Public agent card discovery¶
Agent2Agent (A2A) clients discover an agent by fetching its agent card from the /.well-known/agent-card.json path before invoking it. By default, every request to a DataRobot agent endpoint requires an API key, so an external client can't fetch the agent card without already holding a credential. Public agent card discovery opens the agent card path to unauthenticated GET requests, while every other path on the agent endpoint still requires authentication.
Public discovery is an opt-in, cluster-level setting for self-managed installations. It is disabled by default, and enabling it is a deliberate administrator action that applies to every organization on the cluster.
Discovery behavior¶
When public discovery is enabled, the agent serves one of two agent cards from the same path, depending on the caller:
| Caller | Response |
|---|---|
| Anonymous (no credential) | The redacted agent card. |
| Authenticated, with access to the deployment or workload | The extended (full) agent card. |
| Authenticated, without access to the deployment or workload | 403 Forbidden; no agent card is returned. |
The redacted agent card keeps the name, description, capabilities, URL, security schemes, and the Cross-App Access (XAA) extension that a client needs to authenticate. It empties the list of skills and removes the internal and external identity extensions. The redacted agent card sets supportsAuthenticatedExtendedCard, so A2A-compliant clients re-fetch the extended agent card after authenticating.
The agent card is served from the endpoint that hosts the agent:
| Runtime | Agent card path |
|---|---|
| Deployments | https://DATAROBOT_HOST/api/v2/deployments/DEPLOYMENT_ID/directAccess/a2a/.well-known/agent-card.json |
| Workloads | https://DATAROBOT_HOST/api/v2/endpoints/workloads/WORKLOAD_ID/a2a/.well-known/agent-card.json |
Replace DATAROBOT_HOST with the hostname of your DataRobot installation, and DEPLOYMENT_ID or WORKLOAD_ID with the ID of the deployment or workload that hosts the agent.
Enable public discovery¶
How you enable public discovery depends on which gateway sits in front of the agent:
- Envoy gateway. Workloads served through the Envoy-based API gateway. See Enable discovery behind the Envoy gateway.
- Prediction gateway. Custom model deployments, and workloads served through the prediction gateway. See Enable discovery behind the prediction gateway.
Enable the setting for each gateway that serves agents you want to make discoverable.
Enable discovery behind the Envoy gateway¶
For workloads behind the Envoy gateway, the workload-api.workloads.routes.enabled chart value allows workloads to declare publicly exposed routes. It is disabled by default. Add it to the values.yaml file:
workload-api:
apiGateway:
enabled: true
workloads:
routes:
enabled: true
The workload-api.apiGateway.enabled value routes the Workload API through the Envoy gateway. If your installation already sets it, add only the workloads.routes.enabled value under the existing workload-api block.
After the setting is enabled, the agent developer opts each workload in to public discovery by setting the agent card route's authentication to optional in the workload artifact spec:
"routes": [
{"path": "/a2a/.well-known/agent-card.json", "auth": "optional"}
]
With optional authentication, the route serves the redacted agent card to anonymous callers and the extended agent card to authenticated callers. Routes that aren't listed keep requiring authentication.
Enable discovery behind the prediction gateway¶
For custom model deployments, and workloads behind the prediction gateway, enable keyless discovery on the prediction-gateway chart. Add the following to the values.yaml file:
prediction-gateway:
component:
gateway:
keylessDiscovery:
enabled: true
suffixes:
- /.well-known/agent-card.json
rpmLimit: 120
globalRpmLimit: 1000
The keylessDiscovery block accepts the following values:
| Value | Description |
|---|---|
enabled |
Turns keyless discovery on or off. Defaults to false. |
suffixes |
The path suffixes that accept unauthenticated GET requests. A request is keyless only when it carries no credential, uses the GET method, and its path ends with a listed suffix. When the list is empty, no path is keyless. |
rpmLimit |
The maximum number of unauthenticated discovery requests per minute for a single deployment or workload. |
globalRpmLimit |
The maximum number of unauthenticated discovery requests per minute across all deployments and workloads. |
Requests that include a credential run full authentication and authorization, whether or not the path matches a suffix. Unauthenticated requests that use a method other than GET on a discovery path are rejected with 405 Method Not Allowed.
Rate limits
Redacting the agent card prevents reconnaissance but doesn't protect compute, so the rate limits are the protection against abuse of the open path. The agent card is small and static, so the limits act as an abuse ceiling rather than a usage quota. Start with the example values and tune them once real discovery volume is observed. For per-client fairness, apply limits at your ingress or web application firewall.
Verify discovery¶
To confirm that public discovery works, request the agent card without an API key:
curl -s "https://DATAROBOT_HOST/api/v2/deployments/DEPLOYMENT_ID/directAccess/a2a/.well-known/agent-card.json"
A redacted agent card with an empty skills list confirms that anonymous discovery is enabled. Repeat the request with an Authorization: Bearer API_KEY header, where API_KEY is a key for a user with access to the deployment, to confirm that the extended agent card is returned. When public discovery is disabled, the unauthenticated request is rejected.