[Feat]: NoSQL (MongoDB) TaskStore / PushNotificationConfigStore backend — production-verified reference implementation available
Los mantenedores suelen responder en 2 días
@ishymko ya está trabajando en esto.
Desde el 28/8/2026.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
El issue propone añadir un TaskStore y un PushNotificationConfigStore respaldados por MongoDB al SDK a2a-python. Empieza examinando el DatabaseTaskStore existente en el extra a2a-sdk[sql] para comprender la interfaz y la semántica. Revisa la definición proto de Task y la serialización. La implementación debe gestionar la partición por propietario, la paginación con filtros de cursor y los índices TTL para la retención. Sobrescribe get_info_for_dispatch en el almacén de configuración de push usando memoización. Las pruebas deben verificar la persistencia entre réplicas y el comportamiento de la paginación.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
The SDK currently ships two TaskStore backends: InMemoryTaskStore and the SQLAlchemy-based DatabaseTaskStore (a2a-sdk[sql]). There is no supported path for document/NoSQL databases, even though task records are a natural fit for them. We built and deployed a MongoDB-backed TaskStore + PushNotificationConfigStore for a production A2A server (FastAPI, multi-replica) and would like to propose upstreaming a generic version — either as an optional extra (e.g. a2a-sdk[mongodb]) or as a documented reference implementation.
Why a document store fits this data
- Tasks are ephemeral, retention-bound records. They are written per request, re-read for a bounded window (
GetTask/ListTasks), and then expire. MongoDB TTL indexes handle retention natively (one index on anupdated_atfield); with SQL backends every deployment has to build its own cleanup job (cron /EVENTscheduler / partition rotation). - Many A2A server deployments already run a document store for conversation state, and adding a relational database + Alembic migrations solely for task persistence is a heavy dependency for what is a single-collection workload.
Implementation notes (lessons that may save others time)
We verified these against SDK 1.1.2 semantics; happy to carry them into a PR:
- Store the
Taskas serialized proto bytes, not ProtoJSON.Task.metadatais a protoStructwith arbitrary client-supplied keys — keys containing.or$become invalid MongoDB document keys afterMessageToDict. Storingtask.SerializeToString()as opaque bytes (plus a handful of extracted top-level fields for querying: owner,context_id,status.state,status.timestamp) is exact, round-trip safe, and resilient to unknown fields across SDK upgrades. - Owner partitioning parity. All reads/writes are scoped by
owner_resolver(context)(defaultresolve_user_scope), matchingInMemoryTaskStore— including refusing cross-owner access onget/delete. - Pagination matching in-memory semantics. Sort
(status.timestamp desc — nulls last, id desc); the page token (encode_page_token) is the id of the first item of the requested page (inclusive anchor), so the store re-resolves the anchor document to build a(timestamp, id)cursor filter; unknown tokens raiseInvalidParamsError. MongoDB's BSON ordering (Date > Nullunder descending sort) reproduces the in-memory null-handling exactly. get_info_for_dispatchmust be overridden on customPushNotificationConfigStoreimplementations (the base fallback silently drops notifications for authenticated owners — the docstring warns about this, but it is easy to miss). Since streaming turns call it once per emitted event, we front it with a short (5s) in-process memo keyed bytask_id, invalidated onset_info/delete_info.
The whole thing is ~200 lines for both stores. Deployed behind a FastAPI JSONRPC server; verified: task survives process restart and is served by a different replica, ListTasks cursor pagination over 100+ tasks, push configs dispatching across replicas.
Questions for maintainers
- Is there interest in an official NoSQL backend, and if so, would you prefer an optional extra (
a2a-sdk[mongodb], pymongo async client) or a documented recipe in the docs/examples? - If an extra: should it mirror
DatabaseTaskStore's constructor conventions (create_table→ensure_indexes,owner_resolverinjection), and should retention (TTL) be part of the contract or left to operators? - Would you want the same treatment for
PushNotificationConfigStorein the same PR?
If maintainers are open to it, we're happy to submit the PR with tests (the store semantics above are covered by a small in-memory fake collection in our suite; we can port those tests).
- Lenguaje dominante
- Python
- Estrellas
- 2.2k
- Forks
- 509
- Merge medio
- 3 d 11 h
- PR fusionados (30 d)
- 43
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de a2aproject/a2a-python
-
[Bug]: REST task/request id sanitizationPosiblemente ocupada @Linux2010 la tomó hace 104 días. Abiertomaintainers-only
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
a2aproject/a2a-python#805 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
[Bug]: Agent card signature verification raises raw binascii.Error on a malformed protected header instead of SignatureVerificationErrorPosiblemente ocupada @rohityan la tomó hoy. Abierto
a2aproject/a2a-python#1332 · 2 asignados ·
Los mantenedores suelen responder en 2 días
-
[Bug]: Framework-written FAILED status drops status.timestamp, persisting last_updated as NULLPosiblemente ocupada @rohityan la tomó hoy. Abierto
a2aproject/a2a-python#1331 · 2 asignados ·
Los mantenedores suelen responder en 2 días
-
[Bug]: message/send hangs forever when the AgentExecutor returns without producing eventsPosiblemente ocupada @rohityan la tomó hoy. Abierto
a2aproject/a2a-python#1330 · 2 asignados ·
Los mantenedores suelen responder en 2 días
-
Whole numbers in a data Part are returned as floats (e.g. 4326 becomes 4326.0)Posiblemente ocupada @rohityan la tomó hace 1 día. Abierto
a2aproject/a2a-python#1328 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de a2aproject/a2a-python
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
-
EvaluationSuite.run fails with default args_for_task and mutates supplied kwargsPosiblemente ocupada @ktz03 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
huggingface/evaluate#825 ·
Los mantenedores suelen responder en 1 día
-
Add `django-upgrade` to the CIAbiertodependencies feature github_actions good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
wemake-services/wemake-django-template#3149 ·
Los mantenedores suelen responder en 1 día
-
[request] vsg/1.1.16Abiertoupstream update
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
conan-io/conan-center-index#31142 ·
Los mantenedores suelen responder en 1 día
-
area:core bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día