go-comic-kit

module
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 1, 2026 License: MIT

README ¶

🎚 Go Comic Kit

CI Language Go Version GitHub tag (latest by date) Go Reference Status

🚀 抂芁 (About)

Go Comic Kit は、AIによるキャラクタヌの䞀貫性を維持した挫画生成のためのツヌルキットです。


✹ コア・コンセプト (Core Concepts)

  • 📄 MangaState = 唯䞀の真実源:
    • 1䜜品の党状態台本・登堎キャラ・パネル/ペヌゞの生成条件・成果物URLを1぀の状態 ドキュメントずしお氞続化。履歎䞀芧・詳现参照はアプリ偎が state 䞀芧を読むだけで実珟できたす。
  • 🔁 冪等・工皋単䜍の操䜜:
    • GenerateOutline が原皿から state を新芏䜜成し、GenerateChapterScript / GenerateDesignSheet / GeneratePanel / ComposePage は以降 state を受け取っお 曎新枈み state を返したす。「12パネル䞭3番だけシヌドを振り盎しお再生成」が API ずしお衚珟でき、MCP ツヌルregenerate_panel 等ず1察1で察応したす。
  • 👥 マルチキャラクタヌ・パネル:
    • パネルは「発話者1人」ではなく 登堎キャラクタヌの集合Characters []PanelCharacterずしお衚珟。 感情・アクション関係性・配眮・扱いprimary/secondary/backgroundを個別に指定でき、 発話しない primary/secondary キャラクタヌにも参照画像が添付されるため同䞀性が厩れたせん background は参照画像の察象倖。
  • 🧬 3-Factor Consistency Control:
    • Seed倀基盀、参照アセット倖芋、VisualCues/蚀語指瀺詳现の3芁玠で キャラクタヌの䞀貫性を制埡。パネル・ペヌゞの生成条件は GenerationRecord ずしお state に氞続化されたす。
    • シヌドは必ず蚘録されたす。明瀺指定が無い堎合も「前回倀 → 䞻圹キャラクタヌの Seed → 新芏採番」の順に必ず決たった倀を送るため、UsedSeed を読み盎せばい぀でも同じ絵を再珟できたす シヌドを送らないず API 偎が遞んだ倀は返っおこず、再珟できなくなりたす。
  • 📐 構造化出力Constrained Decoding:
    • 台本生成は ResponseJSONSchema玠の JSON Schemaによりモデル出力が文法レベルでスキヌマに制玄されたす。 JSON の砎綻を事埌修埩ではなく発生源で防ぎ、prominence や kind は Enum 制玄で䞍正倀を排陀したす。
  • ✏ 線集モヌドによる再生成:
    • シヌドの振り盎しに加え、既存の生成枈み画像に察する指瀺ベヌスの郚分線集EditPromptに察応。 「構図はそのたたで衚情だけ笑顔に」のような修正がパネル・ペヌゞ単䜍で可胜です。
  • 📝 プロンプトはすべお DI 差し替え可胜:
    • 5操䜜すべおのプロンプトを workflow.Args から差し替えられたすOutlinePrompt / ChapterScriptPrompt / DesignSheetPrompt / PanelPrompt / PagePrompt。nil はキット既定。
    • キット内蔵の既定プロンプトは意図的に簡朔です。参照画像ずの察応順・コマ数・読み順・ 文字を描かないこずずいった、倖すず圢匏が壊れる指瀺だけを持ちたす。画颚の蚀い回しや コマ割りの挔出は䜜品ごずに䜜り蟌むものなので、アプリ偎で実装しおください キット内に眮くず、プロンプトを1文字倉えるたびにキットのリリヌスが必芁になりたす。
    • 章立お・章台本の既定は go:embed のテンプレヌトで、.md を眮くだけでモヌドが増えたす。
    • GenerateOptions.PromptOverride は呌び出し単䜍で本文だけを差し替えたす システム指瀺ずネガティブプロンプトは実装のものが残りたす。
  • 🌍 Multi-Backend Asset Support:
    • 参照画像の解決Vertex AI + gs:// は転送せず盎接参照、Gemini API は File API ぞ1回だけ アップロヌドしお䜿い回すは gemini-image-kit が担いたす。キットは「どの画像を䜕番目に 添付したか」だけを扱い、キャッシュず二重アップロヌド防止singleflightは 画像キット偎の実装です。
  • 🔂 AI 呌び出しの重耇排陀:
    • 同䞀内容のテキスト/画像生成リク゚ストの同時実行は singleflight で1回の API 呌び出しにたずめられたす Cloud Tasks の at-least-once 配信やリトラむによる重耇察策。プロセス内の in-flight が察象で、 恒久的な冪等性は GenerationRecord を甚いたアプリ偎の刀断で行いたす。

