Skip to content

U-2①: 後端資訊圖卡逐區 refine 端點移植#81

Merged
dofliu merged 3 commits into
mainfrom
claude/u-2-infographic-section-refine
Jun 15, 2026
Merged

U-2①: 後端資訊圖卡逐區 refine 端點移植#81
dofliu merged 3 commits into
mainfrom
claude/u-2-infographic-section-refine

Conversation

@dofliu

@dofliu dofliu commented Jun 15, 2026

Copy link
Copy Markdown
Owner

做什麼

移植 /studio 缺的「資訊圖卡逐區 refine」到後端,補上 U-2 盤點出的唯一「大」缺口(後端 refine 圖卡未移植)。

  • core/infocards/refine_service.py
    • 新增 refine_infographic_section(section, instruction, *, model, image_model, regenerate_image):依指令重生單一 InfographicSection。策略對齊既有 refine_presentation_slide
      • merge:AI 輸出覆蓋原 section,省略欄位保留原值(不清空未提及欄位)。
      • iconType 越界退 info(對齊 infographic_service._coerce)。
      • imagePrompt 有變(或本來有 prompt 沒圖)才重生該區圖 — 只改文字、prompt 不變時不重生圖,避免無謂燒額度。
    • 新增純 prompt 組裝 build_refine_section_prompt(無 responseSchema,對齊原版)。
  • server/routes/infocards.py
    • 新增 POST /api/refine-section(掛 rate_limit,與 /api/refine/api/generate 一致)+ RefineSectionRequest schema。

海報為單張圖、無「區」概念,整圖 refine 已由 /api/generaterefinement 參數涵蓋,故本項聚焦資訊圖卡 section 逐區 refine。

為什麼

  • U-2(2026-06-07 拍板要做)拆小的 ①後端 refine 圖卡端點移植 + ③測試。前端區域選擇 UI(②)依約另開 PR。
  • 遵守 offline-first:真實生圖會燒額度 = 不在本輪跑真實 API,全程 mock Gemini 驗邏輯;條件式重生圖把額度消耗降到最低。

怎麼測

  • 新增 8 測(tests/test_infocards_refine.pyTestRefineSection + TestRefineSectionRoute):prompt 組裝 / merge 保留原欄位 / iconType coerce / imagePrompt 變更才重生圖 / 不變不生圖 / 關閉重生 / 端點整合,全程 mock Gemini
  • 本機(venv):tests/test_infocards_refine.py 18 passed;infocards 子集 52 passed;全套 2433 passed,3 個失敗為容器缺 Noto CJK 字型的像素斷言假象(QR white_blocks + pptx journal theme signature),與本改動無關,CI 有裝字型。

Reviewer 決策點

  • 端點命名用 /api/refine-section(與既有 /api/refine 並列)vs 合併進 /api/refine 加 mode 判別 — 採前者(shape 不同、語意清楚)。如偏好合併可提。
  • 重生圖條件「prompt 改了才生」是預設行為(regenerateImage=True),可由前端傳 regenerateImage=False 純改文字不動圖。

Generated by Claude Code

移植 /studio 缺的「圖卡逐區 refine」到後端(offline-first,全程 mock 測):
- refine_service.refine_infographic_section:依指令重生單一 section,merge 原欄位、
  iconType 越界退 info、imagePrompt 有變才重生該區圖(不燒額度),策略對齊既有
  refine_presentation_slide。
- 新端點 POST /api/refine-section(掛 rate_limit)。
- 補 8 測(mock Gemini,涵蓋 merge/coerce/條件重生圖/端點)。

海報為單圖無區概念,整圖 refine 已由 /api/generate 的 refinement 涵蓋。
前端區域選擇 UI(U-2②)另開 PR。
@dofliu dofliu marked this pull request as ready for review June 15, 2026 15:13
@dofliu dofliu merged commit 980989c into main Jun 15, 2026
3 of 7 checks passed
dofliu pushed a commit that referenced this pull request Jun 15, 2026
#81 把 /api/refine-section 路由改採「收/回單一 section」契約並加
tests/test_infocards_refine.py 覆蓋,但遺留 test_infocards_infographic.py
::TestRefineSection 的兩個路由測試仍送舊形狀 {infographic, sectionId} → 回 422,
使 main CI 紅。移除這兩個過時路由測試(端到端覆蓋已在 test_infocards_refine.py),
保留其餘 infographic_service 函式單元測試。

https://claude.ai/code/session_011KcsjSFoGvB92odmj4VtKK
dofliu added a commit that referenced this pull request Jun 15, 2026
* U-2②: 前端資訊圖卡逐區 refine 接上 #81 後端契約

/app 視覺站的逐區微調原送舊形狀 {infographic, sectionId} 並讀 data.data,
與 #81 實際落地的 POST /api/refine-section(收/回單一 section)對不上,逐區
微調實際打不通。改成與 sibling 單頁微調 /api/refine 同形狀:送 section、
讀 data.section、patch 回 result.data.sections[idx]。純前端一檔,vite build 通過。
docs/PRODUCT_READINESS.md U-2 標 [x](①②③到齊)。

https://claude.ai/code/session_011KcsjSFoGvB92odmj4VtKK

* test: 移除 refine-section 舊契約路由測試(對齊 #81 單一 section 路由)

#81 把 /api/refine-section 路由改採「收/回單一 section」契約並加
tests/test_infocards_refine.py 覆蓋,但遺留 test_infocards_infographic.py
::TestRefineSection 的兩個路由測試仍送舊形狀 {infographic, sectionId} → 回 422,
使 main CI 紅。移除這兩個過時路由測試(端到端覆蓋已在 test_infocards_refine.py),
保留其餘 infographic_service 函式單元測試。

https://claude.ai/code/session_011KcsjSFoGvB92odmj4VtKK

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants