Skip to content

v0.27.0

Choose a tag to compare

@yuanhao yuanhao released this 04 Nov 15:44
· 8 commits to main since this release
3274715

Breaking for struct literals only: ReadFileTool, WriteFileTool and BashTool gain public fields (read_log, max_image_bytes, raw_output). Literals that use ..Default::default() are unaffected. Ships with yoagent-rutis 0.13.0 and yoagent-workers 0.4.0.

Safer built-in tools

  • Partial reads: write_file from default_tools() refuses to overwrite a file it has read only in part (tools::ReadLog, #421).
  • Parallel edits: read_file, write_file and edit_file take turns on a file, so parallel edits no longer lose one. 32 parallel edits of one file used to leave 1 (#423).
  • Images: read_file sends only PNG, JPEG and WebP, typed by content, up to 8000 px and 3.75 MB (with_max_image_bytes). An image a provider refuses would have failed every later request (#423).
  • bash: strips ANSI sequences (with_raw_output(true) keeps them) and names the signal that killed it (#422).
  • edit_file: keeps CRLF line endings, and its "did you mean" snippet is numbered and bounded (#422).

Loop and providers

  • Cut-off answers: on_stop also judges an answer cut off at the output limit, so a required verifier is no longer bypassed (#423).
  • Unanswered tool calls (a failed, cancelled or killed run) are answered when the next run starts, as "not run" or "outcome unknown", and never re-run. continue_loop used to panic on such a history (#424).
  • Images on OpenAI-compatible APIs: images from tool results now reach OpenAI-compatible models in a user message. OpenAI used to answer 400, and DeepSeek ignored the image (#424).
  • ModelConfig::with_image_input(false): a text-only model gets a note in place of each image (#424).
  • Gemini: RECITATION is a refusal, not a cut-off (#423).
  • Opt-in: SubAgentTool::with_max_depth and Agent::with_max_retry_after (#422).
  • Library principles written down in CLAUDE.md and docs/design-philosophy.md (#420).

Full list: CHANGELOG.md.