feat: 画像埋め込みを依存ゼロの単独スクリプトに切り出し、任意のAIで生成できるようにする - #484
Conversation
変換工程が特定アカウントのClaudeサブスクに依存しており、PM不在時に生成が 回らないリスクがあった。LLM工程を任意のAIセッションで代替できるようにする。 パイプラインは非決定的な工程(LLM生成)と決定的な工程(pandoc変換・画像埋め込み・ 完全性検査)に分かれている。決定的な側を単独で実行できれば、LLM工程はどのAIでも よくなる。画像埋め込みだけはLLMに任せられない(生成HTMLは数MBでその大半がbase64 文字列であり、出力長に収まらない)ため、コードで処理する必要がある。 同等の処理は generate_slide.py --embed-only にもあるが、同ファイルが冒頭で claude_agent_sdk を import するため、Claudeを使わない人もパッケージの インストールが必要だった。本スクリプトは標準ライブラリのみで動く。 python3 scripts/claude-slide/embed_images.py docs/manuals/45th_企画マニュアル_縁日 生成側にない機能を2つ追加した。 - 埋め込み前に </html> で閉じているかを検査し、切れていれば書き込まずに終了する。 チャット経由の生成では人間が検査役になり、見落とすと壊れたHTMLを配信してしまう - images/ にあるのにHTMLから参照されていない画像を警告する。AIが画像を落とした 場合の検出用。埋め込み済みの画像を未参照と誤判定しないよう、data URIとして 既に入っているものは区別する 実データ(45th_企画マニュアル_ホールインワン、画像2枚582KB)で検証した。 57KB -> 815KB、2枚とも埋め込み、再実行しても結果は変わらず、 30000バイトで切ったHTMLは終了コード1で拒否、画像を1枚落としたHTMLは警告を出す。 generate_slide.py との重複は PR #478 のマージ後に import へ寄せて解消する。
|
Warning Review limit reachedNext included review available in 57 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai review |
|
|
@coderabbitai review |
|
|
@coderabbitai review |
|
対応Issue
resolve #483
概要
解説HTMLの生成を、どのAIサブスクリプションでも行えるようにする。画像埋め込みを標準ライブラリのみの単独スクリプトに切り出した。
なぜ必要か
変換工程は現在、特定アカウントのClaudeサブスク(PM個人のMaxプラン共用)に依存している。9月以降のPM不在期間に、他の人が生成を回せない。
パイプラインは非決定的な工程と決定的な工程に分かれている。
LLM工程は任意のAIセッション(Claude Code / Codex / ブラウザのチャット)で代替できる。プロンプトは
.claude/manual-prompt-card-strict.mdにあり誰でも読める。残る決定的な工程を単独実行できれば、アカウント依存は消える。画像埋め込みだけはLLMに任せられない。生成HTMLは数MBになるがその大半がbase64文字列で、LLMの出力長に収まらないためである。
同等の処理は
generate_slide.py --embed-onlyにもあるが、同ファイルが冒頭でclaude_agent_sdkを import するため、Claudeを使わない人もこのパッケージのインストールが必要だった。使い方
uv も claude_agent_sdk も不要。import は
argparsebase64mimetypesosresysのみ。これにより、任意のAIで次の手順が踏める。
AIアカウントが要るのは手順4だけになる。
生成側にない機能を2つ追加した
完全性の検査。埋め込み前に
</html>で閉じているかを見て、切れていれば書き込まずに終了コード1で止まる。チャット経由の生成ではスクリプトによる自動検査が効かず人間が検査役になるため、見落とすと壊れたHTMLを配信してしまう。実際に応答の途中切断は起きている(#477)。画像の取りこぼし検出。
images/にあるのにHTMLから参照されていない画像を警告する。AIが画像を落とした場合に気づける。埋め込み済みの画像を未参照と誤判定しないよう、data URIとして既に入っているものは区別している(この誤検知はテスト中に発見して修正した)。検証
実データ
45th_企画マニュアル_ホールインワン(Google Docのエクスポート、画像2枚582KB)で確認した。{{fname}}プレースホルダーと素の相対パス(src="images/image1.png")の両方を埋め込めることも確認済み。実際のGoogle Docエクスポートは後者の形式だった。テスト項目
python3だけで実行できる(uv環境を作らずに動く)備考
generate_slide.pyとはload_images_base64/_resolve_image_src/replace_placeholdersが重複している。本PRでは既存スクリプトに触らず新規ファイルの追加のみとした。#478 が同ファイルを変更中で競合するため。#478 のマージ後にgenerate_slide.py側を import へ寄せて解消する。運用手順書(
docs/development/manual-html-operations.md)への手順追記は、同ファイルを追加する #480 のマージ後に行う。