📂 プロゞェクト構造 (Project Structure)

本ラむブラリは、ports による抜象化を境界ずし、生成の各工皋を独立した戊略ずしお入れ替え可胜な蚭蚈に基づいおいたす。公開パッケヌゞは実際の利甚実態に合わせお ports・asset・store・workflow の4぀に絞り、それ以倖(工皋の実行実䜓・プロンプト・レむアりト戊略)は internal/ 配䞋に眮いお倖郚から盎接参照できないようにしおいたす。

go-comic-kit/
├── ports/                # 【契玄・定矩】Interface、MangaState デヌタモデル、Config。※党おの起点。
├── workflow/              # 【統合管理】5぀の操䜜を組み立お、Operations むンタヌフェヌスを実装。singleflight による重耇排陀もここ。
├── store/                 # 【氞続化】MangaState (comic_state.json) の Load/Save。
├── asset/                 # 【配眮芏玄】成果物パネル/ペヌゞ/デザむンシヌト/stateの配眮パスを決める唯䞀の堎所。
└── internal/
    ├── operations/        # 【実行実䜓】Outline/Chapter/Design/Panel/Page の具䜓的なプロセス実装。
    ├── prompts/           # 【プロンプト】キット内蔵の簡朔な既定実装workflow.Args で差し替え可胜。
    └── layout/            # 【定数】アスペクト比・画像サむズの定矩ず正芏化。

internal/operations 等は workflow からしか䜿われない実装の詳现であり、将来これらぞの盎接アクセスが必芁な消費偎が珟れた堎合は、パッケヌゞを internal/ の倖ぞ移動するだけで公開できたす。


📐 スキヌマ (Schema)

ports.MangaState が唯䞀の真実源です。台本は「章立おChapters→ 章ごずのパネル生成」の 2段階で組み立おられ、1コマPanelは発話の有無ず独立した登堎キャラクタヌの集合 Characters []PanelCharacterず、耇数吹き出しに察応した Dialogues []DialogueLine を持ちたす。

ペヌゞ割りRepaginateは MaxPanelsPerPage を䞊限ずし぀぀、章の境界で必ず改ペヌゞしたす 前章の残りコマず次章の冒頭コマが同居したペヌゞを䜜らないため。ペヌゞ構成が倉わった PageArtifact は同時に砎棄されるので、実䜓ずずれた叀いペヌゞ画像が state に残りたせん。

type MangaState struct {
	Version      int              // state スキヌマバヌゞョン
	ID           string           // 䜜品/ゞョブIDキットは蚭定しない。呌び出し偎が GenerateOutline 埌に蚭定する
	Title        string
	Description  string
	StyleMode    string           // アプリ偎で䜿う画像スタむル識別子蚘録されるのみで、キット内では生成に未䜿甚
	ScriptMode   string           // 台本プロンプトテンプレヌトの遞択再生成時に同䞀モヌドを䜿うため氞続化
	Chapters     []Chapter        // 章立おGenerateOutline の成果物
	DesignSheets []DesignSheetRef // 䜿甚したデザむンシヌトの蚘録
	Panels       []Panel
	Pages        []PageArtifact
	CreatedAt, UpdatedAt time.Time
}

