fix(logic): ignore reference directives when checking for prompt text
Strip inline image tokens and reference directive URLs before deciding whether a prompt carries real user text, so a reference-only prompt is still treated as empty while text around references counts. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,11 +2,17 @@ package logic
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"img_infinite_canvas/internal/domain/design"
|
"img_infinite_canvas/internal/domain/design"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
promptReferenceDirectivePattern = regexp.MustCompile(`(?i)(?:参考图|reference image)\s*\d*\s*(?:[((][^))\n]+[))])?\s*[::]\s*(?:https?://[^\s\],。]+|data:image/[^\s\],。]+|/[^\s\],。]+)`)
|
||||||
|
promptImageTokenPattern = regexp.MustCompile(`\[@image:#\d+:[^:\]]+:(?:\[[^\]]+\]\((?:[^)]+)\)|[^\]]+)\]`)
|
||||||
|
)
|
||||||
|
|
||||||
func validateRequiredPrompt(prompt string, allowEmpty bool) error {
|
func validateRequiredPrompt(prompt string, allowEmpty bool) error {
|
||||||
if allowEmpty {
|
if allowEmpty {
|
||||||
return nil
|
return nil
|
||||||
@@ -18,6 +24,8 @@ func validateRequiredPrompt(prompt string, allowEmpty bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func hasRequiredPromptText(prompt string) bool {
|
func hasRequiredPromptText(prompt string) bool {
|
||||||
|
prompt = promptImageTokenPattern.ReplaceAllString(prompt, " ")
|
||||||
|
prompt = promptReferenceDirectivePattern.ReplaceAllString(prompt, " ")
|
||||||
for _, line := range strings.Split(prompt, "\n") {
|
for _, line := range strings.Split(prompt, "\n") {
|
||||||
line = strings.TrimSpace(strings.ReplaceAll(line, "\u00a0", " "))
|
line = strings.TrimSpace(strings.ReplaceAll(line, "\u00a0", " "))
|
||||||
if line == "" || isPromptReferenceDirective(line) {
|
if line == "" || isPromptReferenceDirective(line) {
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestHasRequiredPromptTextAllowsInlineReferenceContext(t *testing.T) {
|
||||||
|
prompt := "参考图 1(0.jpg):http://localhost:19000/canvas-assets/a.webp 为服装品牌 stillday 创建情绪板 logo 设计 参考图 2(image.png):http://localhost:19000/canvas-assets/b.png ,包含材质、色彩、摄影姿态。"
|
||||||
|
if !hasRequiredPromptText(prompt) {
|
||||||
|
t.Fatalf("expected inline text around reference directives to count as prompt text")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasRequiredPromptTextRejectsReferenceOnlyPrompt(t *testing.T) {
|
||||||
|
prompt := "参考图 1(0.jpg):http://localhost:19000/canvas-assets/a.webp\nReference image 2 (image.png): https://example.com/b.png"
|
||||||
|
if hasRequiredPromptText(prompt) {
|
||||||
|
t.Fatalf("expected reference-only prompt to be treated as empty")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasRequiredPromptTextHandlesChinesePunctuationAfterReference(t *testing.T) {
|
||||||
|
prompt := "参考图 1(image.png):https://example.com/reference.png,参考它的字体做 logo。"
|
||||||
|
if !hasRequiredPromptText(prompt) {
|
||||||
|
t.Fatalf("expected text after Chinese punctuation to count as prompt text")
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user