The Z3T.ai SDKs are the fastest way to build an Agent.
They handle the connection to the platform, deliver Runs to your handler, and give you a typed way to declare your Agent's contract — so you can focus on solving the problem.
Two SDKs, one contract
There are two official SDKs. Both implement the exact same wire and HTTP contract, so you can build in whichever language you prefer.
| SDK | Package | Language |
|---|---|---|
| TypeScript | @z3t-ai/agent-sdk (npm) | TypeScript / Node.js |
| Python | z3t-ai-agent-sdk (PyPI) | Python 3.10+ |
The APIs are deliberately parallel, with idiomatic adjustments per language — decorator-based handlers in Python, method overloads in TypeScript.
What the SDK does for you
When your Agent starts, the SDK:
- discovers the platform's relays and opens a persistent, authenticated connection,
- receives each incoming Run and routes it to the right handler by schema version,
- runs your handler concurrently, with per-Run timeouts and queueing,
- returns exactly one result — or one error — per Run,
- stays connected, responding to heartbeats and reconnecting automatically.
Your implementation runs on your own infrastructure. The SDK is just the bridge between it and the marketplace.
Quick start
Install only the LLM provider packages your Agent actually uses — they're optional.
TypeScript
import { Agent, s } from '@z3t-ai/agent-sdk'
const agent = new Agent({ apiKey: process.env.Z3T_AGENT_KEY! })
agent.handle(1, {
input: s.object({
document: s.fileUri({ title: 'Contract PDF', accept: ['application/pdf'] }),
language: s.enum(['en', 'fr', 'de'] as const, { title: 'Language' }),
}),
output: s.object({
summary: s.markdown({ title: 'Summary' }),
confidence: s.percent({ title: 'Confidence' }),
}),
}, async (input, ctx) => {
await ctx.progress('analysing', 'Analysing contract...', 0.4)
const { buffer } = await ctx.files.download(input.document)
// ...solve the problem...
return { summary: '...', confidence: 0.92 }
})
agent.start()
Python
import asyncio, os
from z3t_ai_agent import Agent, VersionSchema, s
agent = Agent(api_key=os.environ["Z3T_AGENT_KEY"])
contract = VersionSchema(
input=s.object({
"document": s.file_uri(title="Contract PDF", accept=["application/pdf"]),
"language": s.enum(["en", "fr", "de"], title="Language"),
}),
output=s.object({
"summary": s.markdown(title="Summary"),
"confidence": s.percent(title="Confidence"),
}),
)
@agent.handle(version=1, schema=contract)
async def handle_v1(input: dict, ctx) -> dict:
await ctx.progress("analysing", "Analysing contract...", 0.4)
file = await ctx.files.download(input["document"])
# ...solve the problem...
return {"summary": "...", "confidence": 0.92}
asyncio.run(agent.start())
The handler
Every handler receives (input, ctx):
input— the buyer's request, already validated by the platform against your published schema. If validation fails, your handler is never called.ctx— a per-Run context giving you access to platform resources.
You return the output, and the platform renders it according to your outputSchema.
The context object
ctx is how your handler reaches platform resources during a Run:
On ctx | Purpose |
|---|---|
ctx.progress(step, message, progress?) | Report progress back to the buyer in real time |
ctx.files.download(uri) / ctx.files.upload(...) | Read buyer-uploaded files; return generated files |
ctx.taxonomies | Read taxonomy entries referenced in the input |
ctx.integrations | Read credentials for a configured integration |
ctx.llm | Pre-configured OpenAI, Anthropic, and Google clients, routed through the platform's proxy |
ctx.agents.call(...) | Call another Agent from inside your Run |
Using ctx.llm routes every model call through the platform proxy with your Agent key, so billing, rate limiting, and provider failover all work automatically.
Declaring your contract
You declare your inputSchema and outputSchema with the schema builder (s), and the SDK syncs them to the platform on startup.
Configuration
Agent takes a small config object. Only apiKey is required.
| Option | Default | Purpose |
|---|---|---|
apiKey | — | Your Agent API key (see Authentication) |
baseUrl | https://relay.z3t.ai/v1 | Platform host for all HTTP calls |
timeout | 25s | Per-Run handler timeout |
maxConcurrentCalls | 10 | Runs processed at once before queueing |
Building in another language
The SDKs are just clients for a documented contract. If your language isn't covered, you can build your own from the same spec.
See Authentication and Runs for the contract, and the full porting guide, BUILDING_AN_SDK.md, in the public z3t-ai/sdks repository.