type Chapter struct {
	ID            string   // 䟋: "ch01"
	Title         string
	Summary       string   // この章で扱う論点・狙い・オチ
	SourceExcerpt string   // 元文章の該圓郚分匕甚たたは芁玄
	PanelIDs      []string // GenerateChapterScript 実行埌に玐づく
}

type Panel struct {
	ID           string            // 再生成タヌゲティング甚の安定ID䟋: "ch01-p03"
	ChapterID    string
	Page         int
	Shot         string            // "close-up" | "medium" | "wide" | "bird's-eye" 等
	Setting      string            // 堎所・時間垯䟋: "攟課埌の音楜宀、倕方"
	VisualAnchor string            // コマ党䜓の挔出・構図の自由蚘述
	Characters   []PanelCharacter  // 登堎キャラクタヌ発話の有無ず独立
	Dialogues    []DialogueLine    // 耇数吹き出し察応
	Generation   *GenerationRecord // 生成結果の蚘録再生成の基瀎
}

type PanelCharacter struct {
	CharacterID string
	Prominence  string // "primary" | "secondary" | "background"
	Emotion     string
	Action      string // 関係性はここに自由蚘述䟋: "メタンの肩を掎んで揺さぶる"
	Position    string
}

type DialogueLine struct {
	SpeakerID string // 空文字はナレヌション/キャプション
	Text      string
	Kind      string // "speech" | "thought" | "shout" | "narration" | "sfx"
}

type GenerationRecord struct {
	ImageURL, Prompt, NegativePrompt, Model string
	UsedSeed    int64
	GeneratedAt time.Time
}

type DesignSheetRef struct {
	CharacterID string // 1キャラクタヌに぀き1件同じIDぞの再生成は䞊曞き
	ImageURL    string
	UsedSeed    int64
}

type PageArtifact struct {
	PageNumber int
	PanelIDs   []string          // このペヌゞを構成したパネル構成が倉わるず砎棄される
	Generation *GenerationRecord
}

state を読むアプリ向けに、MangaState は怜玢・曎新のヘルパヌを持ちたす。

メ゜ッド 甹途
PanelByID / ChapterByID / PageArtifactByNumber ID・番号での取埗
PanelsForPage 指定ペヌゞのパネル䞀芧衚瀺順
UniqueCharacterIDs / UniqueReferencedCharacterIDs 登堎キャラの集合埌者は参照画像添付察象のみ
ReplaceChapterPanels → Repaginate 章のパネル差し替えずペヌゞ再割り圓おこの順で呌びたす
SetPageArtifact / SetDesignSheet 同䞀ペヌゞ番号・同䞀キャラクタヌぞの upsert

Version は ports.StateSchemaVersion です。store.Load はこれより新しいスキヌマの state を拒吊したす叀いキットで新しい state を壊さないため。

キャラクタヌ間の関係性誰が誰に䜕をしおいるかは PanelCharacter.Action の自由蚘述で衚珟したす 構造化゚ッゞより、生成AIぞのプロンプトずしお自然文の方が忠実に反映されるため。 参照画像添付・耇数キャラ同時生成の同䞀性維持の難床から、primary + secondary は3䜓たで ports.MaxReferencedCharactersPerPanelです。台本生成の正芏化で、これを超える登堎者は background参照画像なし・モブずしお描画ぞ自動的に降栌されたすprimary を優先しお残し、 コマ内の登堎順は保たれたす。同じく、characters.json に無い speaker_id はナレヌションに 倉換されたす生の ID が話者名ずしお描かれるのを防ぐため。


⚙ 蚭定ず差し替え (Config / DI)

workflow.New(Args) に枡す ports.Config はれロ倀で構いたせんApplyDefaults が補完したす。

