From 91e1d5baad6f57a1f111362a021f7a915ad79e98 Mon Sep 17 00:00:00 2001 From: Alex Newman Date: Fri, 6 Feb 2026 02:55:30 -0500 Subject: [PATCH] fix: correct Gemini model name from gemini-3-flash to gemini-3-flash-preview The Gemini API requires the -preview suffix for the Gemini 3 Flash model. gemini-3-flash does not exist - only gemini-3-flash-preview is available. This was causing 404 errors when users selected this model option. Closes #831 Co-Authored-By: Glucksberg Co-Authored-By: Claude Opus 4.6 --- docs/public/configuration.mdx | 2 +- docs/public/cursor/gemini-setup.mdx | 2 +- docs/public/usage/gemini-provider.mdx | 8 ++++---- src/services/worker/GeminiAgent.ts | 6 +++--- .../worker/http/routes/SettingsRoutes.ts | 4 ++-- src/shared/SettingsDefaultsManager.ts | 2 +- .../components/ContextSettingsModal.tsx | 2 +- src/ui/viewer/types.ts | 2 +- tests/gemini_agent.test.ts | 20 +++++++++---------- 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/public/configuration.mdx b/docs/public/configuration.mdx index 67c273d9..2e31a59b 100644 --- a/docs/public/configuration.mdx +++ b/docs/public/configuration.mdx @@ -26,7 +26,7 @@ Settings are managed in `~/.claude-mem/settings.json`. The file is auto-created | Setting | Default | Description | |-------------------------------|---------------------------------|---------------------------------------| | `CLAUDE_MEM_GEMINI_API_KEY` | — | Gemini API key ([get free key](https://aistudio.google.com/app/apikey)) | -| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite` | Gemini model: `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash` | +| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite` | Gemini model: `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash-preview` | See [Gemini Provider](usage/gemini-provider) for detailed configuration and free tier information. diff --git a/docs/public/cursor/gemini-setup.mdx b/docs/public/cursor/gemini-setup.mdx index a66458fc..81c509c7 100644 --- a/docs/public/cursor/gemini-setup.mdx +++ b/docs/public/cursor/gemini-setup.mdx @@ -103,7 +103,7 @@ Open http://localhost:37777 to see the memory viewer. |-------|---------------|-------| | `gemini-2.5-flash-lite` | 10 (4,000 with billing) | **Default.** Fastest, highest free tier RPM | | `gemini-2.5-flash` | 5 (1,000 with billing) | Higher capability | -| `gemini-3-flash` | 5 (1,000 with billing) | Latest model | +| `gemini-3-flash-preview` | 5 (1,000 with billing) | Latest model | To change the model, update your settings: diff --git a/docs/public/usage/gemini-provider.mdx b/docs/public/usage/gemini-provider.mdx index 4ca36b13..7696f6cf 100644 --- a/docs/public/usage/gemini-provider.mdx +++ b/docs/public/usage/gemini-provider.mdx @@ -39,7 +39,7 @@ Claude-mem supports Google's Gemini API as an alternative to the Claude Agent SD |---------|--------|---------|-------------| | `CLAUDE_MEM_PROVIDER` | `claude`, `gemini` | `claude` | AI provider for observation extraction | | `CLAUDE_MEM_GEMINI_API_KEY` | string | — | Your Gemini API key | -| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash` | `gemini-2.5-flash-lite` | Gemini model to use | +| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash-preview` | `gemini-2.5-flash-lite` | Gemini model to use | | `CLAUDE_MEM_GEMINI_BILLING_ENABLED` | `true`, `false` | `false` | Skip rate limiting if billing is enabled on Google Cloud | ### Using the Settings UI @@ -79,7 +79,7 @@ The settings file takes precedence over the environment variable. |-------|--------------|-------| | `gemini-2.5-flash-lite` | 10 | Default, recommended for free tier (highest RPM) | | `gemini-2.5-flash` | 5 | Higher capability, lower rate limit | -| `gemini-3-flash` | 5 | Latest model, lower rate limit | +| `gemini-3-flash-preview` | 5 | Latest model, lower rate limit | ## Provider Switching @@ -139,7 +139,7 @@ Google has two rate limit tiers for free usage: |-------|-----|-----| | gemini-2.5-flash-lite | 10 | 250K | | gemini-2.5-flash | 5 | 250K | -| gemini-3-flash | 5 | 250K | +| gemini-3-flash-preview | 5 | 250K | Claude-mem enforces these limits automatically with built-in delays between requests. Processing may be slower but stays within limits. @@ -149,7 +149,7 @@ Claude-mem enforces these limits automatically with built-in delays between requ |-------|-----|-----| | gemini-2.5-flash-lite | 4,000 | 4M | | gemini-2.5-flash | 1,000 | 1M | -| gemini-3-flash | 1,000 | 1M | +| gemini-3-flash-preview | 1,000 | 1M | **Recommended**: Enable billing on your Google Cloud project to unlock much higher rate limits. You won't be charged unless you exceed the generous free quota. This allows claude-mem to process observations instantly instead of waiting between requests. diff --git a/src/services/worker/GeminiAgent.ts b/src/services/worker/GeminiAgent.ts index 649d7484..30f24628 100644 --- a/src/services/worker/GeminiAgent.ts +++ b/src/services/worker/GeminiAgent.ts @@ -38,7 +38,7 @@ export type GeminiModel = | 'gemini-2.5-pro' | 'gemini-2.0-flash' | 'gemini-2.0-flash-lite' - | 'gemini-3-flash'; + | 'gemini-3-flash-preview'; // Free tier RPM limits by model (requests per minute) const GEMINI_RPM_LIMITS: Record = { @@ -47,7 +47,7 @@ const GEMINI_RPM_LIMITS: Record = { 'gemini-2.5-pro': 5, 'gemini-2.0-flash': 15, 'gemini-2.0-flash-lite': 30, - 'gemini-3-flash': 5, + 'gemini-3-flash-preview': 5, }; // Track last request time for rate limiting @@ -406,7 +406,7 @@ export class GeminiAgent { 'gemini-2.5-pro', 'gemini-2.0-flash', 'gemini-2.0-flash-lite', - 'gemini-3-flash', + 'gemini-3-flash-preview', ]; let model: GeminiModel; diff --git a/src/services/worker/http/routes/SettingsRoutes.ts b/src/services/worker/http/routes/SettingsRoutes.ts index 0633e9f1..d32a39a3 100644 --- a/src/services/worker/http/routes/SettingsRoutes.ts +++ b/src/services/worker/http/routes/SettingsRoutes.ts @@ -242,9 +242,9 @@ export class SettingsRoutes extends BaseRouteHandler { // Validate CLAUDE_MEM_GEMINI_MODEL if (settings.CLAUDE_MEM_GEMINI_MODEL) { - const validGeminiModels = ['gemini-2.5-flash-lite', 'gemini-2.5-flash', 'gemini-3-flash']; + const validGeminiModels = ['gemini-2.5-flash-lite', 'gemini-2.5-flash', 'gemini-3-flash-preview']; if (!validGeminiModels.includes(settings.CLAUDE_MEM_GEMINI_MODEL)) { - return { valid: false, error: 'CLAUDE_MEM_GEMINI_MODEL must be one of: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash' }; + return { valid: false, error: 'CLAUDE_MEM_GEMINI_MODEL must be one of: gemini-2.5-flash-lite, gemini-2.5-flash, gemini-3-flash-preview' }; } } diff --git a/src/shared/SettingsDefaultsManager.ts b/src/shared/SettingsDefaultsManager.ts index 5adc82dc..d3b34ac6 100644 --- a/src/shared/SettingsDefaultsManager.ts +++ b/src/shared/SettingsDefaultsManager.ts @@ -22,7 +22,7 @@ export interface SettingsDefaults { CLAUDE_MEM_PROVIDER: string; // 'claude' | 'gemini' | 'openrouter' CLAUDE_MEM_CLAUDE_AUTH_METHOD: string; // 'cli' | 'api' - how Claude provider authenticates CLAUDE_MEM_GEMINI_API_KEY: string; - CLAUDE_MEM_GEMINI_MODEL: string; // 'gemini-2.5-flash-lite' | 'gemini-2.5-flash' | 'gemini-3-flash' + CLAUDE_MEM_GEMINI_MODEL: string; // 'gemini-2.5-flash-lite' | 'gemini-2.5-flash' | 'gemini-3-flash-preview' CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED: string; // 'true' | 'false' - enable rate limiting for free tier CLAUDE_MEM_OPENROUTER_API_KEY: string; CLAUDE_MEM_OPENROUTER_MODEL: string; diff --git a/src/ui/viewer/components/ContextSettingsModal.tsx b/src/ui/viewer/components/ContextSettingsModal.tsx index 2975638d..4797e069 100644 --- a/src/ui/viewer/components/ContextSettingsModal.tsx +++ b/src/ui/viewer/components/ContextSettingsModal.tsx @@ -465,7 +465,7 @@ export function ContextSettingsModal({ > - +
diff --git a/src/ui/viewer/types.ts b/src/ui/viewer/types.ts index 03e761dd..914777ac 100644 --- a/src/ui/viewer/types.ts +++ b/src/ui/viewer/types.ts @@ -63,7 +63,7 @@ export interface Settings { // AI Provider Configuration CLAUDE_MEM_PROVIDER?: string; // 'claude' | 'gemini' | 'openrouter' CLAUDE_MEM_GEMINI_API_KEY?: string; - CLAUDE_MEM_GEMINI_MODEL?: string; // 'gemini-2.5-flash-lite' | 'gemini-2.5-flash' | 'gemini-3-flash' + CLAUDE_MEM_GEMINI_MODEL?: string; // 'gemini-2.5-flash-lite' | 'gemini-2.5-flash' | 'gemini-3-flash-preview' CLAUDE_MEM_GEMINI_RATE_LIMITING_ENABLED?: string; // 'true' | 'false' CLAUDE_MEM_OPENROUTER_API_KEY?: string; CLAUDE_MEM_OPENROUTER_MODEL?: string; diff --git a/tests/gemini_agent.test.ts b/tests/gemini_agent.test.ts index 0d771c86..0f823435 100644 --- a/tests/gemini_agent.test.ts +++ b/tests/gemini_agent.test.ts @@ -349,27 +349,27 @@ describe('GeminiAgent', () => { } }); - describe('gemini-3-flash model support', () => { - it('should accept gemini-3-flash as a valid model', async () => { - // The GeminiModel type includes gemini-3-flash - compile-time check + describe('gemini-3-flash-preview model support', () => { + it('should accept gemini-3-flash-preview as a valid model', async () => { + // The GeminiModel type includes gemini-3-flash-preview - compile-time check const validModels = [ 'gemini-2.5-flash-lite', 'gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-2.0-flash', 'gemini-2.0-flash-lite', - 'gemini-3-flash' + 'gemini-3-flash-preview' ]; // Verify all models are strings (type guard) expect(validModels.every(m => typeof m === 'string')).toBe(true); - expect(validModels).toContain('gemini-3-flash'); + expect(validModels).toContain('gemini-3-flash-preview'); }); - it('should have rate limit defined for gemini-3-flash', async () => { - // GEMINI_RPM_LIMITS['gemini-3-flash'] = 5 + it('should have rate limit defined for gemini-3-flash-preview', async () => { + // GEMINI_RPM_LIMITS['gemini-3-flash-preview'] = 5 // This is enforced at compile time, but we can test the rate limiting behavior - // by checking that the rate limit is applied when using gemini-3-flash + // by checking that the rate limit is applied when using gemini-3-flash-preview const session = { sessionDbId: 1, contentSessionId: 'test-session', @@ -393,8 +393,8 @@ describe('GeminiAgent', () => { usageMetadata: { totalTokenCount: 10 } })))); - // This validates that gemini-3-flash is a valid model at runtime - // The agent's validation array includes gemini-3-flash + // This validates that gemini-3-flash-preview is a valid model at runtime + // The agent's validation array includes gemini-3-flash-preview await agent.startSession(session); expect(global.fetch).toHaveBeenCalled(); });