Explorer
/tmp/integrate_feedback_v2.py
← Zurück ↓ Download
from pathlib import Path
p=Path('/opt/struktur/social-media-agent/publish_ready.py'); s=p.read_text()
# Deduplicate prior import and add feedback module.
s=s.replace('from codex_image_qa import CodexImageQAError, qa_passes, run_image_qa\nfrom codex_image_qa import CodexImageQAError, qa_passes, run_image_qa','from codex_image_qa import CodexImageQAError, qa_passes, run_image_qa\nfrom human_feedback import feedback_prompt_text, save_variant_feedback')
# Prompt API and feedback suffix.
s=s.replace('def fach_image_prompt(package: dict) -> str:', 'def fach_image_prompt(package: dict, feedback_text: str = "") -> str:')
s=s.replace('            "Comicstil, Icons, Diagramm-Fallback, Text im Bild, Fantasieschrift.")','            "Comicstil, Icons, Diagramm-Fallback, Text im Bild, Fantasieschrift." + (f" Carlo-Erfahrungsbasis für passende Themen: {feedback_text}." if feedback_text else ""))')
# Ensure variant feedback columns on every schema init.
needle='    CREATE INDEX IF NOT EXISTS idx_package_image_variants_package ON package_image_variants(package_id, variant_order);'
addition=needle+'\n    for column, definition in {"human_rating": "TEXT NOT NULL DEFAULT \'\'", "human_reason_verbatim": "TEXT NOT NULL DEFAULT \'\'", "human_reason_structured_json": "TEXT NOT NULL DEFAULT \'{}\'", "human_feedback_at": "TEXT NOT NULL DEFAULT \'\'", "human_feedback_by": "TEXT NOT NULL DEFAULT \'\'", "feedback_rules_json": "TEXT NOT NULL DEFAULT \'[]\'"}.items():\n        _ensure_column(con, "package_image_variants", column, definition)'
assert s.count(needle)==1; s=s.replace(needle,addition)
# Persist fields.
s=s.replace('def persist_image_variant(con: sqlite3.Connection, package_id: str, group_id: str, order_no: int, generated: dict, prompt: str, qa: dict) -> str:', 'def persist_image_variant(con: sqlite3.Connection, package_id: str, group_id: str, order_no: int, generated: dict, prompt: str, qa: dict, feedback_rules: list[dict] | None = None) -> str:')
old='con.execute("INSERT INTO package_image_variants(variant_id,package_id,generation_group_id,variant_order,image_path,origin_path,file_type,file_bytes,sha256,generator,prompt,qa_status,qa_report_json,qa_failure_reasons,created_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", (variant_id, package_id, group_id, order_no, generated.get("path", ""), generated.get("origin_path", ""), generated.get("file_type", "PNG"), int(generated.get("bytes") or 0), generated.get("sha256", ""), "Codex built-in image_gen", prompt, "passed" if qa.get("overall") == "PASS" else "failed", json.dumps(qa, ensure_ascii=False), "; ".join(qa.get("failure_reasons", [])), _now()))'
new='columns="variant_id,package_id,generation_group_id,variant_order,image_path,origin_path,file_type,file_bytes,sha256,generator,prompt,feedback_rules_json,qa_status,qa_report_json,qa_failure_reasons,created_at"\n    values=(variant_id, package_id, group_id, order_no, generated.get("path", ""), generated.get("origin_path", ""), generated.get("file_type", "PNG"), int(generated.get("bytes") or 0), generated.get("sha256", ""), "Codex built-in image_gen", prompt, json.dumps(feedback_rules or [], ensure_ascii=False), "passed" if qa.get("overall") == "PASS" else "failed", json.dumps(qa, ensure_ascii=False), "; ".join(qa.get("failure_reasons", [])), _now())\n    con.execute(f"INSERT INTO package_image_variants({columns}) VALUES ({\",\".join(\"?\" for _ in values)})", values)'
assert s.count(old)==1; s=s.replace(old,new)
# Generation feedback context.
s=s.replace('    prompt_base = fach_image_prompt(package)\n    prompt_ok, prompt_reason = image_relevance_gate(package, prompt_base)', '    feedback_text, feedback_rules = feedback_prompt_text(package)\n    prompt_base = fach_image_prompt(package, feedback_text)\n    prompt_ok, prompt_reason = image_relevance_gate(package, prompt_base)')
s=s.replace('persist_image_variant(con, package_id, generation_group_id, variant_no, generated, prompt, qa)', 'persist_image_variant(con, package_id, generation_group_id, variant_no, generated, prompt, qa, feedback_rules)')
# Include variants in read model.
s=s.replace('        item["media_status"] = media_status_label(item)', '        variants = con.execute("SELECT * FROM package_image_variants WHERE package_id=? ORDER BY CASE WHEN final_for_package=1 THEN 0 WHEN qa_status=\'passed\' THEN 1 ELSE 2 END, variant_order", (item["package_id"],)).fetchall()\n        item["variants"] = [dict(v) for v in variants]\n        item["media_status"] = media_status_label(item)')
p.write_text(s); print('feedback integration patched')