Files
litellm/tests/test_litellm/a2a_protocol/providers
c8bcfbb20c feat(a2a): watsonx Orchestrate agent provider (#29410)
* feat(a2a): add watsonx Orchestrate agent provider

Bridge A2A message/send to WXO runs API (CP4D and IBM Cloud IAM auth),
with dashboard agent type metadata and unit tests for transformations.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(a2a): use shared httpx client and cache WXO auth tokens

Route WXO streaming through get_async_httpx_client (TLS verification
enabled). Cache bearer tokens with TTL buffer. Extract A2A reply text via
a dedicated helper instead of hard-coded JSON paths.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(a2a): treat CP4D token expiration as absolute Unix time

CP4D /authorize returns expiration as epoch seconds, not TTL. Compute
remaining lifetime against wall clock so cached tokens refresh before expiry.

Co-authored-by: Cursor <cursoragent@cursor.com>

* style(a2a): black-format watsonx orchestrate handler for CI py312

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix watsonx orchestrate edge cases

* Fix WXO streaming fallback error handling

* Fix watsonx orchestrate run completion handling

* fix(a2a): make WXO username optional in agent create UI

Username is only required for cp4d auth; ibm_cloud uses api_key alone.
Backend still validates username when auth_mode is cp4d.

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(a2a): align WXO dashboard field test with optional username

Username is not required in agent_create_fields.json; backend validates
for cp4d auth_mode only.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(a2a): send Accept header on WXO streaming run request

* fix(a2a/wxo): scope streaming transport fallback to initial POST only

Narrow the httpx.TransportError fallback in handle_streaming so it only
covers the initial POST /runs/stream. Errors during polling or SSE
consumption now propagate instead of triggering handle_non_streaming,
which would have submitted a duplicate WXO run for the same request.

* refactor(a2a/wxo): type run-param extraction and use text response_type

Return a typed WXORequestParams NamedTuple from _extract_litellm_params
instead of a positional tuple so call sites read params by name, and send
the user message with response_type 'text' so the run body is valid across
all WXO agent configurations rather than the search-specific type.

* fix(a2a/wxo): evict expired token cache entries and raise asyncio.TimeoutError on poll timeout

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: mateo-berri <277851410+mateo-berri@users.noreply.github.com>
2026-06-02 18:41:10 +05:30
..