Skip to main content

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.

Mocking providers and tools

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