From 0eb918c8934a24c617f88e5adf48be9fddd4f467 Mon Sep 17 00:00:00 2001 From: okendoken Date: Mon, 16 Feb 2026 22:33:36 +0100 Subject: [PATCH] add imrpvoed --- README.md | 8 +++--- chrome_screenshot_ext/popup.js | 34 ++++++++++++++++++++++--- scripts/ai_prepare_responses.py | 43 +++++++++++++++++++++++++------- tools/local_screenshot_bridge.py | 43 +++++++++++++++++++++++++------- 4 files changed, 102 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 9e2542c..a2b68be 100644 --- a/README.md +++ b/README.md @@ -91,9 +91,10 @@ If you change extension code, click `Reload` on this extension page. Popup shows: - Saved file paths -- AI suggestions per detected post: - - short response - - medium response +- AI suggestions per detected post (6 total): + - improved short + medium + - critical short + medium + - suggested short + medium - Any AI error details History in popup: @@ -146,4 +147,3 @@ Common options: `chrome://*`, Web Store, and some protected tabs cannot be scripted. - No AI results in popup: verify server started with `--ai`. - diff --git a/chrome_screenshot_ext/popup.js b/chrome_screenshot_ext/popup.js index 570e386..855b058 100644 --- a/chrome_screenshot_ext/popup.js +++ b/chrome_screenshot_ext/popup.js @@ -50,12 +50,38 @@ function renderResult(entryOrResp) { for (const p of resp.ai_result.ai.posts) { const idx = typeof p.index === "number" ? p.index : "?"; const postText = (p.post_text || "").replace(/\s+/g, " ").trim(); - const short = (p.short_response || "").replace(/\s+/g, " ").trim(); - const medium = (p.medium_response || "").replace(/\s+/g, " ").trim(); + + // Back-compat with older saved results. + const hasNew = + "improved_short" in p || + "improved_medium" in p || + "critical_short" in p || + "critical_medium" in p || + "suggested_short" in p || + "suggested_medium" in p; + + const improvedShort = (p.improved_short || "").replace(/\s+/g, " ").trim(); + const improvedMedium = (p.improved_medium || "").replace(/\s+/g, " ").trim(); + const criticalShort = (p.critical_short || "").replace(/\s+/g, " ").trim(); + const criticalMedium = (p.critical_medium || "").replace(/\s+/g, " ").trim(); + const suggestedShort = (p.suggested_short || "").replace(/\s+/g, " ").trim(); + const suggestedMedium = (p.suggested_medium || "").replace(/\s+/g, " ").trim(); + + const shortLegacy = (p.short_response || "").replace(/\s+/g, " ").trim(); + const mediumLegacy = (p.medium_response || "").replace(/\s+/g, " ").trim(); lines.push(""); lines.push(`#${idx} Post: ${clampString(postText, 180)}`); - lines.push(` Short: ${short}`); - lines.push(` Medium: ${medium}`); + if (hasNew) { + lines.push(` improved (short): ${improvedShort}`); + lines.push(` improved (medium): ${improvedMedium}`); + lines.push(` Critical (short): ${criticalShort}`); + lines.push(` Critical (medium): ${criticalMedium}`); + lines.push(` Suggested (short): ${suggestedShort}`); + lines.push(` Suggested (medium): ${suggestedMedium}`); + } else { + lines.push(` Short: ${shortLegacy}`); + lines.push(` Medium: ${mediumLegacy}`); + } } if (resp.ai_result.ai_path) lines.push(`\nAI file: ${resp.ai_result.ai_path}`); } else { diff --git a/scripts/ai_prepare_responses.py b/scripts/ai_prepare_responses.py index 4d59647..d0e1c03 100755 --- a/scripts/ai_prepare_responses.py +++ b/scripts/ai_prepare_responses.py @@ -116,8 +116,12 @@ def _sanitize_ai_payload(ai: dict, page_url: str, page_title: str) -> dict: { "index": int(p.get("index", i)), "post_text": _ea_sanitize_text(p.get("post_text", "")), - "short_response": _ea_sanitize_text(p.get("short_response", "")), - "medium_response": _ea_sanitize_text(p.get("medium_response", "")), + "improved_short": _ea_sanitize_text(p.get("improved_short", "")), + "improved_medium": _ea_sanitize_text(p.get("improved_medium", "")), + "critical_short": _ea_sanitize_text(p.get("critical_short", "")), + "critical_medium": _ea_sanitize_text(p.get("critical_medium", "")), + "suggested_short": _ea_sanitize_text(p.get("suggested_short", "")), + "suggested_medium": _ea_sanitize_text(p.get("suggested_medium", "")), } ) out["posts"] = cleaned_posts @@ -141,10 +145,23 @@ def _response_schema(max_posts: int) -> dict: "properties": { "index": {"type": "integer"}, "post_text": {"type": "string"}, - "short_response": {"type": "string"}, - "medium_response": {"type": "string"}, + "improved_short": {"type": "string"}, + "improved_medium": {"type": "string"}, + "critical_short": {"type": "string"}, + "critical_medium": {"type": "string"}, + "suggested_short": {"type": "string"}, + "suggested_medium": {"type": "string"}, }, - "required": ["index", "post_text", "short_response", "medium_response"], + "required": [ + "index", + "post_text", + "improved_short", + "improved_medium", + "critical_short", + "critical_medium", + "suggested_short", + "suggested_medium", + ], }, }, "notes": {"type": "string"}, @@ -204,16 +221,24 @@ def main(argv: list[str]) -> int: "goal": "Draft replies to each distinct post currently visible on the page.", "definition_of_post": "A single feed item / post / story / comment root visible on-screen right now. If it's a single-article page, treat the main article as one post.", "output_requirements": { - "short_response": "1-2 sentences, direct, useful, no fluff.", - "medium_response": "3-6 sentences, more context, still concise.", - "style": "Follow the system instructions for voice/tone. If unclear what the post says, be honest and ask a question instead of guessing.", + #"ironic": "Lightly ironic, laughing at us humans (not cruel).", + "improved": "Proofreading-style improvements, preserving the original words as much as possible. Improving in medium version.", + "critical": "Bold/critical: politely questions the premise or assumptions.", + "suggested": "Best style you think fits (helpful/witty/clarifying/etc).", + "short": "1-2 sentences, direct, useful, no fluff.", + "medium": "3-6 sentences, more context, still concise.", + "style": "Follow the system instructions for voice/tone. Apply EXTRA_INSTRUCTIONS to all responses. If unclear what the post says, be honest and ask a question instead of guessing.", }, }, } prompt_text = ( "You will receive (1) a screenshot of the current viewport and (2) extracted visible page content.\n" - "Identify each distinct post visible on the page and draft two reply options per post.\n" + "Identify each distinct post visible on the page and draft SIX reply options per post:\n" + "- improved_short, improved_medium\n" + "- critical_short, critical_medium\n" + "- suggested_short, suggested_medium\n" + "All six must follow the system instructions and EXTRA_INSTRUCTIONS.\n" "Do not invent facts not present in the screenshot/content.\n" "Return JSON matching the provided schema. Include all top-level keys: page_url, page_title, posts, notes.\n" "If a value is unknown, use an empty string.\n\n" diff --git a/tools/local_screenshot_bridge.py b/tools/local_screenshot_bridge.py index 737e260..3183e2e 100755 --- a/tools/local_screenshot_bridge.py +++ b/tools/local_screenshot_bridge.py @@ -141,8 +141,12 @@ def _sanitize_ai_payload(ai: dict, page_url: str, page_title: str) -> dict: { "index": int(p.get("index", i)), "post_text": _ea_sanitize_text(p.get("post_text", "")), - "short_response": _ea_sanitize_text(p.get("short_response", "")), - "medium_response": _ea_sanitize_text(p.get("medium_response", "")), + "improved_short": _ea_sanitize_text(p.get("improved_short", "")), + "improved_medium": _ea_sanitize_text(p.get("improved_medium", "")), + "critical_short": _ea_sanitize_text(p.get("critical_short", "")), + "critical_medium": _ea_sanitize_text(p.get("critical_medium", "")), + "suggested_short": _ea_sanitize_text(p.get("suggested_short", "")), + "suggested_medium": _ea_sanitize_text(p.get("suggested_medium", "")), } ) out["posts"] = cleaned_posts @@ -165,10 +169,23 @@ def _response_schema(max_posts: int) -> dict: "properties": { "index": {"type": "integer"}, "post_text": {"type": "string"}, - "short_response": {"type": "string"}, - "medium_response": {"type": "string"}, + "improved_short": {"type": "string"}, + "improved_medium": {"type": "string"}, + "critical_short": {"type": "string"}, + "critical_medium": {"type": "string"}, + "suggested_short": {"type": "string"}, + "suggested_medium": {"type": "string"}, }, - "required": ["index", "post_text", "short_response", "medium_response"], + "required": [ + "index", + "post_text", + "improved_short", + "improved_medium", + "critical_short", + "critical_medium", + "suggested_short", + "suggested_medium", + ], }, }, "notes": {"type": "string"}, @@ -219,16 +236,24 @@ def _maybe_generate_ai(server, png_path: Path, meta: dict, content: object) -> d "goal": "Draft replies to each distinct post currently visible on the page.", "definition_of_post": "A single feed item / post / story / comment root visible on-screen right now. If it's a single-article page, treat the main article as one post.", "output_requirements": { - "short_response": "1-2 sentences, direct, useful, no fluff.", - "medium_response": "3-6 sentences, more context, still concise.", - "style": "Follow the system instructions for voice/tone. If unclear what the post says, be honest and ask a question instead of guessing.", +# "ironic": "Lightly ironic, laughing at us humans (not cruel).", + "improved": "Proofreading-style improvements, preserving the original words as much as possible. Improving in medium version.", + "critical": "Bold/critical: politely questions the premise or assumptions.", + "suggested": "Best style you think fits (helpful/witty/clarifying/etc).", + "short": "1-2 sentences, direct, useful, no fluff.", + "medium": "3-6 sentences, more context, still concise.", + "style": "Follow the system instructions for voice/tone. Apply EXTRA_INSTRUCTIONS to all responses. If unclear what the post says, be honest and ask a question instead of guessing.", }, }, } prompt_text = ( "You will receive (1) a screenshot of the current viewport and (2) extracted visible page content.\n" - "Identify each distinct post visible on the page and draft two reply options per post.\n" + "Identify each distinct post visible on the page and draft SIX reply options per post:\n" + "- improved_short, improved_medium\n" + "- critical_short, critical_medium\n" + "- suggested_short, suggested_medium\n" + "All six must follow the system instructions and EXTRA_INSTRUCTIONS.\n" "Do not invent facts not present in the screenshot/content.\n" "Return JSON matching the provided schema. Include all top-level keys: page_url, page_title, posts, notes.\n" "If a value is unknown, use an empty string.\n\n"