Embedded local-first TraceDB for AI agents in Python
Project description
yitrace-db
Embedded yiTrace DB for Python agents.
yitrace-db is the Python equivalent of @yitrace/db: it embeds the Rust
yiTrace engine in the Python process and calls EngineJsonApi in-process. It
does not parse yiTrace files in Python and does not send embedded calls through
a TCP socket. It can optionally expose the same DB through FastAPI or the
yitrace-db serve CLI when you want a local server.
Install
For local development from this repository:
cd yitrace-db-python
python -m pip install -e .
Public wheels should be built with maturin per platform:
cd yitrace-db-python
python -m pip install maturin
python -m maturin build --release --interpreter "$(command -v python)"
Use --interpreter when the machine has multiple Python installs; otherwise
maturin may discover an old system Python instead of the environment you are
building for.
Test
python -m pytest
From the repository root, run the package-mode eval when changing package
contracts, connect(path=...), FastAPI router behavior, or server-mode docs:
./scripts/package_mode_eval.sh
Usage
You can use it directly:
from yitrace_db import YiTraceDB, create_span_event_builder
db = YiTraceDB.open("./data", tenant_id=1)
events = create_span_event_builder({
"trace_id": "run-uuid",
"session_id": "session-uuid",
"attrs": {
"project_id": "agentic-data",
"skill": "review",
"mode": "auto",
},
})
events.start_span(span_id="span-uuid", name="risk review", input_text="疑似盗刷")
events.log("疑似盗刷", span_id="span-uuid")
events.end_span(span_id="span-uuid", status=0, duration_ns=12_000_000, output_text="needs review")
events.ingest(db)
hits = db.search({"text": "盗刷", "k": 10, "filter": {"attrs": {"project_id": "agentic-data"}}})
span = db.span("run-uuid", "span-uuid")
trajectories = db.trace_trajectories({
"filter": {"projectId": "agentic-data", "taskFingerprint": "refund-v1"}
})
groups = db.trajectory_groups({
"filter": {"projectId": "agentic-data", "taskFingerprint": "refund-v1"}
})
diff = db.trace_diff("run-a", "run-b")
loops = db.loops(projectId="agentic-data", taskFingerprint="refund-v1")
task_runs = db.task_traces("refund-v1", validationStatus="pass")
annotation = db.annotate(
traceId="run-uuid",
spanId="span-uuid",
label="best_path",
score=950,
source="human",
attrs={"project_id": "agentic-data", "skill": "review"},
)
db.update_annotation(annotation["annotationId"], status="resolved", reviewer="qa")
db.link_dataset_item(
datasetId="agentic-regression",
itemId="case-1",
traceId="run-uuid",
spanId="span-uuid",
split="eval",
label="pass",
)
plan = db.retention_plan(
{
"filter": {"projectId": "agentic-data"},
"deleteBeforeTs": 100000,
"protect": {"annotations": True, "datasetAssociations": True},
}
)
result = db.apply_retention(
{
"filter": {"projectId": "agentic-data"},
"deleteBeforeTs": 100000,
"requestedBy": "nightly-retention",
}
)
audits = db.retention_audits(source="nightly-retention")
db.close()
Use with to close safely:
with YiTraceDB.open("./data", tenant_id=1) as db:
print(db.search(text="盗刷", k=10))
Use db.lock_metrics() when a service feels slow around embedded writes. It
returns whether embedded locking is enabled, lock acquire counts, wait counts,
active waiters, wait milliseconds, timeout counts, stale lock cleanup counts,
and reader pin counts.
Or through the user-facing yitrace package:
python -m pip install "yitrace[db]"
# Or install the two packages explicitly:
python -m pip install yitrace yitrace-db
from yitrace import DbExporter, Tracer, connect
db = connect(path="./data", tenant_id=1)
tracer = Tracer(exporter=DbExporter(db, tenant_id=1), node_id=1)
The existing yitrace package remains the pure-Python instrumentation SDK and
client facade. Use yitrace when you want one import for HTTP and local modes.
Use yitrace-db directly when a Python app needs the embedded DB handle.
Server Mode
Install optional server dependencies:
python -m pip install "yitrace-db[server]"
Expose an embedded DB through FastAPI:
from fastapi import FastAPI
from yitrace_db import YiTraceDB
from yitrace_db.fastapi import create_yitrace_router
db = YiTraceDB.open("./data", tenant_id=1)
app = FastAPI()
app.include_router(create_yitrace_router(db), prefix="/yitrace")
Or start the small CLI server:
yitrace-db serve --data-dir ./data --bind 0.0.0.0:7878
Embedded mode can be used by multiple local worker processes. Each worker may
call YiTraceDB.open("./data"); the Rust engine serializes open/write paths
inside the data dir. Before each write it refreshes WAL, manifest, and metadata:
an unchanged WAL is skipped, an appended WAL is applied from its tail, and
derived indexes are rebuilt only when the manifest changes. Cross-process reader
pins stop reclaim() from physically deleting segment files while another
process still holds a snapshot. Do not share one data directory across machines
or unreliable network filesystems. For multi-host deployments, run one yiTrace
server process and send workers to it over HTTP.
The read-model helpers above are single-node implementations. Common filters
such as project_id, skill, task_fingerprint, loop_id,
validation_status, tool_name, and model use the attrs sidecar postings and
return readPlan. Postings are memory-budgeted: very wide values or total-entry
pressure disable only the affected postings, then queries fall back to the
sidecar rows and still return correct results. Persistent data dirs write a
disposable filter_attrs.dat segment cache; reopen loads it before replaying
the WAL tail, and stale or corrupt cache contents are rebuilt from the current snapshot. No-text
trace_aggregate() can use the in-memory aggregate
rollup (readPlan.source == "aggregate_rollup"). Persistent data dirs also
write a disposable trace_rollup.dat segment cache; reopen loads it before
replaying the WAL tail, and stale or corrupt cache contents are rebuilt from
the current snapshot. Deletes, retention apply, and segment upgrades rebuild
the cache as well. Trajectory, loop, and task helpers can return
readPlan.source == "trajectory_rollup" for no-text path summaries and reuse
the same trace_rollup.dat cache after reopen. When those helpers expand
complete traces after finding candidates, readPlan.traceFetchSource shows
whether that second step also used the rollup by trace id. Text filters still
use the normal folded read path. Disk sidecars and dedicated
trajectory-loop-task indexes can be added later without changing these method
names.
Annotation and dataset association use the same embedded metadata ledger as Node/Rust. They keep review and regression-set links beside trace data without copying large trace payloads.
Retention audit and policy records are stored in that same ledger. Retention is
always explicit: dry-run with retention_plan(), then call apply_retention()
or trigger saved policies with run_retention_policies(). Audit and policy
queries use the same in-memory metadata postings as annotations.
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 Distributions
Built Distributions
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 yitrace_db-0.1.0-cp38-abi3-win_amd64.whl.
File metadata
- Download URL: yitrace_db-0.1.0-cp38-abi3-win_amd64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.8+, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f44898df94559e237da548a35366b4280f771dcd0ac7863d25388d135b00339
|
|
| MD5 |
d6c8347801ecfd131f8060963fbf9b76
|
|
| BLAKE2b-256 |
c079391b0cfa35b74a988291d57bd7f2bc995f8a7471ccf1c3c04d0900e8eaa5
|
File details
Details for the file yitrace_db-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: yitrace_db-0.1.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e0173327cfdbfad3a5e4c87c47edec5c2fbf2066e6db834102572eaae3e6298
|
|
| MD5 |
fe6f3cde36b92092d60d338fa865e646
|
|
| BLAKE2b-256 |
7a3991ca47de0dc5664b8769410bdb4d639bfe3197cd65f733dccfa65b2d50cc
|
File details
Details for the file yitrace_db-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: yitrace_db-0.1.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.8+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29efe4c0c2b2b26d6948daf7f5cc41d48763142c26cae7652a4de5c1ac7eaf16
|
|
| MD5 |
49c706dc3d8443c9549fe04b8a6aaf6a
|
|
| BLAKE2b-256 |
359381adaa94b2dc107ece603b24fdd7a5ac04012b517f1caf7bf1fa63d66489
|
File details
Details for the file yitrace_db-0.1.0-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: yitrace_db-0.1.0-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 3.0 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f52245ea459b9f2dd40a5c4332aa2d0d775ccc71a987db91ed8d300ea5d1c431
|
|
| MD5 |
e5fbcf929589d06af6337f2576e8cd01
|
|
| BLAKE2b-256 |
24e51b230c092441fa3e59b103704ac9bf0e7716ea698340642bf5a12e71521e
|
File details
Details for the file yitrace_db-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: yitrace_db-0.1.0-cp38-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.1 MB
- Tags: CPython 3.8+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2e2e51a508cfd928cc9670b911671a01fa7eb716316b577a8cca0614b2097dc
|
|
| MD5 |
9369821b7649c23808a8a972d28a54c9
|
|
| BLAKE2b-256 |
dfc63f7240324f46aedd3a0f6f7136ed43e76513478f2eda7cf4aa2234649060
|