Skip to content

Commit aba88fc

Browse files
kthota-gGerrit Code Review
authored andcommitted
Merge "Client refactoring and other fixes" into main
2 parents 045f8a4 + 2ce2bdb commit aba88fc

File tree

13 files changed

+856
-99
lines changed

13 files changed

+856
-99
lines changed

.vscode/launch.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"version": "0.2.0",
3+
"configurations": [
4+
{
5+
"name": "Debug HelloWorld Agent",
6+
"type": "debugpy",
7+
"request": "launch",
8+
"program": "${workspaceFolder}/examples/helloworld/__main__.py",
9+
"console": "integratedTerminal",
10+
"justMyCode": false,
11+
"env": {
12+
"PYTHONPATH": "${workspaceFolder}",
13+
},
14+
"cwd": "${workspaceFolder}/examples/helloworld",
15+
"args": [
16+
"--host",
17+
"localhost",
18+
"--port",
19+
"9999"
20+
]
21+
},
22+
{
23+
"name": "Debug Currency Agent",
24+
"type": "debugpy",
25+
"request": "launch",
26+
"program": "${workspaceFolder}/examples/langgraph/__main__.py",
27+
"console": "integratedTerminal",
28+
"justMyCode": false,
29+
"env": {
30+
"PYTHONPATH": "${workspaceFolder}",
31+
},
32+
"cwd": "${workspaceFolder}/examples/langgraph",
33+
"args": [
34+
"--host",
35+
"localhost",
36+
"--port",
37+
"10000"
38+
]
39+
}
40+
]
41+
}

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"editor.defaultFormatter": "charliermarsh.ruff",
1010
"editor.formatOnSave": true,
1111
"editor.codeActionsOnSave": {
12-
"source.organizeImports": "true"
12+
"source.organizeImports": "always"
1313
},
1414
},
1515
"ruff.importStrategy": "fromEnvironment"

examples/helloworld/__main__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from agent_executor import HelloWorldAgentExecutor
22

3+
from a2a.server.apps import A2AStarletteApplication
34
from a2a.server.request_handlers import DefaultRequestHandler
45
from a2a.server.tasks import InMemoryTaskStore
5-
from a2a.server.apps import A2AStarletteApplication
66
from a2a.types import (
77
AgentAuthentication,
88
AgentCapabilities,

examples/helloworld/test_client.py

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
from typing import Any
33
import httpx
44
from uuid import uuid4
5-
from a2a.types import SendMessageSuccessResponse, Task
5+
from a2a.types import (
6+
SendMessageRequest,
7+
MessageSendParams,
8+
SendStreamingMessageRequest,
9+
)
610

711

812
async def main() -> None:
@@ -19,31 +23,18 @@ async def main() -> None:
1923
'messageId': uuid4().hex,
2024
},
2125
}
26+
request = SendMessageRequest(
27+
params=MessageSendParams(**send_message_payload)
28+
)
2229

23-
response = await client.send_message(payload=send_message_payload)
30+
response = await client.send_message(request)
2431
print(response.model_dump(mode='json', exclude_none=True))
2532

