Skip to content

Commit bed152d

Browse files
authored
feat!: Remove kind discriminator as per the 1.0 specification (#551)
Fixes #544
1 parent d1b47c6 commit bed152d

File tree

31 files changed

+496
-327
lines changed

31 files changed

+496
-327
lines changed

client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportStreamingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public void testA2AClientResubscribeToTask() throws Exception {
168168
assertEquals("artifact-1", artifact.artifactId());
169169
assertEquals("joke", artifact.name());
170170
Part<?> part = artifact.parts().get(0);
171-
assertEquals(Part.Kind.TEXT, part.getKind());
171+
assertTrue(part instanceof TextPart);
172172
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
173173
}
174174
}

client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public void testA2AClientSendMessage() throws Exception {
131131
assertEquals("joke", artifact.name());
132132
assertEquals(1, artifact.parts().size());
133133
Part<?> part = artifact.parts().get(0);
134-
assertEquals(Part.Kind.TEXT, part.getKind());
134+
assertTrue(part instanceof TextPart);
135135
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
136136
assertTrue(task.metadata().isEmpty());
137137
}
@@ -172,7 +172,7 @@ public void testA2AClientSendMessageWithMessageResponse() throws Exception {
172172
Message agentMessage = (Message) result;
173173
assertEquals(Message.Role.AGENT, agentMessage.role());
174174
Part<?> part = agentMessage.parts().get(0);
175-
assertEquals(Part.Kind.TEXT, part.getKind());
175+
assertTrue(part instanceof TextPart);
176176
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
177177
assertEquals("msg-456", agentMessage.messageId());
178178
}
@@ -243,7 +243,7 @@ public void testA2AClientGetTask() throws Exception {
243243
assertEquals(1, artifact.parts().size());
244244
assertEquals("artifact-1", artifact.artifactId());
245245
Part<?> part = artifact.parts().get(0);
246-
assertEquals(Part.Kind.TEXT, part.getKind());
246+
assertTrue(part instanceof TextPart);
247247
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
248248
assertTrue(task.metadata().isEmpty());
249249
List<Message> history = task.history();
@@ -255,15 +255,15 @@ public void testA2AClientGetTask() throws Exception {
255255
assertNotNull(parts);
256256
assertEquals(3, parts.size());
257257
part = parts.get(0);
258-
assertEquals(Part.Kind.TEXT, part.getKind());
258+
assertTrue(part instanceof TextPart);
259259
assertEquals("tell me a joke", ((TextPart)part).text());
260260
part = parts.get(1);
261-
assertEquals(Part.Kind.FILE, part.getKind());
261+
assertTrue(part instanceof FilePart);
262262
FileContent filePart = ((FilePart) part).file();
263263
assertEquals("file:///path/to/file.txt", ((FileWithUri) filePart).uri());
264264
assertEquals("text/plain", filePart.mimeType());
265265
part = parts.get(2);
266-
assertEquals(Part.Kind.FILE, part.getKind());
266+
assertTrue(part instanceof FilePart);
267267
filePart = ((FilePart) part).file();
268268
assertEquals("aGVsbG8=", ((FileWithBytes) filePart).bytes());
269269
assertEquals("hello.txt", filePart.name());
@@ -558,7 +558,7 @@ public void testA2AClientSendMessageWithFilePart() throws Exception {
558558
assertEquals("image-analysis", artifact.name());
559559
assertEquals(1, artifact.parts().size());
560560
Part<?> part = artifact.parts().get(0);
561-
assertEquals(Part.Kind.TEXT, part.getKind());
561+
assertTrue(part instanceof TextPart);
562562
assertEquals("This is an image of a cat sitting on a windowsill.", ((TextPart) part).text());
563563
assertFalse(task.metadata().isEmpty());
564564
assertEquals(1, task.metadata().size());
@@ -618,7 +618,7 @@ public void testA2AClientSendMessageWithDataPart() throws Exception {
618618
assertEquals("data-analysis", artifact.name());
619619
assertEquals(1, artifact.parts().size());
620620
Part<?> part = artifact.parts().get(0);
621-
assertEquals(Part.Kind.TEXT, part.getKind());
621+
assertTrue(part instanceof TextPart);
622622
assertEquals("Processed weather data: Temperature is 25.5°C, humidity is 60.2% in San Francisco.", ((TextPart) part).text());
623623
assertTrue(task.metadata().isEmpty());
624624
}
@@ -676,7 +676,7 @@ public void testA2AClientSendMessageWithMixedParts() throws Exception {
676676
assertEquals("mixed-analysis", artifact.name());
677677
assertEquals(1, artifact.parts().size());
678678
Part<?> part = artifact.parts().get(0);
679-
assertEquals(Part.Kind.TEXT, part.getKind());
679+
assertTrue(part instanceof TextPart);
680680
assertEquals("Analyzed chart image and data: Bar chart showing quarterly data with values [10, 20, 30, 40].", ((TextPart) part).text());
681681
assertTrue(task.metadata().isEmpty());
682682
}

client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/sse/SSEEventListenerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public void testOnEventWithTaskArtifactUpdateEventEvent() throws Exception {
136136
Artifact artifact = taskArtifactUpdateEvent.artifact();
137137
assertEquals("artifact-1", artifact.artifactId());
138138
assertEquals(1, artifact.parts().size());
139-
assertEquals(Part.Kind.TEXT, artifact.parts().get(0).getKind());
139+
assertTrue(artifact.parts().get(0) instanceof TextPart);
140140
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text());
141141
}
142142

client/transport/rest/src/test/java/io/a2a/client/transport/rest/RestTransportTest.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import io.a2a.spec.MessageSendConfiguration;
4949
import io.a2a.spec.MessageSendParams;
5050
import io.a2a.spec.Part;
51-
import io.a2a.spec.Part.Kind;
5251
import io.a2a.spec.PushNotificationConfig;
5352
import io.a2a.spec.StreamingEventKind;
5453
import io.a2a.spec.Task;
@@ -148,7 +147,7 @@ public void testSendMessage() throws Exception {
148147
assertEquals("message-1234", history.messageId());
149148
assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", history.taskId());
150149
assertEquals(1, history.parts().size());
151-
assertEquals(Kind.TEXT, history.parts().get(0).getKind());
150+
assertTrue(history.parts().get(0) instanceof io.a2a.spec.TextPart);
152151
assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text());
153152
assertNull(task.metadata());
154153
assertNull(history.referenceTaskIds());
@@ -210,22 +209,22 @@ public void testGetTask() throws Exception {
210209
assertEquals("artifact-1", artifact.artifactId());
211210
assertNull(artifact.name());
212211
assertEquals(false, artifact.parts().isEmpty());
213-
assertEquals(Kind.TEXT, artifact.parts().get(0).getKind());
212+
assertTrue(artifact.parts().get(0) instanceof io.a2a.spec.TextPart);
214213
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text());
215214
assertEquals(1, task.history().size());
216215
Message history = task.history().get(0);
217216
assertEquals("message", history.kind());
218217
assertEquals(Message.Role.USER, history.role());
219218
assertEquals("message-123", history.messageId());
220219
assertEquals(3, history.parts().size());
221-
assertEquals(Kind.TEXT, history.parts().get(0).getKind());
220+
assertTrue(history.parts().get(0) instanceof io.a2a.spec.TextPart);
222221
assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text());
223-
assertEquals(Kind.FILE, history.parts().get(1).getKind());
222+
assertTrue(history.parts().get(1) instanceof FilePart);
224223
FilePart part = (FilePart) history.parts().get(1);
225224
assertEquals("text/plain", part.file().mimeType());
226225
assertEquals("file:///path/to/file.txt", ((FileWithUri) part.file()).uri());
227226
part = (FilePart) history.parts().get(2);
228-
assertEquals(Kind.FILE, part.getKind());
227+
assertTrue(part instanceof FilePart);
229228
assertEquals("text/plain", part.file().mimeType());
230229
assertEquals("aGVsbG8=", ((FileWithBytes) part.file()).bytes());
231230
assertNull(history.metadata());
@@ -448,7 +447,7 @@ public void testResubscribe() throws Exception {
448447
assertEquals("artifact-1", artifact.artifactId());
449448
assertEquals("joke", artifact.name());
450449
Part<?> part = artifact.parts().get(0);
451-
assertEquals(Part.Kind.TEXT, part.getKind());
450+
assertTrue(part instanceof io.a2a.spec.TextPart);
452451
assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text());
453452
}
454453
}

extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreTestAgentExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private String getLastTextPart(Message message) throws JSONRPCError {
6767
return "";
6868
}
6969
Part<?> part = message.parts().get(message.parts().size() - 1);
70-
if (part.getKind() == Part.Kind.TEXT) {
70+
if (part instanceof TextPart) {
7171
return ((TextPart) part).text();
7272
}
7373
throw new InvalidRequestError("Last part is not text");

extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void testTaskSerialization() throws JsonProcessingException {
5353

5454
// Test serialization as Event
5555
String json = JsonUtil.toJson(originalTask);
56-
assertTrue(json.contains("\"kind\":\"task\""), "JSON should contain task kind");
56+
assertTrue(json.contains("\"task\""), "JSON should contain task wrapper");
5757
assertTrue(json.contains("\"id\":\"test-task-123\""), "JSON should contain task ID");
5858

5959
// Test deserialization back to StreamingEventKind
@@ -84,7 +84,7 @@ public void testMessageSerialization() throws JsonProcessingException {
8484

8585
// Test serialization as Event
8686
String json = JsonUtil.toJson(originalMessage);
87-
assertTrue(json.contains("\"kind\":\"message\""), "JSON should contain message kind");
87+
assertTrue(json.contains("\"message\""), "JSON should contain message wrapper");
8888
assertTrue(json.contains("\"taskId\":\"test-task-789\""), "JSON should contain task ID");
8989

9090
// Test deserialization back to StreamingEventKind
@@ -115,7 +115,7 @@ public void testTaskStatusUpdateEventSerialization() throws JsonProcessingExcept
115115

116116
// Test serialization as Event
117117
String json = JsonUtil.toJson((Event) originalEvent);
118-
assertTrue(json.contains("\"kind\":\"status-update\""), "JSON should contain status-update kind");
118+
assertTrue(json.contains("\"statusUpdate\""), "JSON should contain statusUpdate wrapper");
119119
assertTrue(json.contains("\"taskId\":\"test-task-abc\""), "JSON should contain task ID");
120120
assertTrue(json.contains("\"final\":true"), "JSON should contain final flag");
121121

@@ -148,7 +148,7 @@ public void testTaskArtifactUpdateEventSerialization() throws JsonProcessingExce
148148

149149
// Test serialization as Event
150150
String json = JsonUtil.toJson((Event) originalEvent);
151-
assertTrue(json.contains("\"kind\":\"artifact-update\""), "JSON should contain artifact-update kind");
151+
assertTrue(json.contains("\"artifactUpdate\""), "JSON should contain artifactUpdate wrapper");
152152
assertTrue(json.contains("\"taskId\":\"test-task-xyz\""), "JSON should contain task ID");
153153
assertTrue(json.contains("\"test-artifact-123\""), "JSON should contain artifact ID");
154154

@@ -216,7 +216,7 @@ public void testReplicatedEventWithStreamingEventSerialization() throws JsonProc
216216
String json = JsonUtil.toJson(originalReplicatedEvent);
217217
assertTrue(json.contains("\"taskId\":\"replicated-test-task\""), "JSON should contain task ID");
218218
assertTrue(json.contains("\"event\""), "JSON should contain event field");
219-
assertTrue(json.contains("\"kind\":\"status-update\""), "JSON should contain the event kind");
219+
assertTrue(json.contains("\"statusUpdate\""), "JSON should contain the event type wrapper");
220220
assertFalse(json.contains("\"error\""), "JSON should not contain error field");
221221

222222
// Deserialize the ReplicatedEventQueueItem

extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/ReplicatedQueueManagerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ void testReplicatedEventJsonSerialization() throws Exception {
203203
assertNotNull(json);
204204
assertTrue(json.contains("json-test-task"));
205205
assertTrue(json.contains("\"event\":{"));
206-
assertTrue(json.contains("\"kind\":\"status-update\""));
206+
assertTrue(json.contains("\"statusUpdate\""));
207207

208208
// Deserialize back
209209
ReplicatedEventQueueItem deserialized = JsonUtil.fromJson(json, ReplicatedEventQueueItem.class);

extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ public void testA2AMessageReplicatedToKafka() throws Exception {
177177
assertEquals(contextId, statusUpdateEvent.contextId(), "Event context ID should match original context ID");
178178
assertEquals(TaskState.SUBMITTED, statusUpdateEvent.status().state(), "Event should show SUBMITTED state");
179179
assertFalse(statusUpdateEvent.isFinal(), "Event should show final:false");
180-
assertEquals("status-update", statusUpdateEvent.kind(), "Event should indicate status-update type");
180+
assertEquals(TaskStatusUpdateEvent.STREAMING_EVENT_ID, statusUpdateEvent.kind(), "Event should indicate status-update type");
181181
}
182182

183183
@Test

extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicationTestAgentExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private String getLastTextPart(Message message) throws JSONRPCError {
6868
throw new InvalidRequestError("No parts in message");
6969
}
7070
Part<?> part = message.parts().get(message.parts().size() - 1);
71-
if (part.getKind() == Part.Kind.TEXT) {
71+
if (part instanceof TextPart) {
7272
return ((TextPart) part).text();
7373
}
7474
throw new InvalidRequestError("Last part is not text");

extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTestAgentExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC
5656

5757
private String getLastTextPart(Message message) throws JSONRPCError {
5858
Part<?> part = message.parts().get(message.parts().size() - 1);
59-
if (part.getKind() == Part.Kind.TEXT) {
59+
if (part instanceof TextPart) {
6060
return ((TextPart) part).text();
6161
}
6262
throw new InvalidRequestError("No parts");

0 commit comments

Comments
 (0)