diff --git a/packages/reactor-cli/README.md b/packages/reactor-cli/README.md index 806a3e5b..bbbbb50f 100644 --- a/packages/reactor-cli/README.md +++ b/packages/reactor-cli/README.md @@ -228,6 +228,11 @@ reactors: [] # optional: a multi-reactor host (see below) Global flags `--state-dir`, `--project`, `--json`, `--offline` override the file on every command. +The built-in providers are `openrouter` (the default), `openai`, `anthropic`, +`google`, and `orcarouter`; each supplies its own endpoint and key env var +(`ORCAROUTER_API_KEY` for OrcaRouter). To point at any other OpenAI-compatible +endpoint, set `base_url` + `api_key_env` explicitly. + ### Sandbox The `sandbox` block is the render **threat-model** knob: diff --git a/packages/reactor-cli/src/__tests__/provider-plan.test.ts b/packages/reactor-cli/src/__tests__/provider-plan.test.ts index 02eb5620..265a4b39 100644 --- a/packages/reactor-cli/src/__tests__/provider-plan.test.ts +++ b/packages/reactor-cli/src/__tests__/provider-plan.test.ts @@ -35,6 +35,16 @@ describe('resolveProviderPlan', () => { assert.equal(google.custom, true); }); + it('resolves the orcarouter built-in to the OrcaRouter gateway base URL + key env', () => { + const orcarouter = resolveProviderPlan({ provider: 'orcarouter' }); + assert.equal(orcarouter.provider, 'orcarouter'); + assert.equal(orcarouter.baseURL, 'https://api.orcarouter.ai/v1'); + assert.equal(orcarouter.apiKeyEnv, 'ORCAROUTER_API_KEY'); + assert.equal(orcarouter.transport, 'openai-compat'); + // A non-default provider: the CLI builds + injects the scoped provider. + assert.equal(orcarouter.custom, true); + }); + it('routes the anthropic built-in through the NATIVE adapter (no compat base URL)', () => { const anthropic = resolveProviderPlan({ provider: 'anthropic' }); assert.equal(anthropic.apiKeyEnv, 'ANTHROPIC_API_KEY'); diff --git a/packages/reactor-cli/src/commands/init.ts b/packages/reactor-cli/src/commands/init.ts index c978b288..26afc0ad 100644 --- a/packages/reactor-cli/src/commands/init.ts +++ b/packages/reactor-cli/src/commands/init.ts @@ -132,10 +132,10 @@ state: dir: ./.reactor model: - # Provider: openrouter (default) | openai | anthropic | google | . + # Provider: openrouter (default) | openai | anthropic | google | orcarouter | . # A built-in supplies its own endpoint + key env (OPENROUTER_API_KEY, - # OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY). To use another vendor, - # set base_url + api_key_env. See docs: /cli/configuration#choosing-a-model-provider + # OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, ORCAROUTER_API_KEY). + # To use another vendor, set base_url + api_key_env. See docs: /cli/configuration#choosing-a-model-provider provider: openrouter render_model: google/gemini-3.5-flash compile_model: google/gemini-3.5-flash diff --git a/packages/reactor-cli/src/config.ts b/packages/reactor-cli/src/config.ts index d6d7cd37..49e5b65e 100644 --- a/packages/reactor-cli/src/config.ts +++ b/packages/reactor-cli/src/config.ts @@ -40,7 +40,7 @@ export interface ModelConfig { readonly max_turns: number; /** * Override the provider's OpenAI-compatible base URL. Optional: a built-in - * provider (openrouter/openai/anthropic/google) supplies its own. Set this (with + * provider (openrouter/openai/anthropic/google/orcarouter) supplies its own. Set this (with * {@link api_key_env}) to point at any other OpenAI-compatible endpoint. */ readonly base_url?: string; diff --git a/packages/reactor-cli/src/model/provider-plan.ts b/packages/reactor-cli/src/model/provider-plan.ts index a5877dd4..ceb2b947 100644 --- a/packages/reactor-cli/src/model/provider-plan.ts +++ b/packages/reactor-cli/src/model/provider-plan.ts @@ -93,6 +93,10 @@ const KNOWN_PROVIDERS: Readonly> = Object.freeze({ baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', apiKeyEnv: 'GEMINI_API_KEY', }, + orcarouter: { + baseURL: 'https://api.orcarouter.ai/v1', + apiKeyEnv: 'ORCAROUTER_API_KEY', + }, }); /** The provider labels the CLI knows out of the box (for error guidance). */