mirror of
https://github.com/tiennm99/litellm.git
synced 2026-08-03 18:23:40 +00:00
* 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>
267 lines
9.6 KiB
JSON
267 lines
9.6 KiB
JSON
[
|
|
{
|
|
"agent_type": "a2a",
|
|
"agent_type_display_name": "A2A Standard",
|
|
"description": "Standard A2A protocol",
|
|
"logo_url": "/ui/assets/logos/a2a_agent.png",
|
|
"credential_fields": [],
|
|
"litellm_params_template": {}
|
|
},
|
|
{
|
|
"agent_type": "langgraph",
|
|
"agent_type_display_name": "LangGraph",
|
|
"description": "Connect to LangGraph agents via the LangGraph Platform API",
|
|
"logo_url": "/ui/assets/logos/langgraph.png",
|
|
"model_template": "langgraph/{assistant_id}",
|
|
"credential_fields": [
|
|
{
|
|
"key": "assistant_id",
|
|
"label": "Assistant ID",
|
|
"placeholder": "agent",
|
|
"tooltip": "The assistant/agent ID from your LangGraph deployment",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": "agent",
|
|
"include_in_litellm_params": false
|
|
},
|
|
{
|
|
"key": "api_base",
|
|
"label": "LangGraph API Base",
|
|
"placeholder": "http://localhost:2024",
|
|
"tooltip": "The base URL for your LangGraph server (e.g., http://localhost:2024 or your deployed LangGraph Cloud URL)",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": "http://localhost:2024",
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "api_key",
|
|
"label": "LangGraph API Key",
|
|
"placeholder": null,
|
|
"tooltip": "API key for authenticating with your LangGraph server (optional for local development)",
|
|
"required": false,
|
|
"field_type": "password",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "langgraph"
|
|
}
|
|
},
|
|
{
|
|
"agent_type": "bedrock_agentcore",
|
|
"agent_type_display_name": "Bedrock AgentCore",
|
|
"description": "Connect to Amazon Bedrock AgentCore hosted agent runtimes",
|
|
"logo_url": "/ui/assets/logos/bedrock.svg",
|
|
"inherit_credentials_from_provider": "Bedrock",
|
|
"model_template": "bedrock/agentcore/{agent_runtime_arn}",
|
|
"credential_fields": [
|
|
{
|
|
"key": "agent_runtime_arn",
|
|
"label": "Agent Runtime ARN",
|
|
"placeholder": "arn:aws:bedrock-agentcore:us-west-2:123456789012:runtime/my-agent-runtime",
|
|
"tooltip": "The ARN of your Bedrock AgentCore runtime. Find this in your AWS Bedrock console under AgentCore.",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": false
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "bedrock"
|
|
}
|
|
},
|
|
{
|
|
"agent_type": "azure_ai_foundry",
|
|
"agent_type_display_name": "Azure AI Foundry",
|
|
"description": "Connect to Microsoft Azure AI Foundry agents",
|
|
"logo_url": "/ui/assets/logos/azure_ai_foundry.png",
|
|
"inherit_credentials_from_provider": "Azure AI",
|
|
"model_template": "azure_ai/agents/{agent_id}",
|
|
"credential_fields": [
|
|
{
|
|
"key": "agent_id",
|
|
"label": "Agent ID",
|
|
"placeholder": "asst_abc123",
|
|
"tooltip": "The agent/assistant ID from your Azure AI Foundry project (e.g., asst_abc123)",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": false
|
|
},
|
|
{
|
|
"key": "api_base",
|
|
"label": "Azure AI API Base",
|
|
"placeholder": "https://your-resource.services.ai.azure.com/api/projects/your-project",
|
|
"tooltip": "The base URL for your Azure AI Foundry project endpoint (e.g., https://your-resource.services.ai.azure.com/api/projects/your-project)",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "api_key",
|
|
"label": "Azure AD Token",
|
|
"placeholder": null,
|
|
"tooltip": "Azure AD Bearer token for authentication. Optional if using Service Principal credentials below. Get via: az account get-access-token --resource https://ai.azure.com",
|
|
"required": false,
|
|
"field_type": "password",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "tenant_id",
|
|
"label": "Azure Tenant ID",
|
|
"placeholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
"tooltip": "Azure AD Tenant ID for Service Principal authentication. Find in Azure Portal > Azure Active Directory > Overview",
|
|
"required": false,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "client_id",
|
|
"label": "Azure Client ID",
|
|
"placeholder": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
"tooltip": "Application (client) ID of your Service Principal. Find in Azure Portal > App registrations > your app",
|
|
"required": false,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "client_secret",
|
|
"label": "Azure Client Secret",
|
|
"placeholder": null,
|
|
"tooltip": "Client secret for your Service Principal. Create in Azure Portal > App registrations > your app > Certificates & secrets",
|
|
"required": false,
|
|
"field_type": "password",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "azure_ai"
|
|
}
|
|
},
|
|
{
|
|
"agent_type": "pydantic_ai_agents",
|
|
"agent_type_display_name": "Pydantic AI",
|
|
"description": "Connect to Pydantic AI agents via A2A protocol (with fake streaming support)",
|
|
"logo_url": "/ui/assets/logos/pydantic.svg",
|
|
"use_a2a_form_fields": true,
|
|
"credential_fields": [
|
|
{
|
|
"key": "api_base",
|
|
"label": "Agent URL",
|
|
"placeholder": "http://localhost:9999",
|
|
"tooltip": "The base URL for your Pydantic AI agent server",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": "http://localhost:9999",
|
|
"include_in_litellm_params": true
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "pydantic_ai_agents"
|
|
}
|
|
},
|
|
{
|
|
"agent_type": "vertex_agent_engine",
|
|
"agent_type_display_name": "Vertex AI Agent Engine",
|
|
"description": "Connect to Google Cloud Vertex AI Reasoning Engines",
|
|
"logo_url": "/ui/assets/logos/google.svg",
|
|
"inherit_credentials_from_provider": "Vertex_AI",
|
|
"model_template": "vertex_ai/agent_engine/{reasoning_engine_id}",
|
|
"credential_fields": [
|
|
{
|
|
"key": "reasoning_engine_id",
|
|
"label": "Reasoning Engine Resource ID",
|
|
"placeholder": "projects/123456789/locations/us-central1/reasoningEngines/987654321",
|
|
"tooltip": "The full resource ID of your Vertex AI Reasoning Engine. Find this in Google Cloud Console under Vertex AI > Agent Builder > Your Agent.",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": false
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "vertex_ai"
|
|
}
|
|
},
|
|
{
|
|
"agent_type": "watsonx_orchestrate",
|
|
"agent_type_display_name": "watsonx Orchestrate",
|
|
"description": "Connect to IBM watsonx Orchestrate agents via CP4D or IBM Cloud IAM",
|
|
"logo_url": "/ui/assets/logos/watsonx.svg",
|
|
"credential_fields": [
|
|
{
|
|
"key": "cp4d_host",
|
|
"label": "CP4D Host URL",
|
|
"placeholder": "https://cpd-cpd.apps.example.com",
|
|
"tooltip": "Your CP4D cluster base URL (e.g. https://cpd-cpd.apps.example.com). For IBM Cloud WXO, use the service endpoint.",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "instance_id",
|
|
"label": "WXO Instance ID",
|
|
"placeholder": "1769134113217795",
|
|
"tooltip": "The numeric watsonx Orchestrate instance ID. Find it in the WXO service URL: /orchestrate/cpd/instances/<INSTANCE_ID>",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "wxo_agent_id",
|
|
"label": "WXO Agent ID",
|
|
"placeholder": "588c8cdf-60f4-454b-8468-8702b19dca46",
|
|
"tooltip": "UUID of the agent in watsonx Orchestrate. Find it via the WXO console or GET /v1/orchestrate/agents.",
|
|
"required": true,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "auth_mode",
|
|
"label": "Authentication Mode",
|
|
"placeholder": null,
|
|
"tooltip": "cp4d: on-prem / CloudPak for Data (requires username). ibm_cloud: IBM Cloud IAM (api_key only).",
|
|
"required": false,
|
|
"field_type": "select",
|
|
"options": ["cp4d", "ibm_cloud"],
|
|
"default_value": "cp4d",
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "username",
|
|
"label": "Username (CP4D only)",
|
|
"placeholder": "admin",
|
|
"tooltip": "Your CP4D username. Required when auth_mode is 'cp4d'.",
|
|
"required": false,
|
|
"field_type": "text",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
},
|
|
{
|
|
"key": "api_key",
|
|
"label": "API Key",
|
|
"placeholder": null,
|
|
"tooltip": "CP4D API key (auth_mode=cp4d) or IBM Cloud API key (auth_mode=ibm_cloud).",
|
|
"required": true,
|
|
"field_type": "password",
|
|
"default_value": null,
|
|
"include_in_litellm_params": true
|
|
}
|
|
],
|
|
"litellm_params_template": {
|
|
"custom_llm_provider": "watsonx_orchestrate"
|
|
}
|
|
}
|
|
]
|
|
|