diff --git a/.changeset/gemini-experimental.md b/.changeset/gemini-experimental.md new file mode 100644 index 00000000..aedd1e13 --- /dev/null +++ b/.changeset/gemini-experimental.md @@ -0,0 +1,7 @@ +--- +"uptide": patch +--- + +Gemini is labelled experimental: in `fix --help`, in the `LLM:` line `fix` prints, and in the +docs. Its evaluation runs on the storefront fixture failed on service errors (HTTP 503/429), +so its migration quality is not established yet. diff --git a/README.md b/README.md index b00ad685..bab53eb1 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ was kept on the compiler's word and deserves a careful review. ## Choosing a model -Assisted fixes support Anthropic, OpenAI and Gemini, with the same prompts, tool, +Assisted fixes support Anthropic, OpenAI and Gemini (experimental), with the same prompts, tool, verification and publish gate. Set the chosen provider's key in your environment: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` or `GEMINI_API_KEY`. Never put keys in repository config or command arguments. diff --git a/docs/cli.md b/docs/cli.md index cf6d6a21..c79b6a03 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -175,7 +175,7 @@ gate are the same as for a verified dependency. ## Choosing a model -Assisted fixes support Anthropic, OpenAI and Gemini, with the same prompts, tool, +Assisted fixes support Anthropic, OpenAI and Gemini (experimental), with the same prompts, tool, verification and publish gate. Set the chosen provider's key in your environment: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY` or `GEMINI_API_KEY`. Never put keys in repository config or command arguments. diff --git a/packages/cli/src/cli.test.ts b/packages/cli/src/cli.test.ts index e4aa1cc7..4709a369 100644 --- a/packages/cli/src/cli.test.ts +++ b/packages/cli/src/cli.test.ts @@ -679,7 +679,10 @@ it('selects each provider from its key, passes model and the universal budget, a const io = memoryIo({ cwd: pnpmGitRepo(), env: { [key]: 'test-key' } }); expect(await run(['fix', 'zod'], io, engine)).toBe(0); expect(engine.calls[0]).toMatchObject({ provider, model, maxCostUsd: 1 }); - expect(io.stderr()).toContain(`LLM: ${provider} / ${model}`); + // Gemini is experimental: its evaluation runs failed on service errors (docs/provider-evaluation.md). + expect(io.stderr()).toContain( + `LLM: ${provider}${provider === 'gemini' ? ' (experimental)' : ''} / ${model}`, + ); expect(io.stderr()).toContain('LLM spend: no LLM calls.'); expect(io.stderr()).not.toContain('test-key'); } diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 482de233..cccbf4e0 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -714,7 +714,7 @@ ${EXIT_CODES('a plan was made', 'not used', ';\n or a dependency failed to a ) .option( '--provider ', - 'LLM provider: anthropic, openai or gemini (also UPTIDE_PROVIDER)', + 'LLM provider: anthropic, openai or gemini (experimental) (also UPTIDE_PROVIDER)', ) .option('--model ', 'LLM model ID (also UPTIDE_MODEL)') .option('--no-llm', 'rule-based fixes only: never send code to the LLM provider') @@ -881,7 +881,7 @@ ${PRIVACY}`, else if (!llm) io.err('assisted fixes off (--no-llm): no code leaves this machine\n'); else if (selection.available) { io.err( - `LLM: ${selection.provider} / ${selection.model} · budget $${maxCost.toFixed(2)}\n`, + `LLM: ${selection.provider}${selection.provider === 'gemini' ? ' (experimental)' : ''} / ${selection.model} · budget $${maxCost.toFixed(2)}\n`, ); io.err(assistedNote(selection.provider)); const price = priceFor(selection.provider, selection.model);