mirror of
https://github.com/openprose/prose.git
synced 2026-09-19 05:55:05 +08:00
0061ca35f1
Reactor was hard-wired to OpenRouter on the CLI (only OPENROUTER_API_KEY was ever read), stranding users holding OpenAI / Anthropic / Google keys. The SDK already supported a scoped provider; this makes it real and elegant at the CLI. reactor-cli (0.2.0 -> 0.2.1): - reactor.yml model.provider now switches the live provider; built-ins openrouter|openai|anthropic|google resolve their endpoint + key env, and any OpenAI-compatible vendor works via model.base_url + model.api_key_env. - A keyless ProviderPlan resolver + a model-bearing OpenAIProvider factory (reached only past the dynamic-import offline boundary), threaded into compile sessions and the run/serve render (incl. the configured render_model, which the run phase previously ignored). - doctor reports the configured provider's key (not only OPENROUTER_API_KEY) and doctor --live smokes the configured endpoint; a missing key fails non-zero with the exact env var (never misdirects to OpenRouter, never exits 0). - Tests: ProviderPlan resolver + a hermetic missing-key compile. reactor (0.3.0 -> 0.3.1): - Receipt Cost now reports the real provider + model instead of a hardcoded openrouter / gemini-3.5-flash (cost-only labels, never fingerprinted). New optional RunProjectRender.providerLabel + CostLabels. - Tests: cost-labels + a key-gated bring-your-own-provider live smoke. Build: each reactor package cleans its output dir before tsc, so local incremental builds cannot accumulate orphaned dist test artifacts. Known limitation: Anthropic's direct OpenAI-compat endpoint rejects our structured-output response_format unless strict:true; route Anthropic models through OpenRouter today (documented).