Repository navigation
Releases
Releases · spring-ai-community/spring-ai-agent-utils
v0.13.0
What's Changed
- fix: flatten
TodoWritetool 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 nowtodoWrite(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 callstodoWritedirectly from Java needs updating;TodoEventHandlerstill receivesTodos.
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
ClassPathResourceskills location such asMETA-INF/skillsnow 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):
ClassPathResourceskill locations failed withUnsupported 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,GlobToolandListDirectoryToolresolve a relativepathagainst 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). DockerCliExecBackendon Windows (#88): arguments containing double quotes reacheddocker.exemangled, so commands silently ran a bareecho(exit 0, empty output, no side effects). They are now quoted for the Windows command line.- Misleading
Readtool description (#85, #86): no longer claims to read images, PDFs and Jupyter notebooks. Bashtool description: the git commit and pull request examples no longer tell the model to add "Generated with Claude Code" andCo-Authored-By: Claudelines 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 asSKILL.mdfiles, 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
Tasktool.
Examples and docs
- New
observability-demo: traces tool calls with aToolCallListenerand stops running turns withInterruptAdvisor(type/stop, or a per-turn tool-call budget).code-agent-demonow traces tool calls and stops turns that exceedagent.turn.timeout. todo-demo,subagent-demo,subagent-a2a-demoandcode-agent-demostart withoutBRAVE_API_KEY, and the commented-out OpenAI starter now uses the correctspring-ai-starter-model-openaiartifact (#71, #72).- The guides now live only in the documentation site; the duplicate copy in
spring-ai-agent-utils/docswas removed.
Dependencies
- Spring AI is unchanged (2.0.1).
- The optional
spring-ai-sessiondependency (used byAutoDreamServicefor cross-session recall) moves from 0.7.0 to 0.10.0.
New Contributors
- @yamakze made their first contribution in #86
- @lyxnbclass made their first contribution in #89
- @Ashfaqbs made their first contribution in #90
- @Hugo-DDT made their first contribution in #93
- @pengbo made their first contribution in #72
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
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)
ExecBackendSPI (org.springaicommunity.agent.common.exec) — pluggable command execution;ShellTools.builder().execBackend(...)andAgentEnvironment.gitStatus(ExecBackend).LocalExecBackend(the default) addsworkingDirectory,cleanEnvironmentandshellCommandoptions.WorkspaceSPI (org.springaicommunity.agent.common.workspace) — root directory + host-to-model path display; one-callworkspace(...)option on the tool builders,SkillsToolbase-path mapping,AgentEnvironment.info(Workspace).- Directory confinement for search tools —
allowedDirectory(...)onGrepTool,GlobToolandListDirectoryTool, 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 DockerExecBackendrunning commands in a sandbox container (newexec-backends/module group, managed by the BOM).InterruptAdvisor(org.springaicommunity.agent.advisors) — cooperative cancellation of in-flight agentic turns. Polls an application-suppliedBooleanSupplierbefore 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 newTurnInterruptedException(withstream(), 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 aToolCallbackdecorator.beforeCallreturns an opaque correlation context handed back toafterCall/onError;onErrorreturns an error string to report to the model ornullto rethrow. Definition and metadata are delegated untouched, so wrapping composes with any callback source. If you had your ownToolCallbackdecorators for logging, these can be replaced with a listener.
Full Changelog: v0.11.0...v0.12.0
v0.11.0
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
codinginTodoWriteToolprompt to make it more general by @kezhenxu94 in #67
New Contributors
- @caio-henrique made their first contribution in #63
- @zz-zhi54 made their first contribution in #57
- @kezhenxu94 made their first contribution in #64
- @jiashi19 made their first contribution in #34
Full Changelog: v0.10.0...v0.11.0
v0.10.0
v0.9.0
v0.8.0
v0.7.0
v0.6.0
v0.5.0
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
- @markpollack made their first contribution in #10
- @jamesward made their first contribution in #23
Full Changelog: v0.4.2...v0.5.0