Weave by Weights & Biases
Weave is a toolkit for tracing and evaluating AI agents, built by Weights & Biases.
You can use Weave to:
- Trace agents. Conversations, turns, LLM calls, and tool calls show up in the Agents tab.
- Evaluate agents and LLM applications.
- Trace functions with
@weave.opwhen you want the Calls tab, not the Agents tab.
Documentation
Our documentation site can be found here.
Start here for agents:
- Choose an agent integration — OpenAI Agents SDK, Claude Agent SDK, and Google ADK.
weave.init()is enough for those SDKs. - Custom agents — wrap your own loop with
start_conversation,start_turn,start_llm, andstart_tool.
Prerequisites
- Python 3.10 or higher
- A Weights & Biases account (free tier available)
- A W&B API key from https://wandb.ai/authorize. Set
WANDB_API_KEY. - An OpenAI API key in
OPENAI_API_KEY, for the example below.
Quick start: trace an agent
This example uses the OpenAI Agents SDK. The Python import is agents; the package name is openai-agents. Weave autopatches it after weave.init(). Traces land in the Agents tab, not the Calls tab.
pip install weave openai-agents requests
import asyncio
import requests
import weave
from agents import Agent, Runner, function_tool
weave.init("<your-team>/<your-project-name>")
@function_tool
def wikipedia_search(query: str) -> str:
"""Search Wikipedia for a topic and return its title and intro paragraph."""
r = requests.get(
"https://en.wikipedia.org/w/api.php",
params={
"action": "query",
"generator": "search",
"gsrsearch": query,
"gsrlimit": 1,
"prop": "extracts",
"exintro": True,
"explaintext": True,
"format": "json",
},
headers={"User-Agent": "weave-demo"},
).json()
page = next(iter(r["query"]["pages"].values()))
return f"{page['title']}: {page['extract']}"
agent = Agent(
name="Research assistant",
instructions=(
"You are a research assistant. Use the wikipedia_search tool to look up "
"topics when needed, and cite the article titles you used."
),
tools=[wikipedia_search],
)
async def main():
history = []
for question in [
"Who founded Anthropic?",
"What is Claude (the AI assistant)?",
"Summarize what we discussed in one sentence.",
]:
history.append({"role": "user", "content": question})
print(f"USER: {question}")
result = await Runner.run(agent, input=history)
print(f"AGENT: {result.final_output}\n")
history = result.to_input_list()
asyncio.run(main())
weave.init() prints a project URL. Open the Agents tab.
Claude Agent SDK works the same way: install the framework, call weave.init(), run the agent. For Google ADK, import google.adk before weave.init(). See Choose an agent integration.
Custom agents
If you are not using a supported agent SDK, wrap your own loop. This is the Conversation SDK, not the @weave.op path.
Use start_conversation, start_turn, and start_llm. In Python they are context managers and close on exceptions. start_session and Session still exist; they emit a DeprecationWarning. Do not use them in new code.
import weave
weave.init("<your-team>/<your-project-name>")
with weave.start_conversation(agent_name="research-bot"):
with weave.start_turn(user_message="Who founded Anthropic?"):
with weave.start_llm(model="gpt-4o-mini", provider_name="openai") as llm:
llm.output("Anthropic was founded by former OpenAI researchers.")
llm.record(
usage=weave.Usage(input_tokens=12, output_tokens=9),
response_model="gpt-4o-mini",
)
Always pass provider_name. Weave does not infer it from the model name.
For a multi-turn loop with tools, see the custom agents quickstart.
Function tracing
@weave.op traces a function. Those traces land in the Calls tab, not the Agents tab. Use it for evaluations, scorers, and LLM calls that are not an agent loop.
Plain openai is also auto-traced into the Calls tab after weave.init(). @weave.op wraps the call in a parent function, so the OpenAI request sits under extract_fruit.
pip install weave openai
import json
import weave
from openai import OpenAI
weave.init("<your-team>/<your-project-name>")
@weave.op
def extract_fruit(sentence: str) -> dict:
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": (
"You will be provided with unstructured data, and your task is to parse "
"it into one JSON object with fruit, color and flavor as keys."
),
},
{"role": "user", "content": sentence},
],
temperature=0.7,
response_format={"type": "json_object"},
)
extracted = response.choices[0].message.content
return json.loads(extracted)
extract_fruit(
"There are many fruits that were found on the recently discovered planet Goocrux. "
"There are neoskizzles that grow there, which are purple and taste like candy."
)
Contributing
Interested in pulling back the hood or contributing? Awesome, before you dive in, here's what you need to know.
We're in the process of 🧹 cleaning up 🧹. This codebase contains a large amount code for the "Weave engine" and "Weave boards", which we've put on pause as we focus on Tracing and Evaluations.
The Weave Tracing code is mostly in: weave/trace and weave/trace_server.
The Weave Evaluations code is mostly in weave/flow.
Metadata
Release files for weave 0.53.12
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| weave-0.53.12.tar.gz | 1.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| weave-0.53.12-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.2 MB
Release files / weave-0.53.12.tar.gz
| Download URL | weave-0.53.12.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3b1104219983bf422f821df75343e2eed021f2d2247016bc5bb214dd9e619f04
|
|
BLAKE2b-256 checksum How to use checksums |
4061b5698453885a35bb6c7729d8b423b99bf1c4ff2fa9421a22ec4e94c8bc24
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency logRelease files / weave-0.53.12-py3-none-any.whl
| Download URL | weave-0.53.12-py3-none-any.whl |
|---|---|
| Size | 1.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b070d11e64f6bbfdff8b72603bdec872ac6e7030a0d2b0fe985d96f454bd03e4
|
|
BLAKE2b-256 checksum How to use checksums |
0689f4f2c1ee1c09b5c46bafe12daf9a1e07aaffaa6ae55f0fbc0683f9925092
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 9, 2026.
Transparency log