diff --git a/frontend/src/domain/design.ts b/frontend/src/domain/design.ts index bb9c6db..52ec859 100644 --- a/frontend/src/domain/design.ts +++ b/frontend/src/domain/design.ts @@ -306,6 +306,7 @@ export type AgentContent = | { type: "image"; imageUrl: string; + imageName?: string; imageWidth?: number; imageHeight?: number; }; diff --git a/frontend/src/ui/components/CanvasAgentComposer/index.tsx b/frontend/src/ui/components/CanvasAgentComposer/index.tsx index 6e4c87c..2626a61 100644 --- a/frontend/src/ui/components/CanvasAgentComposer/index.tsx +++ b/frontend/src/ui/components/CanvasAgentComposer/index.tsx @@ -190,6 +190,7 @@ export const CanvasAgentComposer = forwardRef {previewSlot}
diff --git a/frontend/src/ui/components/PromptComposer/index.tsx b/frontend/src/ui/components/PromptComposer/index.tsx index c684b90..9355c7e 100644 --- a/frontend/src/ui/components/PromptComposer/index.tsx +++ b/frontend/src/ui/components/PromptComposer/index.tsx @@ -632,6 +632,7 @@ export const PromptComposer = forwardRef< onAnnotationPreviewChange?: (preview: AnnotationPreviewRequest | null) => void; onPasteFile?: (file: File | null) => void | Promise; onSubmit?: () => void; + submitDisabled?: boolean; } >(function PromptComposer( { @@ -648,7 +649,8 @@ export const PromptComposer = forwardRef< onAnnotationsChange, onAnnotationPreviewChange, onPasteFile, - onSubmit + onSubmit, + submitDisabled = false }, ref ) { @@ -883,7 +885,8 @@ export const PromptComposer = forwardRef< } return { type: "image", - imageUrl: part.reference.publicUrl + imageUrl: part.reference.publicUrl, + imageName: part.reference.name }; }) .filter((part): part is AgentContent => Boolean(part)); @@ -1067,9 +1070,10 @@ export const PromptComposer = forwardRef< } } } - if ((event.metaKey || event.ctrlKey) && event.key === "Enter") { + const isComposing = event.nativeEvent.isComposing || event.keyCode === 229; + if (event.key === "Enter" && !event.shiftKey && !isComposing) { event.preventDefault(); - onSubmit?.(); + if (!submitDisabled) onSubmit?.(); } }} onPaste={handlePaste} diff --git a/frontend/src/ui/pages/CanvasWorkspace/index.tsx b/frontend/src/ui/pages/CanvasWorkspace/index.tsx index e6ec1b4..74299ca 100644 --- a/frontend/src/ui/pages/CanvasWorkspace/index.tsx +++ b/frontend/src/ui/pages/CanvasWorkspace/index.tsx @@ -5393,18 +5393,22 @@ function agentContentsToDisplayText(contents: AgentContent[]) { return contents .map((content, index) => { if (content.type === "text") return content.text; - return `参考图 ${index + 1}(image):${content.imageUrl}`; + return `参考图 ${index + 1}(${agentContentImageName(content)}):${content.imageUrl}`; }) .filter((item) => item.trim()) .join("\n\n"); } +function agentContentImageName(content: Extract) { + return content.imageName?.replace(/\s+/g, " ").trim() || "image"; +} + function imageGeneratorSubmittedPrompt(contents: AgentContent[]) { return cleanImageGeneratorPrompt( contents .map((content, index) => { if (content.type === "text" && !isSettingsTextSource(content.textSource)) return content.text; - if (content.type === "image") return `参考图 ${index + 1}:${content.imageUrl}`; + if (content.type === "image") return `参考图 ${index + 1}(${agentContentImageName(content)}):${content.imageUrl}`; return ""; }) .filter((item) => item.trim()) diff --git a/frontend/src/ui/pages/HomePage/index.tsx b/frontend/src/ui/pages/HomePage/index.tsx index ef1bd36..fde388a 100644 --- a/frontend/src/ui/pages/HomePage/index.tsx +++ b/frontend/src/ui/pages/HomePage/index.tsx @@ -736,6 +736,7 @@ export function HomePage() { onReferenceRemoved={handleReferenceRemoved} onPasteFile={attachImage} onSubmit={() => createProject()} + submitDisabled={loading || !canSubmitPrompt} />
void attachImage(event.target.files?.[0] ?? null)} /> diff --git a/server/img_infinite_canvas.api b/server/img_infinite_canvas.api index 8ea5522..cf867ef 100644 --- a/server/img_infinite_canvas.api +++ b/server/img_infinite_canvas.api @@ -369,6 +369,7 @@ type AgentContent { Text string `json:"text,optional"` TextSource string `json:"textSource,optional"` ImageUrl string `json:"imageUrl,optional"` + ImageName string `json:"imageName,optional"` ImageWidth int64 `json:"imageWidth,optional"` ImageHeight int64 `json:"imageHeight,optional"` } diff --git a/server/internal/application/design_service.go b/server/internal/application/design_service.go index d2fc1e9..200dfa2 100644 --- a/server/internal/application/design_service.go +++ b/server/internal/application/design_service.go @@ -4510,7 +4510,13 @@ func promptFromAgentMessages(messages []design.AgentChatMessage) string { if builder.Len() > 0 { builder.WriteString("\n") } - builder.WriteString("Reference image: ") + builder.WriteString("Reference image") + if imageName := strings.TrimSpace(content.ImageName); imageName != "" { + builder.WriteString(" (") + builder.WriteString(compactReferenceImageName(imageName)) + builder.WriteString(")") + } + builder.WriteString(": ") builder.WriteString(imageURL) } } @@ -4519,6 +4525,10 @@ func promptFromAgentMessages(messages []design.AgentChatMessage) string { return builder.String() } +func compactReferenceImageName(value string) string { + return strings.Join(strings.Fields(value), " ") +} + func hasUserPromptTextInAgentMessages(messages []design.AgentChatMessage) bool { for _, message := range messages { if strings.TrimSpace(message.Role) != "" && strings.ToLower(strings.TrimSpace(message.Role)) != "user" { diff --git a/server/internal/domain/design/agent.go b/server/internal/domain/design/agent.go index 33a5589..f05f975 100644 --- a/server/internal/domain/design/agent.go +++ b/server/internal/domain/design/agent.go @@ -18,6 +18,7 @@ type AgentContent struct { Text string TextSource string ImageURL string + ImageName string ImageWidth int64 ImageHeight int64 } diff --git a/server/internal/logic/agent_websocket_logic.go b/server/internal/logic/agent_websocket_logic.go index 9128c97..f11127a 100644 --- a/server/internal/logic/agent_websocket_logic.go +++ b/server/internal/logic/agent_websocket_logic.go @@ -70,6 +70,7 @@ type socketContent struct { Text string `json:"text"` TextSource string `json:"text_source"` ImageURL string `json:"image_url"` + ImageName string `json:"image_name"` ImageWidth int64 `json:"image_width"` ImageHeight int64 `json:"image_height"` } @@ -155,6 +156,7 @@ func (data socketStartData) toDomainChat(projectID string) design.AgentChatReque Text: content.Text, TextSource: content.TextSource, ImageURL: content.ImageURL, + ImageName: content.ImageName, ImageWidth: content.ImageWidth, ImageHeight: content.ImageHeight, }) diff --git a/server/internal/logic/mapper.go b/server/internal/logic/mapper.go index b226c4d..e731e44 100644 --- a/server/internal/logic/mapper.go +++ b/server/internal/logic/mapper.go @@ -519,6 +519,7 @@ func toDomainAgentChat(req *types.AgentChatRequest) design.AgentChatRequest { Text: content.Text, TextSource: content.TextSource, ImageURL: content.ImageUrl, + ImageName: content.ImageName, ImageWidth: content.ImageWidth, ImageHeight: content.ImageHeight, }) diff --git a/server/internal/types/types.go b/server/internal/types/types.go index bac3477..3ff2bfd 100644 --- a/server/internal/types/types.go +++ b/server/internal/types/types.go @@ -49,6 +49,7 @@ type AgentContent struct { Text string `json:"text,optional"` TextSource string `json:"textSource,optional"` ImageUrl string `json:"imageUrl,optional"` + ImageName string `json:"imageName,optional"` ImageWidth int64 `json:"imageWidth,optional"` ImageHeight int64 `json:"imageHeight,optional"` }