- Responds to prompts using CRAFT’s managed LLM gateway
- Calls the CRAFT Assets API to list real data connections
- Is registered in the CRAFT agent registry
Obtain a CRAFT project access token via your deployment’s OIDC token endpoint (client credentials grant) and export the connection settings:For local dev, run
docker-compose up from the solution starter template — it pre-configures OIDC_TOKEN_URL, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, and the local URLs.Step 1 — Connect to CRAFT’s LLM gateway
The only difference between a standalone agent and a CRAFT-native agent is where it routes its LLM calls. CRAFT runs a LiteLLM gateway that handles model selection, project billing, and rate limits. All four frameworks reach it through an OpenAI-compatible endpoint. Pick your framework:- Google ADK
- Claude Agent SDK
- Pydantic AI
- LangGraph
agent.py
Routing to specific backends
The CRAFT gateway uses LiteLLM under the hood, so any model string it recognises works in themodel= field — you don’t need to change any client code. Ask your platform team which models are in the project’s allowlist.
Vertex AI (Google Cloud) — CRAFT default
Vertex AI (Google Cloud) — CRAFT default
Amazon Bedrock
Amazon Bedrock
Azure AI Foundry
Azure AI Foundry
Nebius Tokenfactory
Nebius Tokenfactory
Step 2 — Add a CRAFT tool
Tools let your agent take action. The simplest CRAFT tool calls the Assets API to list the data connections registered in your project — real databases and warehouses the platform knows about.- Google ADK
- Claude Agent SDK
- Pydantic AI
- LangGraph
agent.py
httpx.get() away.
Step 3 — Register your agent
A registered agent is discoverable by other platform services, the UI, and other agents via the A2A protocol. Registration is onePOST to the Assets API.
register.py
agent_card_url points to a /.well-known/agent-card.json endpoint your service exposes — it describes your agent’s skills so other agents can call it. See the A2A protocol primer for the Agent Card schema, and multi-agent patterns for wiring A2A delegation.
Re-POSTing the same
name in a project returns 409 RESOURCE_ALREADY_EXISTS.
To update an existing registration, PUT /assets/agents/{resource_uri} and include
the current ETag in If-Match:PUTwithoutIf-Matchreturns 428Precondition Required.PUTwith a staleIf-Matchreturns 412Precondition Failed("ETag mismatch — resource was modified").
ETag header on a prior GET /assets/agents/{resource_uri}
(or use the current_version field from the JSON body — both are equivalent), and feed
it back on the next PUT. Either the bare integer (If-Match: 1) or the quoted form
(If-Match: "1") is accepted; weak ETags (W/"1") are rejected. Automate the
GET → PUT(If-Match) cycle in your deploy pipeline so the registry stays in sync
with your running service.What’s next
Add more tools
Function tools, MCP tools via FastMCPToolset, schema discipline.
Multi-agent patterns
A2A delegation, parallel fan-out, supervisor agents.
A2A protocol primer
Agent Cards, JSON-RPC over SSE, task lifecycle.
Eval harness
Golden traces, Langfuse evaluators, regression suites.

