README
¶
ðš Go Comic Kit
ð æŠèŠ (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 ã¯åç §ç»åã®å¯Ÿè±¡å€ïŒã
- ããã«ã¯ãçºè©±è
1人ãã§ã¯ãªã ç»å Žãã£ã©ã¯ã¿ãŒã®éåïŒ
- 𧬠3-Factor Consistency Control:
- Seedå€ïŒåºç€ïŒãåç
§ã¢ã»ããïŒå€èŠïŒãVisualCues/èšèªæç€ºïŒè©³çްïŒã®3èŠçŽ ã§
ãã£ã©ã¯ã¿ãŒã®äžè²«æ§ãå¶åŸ¡ãããã«ã»ããŒãžã®çææ¡ä»¶ã¯
GenerationRecordãšã㊠state ã«æ°žç¶åãããŸãã - ã·ãŒãã¯å¿
ãèšé²ãããŸããæç€ºæå®ãç¡ãå Žåããååå€ â 䞻圹ãã£ã©ã¯ã¿ãŒã® Seed â
æ°èŠæ¡çªãã®é ã«å¿
ãæ±ºãŸã£ãå€ãéãããã
UsedSeedãèªã¿çŽãã°ãã€ã§ãåãçµµãåçŸã§ããŸã ïŒã·ãŒããéããªããš API åŽãéžãã å€ã¯è¿ã£ãŠãããåçŸã§ããªããªããŸãïŒã
- Seedå€ïŒåºç€ïŒãåç
§ã¢ã»ããïŒå€èŠïŒãVisualCues/èšèªæç€ºïŒè©³çްïŒã®3èŠçŽ ã§
ãã£ã©ã¯ã¿ãŒã®äžè²«æ§ãå¶åŸ¡ãããã«ã»ããŒãžã®çææ¡ä»¶ã¯
- ð æ§é ååºåïŒ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ã¯åŒã³åºãåäœã§æ¬æã ããå·®ãæ¿ããŸã ïŒã·ã¹ãã æç€ºãšãã¬ãã£ãããã³ããã¯å®è£ ã®ãã®ãæ®ããŸãïŒã
- 5æäœãã¹ãŠã®ããã³ããã
- ð Multi-Backend Asset Support:
- åç
§ç»åã®è§£æ±ºïŒVertex AI +
gs://ã¯è»¢éããçŽæ¥åç §ãGemini API 㯠File API ãž1åã ã ã¢ããããŒãããŠäœ¿ãåãïŒã¯ gemini-image-kit ãæ ããŸãããããã¯ãã©ã®ç»åãäœçªç®ã« æ·»ä»ããããã ããæ±ãããã£ãã·ã¥ãšäºéã¢ããããŒã鲿¢ïŒsingleflightïŒã¯ ç»åãããåŽã®å®è£ ã§ãã
- åç
§ç»åã®è§£æ±ºïŒVertex AI +
- ð 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)
- shouni/gemini-image-kit - Geminiç»åçæã³ã¢
- shouni/go-character-kit - ãã£ã©ã¯ã¿ãŒè³ç£ïŒcharacters.jsonïŒç®¡ç
- shouni/go-gemini-client - Gemini API/Vertex AI ã¯ã©ã€ã¢ã³ãïŒæ§é ååºå察å¿ïŒ
- shouni/go-remote-io - GCS/ããŒã«ã«/HTTP 察å¿ã®èªã¿æžãæœè±¡å
- shouni/go-http-kit - HTTP ã¯ã©ã€ã¢ã³ãæœè±¡å
- shouni/go-utils - å ±éãŠãŒãã£ãªãã£
ð ã©ã€ã»ã³ã¹ (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 å±€ãæäŸããŸãã |