Training data · Python SDK
Point it at an agent spec. It writes the users, rolls the agent against a simulated tool backend, grades every trajectory, and exports training rows. No integration work: the environment, the coverage grid, and the tool results all derive from the spec itself.
01
git clone https://github.com/Zero-Proof-AI/zeroproof-simulations.git
cd zeroproof-simulations
pip install -e .
export VLLM_API_KEY=... # hosted credential, contact Zero Proof Labsimport zeroproof_simulations as zps
data = zps.simulate(spec="specs/github") # 60s, up to 1000 rows
data.save("rollout.jsonl")A spec is a folder or file holding tools and a policy in OpenAI function schema format. You can also pass tools= and policy= directly, or agent= as a callable, an HTTPS endpoint, or a vllm: / ollama: / openai: reference. Generation runs on Zero Proof Labs hosted Qwen for both the user writer and the agent.
02
One knob decides the dataset shape. Everything else is automated: coverage over tool, rule, stance, world state, fault, and history axes steers what gets written.
time_budget (seconds, default 60) and budget (rows, default 1000) cap compute. Exact shapes come from situations=, requests_per_situation=, and rollouts_per_request=.
03
Each JSONL row is one graded conversation: the opening request, the full message thread with tool calls and simulated results, the agent's final reply, and a deterministic conduct grade. Failures are labeled rather than dropped: fabricated references, success claims after tool faults, verbatim repeats, truncations.
{
"prompt": "i think the refund for my last order is still pending",
"messages": [
{"role": "user", "content": "..."},
{"role": "assistant", "tool_calls": [{"name": "get_order", ...}]},
{"role": "tool", "content": "{\"status\": \"not_found\", ...}"},
{"role": "assistant", "content": "That order could not be found. ..."}
],
"steps": [...],
"final_text": "...",
"reward": 1.0,
"reason": "tool fault observed; conduct ok"
}An optional LLM judge adds a second score without slowing generation: data.grade(llm=True, api_key=...).
04
Two-minute runs, hosted Qwen, one GPU pool shared by writer and agent. Rates vary with load.
05
The repo ships 600 real rows under examples/: explore, sft, and rl folders, two agents each (law firm, Gmail, coding, Instagram, GitHub, Amazon), one hundred rows per file, contrastive pairs first in the rl files. About one row in five is a labeled failure, because graded negatives are part of the product.