Explorer
/tmp/resume_carousel_pilot_v2.py
← Zurück ↓ Download
import inspect,sqlite3,json,uuid,hashlib
from pathlib import Path
from publish_ready import build_carousel_slides,media_brief_prompt,_render_carousel_slide_text,qa_passes
import codex_image_adapter
from codex_image_adapter import generate_with_codex
from codex_image_qa import run_image_qa
assert 'reference_image' in str(inspect.signature(generate_with_codex)), inspect.signature(generate_with_codex)
DB='/opt/struktur/social-media-agent/cases.db'; pid='PKG-eff43bd0-9220-444c-a0af-786f91a1194e'; c=sqlite3.connect(DB); c.row_factory=sqlite3.Row
car=c.execute('select * from carousels where package_id=? order by created_at desc limit 1',(pid,)).fetchone(); br=dict(c.execute('select * from media_briefs where media_brief_id=?',(car['media_brief_id'],)).fetchone())
for k in ('required_objects_json','technical_requirements_json','avoid_motifs_json','avoid_technical_errors_json','reference_assets_json','feedback_rules_json'): br[k.removesuffix('_json')]=json.loads(br.pop(k) or '[]')
pkg=dict(c.execute('select * from publication_packages where package_id=?',(pid,)).fetchone()); slides=build_carousel_slides(pkg); reports=[]
for slide in slides:
 target=Path('/opt/struktur/social-media-agent/generated_visuals')/f"{pkg['signal_id']}_{car['carousel_id'][-8:]}_slide-{slide['slide_number']}.png"
 if target.is_file(): generated={'origin_path':'','path':str(target),'bytes':target.stat().st_size,'sha256':hashlib.sha256(target.read_bytes()).hexdigest()}; prompt=media_brief_prompt(br,1)
 else:
  prompt=media_brief_prompt(br,1)+f" Carousel-Slide {slide['slide_number']} Zweck: {slide['purpose']}. Sichtbares Motiv: {slide['motif']}. Keine Schrift oder Zahlen im Bild; Text wird später deterministisch als Layout aufgebracht."
  ref=Path(br['reference_assets'][0]['path']) if br['reference_assets'] else None
  generated=generate_with_codex(prompt,target,reference_image=ref)
 qa=run_image_qa(target,pkg['topic'],str(pkg.get('final_text') or pkg.get('facebook_text'))); _render_carousel_slide_text(target,slide); data=target.read_bytes(); sha=hashlib.sha256(data).hexdigest()
 if not c.execute('select 1 from carousel_slides where carousel_id=? and slide_number=?',(car['carousel_id'],slide['slide_number'])).fetchone():
  c.execute("insert into carousel_slides(slide_id,carousel_id,package_id,slide_number,slide_count,purpose,statement,image_path,origin_path,sha256,file_bytes,generator,prompt,media_brief_id,qa_status,qa_report_json,qa_failure_reasons,created_at) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)",(f'SLIDE-{uuid.uuid4()}',car['carousel_id'],pid,slide['slide_number'],5,slide['purpose'],slide['statement'],str(target),generated.get('origin_path',''),sha,len(data),'Codex built-in image_gen',prompt,br['media_brief_id'],'passed' if qa_passes(qa) else 'failed',json.dumps(qa,ensure_ascii=False),'; '.join(qa.get('failure_reasons',[])),__import__('datetime').datetime.now(__import__('datetime').timezone.utc).isoformat()))
 reports.append({'slide':slide['slide_number'],'path':str(target),'sha256':sha,'bytes':len(data),'qa':qa})
c.execute("update publication_packages set media_type='carousel',media_type_reason=? where package_id=?",('Mehrere zusammenhängende technische Punkte lassen sich als Ursache-Wirkung- und Vorgehensfolge erklären.',pid)); c.commit(); print(json.dumps({'carousel_id':car['carousel_id'],'slides':reports},ensure_ascii=False)); c.close()