diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-22 00:24:27 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-22 00:24:27 +0300 |
| commit | e809e691649923b87ff4c13366069e69c67d2d7b (patch) | |
| tree | 6d529db99cd8ee4206ff74f67e44ed92d3efe2cf | |
| parent | d7c7f24385ca1f3a6a86eae5a5255384b4e79632 (diff) | |
Improve prompt variety for generated comic pages
| -rw-r--r-- | generated_vocab_alien_jungle_starship.txt | 10 | ||||
| -rw-r--r-- | internal/comic/artist.go | 2 | ||||
| -rw-r--r-- | internal/config/config_test.go | 2 | ||||
| -rw-r--r-- | internal/image/gemini_api.go | 4 | ||||
| -rw-r--r-- | prompts/gallery_page_prompt.md | 12 | ||||
| -rw-r--r-- | prompts/story_page_prompt.md | 11 |
6 files changed, 37 insertions, 4 deletions
diff --git a/generated_vocab_alien_jungle_starship.txt b/generated_vocab_alien_jungle_starship.txt new file mode 100644 index 0000000..b9690dd --- /dev/null +++ b/generated_vocab_alien_jungle_starship.txt @@ -0,0 +1,10 @@ +подводен свят = underwater world +коралов замък = coral castle +извънземно морско същество = alien sea creature +трезъбец = trident +морска героиня = ocean heroine +светещ риф = glowing reef +перлена порта = pearl gate +бурно течение = strong current +пазител = guardian +дълбинна звезда = abyssal star diff --git a/internal/comic/artist.go b/internal/comic/artist.go index a54c01a..b089769 100644 --- a/internal/comic/artist.go +++ b/internal/comic/artist.go @@ -345,6 +345,8 @@ func (a *Artist) galleryPromptData(style, bible string, galleryNum int) map[stri "ScriptName": localizedScriptName(a.script), "Style": localizedStylePrompt(style, a.language, a.script), "Bible": bible, + "GalleryNum": galleryNum, + "TotalGalleryPages": a.galleryPages, "Pose": galleryPoses[(galleryNum-1)%len(galleryPoses)], "RenderingRequirement": a.renderingRequirement(), "RenderingRequirementEnd": a.renderingRequirementEnd(), diff --git a/internal/config/config_test.go b/internal/config/config_test.go index e27906d..60152be 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -210,6 +210,8 @@ func TestEmbeddedPromptTemplatesRender(t *testing.T) { "BlurbBox": "правоъгълно текстово поле с кратък текст", "SeriesTitle": "КомиксФордж Приключения", "Pose": "extreme close-up portrait", + "GalleryNum": 1, + "TotalGalleryPages": 5, } for _, name := range []string{ diff --git a/internal/image/gemini_api.go b/internal/image/gemini_api.go index f1aa1c8..720388b 100644 --- a/internal/image/gemini_api.go +++ b/internal/image/gemini_api.go @@ -59,7 +59,9 @@ func geminiReferenceParts(prompt string, refs [][]byte) []*genai.Part { refNote := fmt.Sprintf( "The %d reference image(s) above show the exact character appearance that must be preserved. "+ - "Every character, animal, or object must look identical in the new image. Now generate:\n\n", + "Every character, animal, or object must keep the same identity, face, costume, colours, and markings. "+ + "Use the references for identity only: do not copy their scene, pose, camera angle, panel layout, lighting, action, or background. "+ + "The new image must follow the new prompt's story beat and composition. Now generate:\n\n", len(refs), ) parts = append(parts, &genai.Part{Text: refNote + prompt}) diff --git a/prompts/gallery_page_prompt.md b/prompts/gallery_page_prompt.md index 9aaf8ab..4cdbd04 100644 --- a/prompts/gallery_page_prompt.md +++ b/prompts/gallery_page_prompt.md @@ -1,3 +1,13 @@ +UNIQUE GALLERY IMAGE {{.GalleryNum}} OF {{.TotalGalleryPages}} — this must be a completely different standalone composition from every other gallery image. +Primary composition for this gallery image: +{{.Pose}} + +VARIETY REQUIREMENTS: + • Make this gallery image differ strongly from the other gallery images in camera distance, camera angle, pose/action, background location, lighting, and foreground objects. + • Do not repeat the same standing pose, centered framing, facial expression, background, or light direction used in another gallery image. + • If reference images are provided, use them only for identity and costume consistency. Do not copy their pose, scene, camera, lighting, or background. + • This gallery image should feel like a distinct portfolio shot from a different moment in the story world. + Style: {{.Style}}.{{.RenderingRequirement}} One full-frame {{if .RenderingRequirement}}photograph that looks 100% like a real camera shot{{else}}illustration{{end}} in landscape 16:9 format. Do not split the image into panels or sections. The entire canvas is one single scene. @@ -7,7 +17,5 @@ No text of any kind. No title, labels, speech bubbles, panel borders, or UI elem {{end}} -Composition: {{.Pose}} - The characters must be EXACTLY the described people — same faces, gender, adult age, and clothing. Include the animal companion if naturally present. Do not invent new characters or change anyone's gender. Do not add text overlays. Background: the story setting rendered with full cinematic atmosphere and colour mood.{{if .RenderingRequirement}}{{.RenderingRequirementEnd}}{{end}} diff --git a/prompts/story_page_prompt.md b/prompts/story_page_prompt.md index bed4f0d..dd2e452 100644 --- a/prompts/story_page_prompt.md +++ b/prompts/story_page_prompt.md @@ -1,12 +1,21 @@ This comic page is in {{.LanguageName}}. All speech, thoughts, captions, and labels inside panels must use {{.ScriptName}} script only. +UNIQUE STORY PAGE {{.PageNum}} OF {{.TotalPages}} — render this page as a NEW story beat, not a repeat of any previous page. +The exact page-specific panel plan is the highest priority instruction: +{{.PanelLayout}} + +CONTINUITY RULE: + • This page must continue the story with different actions, settings, poses, camera angles, and foreground objects from all earlier pages. + • If reference images are provided, use them only for character identity and costume consistency. Do not copy their composition, location, pose, lighting, or background. + • Every panel on this page must clearly show a different moment in the sequence. + {{.Words}} Style: {{.Style}}.{{.RenderingRequirement}} Interior story page only. Do NOT render a cover masthead, title banner, subtitle, price box, issue number, date, page header, page footer, logo bug, or publisher badge. {{if .Bible}}CHARACTER AND SETTING REFERENCE: {{.Bible}} -{{end}}{{.PanelLayout}}Each panel is separated by a thin black gutter line. All {{.PanelsPerPage}} panels must be clearly distinct scenes, not one continuous image. Fill the full image area with the {{.PanelsPerPage}} panels. +{{end}}Each panel is separated by a thin black gutter line. All {{.PanelsPerPage}} panels must be clearly distinct scenes, not one continuous image. Fill the full image area with the {{.PanelsPerPage}} panels. MANDATORY SPEECH BUBBLES — this is a comic; characters must speak: • At least {{.RequiredDialoguePanels}} of the {{.PanelsPerPage}} panels on this page must contain a speech bubble or thought bubble. • If the panel description includes quoted dialogue, render it exactly inside the bubble. |
