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.
Catalyst hooks LangChain callback managers so runnable calls emit spans without
manual span creation. In agent workflows, the trace tree includes chain, model,
and tool spans with parent-child relationships preserved by LangChain callbacks.
For the Agents dashboard, wrap the product-level agent invocation with
agentSpan() / agent_span() and pass a stable agentId / agent_id. The
LangChain chain, model, and tool spans stay nested below that AGENT span.
Install
bun add @inference/tracing @langchain/core langchain @langchain/anthropic zod
Pass the callback manager module to setup(). Catalyst patches the static
configuration path LangChain uses when constructing callback managers.
import { agentSpan, setup } from "@inference/tracing";
import { ChatAnthropic } from "@langchain/anthropic";
import * as CallbackManagerModule from "@langchain/core/callbacks/manager";
import { createAgent, tool } from "langchain";
import { z } from "zod";
const tracing = await setup({
serviceName: "support-agent",
modules: { langchainCallbacksManager: CallbackManagerModule },
});
const lookupOrder = tool(
({ orderId }) => JSON.stringify({ orderId, status: "shipped", total: 42.5 }),
{
name: "lookup_order",
description: "Look up an order by ID.",
schema: z.object({ orderId: z.string() }),
},
);
const cancelOrder = tool(
({ orderId, reason }) => JSON.stringify({ ok: true, orderId, reason }),
{
name: "cancel_order",
description: "Cancel a not-yet-delivered order.",
schema: z.object({ orderId: z.string(), reason: z.string() }),
},
);
const agent = createAgent({
model: new ChatAnthropic({ model: "claude-haiku-4-5", maxTokens: 512 }),
tools: [lookupOrder, cancelOrder],
systemPrompt: "Use tools to resolve order issues.",
});
const result = await agentSpan(
tracing.tracer,
{
agentId: "support-agent",
name: "SupportAgent",
role: "support",
system: "langchain",
},
async (span) => {
const input = "Cancel order ABC-123.";
span.setInput(input);
const output = await agent.invoke({
messages: [{ role: "user", content: input }],
});
span.setOutput(output.messages.at(-1)?.content);
return output;
},
);
console.log(result.messages.at(-1)?.content);
await tracing.shutdown();
import json
from inference_catalyst_tracing import agent_span, setup
from langchain.agents import create_agent
from langchain_anthropic import ChatAnthropic
from langchain_core.tools import tool
tracing = setup(service_name="support-agent")
@tool
def lookup_order(order_id: str) -> str:
"""Look up an order by ID."""
return json.dumps({"order_id": order_id, "status": "shipped", "total": 42.5})
@tool
def cancel_order(order_id: str, reason: str) -> str:
"""Cancel a not-yet-delivered order."""
return json.dumps({"ok": True, "order_id": order_id, "reason": reason})
llm = ChatAnthropic(model_name="claude-haiku-4-5", max_tokens_to_sample=512)
agent = create_agent(
llm,
tools=[lookup_order, cancel_order],
system_prompt="Use tools to resolve order issues.",
)
with agent_span(
tracing.tracer,
agent_id="support-agent",
name="SupportAgent",
agent_role="support",
system="langchain",
) as span:
user_input = "Cancel order ABC-123."
span.set_input(user_input)
result = agent.invoke(
{"messages": [{"role": "user", "content": user_input}]},
)
span.set_output(result["messages"][-1].content)
print(result["messages"][-1].content)
tracing.shutdown()
What To Look For
- A top-level LangChain chain or agent span
- An outer AGENT span with
agent.id=support-agent when you use the wrapper
- Nested LLM spans for model calls
- Tool spans named after LangChain tools
- Tool input and output attributes on tool spans
- Token counts on model spans when the provider returns usage