Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[Feat]: Add RetryTransport for automatic retry with exponential backoff

Ouverte
#871 6 commentaires 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 3 jours

@cchinchilla-dev y travaille déjà.

Depuis le 25/3/2026.

  • #1018 par @cchinchilla-dev — ouverte

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
45/100
Type d'issue
Fonctionnalité
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
grpc, python
Domaine
api, backend

Piste de recherche

Examinez les classes de transport existantes (JsonRpcTransport, RestTransport, GrpcTransport) ainsi que le modèle TenantTransportDecorator. Le nouveau RetryTransport doit pouvoir encapsuler n’importe quel ClientTransport. Commencez par examiner la hiérarchie des exceptions du SDK (A2AClientError, A2AClientTimeoutError) et la manière dont elles chaînent les erreurs httpx et grpc. Écrivez des tests pour le prédicat de nouvelle tentative et le hook on_retry. Assurez-vous que l’implémentation fonctionne avec les trois transports et qu’elle ne réessaie pas les erreurs de domaine.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

component: client
Is your feature request related to a problem? Please describe.

The SDK's transports (JsonRpcTransport, RestTransport, GrpcTransport) raise immediately on transient failures (network errors, timeouts, rate limits, 5xx responses, gRPC UNAVAILABLE/RESOURCE_EXHAUSTED) with no built-in retry mechanism. Every caller has to reimplement the same retry/backoff loop, and to do it correctly they have to inspect __cause__ chains because A2AClientError doesn't expose HTTP status codes or gRPC codes directly.

Describe the solution you'd like

A RetryTransport decorator wrapping any ClientTransport, mirroring the existing TenantTransportDecorator pattern:

inner = JsonRpcTransport(httpx_client=client, agent_card=card)
transport = RetryTransport(base=inner, max_retries=3)

The default predicate retries on:

  • A2AClientTimeoutError (always).
  • A2AClientError chained from httpx.RequestError or httpx.HTTPStatusError(408/429/502/503/504).
  • A2AClientError chained from grpc.aio.AioRpcError(UNAVAILABLE/RESOURCE_EXHAUSTED).
  • Domain errors (TaskNotFoundError, etc.) are never retried.

retry_predicate is configurable for custom logic, and on_retry is exposed as a hook for logging/metrics. Streaming methods (send_message_streaming, subscribe) only retry before the first event is yielded.

Describe alternatives you've considered
  • Retry via ClientCallInterceptor — not feasible; after() only fires on successful results, so interceptors never see exceptions.
  • Transport-specific retry (httpx custom transport, gRPC retryPolicy / UnaryUnaryClientInterceptor) — operates below the SDK's exception layer, requires two separate configurations, and doesn't cover all three transports uniformly.
  • Retry inside each transport implementation — triples the logic across JsonRpcTransport, RestTransport, GrpcTransport and forces every future transport to reimplement it.
Additional context

Purely additive: new RetryTransport class, tests, and one export change. No new dependencies — the grpc import is conditional, matching the SDK's existing pattern. ClientFactory integration is left as a follow-up.

Code of Conduct
  • I agree to follow this project's Code of Conduct
Langage dominant
Python
Étoiles
2.2k
Forks
518
Merge moyen
3 j 19 h
PR mergées (30 j)
43

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de a2aproject/a2a-python

Toutes les issues de a2aproject/a2a-python

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.