Skip to main content

Prime Traces SDK

Upload and query training, evaluation and inference traces through the Prime Traces service.

Install

uv add prime-traces   # or: pip install prime-traces

Upload

upload_records takes JSON-compatible mappings or any object exposing to_record() — which verifiers Trace / Episode and prime-rl Rollout already do, so producers can hand over their own objects. Records are serialized lazily into bounded batches, so nothing buffers the whole run or round-trips through disk.

from prime_traces import LineFormat, TracesClient

client = TracesClient()  # PRIME_API_KEY / PRIME_TRACES_URL / ~/.prime/config.json

receipts = client.upload_records(traces, context={"source": "prime-rl"})

# One complete episode per record, for multi-agent runs
receipts = client.upload_records(episodes, line_format=LineFormat.EPISODE)

# Already have a completed JSONL file, or encoded bytes?
receipts = client.upload_file("traces.jsonl", context={"source": "hosted_eval"})
receipts = client.upload_lines(encoded_lines)

Query

page = client.list(run_id="run_9f3k2m", reward_min=0.9, has_error=False)
for summary in page.items:
    print(summary.trace_id, summary.score.reward)

for summary in client.iter(task_id="tb2-0187"):   # paginates for you
    ...

# Everything one upload stored (works for list_episodes too); a large upload
# returns one receipt per batch, so pass them all
page = client.list(upload_id=[receipt.upload_id for receipt in receipts])

# Or label uploads yourself and filter on the label, across batches and files
client.upload_file("episodes.jsonl", line_format=LineFormat.EPISODE, context={"bundle": "v4"})
page = client.list_episodes(context={"bundle": "v4"})

summary = client.get(trace_id)
raw     = client.get_raw(trace_id)                 # exact stored document
client.download_raw(trace_id, "trace.json")        # streamed, for large traces

client.delete(trace_id)
client.delete_run("run_9f3k2m")

Summaries are projections of the stored document, which is kept verbatim — fields the producer never recorded come back as None. Deleting something that is already gone raises NotFoundError rather than passing silently.

Episodes are read-only:

page   = client.list_episodes(run_id="run_9f3k2m")
detail = client.get_episode(episode_id)      # + member aggregate under .traces
raw    = client.get_episode_raw(episode_id)  # stored envelope; traces = member IDs
members = client.list_episode_traces(episode_id, has_error=True)

get_episode_raw returns the envelope the producer uploaded (env, task, group, run, ok, every entry of errors) with traces narrowed to member trace IDs; read each member with get_raw.

Runs are read-only totals over their traces, computed when read:

page  = client.list_runs(run_type="eval")   # most recently ingested first
run   = client.get_run("run_9f3k2m")        # trace and episode counts, avg_reward, steps
steps = client.list_run_steps("run_9f3k2m") # per-step trace counts and avg_reward

avg_reward covers scored traces only. list_run_steps returns every step in one response, and an empty list for a run without steps or one you cannot see; get_run raises NotFoundError for the latter.

prime traces list --runs --run-type train
prime traces get run_9f3k2m --runs -o json

Search indexed content

Case-sensitive literal search within one run. Requires SDK 0.0.5+ and a server supporting GET /api/v1/runs/{run_id}/search.

page = client.search("connection refused", run_id="run_9f3k2m", role="tool")
for match in page.items:
    print(match.trace_id, match.node_idx, match.excerpt)
prime traces search 'connection refused' --run-id run_9f3k2m --role tool -o json

Async uses the same API. Optional filters: role, run_step, has_error, reward_min, reward_max, and field (content, reasoning_content, tool_calls). String content is decoded; structured content and tool calls use recorded JSON.

Search uses server text indexes, so the query needs at least three characters. Each call returns one page without downloading raw traces. Continue with cursor=page.next_cursor (CLI: --cursor) and unchanged filters until null. Cursors are node positions, not snapshots: a trace replaced mid-search resumes at the same position in its new copy.

The first page's coverage reports what was not searchable: unindexed_trace_ids (a bounded sample) and partial_index. It is null on later pages, and on a first page when the server could not compute it within budget (unknown, not complete). Restart after pending uploads finish indexing; nodes beyond the indexing cap remain excluded.

A search that overruns the server's read budget fails with search_limit_exceeded (HTTP 400). Retrying unchanged will not help; use a more specific query or add filters.

Async

AsyncTracesClient mirrors TracesClient method for method.

import asyncio
from prime_traces import AsyncTracesClient

async def main():
    async with AsyncTracesClient() as client:
        await client.upload_records(traces, context={"source": "prime-rl"})

        page, episodes = await asyncio.gather(   # reads overlap
            client.list(run_id="run_9f3k2m"),
            client.list_episodes(run_id="run_9f3k2m"),
        )

        async for summary in client.iter(task_id="tb2-0187"):
            ...

asyncio.run(main())

Configuration

Source Meaning
PRIME_API_KEY Platform API token, needs traces:read / traces:write scopes
PRIME_TRACES_URL Base URL of the Prime Traces service; defaults to https://api.primeintellect.ai
PRIME_TEAM_ID Optional team context, sent as X-Prime-Team-ID
~/.prime/config.json Shared prime CLI config (api_key, team_id, traces_url)

Precedence is constructor argument → environment variable → config file.

Not yet available

  • Exports — the service route exists but is unimplemented, so wrapping it would ship a method that cannot succeed.
  • Cross-run search, regex and arbitrary JSON-path queries.

Examples

The runnable basic_usage.py example covers upload, query, downloads and error handling.

Metadata

Release files for prime-traces 0.0.10

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

Source distribution (sdist)

Source distribution for prime-traces 0.0.10
File Size Uploaded
prime_traces-0.0.10.tar.gz 60.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for prime-traces 0.0.10
File Interpreter ABI Platform
prime_traces-0.0.10-py3-none-any.whl Python 3 none any Details

Total release size: 103.8 kB

Release files / prime_traces-0.0.10.tar.gz

Download URL prime_traces-0.0.10.tar.gz
Size 60.1 kB
Tags Source
SHA-256 checksum
How to use checksums
99b940ec479aff60100a9266c5aaaed6d75bb1f1107727b8430e5e8222455504
BLAKE2b-256 checksum
How to use checksums
8b40560f8f56af8577ea8b588d82ceead05f1ec2ff4592d96231f9b2b890969c
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 14, 2026.

Transparency log

Release files / prime_traces-0.0.10-py3-none-any.whl

Download URL prime_traces-0.0.10-py3-none-any.whl
Size 43.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1f697fa2365a3f9ad0ec580e815fd61d64a9db7ed0c84b68747df15b242fe585
BLAKE2b-256 checksum
How to use checksums
3bd4772ee8b6bf3b26d91321dccac763a08baa11c6f2ded066e42c523a11986f
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 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.10 This release

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 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