A flight simulator for AI agents - deterministic, stateful simulated worlds for agent evaluation.
Project description
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: design complete, implementation starting — no release yet (pre-0.1.0).
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
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.
License
TBD (Apache 2.0 planned).
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 eval_mock-0.0.1.tar.gz.
File metadata
- Download URL: eval_mock-0.0.1.tar.gz
- Upload date:
- Size: 44.4 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
864c82e9abbb1cbb00683a2fafcec842b021abb363284d9a2828a2925ef7fa74
|
|
| MD5 |
a388c762748e6df3ef7f8b543a419a71
|
|
| BLAKE2b-256 |
02e7e551bded75e7825db629e3553809b900dd534017083524b333f9bcecdfa3
|
File details
Details for the file eval_mock-0.0.1-py3-none-any.whl.
File metadata
- Download URL: eval_mock-0.0.1-py3-none-any.whl
- Upload date:
- Size: 19.3 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
09b172080d21d552f735757277dd72b70b46a6f55cd535095c30d8675f5e719c
|
|
| MD5 |
17e519829d18a95c7bc0a178a60f644f
|
|
| BLAKE2b-256 |
b68be9f1e0088d0e830ea84d91f9919bf5d0d0301efa3dbe2609ddbca142b6d5
|