Documentation Index
Fetch the complete documentation index at: https://docs.inference.net/llms.txt
Use this file to discover all available pages before exploring further.
Pair OpenAI Agents instrumentation with OpenAI instrumentation so nested model
calls are captured. Use agentSpan() for an explicit outer AGENT span around
the customer request.
For the Agents dashboard, pass a stable agentId to agentSpan() and keep the
OpenAI Agents SDK Agent.name as the readable agent.name.
Install
bun add @inference/tracing openai @openai/agents zod
import { agentSpan, setup } from "@inference/tracing";
import * as agents from "@openai/agents";
import { Agent, run, tool } from "@openai/agents";
import OpenAI from "openai";
import { z } from "zod";
const tracing = await setup({
modules: { openai: OpenAI, openaiAgents: agents },
});
const lookupOrder = tool({
name: "lookup_order",
description: "Look up an order by ID.",
parameters: z.object({ orderId: z.string() }),
execute: async ({ orderId }) =>
JSON.stringify({ orderId, status: "shipped", total: 42.5 }),
});
const supportAgent = new Agent({
name: "SupportAgent",
instructions: "Use tools to help customers with order questions.",
tools: [lookupOrder],
model: "gpt-4o-mini",
});
const userMessage = "Where is order ABC-123?";
await agentSpan(
tracing.tracer,
{
agentId: "support-agent",
name: "SupportAgent",
role: "support",
system: "openai",
},
async (span) => {
span.setInput(userMessage);
const result = await run(supportAgent, userMessage, { maxTurns: 4 });
span.setOutput(String(result.finalOutput ?? ""));
},
);
await tracing.shutdown();
Multi-Agent Handoff
Wrap the triage request once. The trace tree groups the triage agent,
specialist agent, nested model calls, and tools under the customer request.
import { Agent, handoff, run, tool } from "@openai/agents";
const issueRefund = tool({
name: "issue_refund",
description: "Issue a refund for an order.",
parameters: z.object({ orderId: z.string(), amount: z.number() }),
execute: async ({ orderId, amount }) =>
JSON.stringify({ ok: true, orderId, refundId: "RFD-2201", amount }),
});
const refundsAgent = new Agent({
name: "RefundsAgent",
instructions: "Handle refund requests and use issue_refund.",
tools: [issueRefund],
model: "gpt-4o-mini",
});
const billingAgent = new Agent({
name: "BillingAgent",
instructions: "Answer billing questions. Do not issue refunds.",
model: "gpt-4o-mini",
});
const triageAgent = new Agent({
name: "TriageAgent",
instructions: "Route refund requests to RefundsAgent.",
handoffs: [handoff(refundsAgent), handoff(billingAgent)],
model: "gpt-4o-mini",
});
await agentSpan(
tracing.tracer,
{
agentId: "triage-agent",
name: "TriageAgent",
role: "triage",
system: "openai",
},
async (span) => {
const input = "I need a refund for order ABC-123, total $42.50.";
span.setInput(input);
const result = await run(triageAgent, input, { maxTurns: 8 });
span.setOutput(String(result.finalOutput ?? ""));
},
);
Use one stable ID for the outer customer-facing run. If you also emit separate
AGENT spans for handoff specialists, give each specialist its own stable
agent.id, such as refunds-agent or billing-agent.