summaryrefslogtreecommitdiff
path: root/internal/comic/generator.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-20 00:02:07 +0300
committerPaul Buetow <paul@buetow.org>2026-04-20 00:02:07 +0300
commita35ca6f40de73e93372ade6f2d74c231389799e2 (patch)
treefaf7a53d476cbd6d01b694443e8e601cec9257db /internal/comic/generator.go
parent6130cae3fa396cff94653225e47326b642e270f3 (diff)
Fix task 25: keep comic generation single-language and single-style
Diffstat (limited to 'internal/comic/generator.go')
-rw-r--r--internal/comic/generator.go44
1 files changed, 43 insertions, 1 deletions
diff --git a/internal/comic/generator.go b/internal/comic/generator.go
index 34c60c5..b3be2ef 100644
--- a/internal/comic/generator.go
+++ b/internal/comic/generator.go
@@ -79,6 +79,12 @@ func (g *Generator) Generate(ctx context.Context, entries []WordEntry) (string,
if text == "" {
return "", fmt.Errorf("no story content returned")
}
+ if err := validateTextScript("story text", text, g.script); err != nil {
+ return "", err
+ }
+ if err := validateNoPromptLeakage("story text", text); err != nil {
+ return "", err
+ }
return text, nil
}
@@ -101,7 +107,11 @@ func (g *Generator) GenerateFull(ctx context.Context, entries []WordEntry) (Gene
if text == "" {
return GenerateResult{}, fmt.Errorf("no content returned")
}
- return parseGenerateResult(text), nil
+ result := parseGenerateResult(text)
+ if err := validateGeneratedResult(result, g.script); err != nil {
+ return GenerateResult{}, err
+ }
+ return result, nil
}
func (g *Generator) ready() error {
@@ -139,3 +149,35 @@ func (g *Generator) renderStoryPrompt(templateName string, entries []WordEntry)
}
return systemPrompt + "\n\n" + userPrompt, nil
}
+
+func validateGeneratedResult(result GenerateResult, script string) error {
+ if err := validateTextScript("story text", result.StoryText, script); err != nil {
+ return err
+ }
+ if err := validateNoPromptLeakage("story text", result.StoryText); err != nil {
+ return err
+ }
+ if err := validateTextScript("character bible", result.Bible, script); err != nil {
+ return err
+ }
+ if err := validateNoPromptLeakage("character bible", result.Bible); err != nil {
+ return err
+ }
+ if err := validateTextScript("comic title", result.Title, script); err != nil {
+ return err
+ }
+ if err := validateNoPromptLeakage("comic title", result.Title); err != nil {
+ return err
+ }
+ for pageIdx, page := range result.PanelScript {
+ for panelIdx, panel := range page {
+ if err := validateTextScript(fmt.Sprintf("panel script P%d-%c", pageIdx+1, 'A'+panelIdx), panel, script); err != nil {
+ return err
+ }
+ if err := validateNoPromptLeakage(fmt.Sprintf("panel script P%d-%c", pageIdx+1, 'A'+panelIdx), panel); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+}