Overview
Coevolved is designed so you can test most of your system without calling a real LLM:
- Pure steps are just functions
- Composition is deterministic
- Providers are adapters you can fake or stub
Unit testing steps
Test step functions directly, then (optionally) wrap them as Steps in integration tests.
def test_enrich():
state = {"x": 1}
out = enrich(state)
assert out["x"] == 1
Determinism and replay
Use deterministic inputs and fixed prompts when you want repeatable behavior.
For LLM-heavy tests, consider a “replay provider” that returns pre-recorded LLMResponse objects for given prompt hashes.
Mock boundaries:
- Replace LLM providers with a stub that returns a fixed
LLMResponse
- Replace tool steps with deterministic test doubles
Keep a small set of end-to-end tests that hit a real provider for smoke testing, but keep most tests hermetic.
Next steps