Installation
Framework Setup
Per-framework setup guide — what auto-instruments, what needs a decorator, and why.
LangChain
LangChain is fully auto-instrumented. No code changes to your agent logic.
pip install spineforge langchain langchain-openaiimport spineforge
from langchain.agents import AgentExecutor
from langchain_openai import ChatOpenAI
spine = spineforge.init(agent_name="langchain-agent")
llm = ChatOpenAI(model="gpt-4o")
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)
with spine.run(input=user_query) as run:
result = executor.invoke({"input": user_query})
run.set_output(result["output"])LangChain tools are auto-captured via the
on_tool_start / on_tool_end callback system. You do not need @track_tool.LangGraph
pip install spineforge langgraph langchain-openaiimport spineforge
spine = spineforge.init(agent_name="langgraph-agent")
# Build your graph normally
graph = build_your_langgraph(...)
with spine.run(input=user_query) as run:
result = graph.invoke({"messages": [("user", user_query)]})
run.set_output(result["messages"][-1].content)LangGraph builds on LangChain's callback system — the same instrumentor captures all LLM and tool spans.
CrewAI
pip install spineforge crewaiimport spineforge
from crewai import Crew, Agent, Task
spine = spineforge.init(agent_name="crewai-agent")
researcher = Agent(role="Researcher", ...)
task = Task(description=user_query, agent=researcher)
crew = Crew(agents=[researcher], tasks=[task])
with spine.run(input=user_query) as run:
result = crew.kickoff()
run.set_output(str(result))AutoGen
pip install spineforge pyautogenimport spineforge
import autogen
spine = spineforge.init(agent_name="autogen-agent")
assistant = autogen.AssistantAgent("assistant", llm_config=config)
user_proxy = autogen.UserProxyAgent("user_proxy", ...)
with spine.run(input=user_query) as run:
user_proxy.initiate_chat(assistant, message=user_query)
run.set_output("conversation complete")Raw OpenAI SDK
The Groq/OpenAI SDK-level instrumentor auto-captures chat.completions.create() calls. For your own tool functions, add @track_tool:
pip install spineforge openaiimport spineforge
from spineforge import track_tool
from openai import OpenAI
spine = spineforge.init(agent_name="raw-sdk-agent")
@track_tool
def search(query: str) -> str:
return fetch_search_results(query)
@track_tool
def call_api(endpoint: str) -> dict:
return requests.get(endpoint).json()
with spine.run(input=user_query) as run:
client = OpenAI(api_key=spine.lease_credential("openai-api-key"))
# LLM calls auto-captured
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": user_query}]
)
# Tool calls captured by @track_tool
search_result = search(resp.choices[0].message.content)
run.set_output(search_result)Adding a new framework (for contributors)
To add support for a new framework:
- Install the instrumentor package:
pip install opentelemetry-instrumentation-<framework> - Activate it in
instrumentation.py:try: from opentelemetry.instrumentation.crewai import CrewAIInstrumentor CrewAIInstrumentor().instrument(tracer_provider=provider) except ImportError: pass # Framework not installed — skip silently - Add span classification in
span_processor.py: Add a condition in_classify_and_build()to detect framework-specific span attributes.