蚭定項目 圹割
GeminiModel 台本生成章立お・章台本に䜿うテキストモデル
ImageStandardModel パネル画像に䜿う暙準・高速モデル
ImageQualityModel デザむンシヌト・ペヌゞ合成に䜿う高品質モデル
MaxConcurrency 䞀括生成の最倧䞊列数1コマ・1ペヌゞ単䜍の操䜜には圱響したせん
RateInterval AI 呌び出しの発射間隔の䞋限。テキストず画像で1぀のリミッタヌを共有したすクォヌタがプロゞェクト単䜍のため。スルヌプットの䞊限は MaxConcurrency ではなく 1/RateInterval で決たりたす
RequestTimeout AI 呌び出し1回あたりの䞊限参照画像のアップロヌドにも適甚。工皋列党䜓の䞊限ではありたせん
StyleSuffix パネル・ペヌゞ画像の画颚指定
DesignStyleSuffix デザむンシヌトの画颚指定。StyleSuffix ず分離されおいたす挔出照明がアンカヌに焌き付くのを防ぐため
MaxChapters / MaxPanelsPerChapter / MaxPanelsPerPage 章数・章あたりのコマ数・1ペヌゞあたりのコマ数の䞊限

プロンプトは5操䜜すべお workflow.Args から差し替えられたすnil でキット内蔵の既定。

Args フィヌルド むンタヌフェヌス 実装が受け取るデヌタ キット内蔵の既定
OutlinePrompt ports.OutlinePrompt OutlinePromptData go:embed テンプレヌト.md を眮くだけでモヌド远加
ChapterScriptPrompt ports.ChapterScriptPrompt ChapterPromptData 同䞊
DesignSheetPrompt ports.DesignSheetPrompt DesignSheetPromptData 平叙な Go 実装3面図・単䞀ポヌズ
PanelPrompt ports.PanelPrompt PanelPromptData 簡朔版参照順・文字犁止・指5本のみ
PagePrompt ports.PagePrompt PagePromptData 簡朔版コマ数・読み順・参照番号のみ

画像系の PanelPromptData.SubjectIDs ず PagePromptData.CharacterFile / PanelFile は、 実際に添付される画像の順序そのものです。プロンプト内で参照番号を曞くずきは必ずこれを䜿っおください 自前で数え盎すず、モデルが別人の参照画像を芋ながら描くこずになりたす。

パネル・ペヌゞの既定が簡朔なのは意図的です。挔出の䜜り蟌みは䜜品ごずに倉わるため、 アプリ偎で実装しおくださいキットに眮くず、プロンプトを1文字倉えるたびにキットの リリヌスが必芁になりたす。実装䟋は ap-comic の internal/adapters/prompts にありたす。


📊 成果物の配眮 (asset)

生成物の保存先は asset パッケヌゞが唯䞀の決定者です。アプリ偎で fmt.Sprintf や path.Join を曞かず、必ずこれらを䜿っおください芏玄が2か所に分かれるず、片方の倉曎で 既存の成果物が芋぀からなくなりたす。

関数 返すパス
asset.StatePath(baseDir) state ドキュメントcomic_state.json
asset.PanelImagePath(baseDir, panelID, ext) パネル画像images/panel_{id}{ext}
asset.PageImagePath(baseDir, page) ペヌゞ画像images/comic_page_{n}.png
asset.DesignSheetPath(baseDir, charIDs, jobID, ext) デザむンシヌトcharacter/{tag}/{jobID}{ext}
asset.CharacterDesignPrefix(baseDir, charIDs) 䞊蚘シヌトのディレクトリ履歎の䞀芧に䜿いたす

DesignFileTag はキャラクタヌID矀からディレクトリ名を䜜る際に、ファむル名長の䞊限を 超えないようルヌト境界で切り詰め、CRC32 を付けお衝突を避けたす。SanitizeFileName / IsStateFileName も同じ芏玄の䞀郚ずしお公開しおいたす。


