|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: 'A2A Java SDK 1.4.0.Final Released' |
| 4 | +date: 2026-09-28 |
| 5 | +tags: ai a2a |
| 6 | +synopsis: 'A2A Java SDK 1.4.0.Final is now available -- with SSE configuration improvements, a breaking change in the multi-tenancy @Tenant qualifier, ITK enhancements, and a comprehensive wave of bug fixes.' |
| 7 | +author: ehsavoie |
| 8 | +image: announce.png |
| 9 | +--- |
| 10 | + |
| 11 | +image::announce.png[A2A Java SDK 1.4.0.Final announcement] |
| 12 | + |
| 13 | +I am happy to announce the release of link:https://github.com/a2aproject/a2a-java/releases/tag/v1.4.0.Final[A2A Java SDK 1.4.0.Final]. This release consolidates the multi-tenancy API with an important breaking change, brings SSE configuration improvements, strengthens interoperability testing, and delivers a large set of bug fixes across all transports. |
| 14 | + |
| 15 | +NOTE: This release contains a **breaking change** affecting the `@Tenant` qualifier. See the <<migration>> section for details. |
| 16 | + |
| 17 | +== What's New |
| 18 | + |
| 19 | +=== Multi-Tenancy: `@Tenant` Qualifier Consolidation |
| 20 | + |
| 21 | +The `@Tenant` qualifier annotation has been moved **from** `a2a-java-extras-multitenancy` **into** `server-common` (link:https://github.com/a2aproject/a2a-java/pull/1176[\#1176]). This is a **breaking change** -- see <<migration>> below. |
| 22 | + |
| 23 | +Moving the qualifier into `server-common` means the CDI runtime can now correctly filter out tenant-qualified beans at all `@PublicAgentCard` and `@ExtendedAgentCard` injection points. Previously, annotating a tenant card with both `@Tenant("x")` and `@PublicAgentCard` would cause CDI ambiguity and result in 404 errors on the default route. |
| 24 | + |
| 25 | +Additional improvements in this area: |
| 26 | + |
| 27 | +* Tenant cards annotated with both `@Tenant("x")` and `@PublicAgentCard` now take precedence over bare `@Tenant` cards at the public card endpoint. |
| 28 | +* Duplicate `@ExtendedAgentCard` registrations for the same tenant are now rejected at startup instead of silently winning arbitrarily. |
| 29 | +* Missing default `AgentExecutor` beans now throw an explicit exception at startup rather than causing silent runtime failures. |
| 30 | +* Agent card resolution now correctly falls back to the router even when no default bean is present (link:https://github.com/a2aproject/a2a-java/pull/1184[\#1184]). |
| 31 | + |
| 32 | +=== SSE Configuration |
| 33 | + |
| 34 | +A new `SSEParserConfig` class (link:https://github.com/a2aproject/a2a-java/pull/1149[\#1149]) makes Server-Sent Events parsing configurable per client. The default per-line size limit has been raised to 1 MB, resolving issues where large message payloads were rejected by the SSE parser. |
| 35 | + |
| 36 | +=== `application/a2a+json` Content-Type Support |
| 37 | + |
| 38 | +The server transports now recognize `application/a2a+json` as a valid content type alongside `application/json` (link:https://github.com/a2aproject/a2a-java/pull/1181[\#1181]), improving out-of-the-box interoperability with clients that send this media type. |
| 39 | + |
| 40 | +=== ITK Enhancements |
| 41 | + |
| 42 | +The ITK test agent gains ACTS SUT behavior support via YAML configuration (link:https://github.com/a2aproject/a2a-java/pull/1150[\#1150]), along with CI workflow integration and an auth precondition implementation (link:https://github.com/a2aproject/a2a-java/pull/1157[\#1157]). These additions make it easier to configure and run interoperability tests against the upstream ACTS test harness. |
| 43 | + |
| 44 | +=== Documentation Improvements |
| 45 | + |
| 46 | +* A complete `TaskAuthorizationProvider` implementation example has been added to the documentation (link:https://github.com/a2aproject/a2a-java/pull/1146[\#1146]). |
| 47 | +* Security advisory link:https://github.com/a2aproject/a2a-java/security/advisories/GHSA-4fpj-g9jf-9rgg[GHSA-4fpj-g9jf-9rgg] has been incorporated into the threat model (link:https://github.com/a2aproject/a2a-java/pull/1148[\#1148]). |
| 48 | +* JDK HttpClient's restricted `Host` header behavior and the Vert.x HTTP client as an alternative are now documented (link:https://github.com/a2aproject/a2a-java/pull/1180[\#1180]). |
| 49 | + |
| 50 | +== Bug Fixes |
| 51 | + |
| 52 | +* **Task history** -- current status messages are no longer incorrectly included in task history (link:https://github.com/a2aproject/a2a-java/pull/1122[\#1122]) |
| 53 | +* **Push notification config** -- omitted push config IDs are now accepted in both HTTP (link:https://github.com/a2aproject/a2a-java/pull/1092[\#1092]) and gRPC (link:https://github.com/a2aproject/a2a-java/pull/1163[\#1163]) transports |
| 54 | +* **Push notification ordering** -- delivery order of push notifications per task is now preserved (link:https://github.com/a2aproject/a2a-java/pull/1156[\#1156]) |
| 55 | +* **gRPC `Part.metadata`** -- the `metadata` field is now correctly mapped in 0.3 gRPC classes (link:https://github.com/a2aproject/a2a-java/pull/1169[\#1169]) |
| 56 | +* **Blank task/context IDs** -- blank `taskId` and `contextId` values in `messages/send` are treated as absent (link:https://github.com/a2aproject/a2a-java/pull/1172[\#1172]) |
| 57 | +* **JSON null preservation** -- explicit JSON nulls in value mappings are now preserved correctly (link:https://github.com/a2aproject/a2a-java/pull/1174[\#1174]) |
| 58 | +* **Relative redirects** -- relative `Location` header values in HTTP redirects are now resolved against the request URI (link:https://github.com/a2aproject/a2a-java/pull/1162[\#1162]) |
| 59 | +* **SSE terminal callback** -- exactly one terminal SSE callback is now guaranteed (link:https://github.com/a2aproject/a2a-java/pull/1173[\#1173]) |
| 60 | +* **`A2ACardResolver` fallback URL** -- a fallback URL is now always provided (link:https://github.com/a2aproject/a2a-java/pull/1179[\#1179]) |
| 61 | +* **Event bus processor** -- the event bus processor now starts correctly when using manual (non-CDI) wiring (link:https://github.com/a2aproject/a2a-java/pull/997[\#997]) |
| 62 | +* **Terminal enqueue recovery** -- failed terminal enqueue operations are now recovered (link:https://github.com/a2aproject/a2a-java/pull/1185[\#1185]) |
| 63 | + |
| 64 | +[[migration]] |
| 65 | +== Migration from 1.3.x |
| 66 | + |
| 67 | +Update your BOM version: |
| 68 | + |
| 69 | +[source,xml] |
| 70 | +---- |
| 71 | +<dependencyManagement> |
| 72 | + <dependencies> |
| 73 | + <dependency> |
| 74 | + <groupId>org.a2aproject.sdk</groupId> |
| 75 | + <artifactId>a2a-java-sdk-bom</artifactId> |
| 76 | + <version>1.4.0.Final</version> |
| 77 | + <type>pom</type> |
| 78 | + <scope>import</scope> |
| 79 | + </dependency> |
| 80 | + </dependencies> |
| 81 | +</dependencyManagement> |
| 82 | +---- |
| 83 | + |
| 84 | +[[tenant-migration]] |
| 85 | +=== `@Tenant` Import Change (Breaking) |
| 86 | + |
| 87 | +The `@Tenant` qualifier has moved from the `a2a-java-extras-multitenancy` module into `server-common`, and its package has changed accordingly. Any class that imports `@Tenant` must be updated: |
| 88 | + |
| 89 | +[source,java] |
| 90 | +---- |
| 91 | +// Before (1.3.x) -- from the extras module |
| 92 | +import org.a2aproject.sdk.extras.multitenancy.Tenant; |
| 93 | +
|
| 94 | +// After (1.4.0) -- from server-common |
| 95 | +import org.a2aproject.sdk.server.multitenancy.Tenant; |
| 96 | +---- |
| 97 | + |
| 98 | +The annotation's semantics are unchanged. No other code modifications are required. |
| 99 | + |
| 100 | +=== Missing Default `AgentExecutor` Now Throws |
| 101 | + |
| 102 | +If a CDI-based multi-tenant deployment has no default `AgentExecutor` bean, the server will now throw an explicit exception at startup. Previously this would compile and deploy successfully but fail silently at runtime. Ensure a default `AgentExecutor` bean is always registered, or supply an `AgentExecutorRouter` programmatically via the builder: |
| 103 | + |
| 104 | +[source,java] |
| 105 | +---- |
| 106 | +AgentExecutorRouter router = tenant -> |
| 107 | + executors.getOrDefault(tenant, defaultExecutor); |
| 108 | +
|
| 109 | +DefaultRequestHandler handler = DefaultRequestHandler.builder() |
| 110 | + .agentExecutorRouter(router) |
| 111 | + .taskStore(taskStore) |
| 112 | + .queueManager(queueManager) |
| 113 | + // ... |
| 114 | + .build(); |
| 115 | +---- |
| 116 | + |
| 117 | +== Contributors |
| 118 | + |
| 119 | +A big thank you to all contributors of this release -- and a warm welcome to those joining for the first time! |
| 120 | + |
| 121 | +link:https://github.com/ehsavoie[@ehsavoie], link:https://github.com/kabir[@kabir], link:https://github.com/JakubWorek[@JakubWorek], link:https://github.com/014-code[@014-code], link:https://github.com/1fanwang[@1fanwang], link:https://github.com/hutiefang76[@hutiefang76], link:https://github.com/serhiy-bzhezytskyy[@serhiy-bzhezytskyy], link:https://github.com/56wj[@56wj], link:https://github.com/paulrutter[@paulrutter], link:https://github.com/girishkvs[@girishkvs], link:https://github.com/chopmob-cloud[@chopmob-cloud] |
| 122 | + |
| 123 | +== Resources |
| 124 | + |
| 125 | +* link:https://github.com/a2aproject/a2a-java/releases/tag/v1.4.0.Final[Release Notes on GitHub] |
| 126 | +* link:https://central.sonatype.com/artifact/org.a2aproject.sdk/a2a-java-sdk-parent/1.4.0.Final[Maven Central] |
| 127 | +* link:https://javadoc.io/doc/org.a2aproject.sdk/[JavaDoc] |
| 128 | +* link:https://a2a-protocol.org/v1.0.0/specification/[A2A Specification] |
| 129 | +* link:https://a2aproject.github.io/a2a-java/[Project Website] |
| 130 | +* link:https://github.com/a2aproject/a2a-java/tree/main/examples[Examples] |
| 131 | + |
| 132 | +== Come Join Us |
| 133 | + |
| 134 | +We value your feedback a lot so please report bugs, ask for improvements etc. Let's build something great together! |
| 135 | + |
| 136 | +If you are an A2A Java SDK user or just curious, don't be shy and join our welcoming community: |
| 137 | + |
| 138 | +* provide feedback on link:https://github.com/a2aproject/a2a-java/issues[GitHub]; |
| 139 | +* craft some code and link:https://github.com/a2aproject/a2a-java/pulls[push a PR]; |
| 140 | +* discuss with us in the `#a2a-java` channel on link:https://discord.gg/jTtSkJB74Q[Discord]; |
0 commit comments