diff --git a/chat.el b/chat.el index 46beed9..e3094b4 100644 --- a/chat.el +++ b/chat.el @@ -1688,12 +1688,25 @@ fn handle_chat_agentic(body: String) -> String { let safe_msg: String = json_safe(message) let safe_sys: String = json_safe(system) + // Vision in the agentic brain (2026-06-27): when the client attaches an image + // (base64 in body "image", mime in "image_media_type"), send it as a real Anthropic + // image content block on THIS user turn — so the model sees raw pixels WITH memory, + // history, and tools (parity with the CLI). img_b64 == "" => byte-identical to before. + let img_b64: String = json_get(body, "image") + let img_mt_raw: String = json_get(body, "image_media_type") + let img_mt: String = if str_eq(img_mt_raw, "") { "image/png" } else { img_mt_raw } + let cur_user_content: String = if str_eq(img_b64, "") { + "\"" + safe_msg + "\"" + } else { + "[{\"type\":\"text\",\"text\":\"" + safe_msg + "\"},{\"type\":\"image\",\"source\":{\"type\":\"base64\",\"media_type\":\"" + img_mt + "\",\"data\":\"" + img_b64 + "\"}}]" + } + // Seed the messages array with recent history if available, so the LLM sees the thread. let prior_messages: String = if agentic_hist_len > 0 { let inner: String = str_slice(agentic_hist, 1, str_len(agentic_hist) - 1) - "[" + inner + ",{\"role\":\"user\",\"content\":\"" + safe_msg + "\"}]" + "[" + inner + ",{\"role\":\"user\",\"content\":" + cur_user_content + "}]" } else { - "[{\"role\":\"user\",\"content\":\"" + safe_msg + "\"}]" + "[{\"role\":\"user\",\"content\":" + cur_user_content + "}]" } let messages: String = prior_messages let api_url: String = "https://api.anthropic.com/v1/messages"