Skip to content

Releases

v0.13.0

Choose a tag to compare

@tzolov tzolov released this 03 Oct 17:33

What's Changed

  • fix: flatten TodoWrite tool parameter to a plain list of todo items by @kezhenxu94 in #74
  • fix(tools): describe Read as UTF-8 text only by @yamakze in #86
  • fix(tools): make Brave web search tests deterministic by @lyxnbclass in #89
  • fix: aggregate skills across multiple SkillsJars sharing the same classpath prefix by @Ashfaqbs in #90
  • feat: add programmatic skill registration via SkillsTool.Builder.addSkill by @Hugo-DDT in #93
  • feat: enhance A2A subagent description to include AgentCard skills and examples by @caio-henrique in #68
  • Add completion callback for tool invocation cleanup by @zz-zhi54 in #96
  • Fix todo-demo first-run failures by @pengbo in #72

Also fixed in this release: #94 (relative paths in workspaces), #56 (skills in GraalVM native images), #88 (DockerCliExecBackend on Windows), and the A2A agent card URL (based on the analysis in #70 by @caio-henrique).

Breaking change

  • TodoWriteTool.todoWrite(Todos) is now todoWrite(List<TodoItem>) (#74). The tool's input schema was nested twice ({"todos": {"todos": [...]}}), so most model calls failed to deserialize; models now send the flat {"todos": [...]} they naturally produce. Only code that calls todoWrite directly from Java needs updating; TodoEventHandler still receives Todos.

See the 0.12.0 to 0.13.0 migration guide for before/after code and all behavioral changes.

Fixes

  • Multiple SkillsJars (#28, #90): a ClassPathResource skills location such as META-INF/skills now collects skills from every classpath entry (your own classes directory and all JARs) instead of only the first. When two locations define the same skill name, the first is kept and a warning is logged.
  • Skills in GraalVM native images (#56): ClassPathResource skill locations failed with Unsupported resource protocol for JAR loading: resource; they now load without registering each file. Native-image hints also cover .claude/skills/**/*.md.
  • Relative paths in workspaces (#94): GrepTool, GlobTool and ListDirectoryTool resolve a relative path against the working directory (the workspace root) instead of the JVM's working directory, which denied valid paths when the JVM ran outside the workspace (for example in a container).
  • DockerCliExecBackend on Windows (#88): arguments containing double quotes reached docker.exe mangled, so commands silently ran a bare echo (exit 0, empty output, no side effects). They are now quoted for the Windows command line.
  • Misleading Read tool description (#85, #86): no longer claims to read images, PDFs and Jupyter notebooks.
  • Bash tool description: the git commit and pull request examples no longer tell the model to add "Generated with Claude Code" and Co-Authored-By: Claude lines to your users' commits and PRs.
  • A2A agent card URL: correct for agent URLs with a trailing slash (http://host:8080/ previously failed), card paths without a leading /, and percent-encoded paths.
  • Offline builds (#87, #89): the Brave web search tests no longer call the live API.

New

  • SkillsTool.Builder.addSkill(name, description, content) (#50, #93): register skills that are not packaged as SKILL.md files, for example generated at runtime or loaded from a database.
  • ToolCallListener.afterCompletion(...) (#96): a default method called once after every tool invocation, on success or failure, for per-invocation cleanup.
  • Richer A2A subagent descriptions (#68): the agent card's skills and examples are listed under each remote agent in the Task tool.

Examples and docs

  • New observability-demo: traces tool calls with a ToolCallListener and stops running turns with InterruptAdvisor (type /stop, or a per-turn tool-call budget). code-agent-demo now traces tool calls and stops turns that exceed agent.turn.timeout.
  • todo-demo, subagent-demo, subagent-a2a-demo and code-agent-demo start without BRAVE_API_KEY, and the commented-out OpenAI starter now uses the correct spring-ai-starter-model-openai artifact (#71, #72).
  • The guides now live only in the documentation site; the duplicate copy in spring-ai-agent-utils/docs was removed.

Dependencies

  • Spring AI is unchanged (2.0.1).
  • The optional spring-ai-session dependency (used by AutoDreamService for cross-session recall) moves from 0.7.0 to 0.10.0.

New Contributors

Thanks also to everyone who reported issues for this release: @mands, @habuma, @hujiayi0126, @joshlong, @git-syl and @mumuzi6.

Full Changelog: v0.12.0...v0.13.0

v0.12.0

Choose a tag to compare

@tzolov tzolov released this 30 Aug 22:43

What's Changed

  • Introduce ExecBackend SPI and route ShellTools through it by @tzolov in #76
  • Add allowedDirectories confinement to Grep/Glob/ListDirectory tools by @tzolov in #77
  • Add Workspace abstraction for sandbox-truthful paths and prompts by @tzolov in #78
  • Add DockerCliExecBackend for sandboxed command execution by @tzolov in #79
  • Add InterruptAdvisor and ToolCallListener for agent loop control by @tzolov in #84

New in 0.12.0 (opt-in, no migration required)

  • ExecBackend SPI (org.springaicommunity.agent.common.exec) — pluggable command execution; ShellTools.builder().execBackend(...) and AgentEnvironment.gitStatus(ExecBackend). LocalExecBackend (the default) adds workingDirectory, cleanEnvironment and shellCommand options.
  • Workspace SPI (org.springaicommunity.agent.common.workspace) — root directory + host-to-model path display; one-call workspace(...) option on the tool builders, SkillsTool base-path mapping, AgentEnvironment.info(Workspace).
  • Directory confinement for search tools — allowedDirectory(...) on GrepTool, GlobTool and ListDirectoryTool, sharing the FileSystemTools jail semantics. Note: when confinement is configured, directory traversal does not follow symbolic links (unconfined behavior is unchanged).
  • spring-ai-agent-utils-docker-cli — a Docker ExecBackend running commands in a sandbox container (new exec-backends/ module group, managed by the BOM).
  • InterruptAdvisor (org.springaicommunity.agent.advisors) — cooperative cancellation of in-flight agentic turns. Polls an application-supplied BooleanSupplier before each model request; its default order (HIGHEST_PRECEDENCE + 400) sits just inside the tool-calling advisor so the check re-runs on every tool-call round. When the signal fires, the turn unwinds with the new TurnInterruptedException (with stream(), it arrives as the Flux error signal). Replaces hand-rolled cancellation flags checked inside tools.
  • ToolCallListener + ToolCallListeners.wrap/wrapAll (org.springaicommunity.agent.tools) — observe every tool invocation (audit logs, SSE progress, metrics) without writing a ToolCallback decorator. beforeCall returns an opaque correlation context handed back to afterCall/onError; onError returns an error string to report to the model or null to rethrow. Definition and metadata are delegated untouched, so wrapping composes with any callback source. If you had your own ToolCallback decorators for logging, these can be replaced with a listener.

Full Changelog: v0.11.0...v0.12.0

v0.11.0

Choose a tag to compare

@tzolov tzolov released this 26 Aug 11:50

What's Changed

  • fix: handle A2A task update events and wait for completion by @caio-henrique in #63
  • feat: Add ToolContext to AskUserQuestionTool and TodoWriteTool by @zz-zhi54 in #57
  • Fix sub-agent tool call observability by dropping manual ToolCallingAdvisor by @tzolov in #65
  • fix(doc): fix typo of AutoAutoMemoryToolsAdvisor by @kezhenxu94 in #64
  • Fix Windows absolute path resolution in ClaudeSubagentResolver by @jiashi19 in #34
  • Add Auto-Dream memory consolidation with cross-session recall by @tzolov in #66
  • fix: remove coding in TodoWriteTool prompt to make it more general by @kezhenxu94 in #67

New Contributors

Full Changelog: v0.10.0...v0.11.0

v0.10.0

Choose a tag to compare

@tzolov tzolov released this 12 Jun 12:39

Full Changelog: v0.9.0...v0.10.0

v0.9.0

Choose a tag to compare

@tzolov tzolov released this 07 Jun 14:10

What's Changed

  • Upgrade to Spring AI 2.0.0-RC1 and fix null guards in logging advisors by @tzolov in #55

Full Changelog: v0.8.0...v0.9.0

v0.8.0

Choose a tag to compare

@tzolov tzolov released this 25 May 10:50

What's Changed

  • Add GraalVM native image support for SkillsTool by @tzolov in #51
  • Upgrade to Spring AI 2.0.0-M7 and fix breaking API changes by @tzolov in #52

Full Changelog: v0.7.0...v0.8.0

v0.7.0

Choose a tag to compare

@tzolov tzolov released this 06 Apr 22:32

What's Changed

  • Add MemoryTools for long-term agent memory by @tzolov in #35
  • Add ref docs as mkdocs by @tzolov in #38

Full Changelog: v0.6.0...v0.7.0

v0.6.0

Choose a tag to compare

@tzolov tzolov released this 06 Apr 22:31

Full Changelog: v0.5.0...v0.6.0

v0.5.0

Choose a tag to compare

@tzolov tzolov released this 24 Feb 09:39

What's Changed

  • Improve SkillsTool and update skills-demo example by @tzolov in #9
  • Add workspace context support and simplify Read tool by @markpollack in #10
  • Add CommandLineQuestionHandler for AskUserQuestionTool by @tzolov in #11
  • Remove unused ToolContext parameters by @tzolov in #16
  • Extract subagent SPI into multi-module architecture by @tzolov in #20
  • add support for skills in classpath jars by @jamesward in #23
  • Add spring-ai-agent-utils-bom module and update docs to 0.5.0 by @tzolov in #27

New Contributors

Full Changelog: v0.4.2...v0.5.0

v0.4.2

Choose a tag to compare

@tzolov tzolov released this 27 Jan 13:21

Full Changelog: v0.4.1...v0.4.2