Status: "think about this" note, so we don't conflate two different things later.
Context
client.py already does dual-client routing — worker / evaluator / prep can point at different models. Today they're all OpenRouter + DeepSeek defaults, so nothing has bitten.
The thing to be clear about
Pi supports mid-conversation cross-provider handoff (switching provider within one running conversation, converting Anthropic thinking traces → <thinking> tags for OpenAI compat). Tilth does not do this, by design — the worker, evaluator, and prep run as isolated contexts (the evaluator never sees the worker's chain-of-thought). There's no single conversation whose reasoning trace has to survive a provider switch.
What does cross between roles are provider-neutral artifacts — the diff, the case JSON, the verdict JSON. Those carry no provider-specific trace format, so the classic handoff hazard mostly doesn't apply to us.
What's left to watch
The real exposure is narrower: per-role provider compatibility, not trace handoff. Each role talks to its own provider independently, and each provider has its own wire quirks (reasoning_effort rejected by some, store rejected by others, no tool-call streaming on some — see CLAUDE.md's reasoning_content vs reasoning_details anecdote). That belongs to the companion "add a second provider + capability table" issue.
This note exists so we don't reach for a "context handoff" solution to what is actually a "provider capability" problem.
Source
Pi-harness considerations doc, §2.6; Pi article on cross-provider handoff.
Status: "think about this" note, so we don't conflate two different things later.
Context
client.pyalready does dual-client routing — worker / evaluator / prep can point at different models. Today they're all OpenRouter + DeepSeek defaults, so nothing has bitten.The thing to be clear about
Pi supports mid-conversation cross-provider handoff (switching provider within one running conversation, converting Anthropic thinking traces →
<thinking>tags for OpenAI compat). Tilth does not do this, by design — the worker, evaluator, and prep run as isolated contexts (the evaluator never sees the worker's chain-of-thought). There's no single conversation whose reasoning trace has to survive a provider switch.What does cross between roles are provider-neutral artifacts — the diff, the
caseJSON, theverdictJSON. Those carry no provider-specific trace format, so the classic handoff hazard mostly doesn't apply to us.What's left to watch
The real exposure is narrower: per-role provider compatibility, not trace handoff. Each role talks to its own provider independently, and each provider has its own wire quirks (
reasoning_effortrejected by some,storerejected by others, no tool-call streaming on some — see CLAUDE.md'sreasoning_contentvsreasoning_detailsanecdote). That belongs to the companion "add a second provider + capability table" issue.This note exists so we don't reach for a "context handoff" solution to what is actually a "provider capability" problem.
Source
Pi-harness considerations doc, §2.6; Pi article on cross-provider handoff.