Agent TrustKit measures how trustworthy your AI agents are (grounding, policy compliance, tool safety, reliability, cost, drift) against your own data, offline, without wrapping your code or phoning home. You bring two things: a short contract saying what your agents are supposed to do, and the standard OpenTelemetry they already emit. What separates a good evaluation from a great one is how much depth is in that telemetry.
One config file (contract.yaml) stating the job, the rules, and the guardrails. It's the yardstick every evaluation measures against, and it doubles as the agent-inventory and governance artifact frameworks like NIST expect you to have on file anyway. It's data, written once per project. Not code, not instrumentation. And you don't write it alone: trustkit init can scaffold it from an archetype pack, and we fill it in with you from the questionnaire below.
Agent TrustKit reads the OpenTelemetry your agents already emit (GenAI semantic conventions). If you're instrumented, directly or through LangGraph, the OpenAI Agents SDK, Langfuse, or Phoenix, there's a good chance you don't touch your code at all. You emit standard telemetry and an Agent TrustKit adapter maps it onto our model. The baseline we need per run:
1. each agent invocation with its input and output
2. each tool call with its name, arguments, and, critically, its results
3. timing, tokens, and cost
The more you capture, the more we can verify. Retrieval sources unlock groundedness. Cohort tags unlock fairness and consistency. Handoff signals unlock the escalation checks. Pick the export path that matches your stack; the first thing we run against your file is a read-only preflight (trustkit inspect) that reports what it can and can't support before any evaluation happens.
Your InvokeAgent calls already produce a full trace with enableTrace=True. Write the trace events to a JSONL file, which is about ten lines wherever you invoke the agent. Knowledge-base lookups carry the retrieved passages, so hallucination and omission checks work on this path with nothing extra from you.
import json
response = client.invoke_agent(
agentId=AGENT_ID, agentAliasId=ALIAS_ID,
sessionId=session_id, inputText=user_input,
enableTrace=True,
)
with open("bedrock-traces.jsonl", "a") as f:
for event in response["completion"]:
if "trace" in event:
f.write(json.dumps(event["trace"], default=str) + "\n")If your agent is instrumented with OpenTelemetry (ADOT or any OTel GenAI instrumentation), we ingest standard OTLP trace exports in JSON, pretty-printed or not. Easiest route is a file exporter in your collector pipeline, or OTEL_TRACES_EXPORTER=console on a test run. One heads-up: standard GenAI telemetry doesn't carry retrieved-passage text, so this path covers policies, budgets, tool use, and reliability out of the box, and groundedness and omission checks need a small enrichment we scope together.
If you log requests, tool invocations, and results anywhere at all (CloudWatch, a database, flat files), that's enough to work with. We write a small adapter against your log schema, usually half a day, and it's yours to keep. Send us about ten runs' worth of logs to write it against.
Also fine, and more common than you'd think. We wrap your agent's entry point with a recorder, or hand your team a short instrumentation patch, then run it against a task set we design together. You come out of it with step-by-step execution tracing that's useful whether or not you ever evaluate anything.
This is where most setups come up short. There's a difference between telemetry that shows what an agent said it did and telemetry that lets us prove what happened. Two things matter more than the rest.

You don't write the contract alone. These are the nine questions we work through together to get one:
Send the export, or just the questions, and we'll run the read-only preflight first so nobody gets surprised.
Book a call →[email protected]