Skip to main content

Frameworks

Call observra.instrument() after configure() to patch installed supported agent frameworks:

import observra

observra.configure(gateway_key="obs_live_xxx")
observra.instrument()

The operation is idempotent. Unsupported or unavailable framework integrations are skipped without breaking provider routing.

Supported frameworks​

FrameworkInstrumentation
LangChainLLM, chain, tool, and agent lifecycle spans
LangGraphLangGraph runs through LangChain instrumentation; agent, chain, and LLM hierarchy
LlamaIndexLLM and framework callback spans
CrewAICrew and task lifecycle spans
Semantic KernelKernel and chat-completion spans

Provider routing itself comes from configure(). Framework instrumentation adds higher-level spans; it is not required for direct provider SDK or raw httpx traffic.

LangChain​

import os

import observra
from langchain_openai import ChatOpenAI

observra.configure(gateway_key=os.environ["OBSERVRA_GATEWAY_KEY"])
observra.instrument()

model = ChatOpenAI(
model="mistral-small-latest",
api_key=os.environ["MISTRAL_API_KEY"],
base_url="https://api.mistral.ai/v1",
)
print(model.invoke("Explain observability in one sentence.").content)

LangGraph​

from langgraph.graph import END, START, StateGraph

workflow = StateGraph(dict)
workflow.add_node("answer", lambda state: {"answer": model.invoke(state["question"]).content})
workflow.add_edge(START, "answer")
workflow.add_edge("answer", END)

result = workflow.compile().invoke({"question": "Explain observability in one sentence."})
print(result["answer"])

With instrumentation enabled, the graph, node, and model call appear as a parent-child trace hierarchy.

Version safety​

Framework integrations are version-aware. When a framework changes beyond a supported API, Observra logs and skips the affected patch rather than applying an unsafe monkey patch. Provider routing remains available for supported httpx hosts.

Examples​

Use the LangChain and LangGraph scripts above as the framework integration pattern for CrewAI, LlamaIndex, and Semantic Kernel: configure Observra first, then call observra.instrument() before framework work begins.

Next​