feat(web): support image messages in pico chat (#2299)

This commit is contained in:
wenjie
2026-04-03 14:15:20 +08:00
committed by GitHub
parent f3ad5d9305
commit f2a19ab947
21 changed files with 1009 additions and 79 deletions
+5 -3
View File
@@ -602,14 +602,16 @@ func (cb *ContextBuilder) BuildMessages(
// Add conversation history
messages = append(messages, history...)
// Add current user message
if strings.TrimSpace(currentMessage) != "" {
// Add current user message. Media-only turns must still be preserved so
// multimodal providers receive the uploaded image even when the user sends
// no accompanying text.
if strings.TrimSpace(currentMessage) != "" || len(media) > 0 {
msg := providers.Message{
Role: "user",
Content: currentMessage,
}
if len(media) > 0 {
msg.Media = media
msg.Media = append([]string(nil), media...)
}
messages = append(messages, msg)
}
+32
View File
@@ -707,6 +707,38 @@ func TestEmptyWorkspaceBaselineDetectsNewFiles(t *testing.T) {
}
}
func TestBuildMessages_IncludesMediaOnlyCurrentMessage(t *testing.T) {
tmpDir := setupWorkspace(t, nil)
defer os.RemoveAll(tmpDir)
cb := NewContextBuilder(tmpDir)
msgs := cb.BuildMessages(
nil,
"",
"",
[]string{"data:image/png;base64,abc123"},
"pico",
"chat-1",
"",
"",
)
if len(msgs) != 2 {
t.Fatalf("len(msgs) = %d, want 2", len(msgs))
}
userMsg := msgs[1]
if userMsg.Role != "user" {
t.Fatalf("userMsg.Role = %q, want %q", userMsg.Role, "user")
}
if userMsg.Content != "" {
t.Fatalf("userMsg.Content = %q, want empty string", userMsg.Content)
}
if len(userMsg.Media) != 1 || userMsg.Media[0] != "data:image/png;base64,abc123" {
t.Fatalf("userMsg.Media = %#v, want image payload", userMsg.Media)
}
}
// BenchmarkBuildMessagesWithCache measures caching performance.
func BenchmarkBuildMessagesWithCache(b *testing.B) {
tmpDir, _ := os.MkdirTemp("", "picoclaw-bench-*")