Skip to main content

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.

Metadata

Release files for yitrace-db 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for yitrace-db 0.1.8
File
yitrace_db-0.1.8-cp38-abi3-win_amd64.whl CPython 3.8 abi3 Windows x86-64 Details
yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.8 abi3 Linux glibc 2.17+ x86-64 Details
yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.8 abi3 Linux glibc 2.17+ ARM64 Details
yitrace_db-0.1.8-cp38-abi3-macosx_11_0_arm64.whl CPython 3.8 abi3 macOS 11.0+ ARM64 Details
yitrace_db-0.1.8-cp38-abi3-macosx_10_12_x86_64.whl CPython 3.8 abi3 macOS 10.12+ x86-64 Details

Total release size: 16.2 MB

Release files / yitrace_db-0.1.8-cp38-abi3-win_amd64.whl

Download URL yitrace_db-0.1.8-cp38-abi3-win_amd64.whl
Size 3.2 MB
Tags CPython 3.8 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
341eda086cfb700b05335a48f21b481141148ceb3438d8b5aed51f1f94c14a5f
BLAKE2b-256 checksum
How to use checksums
12621cd5425fe3878ad00ed825858ebef8d31757b1134839422074020865d44e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release files / yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 3.3 MB
Tags CPython 3.8 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
8fe5b5d57dad898afbf3b66311a32203e05aee0aa31a4425ffd729590321d359
BLAKE2b-256 checksum
How to use checksums
46d96de40e537ed6d176d38c557b4b07e2564308dd80929b2546dec4269c9df3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release files / yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL yitrace_db-0.1.8-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 3.2 MB
Tags CPython 3.8 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
daddda09b9b8166c89c47aef63e595b634373ec7e31bad6fbd00f4fb4d762add
BLAKE2b-256 checksum
How to use checksums
d4ba441bd4ff9064e68b3967e53340a9736417b1d0e7c28fbe8b0e1f55b84738
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release files / yitrace_db-0.1.8-cp38-abi3-macosx_11_0_arm64.whl

Download URL yitrace_db-0.1.8-cp38-abi3-macosx_11_0_arm64.whl
Size 3.2 MB
Tags CPython 3.8 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
bd727e721672b5aa5538726179ae76d7b955785a394a637e2b8e7330ba7c2212
BLAKE2b-256 checksum
How to use checksums
7324ce1df5a4c2198a2e92a97a6bc17fb9a7e11590beeedc8e5a95ade0db93bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release files / yitrace_db-0.1.8-cp38-abi3-macosx_10_12_x86_64.whl

Download URL yitrace_db-0.1.8-cp38-abi3-macosx_10_12_x86_64.whl
Size 3.3 MB
Tags CPython 3.8 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
2eb9fc60cae9992cdce83eb5b7678247fe38f18e69d51791bc9cbc4b8d0215a3
BLAKE2b-256 checksum
How to use checksums
22005440931b3b8fb0e12296e071660215b3b4c489e9b2727f6110f599d92fcc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.2

Release history Release notifications | RSS feed

This release

0.1.8 This release

5 release files

0.1.7

5 release files

0.1.6

5 release files

0.1.5

5 release files

0.1.4

5 release files

0.1.3

5 release files

0.1.0

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page