Eval Mock
English | 简体中文
A flight simulator for AI agents. A deterministic, stateful simulated business world where your agent is tested — before it ever touches a real customer, a real order, or a real inbox.
Status: 0.1.0 on PyPI — determinism kernel, full eval loop, fault injection, scripted multi-turn, BYO domains, third-party verify replay, docs site. Public launch follows the design-partner phase.
Quickstart
pip install eval-mock
eval-mock quickstart # zero config: first passing verdict in seconds
Then plug in your own agent — over MCP, or native function calling:
eval-mock run --preset email-basic -- <your agent command> # MCP: agent unchanged
from eval_mock.integrations.env import EvalMockEnv
env = EvalMockEnv("scenario.yaml")
tools = env.openai_tools() # or env.anthropic_tools()
message = env.call(tool_call) # execute the model's tool_call, get the reply message
env.finish(final_answer)
env.assert_pass() # or env.verdict() for the full JSON
No API key, no account, no network — ever. More in examples/ and the docs.
The 60-second version
You own an AI agent — say, customer support. Tomorrow you ship a new version (new model, new prompt). Your boss asks: "Will it mishandle refunds?"
Today you have three bad options:
- Test against real systems — you can't. A test refund is a real refund; a test email lands in a real customer's inbox.
- Build a staging environment — expensive, slow, and still incomplete: the agent needs orders and email and CRM behaving as one coherent world.
- Click through by hand and pray — and a pass today proves nothing, because you can't tell agent flakiness from environment flakiness.
Eval Mock gives your agent an exam hall instead:
- Fake, but alive. A simulated inbox, order system, and CRM that actually behave: when the agent sends an email, the simulated customer receives it; when it cancels an order, the order state changes. Nothing real is touched. No API bills.
- Game saves. Every test starts from an identical save. Run the same scenario 100 times — the world is exactly the same every time, so failures measure your agent's variance (
pass^k), not infrastructure noise. - Auto-grading. Task completed? Touched data it shouldn't have? Retried after the payment API "timed out"? Graded from the world's final state and the full call journal — no human watching replays, no second LLM as judge.
- Disaster drills. Declaratively inject timeouts, rate limits, and permission errors, and see whether the agent recovers — before your customers run that experiment for you.
What you get before every release is a scorecard:
50 scenarios × 10 runs each: v1 passes 92%, v2 passes 88% — the regression is entirely "forgets to retry after a timeout", first diverging at step 3.
Ship or hold, you now decide with numbers.
Why a third path
Evaluating an agent requires a world it can act in. The existing paths all fall short:
- Real systems: side effects, cost, and no reproducibility.
- Record & replay: only replays trajectories that already happened; breaks the moment the agent takes a different (equally valid) path.
- Traditional API mocks: stateless canned responses — an email "sent" through the Email tool can never be found by the CRM tool; the same query returns the same answer before and after a cancellation. There is no world, only isolated answers.
Eval Mock is the third path: the world comes first; tools are projections of the world. The agent acts through standard protocols (MCP, plus a native function-calling adapter); every step is journaled, assertable, and exactly replayable.
How it works
- World Store — one entity store shared by all tools.
seed / snapshot / restore / diffare first-class: the same seed rebuilds the same world, any number of times, verified by canonical digests across machines and OSes. - Scenario — one declarative YAML file = one exam question: the task given to the agent, the initial world, enabled tools, injected faults, scripted multi-turn user follow-ups, and assertions. Versioned together; distributable; a colleague reruns your exact evaluation with one command.
- Trajectory & Verdict — a complete tool-call journal plus a machine-readable verdict: final-state assertions, collateral-damage checks (nothing changed outside an allowlist), earliest-failure attribution, aggregated pass rates across repeated runs. OTel span export optional.
Design rule: LLMs may help author environments; at runtime the environment is zero-LLM — pure deterministic code, so results are reproducible by construction. Scripted multi-turn is deterministic too: no LLM plays the user.
An illustrative scenario (DSL may evolve until 0.1.0):
task:
prompt: "The customer wants a refund for order #1042."
world:
shop:
orders:
- { id: 1042, status: delivered, days_since_delivery: 3 }
tools: [shop, email]
faults:
- { tool: shop.refund, error: timeout, after_calls: 1 } # first attempt times out
turns:
- user: "Actually, store credit is fine too."
assertions:
- id: refund-completed
expr: world.shop.orders.exists(o, o.id == 1042 && o.status == "refunded")
- id: no-collateral
collateral: { allow_changes: [shop.orders, shop.refunds, email.sent] }
What Eval Mock is not
- Not a model mock. We simulate the tools and the world around your agent; the model under test is your real model.
- Not a code-execution sandbox. SWE-bench-style "run the repo's tests in a container" is a different, well-served problem.
- Not an LLM user simulator. Multi-turn users are scripted and deterministic — by design.
- Not a scoring platform. Verdicts are plain files that feed pytest, CI gates, DeepEval, LangSmith, or your own judge.
Roadmap (v1 scope)
- Determinism kernel: seeded world, virtual clock, canonical digests, snapshot/restore
- Core loop: scenario → MCP server + function-calling adapter → journal → verdict
- Domain packs: Email / Calendar / CRM — plus declarative BYO packs (define your own domain in YAML, no code)
- Fault injection, scripted multi-turn, repeat/
pass^kCI gating, third-partyverifyreplay - 0.1.0 on PyPI (docs site + public launch)
Promises
- Zero telemetry. Runs fully offline — no accounts, no API keys, no network required.
- The open-source version is the full product. No feature-gated enterprise edition.
All four promises (including cost-recovery pricing and no-CLA), in writing: PHILOSOPHY.md.
How we work
A small team, async-first: GitHub issues/PRs only (no Discord), no response-time theater — the one hard promise is security reports get a first response within 24h (SECURITY.md). Docs live at qianmoai.github.io/eval-mock; scenario contributions welcome (CONTRIBUTING.md — every community scenario must fail the null agent).
License
Apache-2.0. DCO, no CLA.
Metadata
Release files for eval-mock 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| eval_mock-0.1.0.tar.gz | 291.4 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eval_mock-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 369.6 kB
Release files / eval_mock-0.1.0.tar.gz
| Download URL | eval_mock-0.1.0.tar.gz |
|---|---|
| Size | 291.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f4e7c060189746f63ee436104c96e836f5df951daa9e11e021b00a849ab75a05
|
|
BLAKE2b-256 checksum How to use checksums |
bbf1f664a2f905273067749d8160065ac2ef563508b00c9925be4742cfaae7bf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / eval_mock-0.1.0-py3-none-any.whl
| Download URL | eval_mock-0.1.0-py3-none-any.whl |
|---|---|
| Size | 78.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ef1a24641c60415a8877360fb3a57a856eff2e4654f297a3e2e150e8e1a11aa5
|
|
BLAKE2b-256 checksum How to use checksums |
15a2685b9ccd6b189a168d1f232e4ea2e798c51c48689cd66b358315d3704a19
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.0 {"installer":{"name":"uv","version":"0.12.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for eval-mock 0.1.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.