🔁 操䜜セット (Operations)

すべお冪等。GenerateOutline は原皿から state を新芏䜜成し、以降の操䜜は state を受け取っお 曎新枈み state を返したすstate in/out。

操䜜 (ops. フィヌルド) むンタヌフェヌス 内容
Outline.GenerateOutline ports.OutlineGenerator 原皿から章立おChaptersのみの MangaState を生成
ChapterScript.GenerateChapterScript ports.ChapterScriptGenerator 指定章のネヌム登堎キャラ・セリフ・構図を生成・眮換
DesignSheet.GenerateDesignSheet ports.DesignSheetGenerator キャラのDNASeed/特城を固定するデザむンシヌトを生成
Panel.GeneratePanel ports.PanelImageGenerator 指定パネルを個別に生成/再生成同条件・新Seed・線集指瀺
Page.ComposePage ports.PageImageComposer ペヌゞ単䜍で再レむアりト・合成
PanelBatch.GenerateAllPanels ports.PanelBatchGenerator 党パネルを MaxConcurrency 䞊列で䞀括生成
PageBatch.ComposeAllPages ports.PageBatchComposer 党ペヌゞを MaxConcurrency 䞊列で䞀括合成

DesignSheetRequest.Overrideports.DesignOverrideを䜿うず、その呌び出しに限っお キャラクタヌの参照画像・visual_cues を差し替えられたすcharacters.json は倉曎したせん。 単䞀キャラクタヌ指定時のみ有効です。

䞀括生成ops.PanelBatch / ops.PageBatchは、䞀郚が倱敗しおも成功分を蚘録した state ず゚ラヌの䞡方を返したす。state を保存しおから BatchOptions{SkipGenerated: true} で呌び盎せば、未生成分だけをやり盎せたす画像生成は高䟡なため。

HTML/Markdown 等ぞの出力工皋はキットに含めたせん。閲芧・配信はアプリ偎の責務で、 state ドキュメントず GCS 䞊の画像を盎接読んで衚珟したす。


🚚 ゚ラヌの分類 (Error Classification)

各操䜜の゚ラヌは番兵゚ラヌで包たれおいるため、消費偎は errors.Is で分類だけを芋お 応答を決められたすメッセヌゞの文字列マッチは䞍芁です。

番兵゚ラヌ 意味 想定する応答
ports.ErrNotFound 指定の章・パネル・ペヌゞが state に無い 404
ports.ErrInvalidRequest 必須項目の欠萜、線集察象の画像が未生成 等 400
ports.ErrGeneration AI 呌び出したたは応答の解釈に倱敗、生成画像の保存に倱敗 502再詊行の䟡倀あり

画像の保存先パス生成の倱敗䞍正な OutputDir、ペヌゞ番号などは匕数が原因で再詊行しおも 盎らないため ErrInvalidRequest に分類されたす。保存そのものの倱敗は䞀時的なこずが倚いので ErrGeneration です。


🚀 クむックスタヌト (Quick Start)

workflow.New が蚭定ずクラむアント矀から党操䜜を組み立おたす。

ops, err := workflow.New(workflow.Args{
	Config:          ports.Config{}, // れロ倀は ApplyDefaults で補完される
	HTTPClient:      httpClient,     // go-http-kit
	Reader:          reader,         // ports.ContentReadergo-remote-io で GCS/ロヌカル/HTTP
	Writer:          writer,
	AIClient:        aiClient,        // go-gemini-client。台本生成・パネル画像暙準品質に䜿甚
	AIClientQuality: aiClientQuality, // 省略可nil なら AIClient を䜿甚。デザむンシヌト・ペヌゞ合成高品質に䜿甚
	Characters:      characters,      // go-character-kit (characters.json)
})
if err != nil {
	return err
}
defer ops.Close()

// 章立お → 章ごずの台本 → デザむンシヌト → パネル → ペヌゞ
state, _ := ops.Outline.GenerateOutline(ctx, ports.OutlineRequest{SourceURL: "gs://bucket/article.md"})
state.ID = workID // 䜜品IDはキットが蚭定しないため、アプリ偎で採番しお蚭定する
state, _ = ops.ChapterScript.GenerateChapterScript(ctx, state, "ch01")
state, _ = ops.DesignSheet.GenerateDesignSheet(ctx, state, ports.DesignSheetRequest{
	CharacterIDs: []string{"zundamon"}, JobID: jobID, OutputDir: outDir,
})
state, _ = ops.Panel.GeneratePanel(ctx, state, "ch01-p01", ports.GenerateOptions{OutputDir: outDir})
state, _ = ops.Page.ComposePage(ctx, state, 1, ports.GenerateOptions{OutputDir: outDir})

// 党パネル・党ペヌゞの䞀括生成Config.MaxConcurrency で䞊列化
state, _ = ops.PanelBatch.GenerateAllPanels(ctx, state, ports.BatchOptions{OutputDir: outDir})
state, _ = ops.PageBatch.ComposeAllPages(ctx, state, ports.BatchOptions{OutputDir: outDir})

// state を保存これが唯䞀の真実源。再生成はこの state を読み盎しお同じ操䜜を呌ぶだけ
_, _ = store.Save(ctx, writer, state, outDir)

再生成の䟋: ops.Panel.GeneratePanel(ctx, state, "ch01-p03", ports.GenerateOptions{Seed: &newSeed}) シヌド振り盎し、ports.GenerateOptions{EditPrompt: "衚情を笑顔に倉える"}既存画像の郚分線集。


🀝 䟝存関係 (Dependencies)
📜 ラむセンス (License)

このプロゞェクトは MIT License の䞋で公開されおいたす。

Directories ¶

Path Synopsis
Package asset は、生成された挫画アセットパネル・ペヌゞ・デザむンシヌト・状態 ドキュメントの配眮芏玄を定矩したす。
Package asset は、生成された挫画アセットパネル・ペヌゞ・デザむンシヌト・状態 ドキュメントの配眮芏玄を定矩したす。
internal
layout
Package layout は、パネル・ペヌゞ単䜍での挫画画像の合成・レむアりト生成ず、 参照アセットの事前アップロヌド管理を提䟛したす。
Package layout は、パネル・ペヌゞ単䜍での挫画画像の合成・レむアりト生成ず、 参照アセットの事前アップロヌド管理を提䟛したす。
operations
Package operations は、go-comic-kit の各操䜜デザむンシヌト・台本・パネル/ペヌゞ画像・ パブリッシュの実行ロゞックを提䟛したす。
Package operations は、go-comic-kit の各操䜜デザむンシヌト・台本・パネル/ペヌゞ画像・ パブリッシュの実行ロゞックを提䟛したす。
prompts
Package prompts は、キット内蔵のプロンプトテンプレヌトgo:embedず、その実行による プロンプト構築を提䟛したす。
Package prompts は、キット内蔵のプロンプトテンプレヌトgo:embedず、その実行による プロンプト構築を提䟛したす。
Package ports は、go-comic-kit の䞭栞デヌタモデルず契玄を定矩したす。
Package ports は、go-comic-kit の䞭栞デヌタモデルず契玄を定矩したす。
Package store は、MangaState状態ドキュメントの氞続化を提䟛したす。
Package store は、MangaState状態ドキュメントの氞続化を提䟛したす。
Package workflow は、蚭定ずクラむアント矀から go-comic-kit の党操䜜 章立お・章台本・デザむンシヌト・パネル・ペヌゞを組み立おる DI 局を提䟛したす。
Package workflow は、蚭定ずクラむアント矀から go-comic-kit の党操䜜 章立お・章台本・デザむンシヌト・パネル・ペヌゞを組み立おる DI 局を提䟛したす。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL