Skip to content

Commit 2f3364b

Browse files
authored
Merge branch 'main' into fix/jsonrpc-streaming-timeout
2 parents 17cf975 + 12fd75c commit 2f3364b

48 files changed

Lines changed: 3865 additions & 576 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/spelling/allow.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,14 @@ initdb
4747
inmemory
4848
INR
4949
isready
50+
jku
5051
JPY
5152
JSONRPCt
53+
jwk
54+
jwks
55+
jws
5256
JWS
57+
kid
5358
kwarg
5459
langgraph
5560
lifecycles
@@ -78,6 +83,8 @@ RUF
7883
SLF
7984
socio
8085
sse
86+
sut
87+
SUT
8188
tagwords
8289
taskupdate
8390
testuuid

.github/dependabot.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ updates:
55
schedule:
66
interval: 'monthly'
77
groups:
8-
uv-dependencies:
8+
all:
99
patterns:
1010
- '*'
1111
- package-ecosystem: 'github-actions'

.github/workflows/linter.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
if: github.repository == 'a2aproject/a2a-python'
1313
steps:
1414
- name: Checkout Code
15-
uses: actions/checkout@v5
15+
uses: actions/checkout@v6
1616
- name: Set up Python
1717
uses: actions/setup-python@v6
1818
with:
@@ -23,7 +23,7 @@ jobs:
2323
run: |
2424
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
2525
- name: Install dependencies
26-
run: uv sync --dev
26+
run: uv sync --locked --dev
2727

2828
- name: Run Ruff Linter
2929
id: ruff-lint

.github/workflows/python-publish.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ jobs:
1212
runs-on: ubuntu-latest
1313

1414
steps:
15-
- uses: actions/checkout@v5
15+
- uses: actions/checkout@v6
1616

1717
- name: Install uv
1818
uses: astral-sh/setup-uv@v7
@@ -26,7 +26,7 @@ jobs:
2626
run: uv build
2727

2828
- name: Upload distributions
29-
uses: actions/upload-artifact@v5
29+
uses: actions/upload-artifact@v6
3030
with:
3131
name: release-dists
3232
path: dist/
@@ -40,7 +40,7 @@ jobs:
4040

4141
steps:
4242
- name: Retrieve release distributions
43-
uses: actions/download-artifact@v6
43+
uses: actions/download-artifact@v7
4444
with:
4545
name: release-dists
4646
path: dist/

