CI for AI agents - behavioral fingerprinting and drift detection
Project description
Spooled — Behavioral CI for AI Agents
The diff for agent behavior. Capture what your agent does, detect when it changes, gate the PR.
AI agents are non-deterministic. The same code, prompt, and model produce different tool-calling behavior on every run. A one-word prompt edit can silently drop a compliance check. A model upgrade can change which tools get called. A KB refresh can alter the agent's decision path. Unit tests pass. Eval suites pass. Nobody notices until production.
Spooled catches it on the PR.
What It Does
Capture — wraps your LLM client and records the structural fingerprint of every agent run: which tools were called, in what order, how many times. Content-blind by architecture — prompts, customer data, and AI responses never leave your infrastructure.
Compare — diffs the current run against a committed baseline. Shows exactly what changed: tools added, tools removed, sequence reordered, token usage shifted.
Gate — posts a PR comment with a behavioral score. Blocks the merge if the policy says so. Resolution instructions included.
Install
pip install spooled-ai
Quick Start
import spooled
from spooled.wrappers import wrap_openai
from openai import OpenAI
spooled.init(agent_id="my_agent")
client = wrap_openai(OpenAI())
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Analyze this deal"}],
tools=MY_TOOLS,
)
spooled.shutdown()
That's it. Every tool call is captured. The trace is saved to .spooled/traces/. The hash chain signs every interaction at capture time.
CI Integration
# .github/workflows/spooled.yml
- name: Generate traces
run: python ci_runner.py
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Spooled behavioral check
run: |
pip install spooled-ai
spooled ci compare .spooled/traces/*.jsonl \
--baseline .github/baselines \
--policy spooled-policy.yml \
--enable-blocking
Example PR comment:
❌ Spooled Behavioral CI: FAIL
Spooled Score: 59/100 (D) 🔴
| Agent | Status | Score | Tokens |
|------------|-----------------------------|-------|-------------------|
| deal_agent | ⚠️ Variant · Tooling change | 59 | 🔻 14198 (-32%) |
🔧 Tool Changes:
➖ sanctions_screening removed
➖ ip_patent_search removed
What Spooled Catches
| Change type | Example | Unit tests | Spooled |
|---|---|---|---|
| Prompt tweak | "Be concise" drops compliance tools | ✅ Pass | VARIANT |
| Model swap | Model drops sanctions screening | ✅ Pass | VARIANT |
| Tool deprecation | Agent proceeds without critical data | ✅ Pass | VARIANT |
| KB refresh | Ticket response path changes | ✅ Pass | VARIANT |
| Schema migration | Field rename breaks detection | ✅ Pass | VARIANT |
| Upstream degradation | Retry paths appear in fingerprint | ✅ Pass | VARIANT |
Content-Blind Architecture
Spooled never captures prompts, customer data, or AI responses. Only structural metadata: tool names, call sequence, token counts, timing. This is enforced in code — content is stripped before the trace reaches disk.
Supported Libraries
LLM Providers (explicit wrappers):
- OpenAI (sync/async, streaming)
- Anthropic (sync/async, streaming)
HTTP & Cloud (auto-instrumented via hooks):
- AWS Bedrock
- requests, httpx, aiohttp
Frameworks (callback handlers):
- LangChain, LlamaIndex, AutoGen, CrewAI, LangGraph
Documentation
License
Proprietary.
Project details
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 spooled_ai-0.4.4.tar.gz.
File metadata
- Download URL: spooled_ai-0.4.4.tar.gz
- Upload date:
- Size: 235.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9ecd01568238265ac07a1597e744d3963a52a4705f39eaadd3257cbd8a010fa
|
|
| MD5 |
952b37d574e0af8bc8afeceb3f0c4514
|
|
| BLAKE2b-256 |
18854d046046ad753e53c9cbfaa45a813965ce275c4fb1cfe6fa1a166610dbbd
|
File details
Details for the file spooled_ai-0.4.4-py3-none-any.whl.
File metadata
- Download URL: spooled_ai-0.4.4-py3-none-any.whl
- Upload date:
- Size: 279.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e1f706f5c7f2e66191622a9ea95096e72d0394f080accc300bcb23c2196fc4d
|
|
| MD5 |
3b3918f6e2fbf202594d3beb6349f161
|
|
| BLAKE2b-256 |
c4ce648f0520ebc432fff2e6372edf05cf1c09b82ad9995c5308350948c74f04
|