26-
if isinstance(response.root, SendMessageSuccessResponse) and isinstance(
27-
response.root.result, Task
28-
):
29-
task_id: str = response.root.result.id
30-
get_task_payload = {'id': task_id}
31-
get_response = await client.get_task(payload=get_task_payload)
32-
print(get_response.model_dump(mode='json', exclude_none=True))
33-
34-
cancel_task_payload = {'id': task_id}
35-
cancel_response = await client.cancel_task(
36-
payload=cancel_task_payload
37-
)
38-
print(cancel_response.model_dump(mode='json', exclude_none=True))
39-
else:
40-
print(
41-
'Received an instance of Message, getTask and cancelTask are not applicable for invocation'
42-
)
43-
44-
stream_response = client.send_message_streaming(
45-
payload=send_message_payload
33+
streaming_request = SendStreamingMessageRequest(
34+
params=MessageSendParams(**send_message_payload)
4635
)
36+
37+
stream_response = client.send_message_streaming(streaming_request)
4738
async for chunk in stream_response:
4839
print(chunk.model_dump(mode='json', exclude_none=True))
4940

examples/langgraph/__main__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
from agent_executor import CurrencyAgentExecutor
88
from dotenv import load_dotenv
99

10-
10+
from a2a.server.apps import A2AStarletteApplication
1111
from a2a.server.request_handlers import DefaultRequestHandler
1212
from a2a.server.tasks import InMemoryTaskStore
13-
from a2a.server.apps import A2AStarletteApplication
1413
from a2a.types import (
1514
AgentAuthentication,
1615
AgentCapabilities,

examples/langgraph/test_client.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
SendMessageSuccessResponse,
88
Task,
99
TaskState,
10+
SendMessageRequest,
11+
MessageSendParams,
12+
GetTaskRequest,
13+
TaskQueryParams,
14+
SendStreamingMessageRequest,
1015
)
1116
import httpx
1217
import traceback
@@ -49,10 +54,11 @@ async def run_single_turn_test(client: A2AClient) -> None:
4954
send_payload = create_send_message_payload(
5055
text='how much is 100 USD in CAD?'
5156
)
57+
request = SendMessageRequest(params=MessageSendParams(**send_payload))
58+
59+
print('--- Single Turn Request ---')
5260
# Send Message
53-
send_response: SendMessageResponse = await client.send_message(
54-
payload=send_payload
55-
)
61+
send_response: SendMessageResponse = await client.send_message(request)
5662
print_json_response(send_response, 'Single Turn Request Response')
5763
if not isinstance(send_response.root, SendMessageSuccessResponse):
5864
print('received non-success response. Aborting get task ')
@@ -66,9 +72,8 @@ async def run_single_turn_test(client: A2AClient) -> None:
6672
print('---Query Task---')
6773
# query the task
6874
task_id_payload = {'id': task_id}
69-
get_response: GetTaskResponse = await client.get_task(
70-
payload=task_id_payload
71-
)
75+
get_request = GetTaskRequest(params=TaskQueryParams(**task_id_payload))
76+
get_response: GetTaskResponse = await client.get_task(get_request)
7277
print_json_response(get_response, 'Query Task Response')
7378

7479

@@ -79,8 +84,12 @@ async def run_streaming_test(client: A2AClient) -> None:
7984
text='how much is 50 EUR in JPY?'
8085
)
8186

87+
request = SendStreamingMessageRequest(
88+
params=MessageSendParams(**send_payload)
89+
)
90+
8291
print('--- Single Turn Streaming Request ---')
83-
stream_response = client.send_message_streaming(payload=send_payload)
92+
stream_response = client.send_message_streaming(request)
8493
async for chunk in stream_response:
8594
print_json_response(chunk, 'Streaming Chunk')
8695

@@ -93,8 +102,11 @@ async def run_multi_turn_test(client: A2AClient) -> None:
93102
first_turn_payload = create_send_message_payload(
94103
text='how much is 100 USD?'
95104
)
105+
request1 = SendMessageRequest(
106+
params=MessageSendParams(**first_turn_payload)
107+
)
96108
first_turn_response: SendMessageResponse = await client.send_message(
97-
payload=first_turn_payload
109+
request1
98110
)
99111
print_json_response(first_turn_response, 'Multi-Turn: First Turn Response')
100112

@@ -111,9 +123,10 @@ async def run_multi_turn_test(client: A2AClient) -> None:
111123
second_turn_payload = create_send_message_payload(
112124
'in GBP', task.id, context_id
113125
)
114-
second_turn_response = await client.send_message(
115-
payload=second_turn_payload
126+
request2 = SendMessageRequest(
127+
params=MessageSendParams(**second_turn_payload)
116128
)
129+
second_turn_response = await client.send_message(request2)
117130
print_json_response(
118131
second_turn_response, 'Multi-Turn: Second Turn Response'
119132
)

src/a2a/client/__init__.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11
from a2a.client.client import A2ACardResolver, A2AClient
2+
from a2a.client.errors import (
3+
A2AClientError,
4+
A2AClientHTTPError,
5+
A2AClientJSONError,
6+
)
7+
from a2a.client.helpers import create_text_message_object
28

39

4-
__all__ = ['A2ACardResolver', 'A2AClient']
10+
__all__ = [
11+
'A2ACardResolver',
12+
'A2AClient',
13+
'A2AClientError',
14+
'A2AClientHTTPError',
15+
'A2AClientJSONError',
16+
'create_text_message_object',
17+
]

0 commit comments

Comments
 (0)