Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
b348735
[DRAFT] feat: Upgrade A2A to v1.0
Tehsmash Nov 20, 2025
74c5a19
feat!: migrate from Pydantic types to protobuf-generated types
muscariello Nov 28, 2025
2d698df
fix: update E2E tests and push notification handlers for proto migration
muscariello Nov 29, 2025
424dd7e
fix: resolve all linter errors and add pyright type fixes
muscariello Dec 1, 2025
7405dc7
refactor: Remove redundant JSON-RPC Pydantic types, use jsonrpc libra…
muscariello Dec 1, 2025
6462801
Address PR review feedback: rename methods, update types, clean up al…
muscariello Dec 1, 2025
42c72f2
refactor: remove extras.py and consolidate error types in utils/error…
muscariello Dec 1, 2025
ac1050d
chore: remove AIP-discussion-response.md from tracking
muscariello Dec 1, 2025
7ea7475
fix: Improve streaming errors handling (#576)
lkawka Dec 3, 2025
174d58d
chore(main): release 0.3.20 (#577)
a2a-bot Dec 3, 2025
5fea21f
docs: Fixing typos (#586)
didier-durand Dec 12, 2025
8a76730
feat: Implement Agent Card Signing and Verification per Spec (#581)
sokoliva Dec 12, 2025
090ca9c
chore: Fixing typos (final round) (#588)
didier-durand Dec 12, 2025
03fa4c2
chore(main): release 0.3.21 (#587)
a2a-bot Dec 12, 2025
04bcafc
feat: Add custom ID generators to SimpleRequestContextBuilder (#594)
chenweiyang0204 Dec 16, 2025
e12ca42
test: adding 2 additional tests to user.py (#595)
didier-durand Dec 16, 2025
3deecc4
test: adding 21 tests for client/card_resolver.py (#592)
didier-durand Dec 16, 2025
6fa6a6c
refactor: Move agent card signature verification into `A2ACardResolve…
sokoliva Dec 16, 2025
86c6759
chore(main): release 0.3.22 (#599)
a2a-bot Dec 16, 2025
df78a94
test: adding 13 tests for id_generator.py (#591)
didier-durand Jan 5, 2026
cb7cdb3
chore(deps): bump the github-actions group across 1 directory with 4 …
dependabot[bot] Jan 5, 2026
4487307
fix: align tests and implementation with proto definition updates
muscariello Jan 16, 2026
a680c18
chore: merge main and fix tests for proto refactor
muscariello Jan 16, 2026
0ae8548
style: fix spelling errors and add words to allow list
muscariello Jan 17, 2026
bd552f6
style: add more tech terms to spelling allow list
muscariello Jan 17, 2026
d8df048
style: fix spelling of interruptible
muscariello Jan 17, 2026
7433e04
build(spelling): exclude generated protobuf types from spell check
muscariello Jan 17, 2026
8e5ab33
fix: replace non-inclusive language in optionals.py
muscariello Jan 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 36 additions & 21 deletions .github/actions/spelling/allow.txt
Original file line number Diff line number Diff line change
@@ -1,26 +1,47 @@
AAgent
ACMRTUXB
ACard
AClient
ACMRTUXB
aconnect
adk
AError
AFast
agentic
AGrpc
aio
aiomysql
amannn
aproject
ARequest
ARun
AServer
AServers
AService
AStarlette
AUser
DSNs
ES256
EUR
GBP
GVsb
HS256
HS384
INR
JOSE
JPY
JSONRPCt
JWS
Llm
POSTGRES
RS256
RUF
SECP256R1
SLF
Tful
aconnect
adk
agentic
aio
aiomysql
alg
amannn
aproject
autouse
backticks
base64url
cla
cls
coc
Expand All @@ -29,32 +50,29 @@ coro
datamodel
deepwiki
drivername
DSNs
dunders
euo
EUR
excinfo
fernet
fetchrow
fetchval
GBP
genai
getkwargs
gle
GVsb
hazmat
ietf
initdb
inmemory
INR
isready
JPY
JSONRPCt
JWS
jku
jwk
jwks
jws
kid
kwarg
langgraph
lifecycles
linting
Llm
lstrips
mikeas
mockurl
Expand All @@ -64,7 +82,6 @@ oidc
opensource
otherurl
postgres
POSTGRES
postgresql
protoc
pyi
Expand All @@ -74,14 +91,12 @@ pyversions
redef
respx
resub
RUF
SLF
socio
sse
tagwords
taskupdate
testuuid
Tful
tiangolo
typ
typeerror
vulnz
1 change: 1 addition & 0 deletions .github/actions/spelling/excludes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,5 +87,6 @@
^\.github/workflows/
CHANGELOG.md
^src/a2a/grpc/
^src/a2a/types/
^tests/
.pre-commit-config.yaml
2 changes: 1 addition & 1 deletion .github/workflows/linter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
if: github.repository == 'a2aproject/a2a-python'
steps:
- name: Checkout Code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/python-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v5
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v7
Expand All @@ -26,7 +26,7 @@ jobs:
run: uv build

- name: Upload distributions
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: release-dists
path: dist/
Expand All @@ -40,7 +40,7 @@ jobs:

steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: release-dists
path: dist/
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/stale.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ name: Mark stale issues and pull requests

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

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
python-version: ['3.10', '3.13']
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Set up test environment variables
run: |
echo "POSTGRES_TEST_DSN=postgresql+asyncpg://a2a:a2a_password@localhost:5432/a2a_test" >> $GITHUB_ENV
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/update-a2a-types.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
Expand Down Expand Up @@ -42,7 +42,7 @@ jobs:
uv run scripts/grpc_gen_post_processor.py
echo "Buf generate finished."
- name: Create Pull Request with Updates
uses: peter-evans/create-pull-request@v7
uses: peter-evans/create-pull-request@v8
with:
token: ${{ secrets.A2A_BOT_PAT }}
committer: a2a-bot <[email protected]>
Expand Down
32 changes: 29 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,31 @@
# Changelog

## [0.3.22](https://github.com/a2aproject/a2a-python/compare/v0.3.21...v0.3.22) (2025-12-16)


### Features

* Add custom ID generators to SimpleRequestContextBuilder ([#594](https://github.com/a2aproject/a2a-python/issues/594)) ([04bcafc](https://github.com/a2aproject/a2a-python/commit/04bcafc737cf426d9975c76e346335ff992363e2))


### Code Refactoring

* Move agent card signature verification into `A2ACardResolver` ([6fa6a6c](https://github.com/a2aproject/a2a-python/commit/6fa6a6cf3875bdf7bfc51fb1a541a3f3e8381dc0))

## [0.3.21](https://github.com/a2aproject/a2a-python/compare/v0.3.20...v0.3.21) (2025-12-12)


### Documentation

* Fixing typos ([#586](https://github.com/a2aproject/a2a-python/issues/586)) ([5fea21f](https://github.com/a2aproject/a2a-python/commit/5fea21fb34ecea55e588eb10139b5d47020a76cb))

## [0.3.20](https://github.com/a2aproject/a2a-python/compare/v0.3.19...v0.3.20) (2025-12-03)


### Bug Fixes

* Improve streaming errors handling ([#576](https://github.com/a2aproject/a2a-python/issues/576)) ([7ea7475](https://github.com/a2aproject/a2a-python/commit/7ea7475091df2ee40d3035ef1bc34ee2f86524ee))

## [0.3.19](https://github.com/a2aproject/a2a-python/compare/v0.3.18...v0.3.19) (2025-11-25)


Expand Down Expand Up @@ -94,7 +120,7 @@
### Bug Fixes

* 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))
* **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))
* **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))


### Documentation
Expand Down Expand Up @@ -431,8 +457,8 @@
* 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))
* Fix Release Version ([#161](https://github.com/a2aproject/a2a-python/issues/161)) ([011d632](https://github.com/a2aproject/a2a-python/commit/011d632b27b201193813ce24cf25e28d1335d18e))
* generate StrEnum types for enums ([#134](https://github.com/a2aproject/a2a-python/issues/134)) ([0c49dab](https://github.com/a2aproject/a2a-python/commit/0c49dabcdb9d62de49fda53d7ce5c691b8c1591c))
* library should released as 0.2.6 ([d8187e8](https://github.com/a2aproject/a2a-python/commit/d8187e812d6ac01caedf61d4edaca522e583d7da))
* remove error types from enqueable events ([#138](https://github.com/a2aproject/a2a-python/issues/138)) ([511992f](https://github.com/a2aproject/a2a-python/commit/511992fe585bd15e956921daeab4046dc4a50a0a))
* library should be released as 0.2.6 ([d8187e8](https://github.com/a2aproject/a2a-python/commit/d8187e812d6ac01caedf61d4edaca522e583d7da))
* remove error types from enqueueable events ([#138](https://github.com/a2aproject/a2a-python/issues/138)) ([511992f](https://github.com/a2aproject/a2a-python/commit/511992fe585bd15e956921daeab4046dc4a50a0a))
* **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))
* **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))

Expand Down
2 changes: 1 addition & 1 deletion Gemini.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
- uv as package manager

## How to run all tests
1. If dependencies are not installed install them using following command
1. If dependencies are not installed, install them using the following command
```
uv sync --all-extras
```
Expand Down
6 changes: 3 additions & 3 deletions buf.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ plugins:
# Generate python protobuf related code
# Generates *_pb2.py files, one for each .proto
- remote: buf.build/protocolbuffers/python:v29.3
out: src/a2a/grpc
out: src/a2a/types
# Generate python service code.
# Generates *_pb2_grpc.py
- remote: buf.build/grpc/python
out: src/a2a/grpc
out: src/a2a/types
# Generates *_pb2.pyi files.
- remote: buf.build/protocolbuffers/pyi
out: src/a2a/grpc
out: src/a2a/types
31 changes: 26 additions & 5 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ dependencies = [
"pydantic>=2.11.3",
"protobuf>=5.29.5",
"google-api-core>=1.26.0",
"json-rpc>=1.15.0",
"googleapis-common-protos>=1.70.0",
]

classifiers = [
Expand All @@ -35,6 +37,7 @@ grpc = ["grpcio>=1.60", "grpcio-tools>=1.60", "grpcio_reflection>=1.7.0"]
telemetry = ["opentelemetry-api>=1.33.0", "opentelemetry-sdk>=1.33.0"]
postgresql = ["sqlalchemy[asyncio,postgresql-asyncpg]>=2.0.0"]
mysql = ["sqlalchemy[asyncio,aiomysql]>=2.0.0"]
signing = ["PyJWT>=2.0.0"]
sqlite = ["sqlalchemy[asyncio,aiosqlite]>=2.0.0"]

sql = ["a2a-sdk[postgresql,mysql,sqlite]"]
Expand All @@ -45,6 +48,7 @@ all = [
"a2a-sdk[encryption]",
"a2a-sdk[grpc]",
"a2a-sdk[telemetry]",
"a2a-sdk[signing]",
]

[project.urls]
Expand Down Expand Up @@ -74,6 +78,16 @@ addopts = "-ra --strict-markers"
markers = [
"asyncio: mark a test as a coroutine that should be run by pytest-asyncio",
]
filterwarnings = [
# SQLAlchemy warning about duplicate class registration - this is a known limitation
# of the dynamic model creation pattern used in models.py for custom table names
"ignore:This declarative base already contains a class with the same class name:sqlalchemy.exc.SAWarning",
# ResourceWarnings from asyncio event loop/socket cleanup during garbage collection
# These appear intermittently between tests due to pytest-asyncio and sse-starlette timing
"ignore:unclosed event loop:ResourceWarning",
"ignore:unclosed transport:ResourceWarning",
"ignore:unclosed <socket.socket:ResourceWarning",
]

[tool.pytest-asyncio]
mode = "strict"
Expand All @@ -86,6 +100,7 @@ style = "pep440"
dev = [
"datamodel-code-generator>=0.30.0",
"mypy>=1.15.0",
"PyJWT>=2.0.0",
"pytest>=8.3.5",
"pytest-asyncio>=0.26.0",
"pytest-cov>=6.1.1",
Expand Down Expand Up @@ -114,7 +129,7 @@ explicit = true

[tool.mypy]
plugins = ["pydantic.mypy"]
exclude = ["src/a2a/grpc/"]
exclude = ["src/a2a/types/a2a_pb2\\.py", "src/a2a/types/a2a_pb2_grpc\\.py"]
disable_error_code = [
"import-not-found",
"annotation-unchecked",
Expand All @@ -134,7 +149,8 @@ exclude = [
"**/node_modules",
"**/venv",
"**/.venv",
"src/a2a/grpc/",
"src/a2a/types/a2a_pb2.py",
"src/a2a/types/a2a_pb2_grpc.py",
]
reportMissingImports = "none"
reportMissingModuleSource = "none"
Expand All @@ -145,7 +161,8 @@ omit = [
"*/tests/*",
"*/site-packages/*",
"*/__init__.py",
"src/a2a/grpc/*",
"src/a2a/types/a2a_pb2.py",
"src/a2a/types/a2a_pb2_grpc.py",
]

[tool.coverage.report]
Expand Down Expand Up @@ -257,7 +274,9 @@ exclude = [
"node_modules",
"venv",
"*/migrations/*",
"src/a2a/grpc/**",
"src/a2a/types/a2a_pb2.py",
"src/a2a/types/a2a_pb2.pyi",
"src/a2a/types/a2a_pb2_grpc.py",
"tests/**",
]

Expand Down Expand Up @@ -311,7 +330,9 @@ inline-quotes = "single"

[tool.ruff.format]
exclude = [
"src/a2a/grpc/**",
"src/a2a/types/a2a_pb2.py",
"src/a2a/types/a2a_pb2.pyi",
"src/a2a/types/a2a_pb2_grpc.py",
]
docstring-code-format = true
docstring-code-line-length = "dynamic"
Expand Down
2 changes: 1 addition & 1 deletion scripts/grpc_gen_post_processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from pathlib import Path


def process_generated_code(src_folder: str = 'src/a2a/grpc') -> None:
def process_generated_code(src_folder: str = 'src/a2a/types') -> None:
"""Post processor for the generated code."""
dir_path = Path(src_folder)
print(dir_path)
Expand Down
Loading
Loading