Spool SDK for Python — trace LLM agent runs into the local Spool store
Project description
spool-agent (Python SDK)
The Python counterpart to @spool-ai/agent. Wire any Python LLM agent into
Spool by capturing one Step per model call. Runs land in the same
~/.spool/spool.db store the TypeScript SDK, the CLI, and the web UI
read from — so a Python agent shows up in spool list and spool web
immediately, with no separate ingest step.
Install
pip install -e packages/agent-py # core only (stdlib)
pip install -e 'packages/agent-py[anthropic]' # add the Anthropic helper
Requires Python 3.9+. Core has zero runtime dependencies (it uses
sqlite3, hashlib, json, pathlib from the standard library).
Minimal usage
from spool_agent import SpoolTracer
with SpoolTracer(project="my-app", agent="support") as tracer:
step = tracer.start_step(
model="claude-opus-4-7",
system_prompt="you are helpful",
history=[{"role": "user", "content": "hello"}],
)
# ... call your model, then record what it did ...
step.record_message("hi back!").record_tokens(
input=10, output=2, cached_read=0, cache_creation=0
)
step.end()
Then in another terminal:
spool list
spool inspect <run-id>
spool web # see it live alongside any Claude Code / Codex runs
Anthropic shortcut
If you already use the official anthropic Python SDK, wrap the client
once and every messages.create() call is captured automatically:
from anthropic import Anthropic
from spool_agent import SpoolTracer, trace_anthropic
with SpoolTracer(project="my-app", agent="support") as tracer:
client = trace_anthropic(tracer, Anthropic()) # API-compatible wrapper
resp = client.messages.create(
model="claude-opus-4-7",
max_tokens=512,
system="you are helpful",
messages=[{"role": "user", "content": "hello"}],
)
# one Spool Step captured per call — including tool_use, tokens, latency.
The wrapped client behaves identically to the underlying Anthropic
client — it returns the same Message object, exposes the same
attributes, and re-raises the same exceptions (recording them as
error outcomes before the throw bubbles).
Multi-step agent loop
For multi-step agents that call tools, drive each step manually:
from spool_agent import SpoolTracer, tool_call_action
with SpoolTracer(project="my-app", agent="rag") as tracer:
history = [{"role": "user", "content": "what's the weather in NYC?"}]
# turn 1: model picks a tool
step1 = tracer.start_step(model="claude-opus-4-7", history=history)
step1.record_action(tool_call_action("weather", {"city": "NYC"}, "tu_1"))
step1.record_tokens(input=120, output=20)
step1.end()
# run the tool yourself ...
tool_result = {"temp_f": 68, "conditions": "clear"}
# turn 2: feed the tool result back, model produces a message
history += [
{"role": "assistant", "content": "[tool_call weather]"},
{"role": "tool", "content": str(tool_result)},
]
step2 = tracer.start_step(model="claude-opus-4-7", history=history)
step2.record_message("It's 68°F and clear in NYC.")
step2.record_tokens(input=150, output=15)
step2.end()
What's captured per step
| Field | Source |
|---|---|
model |
required arg to start_step() |
system_prompt, tool_definitions, history, retrieved_docs |
optional context components (blob-stored, content-addressed) |
action |
record_message() / record_tool_call() / record_action() |
outcome |
record_tool_result() / record_outcome() |
tokens (input / output / cached_read / cache_creation [5m] / cache_creation_1h) |
record_tokens() |
cost_cents |
computed from tokens via the same pricing table the TS side uses |
latency_ms |
wall-clock since start_step(), or explicit via record_tokens(latency_ms=...) |
tags |
step.tag("x") — cost:approx auto-applied for unknown models |
Configuration
| Env var | Effect |
|---|---|
SPOOL_HOME |
Override the data directory (default ~/.spool) |
SPOOL_REDACT=off |
Disable regex redaction of API keys / bearer tokens / private keys |
Run the tests
cd packages/agent-py
python -m unittest discover -s tests -v
Tests redirect SPOOL_HOME to a tempdir per test, so they never touch
your real ~/.spool store.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spool_agent-0.3.1.tar.gz.
File metadata
- Download URL: spool_agent-0.3.1.tar.gz
- Upload date:
- Size: 60.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8251d90766208ee5d4a5d552615bb1c68348082e8782ed0cc49999a5e38a4d0
|
|
| MD5 |
c220df7df9feb0d1c0f87a9e159cbad8
|
|
| BLAKE2b-256 |
234cf4ea04bc82d113616a8e9f00f15b2da22580cc327ef2206a1f1bb6d297b1
|
Provenance
The following attestation bundles were made for spool_agent-0.3.1.tar.gz:
Publisher:
publish-pypi.yml on HoneycombHairDevelopers/Spool
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spool_agent-0.3.1.tar.gz -
Subject digest:
b8251d90766208ee5d4a5d552615bb1c68348082e8782ed0cc49999a5e38a4d0 - Sigstore transparency entry: 1791288910
- Sigstore integration time:
-
Permalink:
HoneycombHairDevelopers/Spool@5249fc5483bb79a27f9d657811265ae687b0f773 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/HoneycombHairDevelopers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@5249fc5483bb79a27f9d657811265ae687b0f773 -
Trigger Event:
release
-
Statement type:
File details
Details for the file spool_agent-0.3.1-py3-none-any.whl.
File metadata
- Download URL: spool_agent-0.3.1-py3-none-any.whl
- Upload date:
- Size: 29.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d401845a716a6a1acb2a113fdbcd263e37b9ddb4a04a23d2a9dd0170d966d8c
|
|
| MD5 |
433390a2487759746651b9ecee2ce5d7
|
|
| BLAKE2b-256 |
7856165bc23baf49571e1c67cb7cac890ac40455c23acf8b5910dcbc4431f8cf
|
Provenance
The following attestation bundles were made for spool_agent-0.3.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on HoneycombHairDevelopers/Spool
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
spool_agent-0.3.1-py3-none-any.whl -
Subject digest:
3d401845a716a6a1acb2a113fdbcd263e37b9ddb4a04a23d2a9dd0170d966d8c - Sigstore transparency entry: 1791289125
- Sigstore integration time:
-
Permalink:
HoneycombHairDevelopers/Spool@5249fc5483bb79a27f9d657811265ae687b0f773 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/HoneycombHairDevelopers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@5249fc5483bb79a27f9d657811265ae687b0f773 -
Trigger Event:
release
-
Statement type: