Skip to content

v2.3.0

Choose a tag to compare

@jztan jztan released this 10 May 14:12
· 207 commits to develop since this release

What's New in v2.3.0

Added

  • POST /upload accepts multipart files (PDF, text, markdown, csv, json, png/jpeg/webp/gif, zip) up to 25 MB and returns a file_id scoped to a conversation. Uploads land under <workspace>/.blueclaw/uploads/<conversation_id>/<file_id>. Oversize requests are rejected by a Content-Length pre-check before the body is read; the same cap is also enforced during streaming write as a defense in depth.
  • MessageRequest.file_ids (max 10 per request) lets clients reference uploaded files. The server resolves each id to its absolute path and prepends a system note to the agent prompt, so existing shell, pdf-mcp, and web tools can read attachments without provider-specific wiring.
  • Playground gains a paperclip button, drag-and-drop, and removable attachment chips. Files upload immediately and are sent with the next message; chips clear after a successful send.
  • Optional pip extras for provider SDKs: blueclaw[anthropic], blueclaw[ollama], blueclaw[openai], blueclaw[gemini]. Strands lazy-imports these SDKs only when the matching provider is selected, so they no longer ship as runtime dependencies of the base install.
  • Native vision support for image attachments. When a file_id resolves to a PNG/JPEG/GIF/WEBP, the server now passes the bytes to the agent as a Strands image content block instead of just a path note, so vision-capable models (Anthropic, OpenAI, Bedrock, Ollama vision tags) can actually see pixels. Non-image attachments keep the path-prefix flow.
  • @<path> attachments in the CLI. Both blueclaw (interactive) and blueclaw run "..." now scan user input for whitespace-delimited @<path> tokens, resolve each against the cwd (or the absolute path), and route the file through the same image-vs-path logic as the HTTP API. Combined with the macOS/iTerm shift+drag behavior — which inserts a file's absolute path at the cursor — this gives CLI users a Claude-Code-style attach UX. Tokens that don't resolve (e.g. @username, user@example.com) pass through unchanged; tokens that look like paths but don't resolve emit a yellow "could not attach" warning so typos are immediately diagnosable.
  • Bare absolute paths and quoted paths (single or double) auto-attach without an @-prefix. Pasting /Users/foo/pic.png or '/Users/foo/with space.pdf' into the prompt is enough — useful for shift+drag flows that don't add the @. Bare relative paths (pic.png) still require the explicit @ to avoid attaching casual mentions.

Fixed

  • Inline images larger than ~3.5 MB raw (~5 MB base64) are now rejected with a clear "image too large for inline attachment" message instead of letting Anthropic return a 400 mid-stream. Affects both the CLI @<path> flow and HTTP file_ids.
  • The interactive REPL no longer exits silently when the agent or attachment-builder raises an exception. Per-turn errors are printed in red and the loop continues; the outer "session error" guard also surfaces its message instead of swallowing it.

Changed

  • Workspace.purge_old_sessions now also removes the matching uploads/<cid> directory and any orphaned tmp-* upload directories older than trace_retention_days.

Installation

pip install blueclaw==2.3.0

Links