.github/workflows/run-tck.yaml

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
name: Run TCK
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
pull_request:
7+
branches: [ "main" ]
8+
paths-ignore:
9+
- '**.md'
10+
- 'LICENSE'
11+
- '.github/CODEOWNERS'
12+
13+
permissions:
14+
contents: read
15+
16+
env:
17+
TCK_VERSION: 0.3.0.beta3
18+
SUT_BASE_URL: http://localhost:41241
19+
SUT_JSONRPC_URL: http://localhost:41241/a2a/jsonrpc
20+
UV_SYSTEM_PYTHON: 1
21+
TCK_STREAMING_TIMEOUT: 5.0
22+
23+
concurrency:
24+
group: '${{ github.workflow }} @ ${{ github.head_ref || github.ref }}'
25+
cancel-in-progress: true
26+
27+
jobs:
28+
tck-test:
29+
name: Run TCK with Python ${{ matrix.python-version }}
30+
runs-on: ubuntu-latest
31+
strategy:
32+
matrix:
33+
python-version: ['3.10', '3.13']
34+
steps:
35+
- name: Checkout a2a-python
36+
uses: actions/checkout@v6
37+
38+
- name: Install uv
39+
uses: astral-sh/setup-uv@v7
40+
with:
41+
enable-cache: true
42+
cache-dependency-glob: "uv.lock"
43+
44+
- name: Set up Python ${{ matrix.python-version }}
45+
run: uv python install ${{ matrix.python-version }}
46+
47+
- name: Install Dependencies
48+
run: uv sync --locked --all-extras
49+
50+
- name: Checkout a2a-tck
51+
uses: actions/checkout@v6
52+
with:
53+
repository: a2aproject/a2a-tck
54+
path: tck/a2a-tck
55+
ref: ${{ env.TCK_VERSION }}
56+
57+
- name: Start SUT
58+
run: |
59+
uv run tck/sut_agent.py &
60+
61+
- name: Wait for SUT to start
62+
run: |
63+
URL="${{ env.SUT_BASE_URL }}/.well-known/agent-card.json"
64+
EXPECTED_STATUS=200
65+
TIMEOUT=120
66+
RETRY_INTERVAL=2
67+
START_TIME=$(date +%s)
68+
69+
while true; do
70+
CURRENT_TIME=$(date +%s)
71+
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
72+
73+
if [ "$ELAPSED_TIME" -ge "$TIMEOUT" ]; then
74+
echo "❌ Timeout: Server did not respond with status $EXPECTED_STATUS within $TIMEOUT seconds."
75+
exit 1
76+
fi
77+
78+
HTTP_STATUS=$(curl --output /dev/null --silent --write-out "%{http_code}" "$URL") || true
79+
echo "STATUS: ${HTTP_STATUS}"
80+
81+
if [ "$HTTP_STATUS" -eq "$EXPECTED_STATUS" ]; then
82+
echo "✅ Server is up! Received status $HTTP_STATUS after $ELAPSED_TIME seconds."
83+
break;
84+
fi
85+
86+
echo "⏳ Server not ready (status: $HTTP_STATUS). Retrying in $RETRY_INTERVAL seconds..."
87+
sleep "$RETRY_INTERVAL"
88+
done
89+
90+
- name: Run TCK (mandatory)
91+
id: run-tck-mandatory
92+
run: |
93+
uv run run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category mandatory --transports jsonrpc
94+
working-directory: tck/a2a-tck
95+
96+
- name: Run TCK (capabilities)
97+
id: run-tck-capabilities
98+
run: |
99+
uv run run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category capabilities --transports jsonrpc
100+
working-directory: tck/a2a-tck
101+
102+
- name: Stop SUT
103+
if: always()
104+
run: |
105+
pkill -f sut_agent.py || true
106+
sleep 2

.github/workflows/stale.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ name: Mark stale issues and pull requests
77

88
on:
99
schedule:
10-
# Scheduled to run at 10.30PM UTC everyday (1530PDT/1430PST)
10+
# Scheduled to run at 10.30PM UTC every day (1530PDT/1430PST)
1111
- cron: "30 22 * * *"
1212
workflow_dispatch:
1313

.github/workflows/unit-tests.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
python-version: ['3.10', '3.13']
4040
steps:
4141
- name: Checkout code
42-
uses: actions/checkout@v5
42+
uses: actions/checkout@v6
4343
- name: Set up test environment variables
4444
run: |
4545
echo "POSTGRES_TEST_DSN=postgresql+asyncpg://a2a:a2a_password@localhost:5432/a2a_test" >> $GITHUB_ENV
@@ -53,7 +53,7 @@ jobs:
5353
run: |
5454
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
5555
- name: Install dependencies
56-
run: uv sync --dev --extra all
56+
run: uv sync --locked --dev --extra all
5757
- name: Run tests and check coverage
5858
run: uv run pytest --cov=a2a --cov-report term --cov-fail-under=88
5959
- name: Show coverage summary in log

.github/workflows/update-a2a-types.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
---
22
name: Update A2A Schema from Specification
33
on:
4-
repository_dispatch:
5-
types: [a2a_json_update]
4+
# TODO (https://github.com/a2aproject/a2a-python/issues/559): bring back once types are migrated, currently it generates many broken PRs
5+
# repository_dispatch:
6+
# types: [a2a_json_update]
67
workflow_dispatch:
78
jobs:
89
generate_and_pr:
@@ -12,7 +13,7 @@ jobs:
1213
pull-requests: write
1314
steps:
1415
- name: Checkout code
15-
uses: actions/checkout@v5
16+
uses: actions/checkout@v6
1617
- name: Set up Python
1718
uses: actions/setup-python@v6
1819
with:
@@ -22,7 +23,7 @@ jobs:
2223
- name: Configure uv shell
2324
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH
2425
- name: Install dependencies (datamodel-code-generator)
25-
run: uv sync
26+
run: uv sync --locked
2627
- name: Define output file variable
2728
id: vars
2829
run: |
@@ -42,7 +43,7 @@ jobs:
4243
uv run scripts/grpc_gen_post_processor.py
4344
echo "Buf generate finished."
4445
- name: Create Pull Request with Updates
45-
uses: peter-evans/create-pull-request@v7
46+
uses: peter-evans/create-pull-request@v8
4647
with:
4748
token: ${{ secrets.A2A_BOT_PAT }}
4849
committer: a2a-bot <a2a-bot@google.com>

