v2.0.3
This release introduces Anthropic prompt caching, a deliver_artifact tool for sandboxed agents, a FinalAnswerFilterMiddleware for ReAct streams, state versioning and optimistic concurrency primitives for agent state stores, an AgentProtocolEventBus for pluggable SSE event handling, and a console transcript overhaul, and includes a broad set of reliability fixes across the core reasoning loop, harness, sandbox, and AG-UI protocol layers.
Quick links: Quickstart | V1 Migration Guide | Going to Production
Core / Agent
- Propagate
ToolResultBlock.metadatathrough fine-grained v2 tool-result events (ToolResultTextDeltaEvent/ToolResultDataDeltaEvent/ToolResultEndEvent) so event-stream consumers can access tool-specific context (#2315) - Introduce
AgentProtocolEventBusfor pluggable SSE event handling in the agent-protocol layer (#2634) - State versioning and optimistic concurrency primitives —
VersionedState,ConflictPolicy, andConcurrentSessionModificationException— enablingAgentStateStoreimplementations to detect and reject stale writes
Middleware
FinalAnswerFilterMiddleware— an opt-in filter that buffers text events per model call, suppresses intermediate reasoning-round text when a tool call is produced, and emits only the final user-facing answer (#2926, #2872)
Model Providers
- Anthropic prompt caching: set
cache_controlbreakpoints on tools, system, and the last message; surfacecache_read_input_tokensandcache_creation_input_tokensin usage (#2350, #2223) - Anthropic + Gemini
ResponseParserreadcachedTokensinto usage (#2568) - Explicit no-cache semantics:
CACHE_CONTROL=falsemetadata maps to{"type":"no_cache"}for OpenAI and DashScope converters, so a single message can opt out of caching (#2685, #2684)
Harness / Tools
deliver_artifacttool for sandboxed agents — anArtifactDeliveryTargetSPI + tool that lets an agent inside a sandbox hand out produced files; the workspace prompt now references it when a target is configured, and states plainly that no cross-boundary mechanism exists otherwise (#2667, #2663)- MCP server registration results — an optional
McpServerRegistrationListenerwithSUCCESS/FAILED/SKIPPEDterminal states, so host services can identify and retire unhealthy MCP configurations (#2877, #2875) descriptionfield onSubagentFactoryEntryso the orchestrator gets useful subagent selection context instead of a bare name (#1506, #1504)- Public
ToolkitAPI to assign an already-registered tool to an additional group (#2836, #2835) - Stream ranged file reads in
ReadFileTool— positive line ranges are read incrementally and stop at the requested end line, avoiding loading the full file into memory (#2402)
AG-UI
- CopilotKit + AG-UI full-stack example covering threads, shared state, generative UI, A2UI workbench, and HITL flows end-to-end (#2554)
- Configure agent interruption on AG-UI disconnect (#2719, #2715)
Console
- Transcript overhaul — one bubble per user question, with text and tool calls rendered as ordered content blocks in chronological order;
react-markdownrendering, syntax-highlighted tool I/O cards, SSE auto-reconnect with exponential backoff, andsession.errorrendering (#2640)
Examples
- User binding preferences CRUD API for the DataAgent example (#2711)
- v2 application-layer RAG example (#2794)
- Move
AguiRuntimeContextRequest/AguiRuntimeContextResolver/AguiRequestBodyParserdown from the example layer into theextensions-aguiprotocol layer (#2822) - Replace the Java service control plane with the Go
aistiodcontrol plane, keeping the Java gateway, data, and scheduler planes; theagentscope-builderexample is promoted to the top-levelagentscope-servicemodule - Isolate HITL sessions by user — key
ThreadSessionManager/AgentResolverby(userId, threadId)sohasMemoryand agent reuse no longer mix tenants, and unwrap harness/stop interrupts viaAguiUtil.asReActAgentso demostopThreadand processor interrupts target the live session (#2856, #2855)
Core / Agent
- Propagate
ChatResponse.metadatatoMsg.metadatainReasoningContext(#2931) - Propagate agent state load failures instead of silently replacing conversation state with a fresh session on backend / I/O / decoding errors (#2760)
- Preserve caller-supplied permission context when loading legacy v1 session state, so 1.x → 2.0 migration does not silently downgrade to
DEFAULTpermission mode (#2769, #2768) - Retry empty final responses instead of finishing silently when a reasoning model emits its answer into
reasoning_contentwith emptycontent(#2755, #2750) - Persist the current turn's user input and safe context on model call failure so a resumed session can see the last question (#2799)
- Reconcile dangling
tool_useblocks on interrupt before persistingAgentState, fixing a window between reasoning and acting where pending tool calls were left unmatched (#2410, #2409) - Return suspended results for external tools instead of converting them to generic errors; emit
RequireExternalExecutionEventfor suspended tool calls (#1668, #1582) - Emit
ExternalExecutionResultEventwhen external tool results resume (#2605) - Restore event emitter for detached tool calls (#2483)
- Include field path in tool validation error messages (#2718)
- Simplify
ReActAgentpending tool and error result handling (#2666) - Normalize model-call tools in middleware to avoid duplicate or malformed tool definitions (#2756)
- Avoid event-loop blocking in
WorkspaceContextMiddleware#onSystemPrompt(#2632) - Use call-scoped
AgentStateforReActAgentshutdown retry recovery so theshutdownInterruptedflag is checked and cleared against the per-session state for the current(userId, sessionId)call, instead of the default session state (#2712, #2708)
Model Providers
- Gemini: apply
ModelUtils.applyTimeoutAndRetryto response streams so configured timeout and retry settings take effect (#2356) - RAGFlow: preserve final retry response body so callers can read error details (#2631)
- RAGFlow: type
rerankIdasStringto match the RAGFlow API (#2776)
Harness / Tools / Sandbox
- Stop skill-cache orphan GC from deleting live directories (#2840, #2787)
- Make Nacos skill source paths Windows-safe (#2921)
- Make memory flush fire-and-forget to unblock conversation completion; add
HarnessBackgroundTaskQuiescenceExtensionso tests drain background flush before@TempDirteardown (#2777, #2935) - Handle
SIGTERMin Docker keep-alive to avoid 30s stop delay (#2885) - Bound filesystem search tool output size (#2832)
- Isolate sandbox binding per call to fix concurrent corruption (#2675)
- Make concurrent sandbox uploads safe — unique hydrate temp names and native transfer for relative paths (#2762)
- Fix Windows Docker sandbox session file upload via tar stream (#2557)
- E2B: preserve zero exit code in JSON stream (#2609); reject incomplete process streams without exit code (#2828); reset projection state when recreating sandbox (#2586)
- Kubernetes sandbox: bump fabric8 to 7.8.0 to fix watch NPE with Jackson 2.19+ (#2766); follow redirects so file API downloads survive gateway 307 (#2748)
- Keep persisted snapshot id when resume falls back to fresh create (#2775)
- Add reply IDs to subagent lifecycle events (#2680)
- Inherit memory config in subagents (#2611)
- Make orphan sweep timeout boundary inclusive (#2619)
- Do not downgrade a user-interrupted session to a compaction failure (#2659)
AG-UI
- Assign per-tool result message ids (#2908)
- Emit frontend tool args from fragment deltas (#2874)
- Isolate HITL sessions by user (#2856)
- Emit AG-UI interrupt for permission-type HITL tool confirmation (#2495, #2437)
- Parse request bodies with Jackson 2 codec for Boot 4 / multimodal
MessageContent(#2638) - Suppress
ReActAgenthandshake events in AG-UI converters (#2639) - Stop emitting
RUN_FINISHEDafterRUN_ERRORby default (#2646) - Cancel MVC subscription on disconnect (#2786)
Protocol
- Clear task submit context before publishing terminal status to close an
awaitrace inAgentProtocolTaskStore(#2802)
Storage
- MySQL: remove path-separator check from
MysqlAgentStateStoresession id validation (#2022)
Console / Frontend
Nightly
- d2d3149: [build] add a daily workflow to update the pinned CDDL specs (#17972) (Titus Fortner) #17972
- 9d0ae9e: [py] resolve aliased CddlType members when generating BiDi annotations (Titus Fortner)
- 56e5c61: [py] stop sharing the default ClientConfig proxy between instances (Titus Fortner)
- f580b8d: [build] fix invalid escape sequence in the Java atom line format (Titus Fortner)
- 23c8a89: [py] fix swapped assert arguments in async script array tests (Titus Fortner)
- 50cc58f: [py] add missing assert in device serial options test (Titus Fortner)
- 802accd: [py] remove no-op port self-assignment from the test web server (Titus Fortner)
- ed2dda5: [rust] fix Windows architecture detection under WOW64 (#17987) (Titus Fortner) #17987
- 77ea3d0: [build] build Selenium Manager Linux binaries natively and pin the Rust toolchain (#17988) (Titus Fortner) #17988
- 0a6ea44: [rb] assert Safari returns a sharedId for a located node instead of failing on our own construction (Titus Fortner)
- 539dfe2: [rb] fix local dev execution (Titus Fortner)
- 2e98990: [build] Automated Dependency Update (#17937) (Selenium CI Bot) #17937
- 2df05d0: [rb] report the driver version that actually served each spec run (Titus Fortner)
- 5807971: [build] stop uploading changes.patch as a GitHub release asset (Titus Fortner)
Release 3.4.3
Click to expand
- [DSIP-107][Scheduler] Add schedule missed fire policy (#18464) @liang-wenjie
Click to expand
- [Improvement-18040] [Doc] Update the parameter priority explanation in the docs. (#18321) @njnu-seafish
- [Doc-18322][Parameter] Add a note to the parameter priority documentation specifying and fix some issues (#18323) @njnu-seafish
- [Improvement-18304][API] Remove dead code after t_ds_relation_user_alertgroup… (#18316) @det101
- [Improvement-18332][Worker] Remove plaintext passwords from the logs (#18333) @njnu-seafish
- [Improvement-17563][Helm] Update mysql helm chart version (#18336) @qiuyanjun888
- [Doc-18326][Parameter] Fix and Enrich the documentation for parameter priority. (#18327) @njnu-seafish
- [Improvement-18354][UI] Change the description field to optional (#18355) @njnu-seafish
- [Improvement-18359][UI] Change the description field to optional in k8s config (#18360) @njnu-seafish
- [Improvement-17933][api] Restrict audit logs to current user for non-admin users (#18368) @qiuyanjun888
- [Improvement-18403][API&Security] Avoid raw password exposure in user parameter validation errors (#18404) @njnu-seafish
- [Improvement-18412][api] Fix missing validation for resource preview limit parameter (#18411) @destinyoooo
- [Improvement-18388][TASK]Killed shell tasks should be displayed as FAILURE (#18407) @HomminLee
- [Improvement-18437][API] Add index idx_project_submit_time for queryTaskInstanceListPaging (#18438) @njnu-seafish
- [Improvement-18439][API]Add composite index idx_project_start_time for workflow instance query (#18440) @njnu-seafish
- [Improvement-18441][API&DAO] Optimize TaskInstanceMapper to exclude large text fields from list queries (#18442) @njnu-seafish
- [Doc-18474][Upgrade] Fix zh/en incompatible upgrade docs out of sync (#18478) @njnu-seafish
- [Improvement-18556][API] Remove obsolete dynamic sub-workflow API (#18557) @ruanwenjun
- [Improvement-18558][API] Harden user list access and responses (#18560) @ruanwenjun
- [Improvement-18563][API] Refine datasource authorization list APIs (#18564) @ruanwenjun
- [Improvement-18568][API] Remove obsolete task update-with-upstream API (#18569) @ruanwenjun
- [Improvement-18580][api] Fix typo in DataSourceServiceImpl log message (#18581) @kittimzhe
- [Improvement-18443][API&DAO] Optimize WorkflowInstanceMapper to exclude large text fields from list queries (#18444) @njnu-seafish
- [Improvement-18589][API] Align cluster query permissions (#18590) @ruanwenjun
- [Chore] Remove unused code (#18599) @SbloodyS
Click to expand
- [Fix-18330] Replace HashMap with ConcurrentHashMap in UserGroupInformationFactory to avoid ConcurrentModificationException (#18331) @eye-gu
- [Fix-18340][Helm] Fix duplicate app.kubernetes.io/name label on ConfigMap (#18341) @vlaborie
- [Fix-18346] countTaskInstanceStateByProjectCodes uses submit_time filtering (#18347) @eye-gu
- [Improvement-17705] Add kill-application-when-task-failover logic (#18353) @SbloodyS
- [Fix-17794] Fix rerun workflow instance should follow the specified workerGroup parameter (#18352) @SbloodyS
- [Fix-18247] Fix when forceTaskSuccess is performed on the last unsuccessful workflow instance, the workflow instance cannot be reset to the success state (#18351) @SbloodyS
- [Fix-18307][API] The frontend is correctly using the preferred values of the associated project for task creating and workflow scheduling (#18308) @njnu-seafish
- [Fix-18378] Fix list resources returned only 1000 records in s3 storage type (#18381) @SbloodyS
- [Fix-18391] [Alert] Remove redundant plugin definition table existence check during AlertServer startup (#18392) @njnu-seafish
- [Fix-18409][Common] Fix DAG.addEdge accepting an edge that creates a cycle when paths converge (#18410) @nkuprins
- [Fix-18406] Fix task instance failed but workflow instance remains in running state while using continue strategy with a blocked intermediate predecessor (#18415) @SbloodyS
- [Fix-18338] Check task if it's waiting for TaskGroup slot when pause/kill (#18414) @SbloodyS
- [Fix-18446][task-sql]Persist sqlSource and sqlResource fields when saving SQL task node (#18447) @nanxiuzi
- [Fix-18540][Master] Reset the runtime state when recreating a failed task instance (#18541) @SEPURI-SAI-KRISHNA
- [Fix-18538][Master] Schedule task retry at endTime + retryInterval (#18539) @SEPURI-SAI-KRISHNA
- [Fix-18562][Common] FileUtils.writeContent2File fails for parentless paths (#18408) @hiSandog
- [Fix-18559][API] Align workflow mutations with project write permissions (#18561) @ruanwenjun
- [Fix-18570][Master] Detect wrapped CommandDuplicateHandleException in bootstrapError (#18570) (#18573) @hellodml
- [Fix-18565][API] Validate datasource access for task definitions (#18566) @ruanwenjun
- [Doc-18579] Fix malformed links in datasource and configuration docs (#18578) @kittimzhe
- [Fix-18582][API] Align actuator endpoint matching (#18583) @ruanwenjun
- [Fix-18596][API] Enforce permission checks for sub-workflow references (#18597) @ruanwenjun
- [Fix-17883] Fix K8s Alert HTTP test sending failed by using IP for non-StatefulSet pods (#18574) @zhang-arvin
- [Fix-18389][DataX] Read job definition from attached resource file when custom json is empty (#18434) @nikhiln64
- [Fix-18576][Dependent Task] Fix parsing for ALL dependent tasks (#18605) @yan9651688
- [Fix-18601][Alert] Align Alert Script test-send behavior (#18602) @ruanwenjun
- [Fix-18604][Master] Preserve forced-success state when recovering failed workflows (#18608) @wcmolin
Click to expand
- [Chore][API] Remove obsolete cluster query-by-code API (#18584) @ruanwenjun
- [Chore] Update next release version to 3.4.3 (#18613) @ruanwenjun
Click to expand
- [Chore] Fix sonar token leak (#18363) @SbloodyS
- [Chore] Remove sonar check (#18374) @SbloodyS
- [Chore] Fix auto labeler error (#18375) @SbloodyS
Nightly
- 989e662: [grid] Fix 500 when downloading a file whose name contains spaces (#17968) (Ashraf Ali) #17968
- d6bf2fb: [java] add the LICENSE and NOTICE files to the jars created (#17601) (joerg1985) #17601
- f3ccc60: [java] Remove deprecated GET /session/{sessionId}/se/files/{fileName} endpoint (#17982) (Diego Molina) #17982
SLF4J 2.0.19
-
When the fluent API was used with
XLogger/LoggerWrapperin the slf4j-ext module, caller location was incorrectly reported. To correct this,LoggerWrappernow delegatesmakeLoggingEventBuilder()to the wrapped logger so that the application caller can be correctly extracted. This issue was reported in issues/464. -
In
slf4j-api/DefaultLoggingEventBuilder, a failingtoString()invocation on a key-value value, includingStackOverflowError, no longer aborts logging. The builder now substitutes[FAILED toString()], matching the existing behaviour ofMessageFormatterfor message arguments. This issue was reported in issues/448. -
The
isLoggable()method inSLF4JPlatformLoggernow mapsSystem.Logger.Level.ALLandLevel.OFFthe same way aslog(), that is ALL as TRACE and OFF as ERROR, instead of treating both as always loggable. This is a follow-up to the changes introduced in 2.0.17. See issues/430. -
Published JAR files now package each module's own LICENSE.txt under META-INF/. Previously the parent POM copied the repository-root MIT license into every module, so Apache-2.0 modules such as jcl-over-slf4j and log4j-over-slf4j shipped the wrong license text. This issue was reported in issues/465.
-
A bit-wise identical binary of this version can be reproduced by building from source code at commit f0fc3e52a16d5053039495f4f3b64d191508204f associated with the tag v_2.0.19. Release built using Java "21" 2023-10-17 LTS build 21.0.1.+12-LTS-29 under Linux Debian 11.6.