Skip to main content

evalshift-sdk

In-process capture SDK for EvalShift.

Install it inside your agent process to record what the agent does — model calls, tool calls, retrievals — and write CLI-valid traces to .evalshift/captures/, or to an object store you own when the host's disk does not outlive it. The evalshift CLI reads those captures from disk, or mirrors them down from the bucket; the layout is the interface, and the SDK and CLI never call each other.

  • Distribution: evalshift-sdk · import name: evalshift
  • Runtime deps: none (stdlib-only)
  • Python: >= 3.10
  • Capture is off by default — set EVALSHIFT_CAPTURE=1 to record.
  • License: MIT

For AI coding agents

Point your coding agent at the dense, single-file reference for the piece it is working on:

Install

pip install evalshift-sdk
# or
uv add evalshift-sdk

Optional LangChain integration (EvalShiftCallbackHandler):

pip install "evalshift-sdk[langchain]"   # adds langchain-core>=0.2

Optional provider client wrappers (wrap_openai / wrap_anthropic / wrap_genai):

pip install "evalshift-sdk[openai]"        # openai>=1.40
pip install "evalshift-sdk[anthropic]"     # anthropic>=0.40
pip install "evalshift-sdk[google-genai]"  # google-genai>=1.0

Optional object stores (EVALSHIFT_CAPTURE_STORE=s3://… / gs://… / az://…, see below) use the provider's own client library — install it like any other package:

pip install boto3                              # s3:// — Amazon S3 and S3-compatible stores
pip install google-cloud-storage               # gs://
pip install azure-storage-blob azure-identity  # az://

Every adapter and store module is import-guarded, so the SDK stays dependency-free at runtime unless you opt in.

Co-install note: the EvalShift CLI (PyPI evalshift, import package evalshift_cli) depends on this SDK, so both live in one environment and pip install evalshift brings the SDK with it. Production agents that only record captures install evalshift-sdk alone.

Usage

from evalshift import capture

@capture.agent(suite="support_agent", redact=True, tools=[])   # no-op unless EVALSHIFT_CAPTURE=1
def handle_ticket(query): ...

Already calling a provider SDK directly? Wrap the client once and every call inside the agent records itself — model, tools offered, tool calls requested, usage, latency:

from openai import OpenAI
from evalshift.adapters.openai import wrap_openai      # also: wrap_anthropic, wrap_genai

client = wrap_openai(OpenAI())                          # OpenAI(base_url=...) covers DeepSeek, Ollama, vLLM, Groq, ...

Full guide: DOCS.md · dense LLM reference: https://www.evalshift.dev/sdk-llms-full.txt · locked design decisions: docs/DECISIONS.md

Keeping captures/ bounded

Capture writes one JSON file per sampled invocation, so .evalshift/captures/ is kept bounded by default (no configuration needed): identical-input re-runs are de-duplicated, and each suite directory is capped at the 200 newest captures (oldest evicted). Tune it with env vars — no code change required (precedence: an explicit configure(...) call > env var > built-in default):

Env var Default Meaning
EVALSHIFT_MAX_CAPTURES 200 Max captures kept per suite dir. 0 / none / unlimited = uncapped.
EVALSHIFT_DEDUP on Collapse identical-input captures (per-process). off to disable.
EVALSHIFT_CAPTURE_TTL off Evict captures older than N seconds.
EVALSHIFT_SAMPLE_RATE off Capture only this fraction of runs, e.g. 0.25.
EVALSHIFT_DIR .evalshift Capture root directory.

A malformed value falls back to the default (these knobs never crash capture). To restore fully unbounded capture: EVALSHIFT_MAX_CAPTURES=0 EVALSHIFT_DEDUP=off. Disable dedup with off (or 0/none); false/no are not recognised and leave dedup on. EVALSHIFT_SAMPLE_RATE=0 means sampling off (capture every run) — it is not the same as configure(sample_rate=0.0), which captures nothing. The same knobs are available in code via configure(max_captures=..., dedup=..., capture_ttl=..., sample_rate=...).

Hosts whose disk does not outlive them

On Fargate, Lambda or Kubernetes the capture directory disappears with the task. Ship captures to an object store you own instead — one env var next to the gate, no code change:

EVALSHIFT_CAPTURE=1 EVALSHIFT_CAPTURE_STORE=s3://acme-evals/support-agent python agent.py

SDK 0.5.0 called this variable EVALSHIFT_SINK; that name still works when EVALSHIFT_CAPTURE_STORE is unset. s3://<bucket>/<prefix> (also MinIO, R2, B2 via AWS_ENDPOINT_URL), gs://<bucket>/<prefix> and az://<account>/<container>/<prefix> are accepted; install the provider's client library (above). Credentials come from each provider's default chain, never from the URI.

Uploads run on a bounded background thread and never raise into the agent. Configuration is the one thing that does raise: if EVALSHIFT_CAPTURE_STORE is set but the library is missing or the value is malformed, the first capture.* decorator, client wrapper or configure() call raises SinkConfigurationError — at startup, naming the pip install to run — instead of quietly writing to local disk. With EVALSHIFT_CAPTURE off nothing happens at all. The keys mirror the local layout exactly, so the CLI reads a bucket unchanged once captures.store names it in evalshift.yaml. Hosts stopped by SIGTERM should call evalshift.flush_captures() from a shutdown hook (Lambda: before the handler returns). The hygiene knobs above apply to local disk only; bucket retention is a lifecycle rule. Details: DOCS.md — ObjectStoreSink and cloud stores.

Further reading

Metadata

Release files for evalshift-sdk 0.6.0

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

Source distribution (sdist)

Source distribution for evalshift-sdk 0.6.0
File Size Uploaded
evalshift_sdk-0.6.0.tar.gz 403.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for evalshift-sdk 0.6.0
File Interpreter ABI Platform
evalshift_sdk-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 520.3 kB

Release files / evalshift_sdk-0.6.0.tar.gz

Download URL evalshift_sdk-0.6.0.tar.gz
Size 403.6 kB
Tags Source
SHA-256 checksum
How to use checksums
9d0580a2daab99c04d53f0ef6a047390958f8fd2214c6b16781eb32a38ce48c8
BLAKE2b-256 checksum
How to use checksums
ac8dfd27ba4880d3f55d6e6d14997ae577fcfd4a1a1c16524d55c59560ee65d4
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 11, 2026.

Transparency log

Release files / evalshift_sdk-0.6.0-py3-none-any.whl

Download URL evalshift_sdk-0.6.0-py3-none-any.whl
Size 116.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
38808f87b5763712afc85c2ec7ec278a6cfed57506f32ace95708b0a14d46cdb
BLAKE2b-256 checksum
How to use checksums
17a49865a16b74b1948f61bcc09e72af496fab557f08bcbdc76c67186543d0ca
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 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

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