Mirrors client: a drop-in production trace collector for LLM agents, plus the `mirrors` CLI (install `mirrorkit[cli]`).
Project description
mirrorkit
A lightweight, drop-in production trace collector for LLM agents. Add two lines to your existing LangChain / LangGraph / Anthropic / OpenAI script and your agent's traces start streaming to your Mirrors backend — keyed by an API key, with negligible latency (non-blocking, background-batched).
Install
pip install mirrorkit
Zero required runtime dependencies — the sender uses only the Python stdlib. LangChain / Anthropic / OpenAI are instrumented only if they're importable.
Usage (2 lines)
import mirrorkit
mirrorkit.init(api_key="mk_live_...", project="my-agent")
That's it. Run your agent normally — traces are captured automatically and
shipped in the background. The endpoint defaults to the MIRROR_ENDPOINT
environment variable, then to the production URL.
mirrorkit.init(
api_key="mk_live_...",
project="my-agent",
endpoint="https://api.mirror.dev", # optional override
flush_interval=2.0, # seconds between batch flushes
max_batch=50, # max traces per POST
instrument=True, # auto-hook LangChain/Anthropic/OpenAI
)
Manual logging
For frameworks you don't auto-instrument, enqueue a trace yourself. Messages are OpenAI-style chat dicts:
import mirrorkit
mirrorkit.init(api_key="mk_live_...", project="my-agent")
mirrorkit.log_trace(
[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What's the weather in Paris?"},
{
"role": "assistant",
"content": None,
"tool_calls": [
{
"id": "call_1",
"function": {"name": "get_weather", "arguments": '{"city": "Paris"}'},
}
],
},
{"role": "tool", "tool_call_id": "call_1", "content": "18C, sunny"},
{"role": "assistant", "content": "It's 18C and sunny in Paris."},
],
trace_id="optional-id",
model="gpt-4o",
)
mirrorkit.flush() # also runs automatically at interpreter exit
LangChain global handler
init() registers a global LangChain callback handler automatically, so you
don't need to pass callbacks. If your setup doesn't honor the global hook,
pass the handler explicitly:
from langchain_core.runnables import RunnableConfig
import mirrorkit
mirrorkit.init(api_key="mk_live_...", project="my-agent")
chain.invoke(inputs, config=RunnableConfig(callbacks=[mirrorkit.handler()]))
API
mirrorkit.init(api_key, project="default", endpoint=None, *, flush_interval=2.0, max_batch=50, instrument=True)mirrorkit.log_trace(messages, *, trace_id=None, model=None)mirrorkit.flush(timeout=5.0)mirrorkit.shutdown()mirrorkit.handler()— LangChain callback handler for manual registration
The mirrors CLI
The same package ships a terminal client of the hosted backend — full parity with
the web app: anything you can do in the UI you can do from the CLI (log in,
ingest+build a twin, explore it, run it, add business context, apply agent-suggested
fixes, author + run evals). It needs a few extra deps, so install the cli extra:
pip install "mirrorkit[cli]" # adds the `mirrors` command (click + httpx + pydantic)
Authenticate with a workspace API key (mk_live_…, minted in the web app), then:
mirrors login # paste the key (or --api-key / --dev)
mirrors env ls # list environments
mirrors build traces.jsonl --name airline # ingest + build a twin (streams the log)
mirrors build --project airline --name airline # build from a collector stream
mirrors env assets|schema|fidelity|drift|traces <env> # explore the twin
mirrors query <env> "cancel my flight" # run the twin (one-shot) + see the trace
mirrors chat <env> # multi-turn conversation with the twin
mirrors container status|start|stop <env> # its hosted HTTP endpoint
mirrors context add <env> --text "…" # business context that lifts fidelity
mirrors proposal new|accept <env> [id] # agent-suggested changes -> rebuild
mirrors eval generate <env> --save-as smoke # auto-author eval cases
mirrors eval create <env> --name smoke --from cases.json
mirrors eval run <eval-set-id> # run evals; `mirrors run show <run-id>`
mirrors usage # task-minutes vs. plan allowance
Credentials live in ~/.mirrors/config.json (or MIRRORS_BASE_URL /
MIRRORS_API_KEY for CI). Add --json to any command for machine-readable output.
The CLI talks only HTTP to the backend — it has no engine/build logic of its own.
MCP server (drive Mirrors from an AI client)
The MCP server is now hosted by Mirrors — there's nothing to install from this
package. Point any MCP client (Claude Code, Claude Desktop, Codex, Cursor, VS Code,
Zed, …) at the hosted endpoint; on first use the client opens your browser to sign
in and approve access (standard MCP OAuth — no API keys to paste). It exposes the
full Mirrors surface — the same operations as the CLI and the web app, so an AI
client never has to touch the UI: list_mirrors / get_schema / get_drift,
build_mirror / ingest_mirror, query_mirror / chat_mirror, container_start,
add_context / distill_summary, generate_proposal / accept_proposal,
generate_eval_set / run_eval_set, and more.
Use the URL without a trailing slash (
…/mcp) — it must match the OAuthresourcethe server advertises, and some clients (Cursor) strip a trailing slash before comparing. Both forms are served on the wire, but configure the slashless one.
# Claude Code
claude mcp add --transport http mirrors https://api.runmirrors.com/mcp
# Codex
codex mcp add mirrors --url https://api.runmirrors.com/mcp && codex mcp login mirrors
{ "mcpServers": { "mirrors": { "url": "https://api.runmirrors.com/mcp" } } }
For headless/CI setups you can still skip the browser flow: mint a workspace key
in the web app (Settings → API keys) and send it as an
Authorization: Bearer mk_live_… header. Every request is scoped to the
authenticated workspace. (This package ships only the trace collector and the
optional mirrors CLI.)
Wire format
Batches are POSTed to {endpoint}/api/collect with
Authorization: Bearer {api_key}:
{
"project": "my-agent",
"traces": [
{"id": "abc", "model": "gpt-4o", "messages": [{"role": "user", "content": "hi"}]}
]
}
Failures (non-2xx / network errors) are retried a couple of times then dropped — the collector never raises into your program.
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 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 mirrorkit-0.2.4.tar.gz.
File metadata
- Download URL: mirrorkit-0.2.4.tar.gz
- Upload date:
- Size: 47.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e5d731f2c60fd05b1efc6dfccaa443f55bf71ac77238f692483ef92a11dc079
|
|
| MD5 |
33013c7115d10dc46455a94cdf653b2c
|
|
| BLAKE2b-256 |
211cfc6ed19dd8fd3c2e00d343b7ed95f4e39d358b001664b4d4614553aa6263
|
Provenance
The following attestation bundles were made for mirrorkit-0.2.4.tar.gz:
Publisher:
publish-pypi.yml on ai-singhal/ToolTree_verification_benchmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mirrorkit-0.2.4.tar.gz -
Subject digest:
6e5d731f2c60fd05b1efc6dfccaa443f55bf71ac77238f692483ef92a11dc079 - Sigstore transparency entry: 2188291668
- Sigstore integration time:
-
Permalink:
ai-singhal/ToolTree_verification_benchmark@04f7769f7e554036322927300d9734862649a739 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ai-singhal
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@04f7769f7e554036322927300d9734862649a739 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mirrorkit-0.2.4-py3-none-any.whl.
File metadata
- Download URL: mirrorkit-0.2.4-py3-none-any.whl
- Upload date:
- Size: 47.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9500d55e4c5345de53fa85bc229fa0a04fe1880154bc992d03c29cdb50759ed
|
|
| MD5 |
192f0d792feadd2e18981b0069148896
|
|
| BLAKE2b-256 |
86bd1dbf1a06435c97a2dfa182b9b507956cffba5624615411e69cd5a253ff3a
|
Provenance
The following attestation bundles were made for mirrorkit-0.2.4-py3-none-any.whl:
Publisher:
publish-pypi.yml on ai-singhal/ToolTree_verification_benchmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mirrorkit-0.2.4-py3-none-any.whl -
Subject digest:
f9500d55e4c5345de53fa85bc229fa0a04fe1880154bc992d03c29cdb50759ed - Sigstore transparency entry: 2188291675
- Sigstore integration time:
-
Permalink:
ai-singhal/ToolTree_verification_benchmark@04f7769f7e554036322927300d9734862649a739 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ai-singhal
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@04f7769f7e554036322927300d9734862649a739 -
Trigger Event:
push
-
Statement type: