Skip to content

Add Observability to Your AI Agent in 3 Lines

Drop-in integrations for LangChain, OpenAI Agents, Claude, and CrewAI. No manual instrumentation required.

You’re using a framework to build your agent. You want to see every chain step, tool call, and LLM interaction — without wrapping each one in custom logging. You need observability that plugs into your existing code, not a rewrite.

Terminal window
pip install axonpush[langchain] # LangChain / LangGraph
pip install axonpush[openai-agents] # OpenAI Agents SDK
pip install axonpush[anthropic] # Claude / Anthropic
pip install axonpush[crewai] # CrewAI
pip install axonpush[deepagents] # LangChain Deep Agents
from axonpush import AxonPush
from axonpush.integrations.langchain import AxonPushCallbackHandler
client = AxonPush(api_key="ak_...", tenant_id="1", base_url="https://api.axonpush.xyz")
handler = AxonPushCallbackHandler(client, channel_id=1, agent_id="my-agent")
chain.invoke({"input": "research AI frameworks"}, config={"callbacks": [handler]})
from axonpush import AsyncAxonPush
from axonpush.integrations.openai_agents import AxonPushRunHooks
client = AsyncAxonPush(api_key="ak_...", tenant_id="1", base_url="https://api.axonpush.xyz")
hooks = AxonPushRunHooks(client, channel_id=1)
result = await Runner.run(agent, input="research AI frameworks", hooks=hooks)
from axonpush import AxonPush
from axonpush.integrations.anthropic import AxonPushAnthropicTracer
client = AxonPush(api_key="ak_...", tenant_id="1", base_url="https://api.axonpush.xyz")
tracer = AxonPushAnthropicTracer(client, channel_id=1)
response = tracer.create_message(
anthropic_client,
model="claude-sonnet-4-20250514",
messages=[{"role": "user", "content": "Research AI frameworks"}],
)
from axonpush import AxonPush
from axonpush.integrations.crewai import AxonPushCrewCallbacks
client = AxonPush(api_key="ak_...", tenant_id="1", base_url="https://api.axonpush.xyz")
callbacks = AxonPushCrewCallbacks(client, channel_id=1)
callbacks.on_crew_start()
result = Crew(
agents=[researcher, writer],
tasks=[research_task, write_task],
step_callback=callbacks.on_step,
task_callback=callbacks.on_task_complete,
).kickoff()
callbacks.on_crew_end(result)
from deepagents import create_deep_agent
from axonpush import AxonPush
from axonpush.integrations.deepagents import AxonPushDeepAgentHandler
client = AxonPush(api_key="ak_...", tenant_id="1", base_url="https://api.axonpush.xyz")
handler = AxonPushDeepAgentHandler(client, channel_id=1, agent_id="deep-agent")
agent = create_deep_agent(tools=[], system_prompt="You are a helpful assistant.")
agent.invoke(
{"messages": [{"role": "user", "content": "Research AI frameworks"}]},
config={"callbacks": [handler]},
)
FrameworkEvents
LangChainchain.start, chain.end, chain.error, llm.start, llm.end, tool.<name>.start, tool.end
OpenAI Agentsagent.run.start, agent.run.end, tool.<name>.start, tool.<name>.end, agent.handoff
Anthropicconversation.turn, tool.<name>.start, agent.response, tool.result
CrewAIcrew.start, crew.end, agent.step, tool.<name>.start, tool.<name>.end, task.complete
Deep Agentschain.start/end, llm.start/end, planning.update/complete, subagent.spawn/complete, filesystem.read/write, sandbox.execute
Go Deeper

Pass the same trace_id across services to build a unified trace:

handler = AxonPushCallbackHandler(client, channel_id=1, trace_id="tr_shared_123")
hooks = AxonPushRunHooks(client, channel_id=2, trace_id="tr_shared_123")

Both services’ events appear in the same trace when you call client.traces.get_events("tr_shared_123").