CHANGELOG.md

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,67 @@
11
# Changelog
22

3+
## [0.3.22](https://github.com/a2aproject/a2a-python/compare/v0.3.21...v0.3.22) (2025-12-16)
4+
5+
6+
### Features
7+
8+
* Add custom ID generators to SimpleRequestContextBuilder ([#594](https://github.com/a2aproject/a2a-python/issues/594)) ([04bcafc](https://github.com/a2aproject/a2a-python/commit/04bcafc737cf426d9975c76e346335ff992363e2))
9+
10+
11+
### Code Refactoring
12+
13+
* Move agent card signature verification into `A2ACardResolver` ([6fa6a6c](https://github.com/a2aproject/a2a-python/commit/6fa6a6cf3875bdf7bfc51fb1a541a3f3e8381dc0))
14+
15+
## [0.3.21](https://github.com/a2aproject/a2a-python/compare/v0.3.20...v0.3.21) (2025-12-12)
16+
17+
18+
### Documentation
19+
20+
* Fixing typos ([#586](https://github.com/a2aproject/a2a-python/issues/586)) ([5fea21f](https://github.com/a2aproject/a2a-python/commit/5fea21fb34ecea55e588eb10139b5d47020a76cb))
21+
22+
## [0.3.20](https://github.com/a2aproject/a2a-python/compare/v0.3.19...v0.3.20) (2025-12-03)
23+
24+
25+
### Bug Fixes
26+
27+
* Improve streaming errors handling ([#576](https://github.com/a2aproject/a2a-python/issues/576)) ([7ea7475](https://github.com/a2aproject/a2a-python/commit/7ea7475091df2ee40d3035ef1bc34ee2f86524ee))
28+
29+
## [0.3.19](https://github.com/a2aproject/a2a-python/compare/v0.3.18...v0.3.19) (2025-11-25)
30+
31+
32+
### Bug Fixes
33+
34+
* **jsonrpc, rest:** `extensions` support in `get_card` methods in `json-rpc` and `rest` transports ([#564](https://github.com/a2aproject/a2a-python/issues/564)) ([847f18e](https://github.com/a2aproject/a2a-python/commit/847f18eff59985f447c39a8e5efde87818b68d15))
35+
36+
## [0.3.18](https://github.com/a2aproject/a2a-python/compare/v0.3.17...v0.3.18) (2025-11-24)
37+
38+
39+
### Bug Fixes
40+
41+
* return updated `agent_card` in `JsonRpcTransport.get_card()` ([#552](https://github.com/a2aproject/a2a-python/issues/552)) ([0ce239e](https://github.com/a2aproject/a2a-python/commit/0ce239e98f67ccbf154f2edcdbcee43f3b080ead))
42+
43+
## [0.3.17](https://github.com/a2aproject/a2a-python/compare/v0.3.16...v0.3.17) (2025-11-24)
44+
45+
46+
### Features
47+
48+
* **client:** allow specifying `history_length` via call-site `MessageSendConfiguration` in `BaseClient.send_message` ([53bbf7a](https://github.com/a2aproject/a2a-python/commit/53bbf7ae3ad58fb0c10b14da05cf07c0a7bd9651))
49+
50+
## [0.3.16](https://github.com/a2aproject/a2a-python/compare/v0.3.15...v0.3.16) (2025-11-21)
51+
52+
53+
### Bug Fixes
54+
55+
* Ensure metadata propagation for `Task` `ToProto` and `FromProto` conversion ([#557](https://github.com/a2aproject/a2a-python/issues/557)) ([fc31d03](https://github.com/a2aproject/a2a-python/commit/fc31d03e8c6acb68660f6d1924262e16933c5d50))
56+
57+
## [0.3.15](https://github.com/a2aproject/a2a-python/compare/v0.3.14...v0.3.15) (2025-11-19)
58+
59+
60+
### Features
61+
62+
* Add client-side extension support ([#525](https://github.com/a2aproject/a2a-python/issues/525)) ([9a92bd2](https://github.com/a2aproject/a2a-python/commit/9a92bd238e7560b195165ac5f78742981760525e))
63+
* **rest, jsonrpc:** Add client-side extension support ([9a92bd2](https://github.com/a2aproject/a2a-python/commit/9a92bd238e7560b195165ac5f78742981760525e))
64+
365
## [0.3.14](https://github.com/a2aproject/a2a-python/compare/v0.3.13...v0.3.14) (2025-11-17)
466

567

@@ -58,7 +120,7 @@
58120
### Bug Fixes
59121

60122
* apply `history_length` for `message/send` requests ([#498](https://github.com/a2aproject/a2a-python/issues/498)) ([a49f94e](https://github.com/a2aproject/a2a-python/commit/a49f94ef23d81b8375e409b1c1e51afaf1da1956))
61-
* **client:** `A2ACardResolver.get_agent_card` will auto-populate with `agent_card_path` when `relative_card_path` is empty ([#508](https://github.com/a2aproject/a2a-python/issues/508)) ([ba24ead](https://github.com/a2aproject/a2a-python/commit/ba24eadb5b6fcd056a008e4cbcef03b3f72a37c3))
123+
* **client:** `A2ACardResolver.get_agent_card` will autopopulate with `agent_card_path` when `relative_card_path` is empty ([#508](https://github.com/a2aproject/a2a-python/issues/508)) ([ba24ead](https://github.com/a2aproject/a2a-python/commit/ba24eadb5b6fcd056a008e4cbcef03b3f72a37c3))
62124

63125

64126
### Documentation
@@ -395,8 +457,8 @@
395457
* Event consumer should stop on input_required ([#167](https://github.com/a2aproject/a2a-python/issues/167)) ([51c2d8a](https://github.com/a2aproject/a2a-python/commit/51c2d8addf9e89a86a6834e16deb9f4ac0e05cc3))
396458
* Fix Release Version ([#161](https://github.com/a2aproject/a2a-python/issues/161)) ([011d632](https://github.com/a2aproject/a2a-python/commit/011d632b27b201193813ce24cf25e28d1335d18e))
397459
* generate StrEnum types for enums ([#134](https://github.com/a2aproject/a2a-python/issues/134)) ([0c49dab](https://github.com/a2aproject/a2a-python/commit/0c49dabcdb9d62de49fda53d7ce5c691b8c1591c))
398-
* library should released as 0.2.6 ([d8187e8](https://github.com/a2aproject/a2a-python/commit/d8187e812d6ac01caedf61d4edaca522e583d7da))
399-
* remove error types from enqueable events ([#138](https://github.com/a2aproject/a2a-python/issues/138)) ([511992f](https://github.com/a2aproject/a2a-python/commit/511992fe585bd15e956921daeab4046dc4a50a0a))
460+
* library should be released as 0.2.6 ([d8187e8](https://github.com/a2aproject/a2a-python/commit/d8187e812d6ac01caedf61d4edaca522e583d7da))
461+
* remove error types from enqueueable events ([#138](https://github.com/a2aproject/a2a-python/issues/138)) ([511992f](https://github.com/a2aproject/a2a-python/commit/511992fe585bd15e956921daeab4046dc4a50a0a))
400462
* **stream:** don't block event loop in EventQueue ([#151](https://github.com/a2aproject/a2a-python/issues/151)) ([efd9080](https://github.com/a2aproject/a2a-python/commit/efd9080b917c51d6e945572fd123b07f20974a64))
401463
* **task_updater:** fix potential duplicate artifact_id from default v… ([#156](https://github.com/a2aproject/a2a-python/issues/156)) ([1f0a769](https://github.com/a2aproject/a2a-python/commit/1f0a769c1027797b2f252e4c894352f9f78257ca))
402464

Gemini.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
- uv as package manager
55

66
## How to run all tests
7-
1. If dependencies are not installed install them using following command
7+
1. If dependencies are not installed, install them using the following command
88
```
99
uv sync --all-extras
1010
```

0 commit comments

Comments
 (0)