Skip to content

Commit 3b04533

Browse files
Programcodeclaude
andcommitted
Move the rest of the catalog to each family's newest model
GPT-5.6 Luna becomes GPT-6 Luna, GPT-5.6 Sol becomes GPT-6.1 Sol, and DeepSeek V4 Flash becomes DeepSeek V4.1 Flash. GPT-6 has no Terra, so GPT-5.6 Terra retires into GPT-6.1 Sol. The catalog is back to ten models. Retired IDs resolve in the settings store and at both Edge Function boundaries. GPT-5.6 Luna, the old Basic default, moves to the new Basic default, Claude Haiku 5.5. A retired Basic ID never resolves to a Pro model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 6f556bb commit 3b04533

23 files changed

Lines changed: 89 additions & 72 deletions

‎.claude/skills/verify-debatelab/features/model-defaults.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Model defaults and the model selector
22

3-
Every AI tool has a model selector. A new Pro account starts every tool on Claude Opus 5.5, and a Basic (trial) account on Claude Haiku 5.5. Pro-only models show a `Pro` badge and are disabled for Basic accounts. A setting saved with a retired catalog ID (Claude Sonnet 5 or Claude Opus 5) is rewritten to Claude Opus 5.5 on the next load, and the Edge Functions accept the retired ID from an older client and route it to Opus 5.5. The catalog and defaults live in `supabase/functions/_shared/model-catalog.ts`.
3+
Every AI tool has a model selector. A new Pro account starts every tool on Claude Opus 5.5, and a Basic (trial) account on Claude Haiku 5.5. Pro-only models show a `Pro` badge and are disabled for Basic accounts. A setting saved with a retired catalog ID is rewritten on the next load: GPT-5.6 Luna moves to Claude Haiku 5.5, Claude Sonnet 5 and Opus 5 to Claude Opus 5.5, GPT-5.6 Sol and Terra to GPT-6.1 Sol, and DeepSeek V4 Flash to DeepSeek V4.1 Flash. The Edge Functions resolve a retired ID from an older client the same way. A retired Basic ID never resolves to a Pro model. The catalog and defaults live in `supabase/functions/_shared/model-catalog.ts`.
44

55
## Sub-features
66

‎docs/architecture.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ Supabase Auth owns user sessions. Protected routes provide a client navigation b
128128

129129
Checkout and portal functions create Stripe sessions after authenticated ownership and redirect validation. The webhook updates subscription state and records event processing for idempotency. AI handlers record the provider-reported usage and charge for each request.
130130

131-
All model requests use the single OpenRouter backend route and `OPENROUTER_API_KEY`. The shared eleven-model catalog, its defaults (Claude Haiku 5.5 for Basic, Claude Opus 5.5 for Pro), Pro-only entries, retired-ID successors, and request controls live in [`supabase/functions/_shared/model-catalog.ts`](../supabase/functions/_shared/model-catalog.ts). OpenRouter usage remains raw in the audit row, and the reported charge is unknown when the provider does not return a complete cost. The opponent's voice is the one exception to the OpenRouter route: the `voice` function calls ElevenLabs with `ELEVENLABS_API_KEY`. ElevenLabs reports billed characters, not dollars, so [`supabase/functions/_shared/cost.ts`](../supabase/functions/_shared/cost.ts) prices those rows from a dated list-price snapshot; promotions and plan credits are not modelled, so a voice row can overstate the charge.
131+
All model requests use the single OpenRouter backend route and `OPENROUTER_API_KEY`. The shared ten-model catalog, its defaults (Claude Haiku 5.5 for Basic, Claude Opus 5.5 for Pro), Pro-only entries, retired-ID successors, and request controls live in [`supabase/functions/_shared/model-catalog.ts`](../supabase/functions/_shared/model-catalog.ts). OpenRouter usage remains raw in the audit row, and the reported charge is unknown when the provider does not return a complete cost. The opponent's voice is the one exception to the OpenRouter route: the `voice` function calls ElevenLabs with `ELEVENLABS_API_KEY`. ElevenLabs reports billed characters, not dollars, so [`supabase/functions/_shared/cost.ts`](../supabase/functions/_shared/cost.ts) prices those rows from a dated list-price snapshot; promotions and plan credits are not modelled, so a voice row can overstate the charge.
132132

133133
`Auto Fast` and `Auto Pro` are virtual selections, not provider model IDs. The Edge Functions resolve them through TypeSafe Jev on OpenRouter before calling the concrete writing model. Auto Fast is available to Basic accounts and normally resolves to Claude Haiku 5.5; it can also pick GLM 5.3 Flash, whose manual selection keeps its Pro restriction. Auto Pro remains Pro-only and normally resolves to Claude Opus 5.5. Provider calls, usage rows, and response metadata record the concrete resolved model, while response metadata also retains the requested automatic selection. A Jev router call uses the same OpenRouter key and does not consume a second daily quota unit.
134134

‎docs/testing.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ OPENROUTER_API_KEY=... deno run --allow-read --allow-write --allow-env=OPENROUTE
8686
--allow-net=openrouter.ai scripts/prompt-examples.ts supabase/functions /tmp/after.json
8787
```
8888

89-
This sends the fourteen prompt examples to one real model (GPT-5.6 Luna by default) and writes the raw outputs for manual review. Point the first argument at a directory holding an older `_shared/prompts.ts` and `ai/prompt-builder.ts` to compare revisions. It runs no web research and is a bounded manual check, not a model matrix or an automated quality gate.
89+
This sends the fourteen prompt examples to one real model (GPT-6 Luna by default) and writes the raw outputs for manual review. Point the first argument at a directory holding an older `_shared/prompts.ts` and `ai/prompt-builder.ts` to compare revisions. It runs no web research and is a bounded manual check, not a model matrix or an automated quality gate.
9090

9191
### Live Jev contract smoke
9292

‎scripts/prompt-examples.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
import { PROMPT_EXAMPLES } from "../supabase/functions/_shared/prompts/prompt-examples.ts";
1313

14-
const [functionsDir, outPath, model = "openai/gpt-5.6-luna", only] = Deno.args;
14+
const [functionsDir, outPath, model = "openai/gpt-6-luna", only] = Deno.args;
1515
const selected = only ? new Set(only.split(",")) : null;
1616
if (!functionsDir || !outPath) {
1717
console.error("usage: prompt-examples.ts <functions-dir> <out.json> [model]");

‎src/locales/en.json‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@
932932
"trialFeature4": "3-day access",
933933
"proFeature1": "Expanded AI prep access",
934934
"proFeature2": "All 11 prep modes",
935-
"proFeature3": "All 11 models, including Claude Opus and Sonnet, Muse Spark, and GLM Flash",
935+
"proFeature3": "All 10 models, including Claude Opus and Sonnet, Muse Spark, and GLM Flash",
936936
"proFeature4": "Priority support",
937937
"proFeature5": "Active Grounding™ research",
938938
"startTrial": "Start Free Trial",
@@ -946,9 +946,9 @@
946946
"faq": {
947947
"title": "Frequently Asked Questions",
948948
"q1": "How much does DebateLab cost?",
949-
"a1": "DebateLab offers a 3-day free trial. After that, Pro is $5/month + tax for expanded access and all 11 models.",
949+
"a1": "DebateLab offers a 3-day free trial. After that, Pro is $5/month + tax for expanded access and all 10 models.",
950950
"q2": "What do I get with Pro?",
951-
"a2": "Expanded AI prep access, all 11 models including Claude Opus and Sonnet, Muse Spark, and GLM Flash, Active Grounding™ research, and priority support.",
951+
"a2": "Expanded AI prep access, all 10 models including Claude Opus and Sonnet, Muse Spark, and GLM Flash, Active Grounding™ research, and priority support.",
952952
"q3": "Can I cancel my subscription?",
953953
"a3": "Yes, you can cancel anytime from your Settings page. You'll retain access until the end of your billing period.",
954954
"q4": "Does the AI make things up?",
@@ -1356,7 +1356,7 @@
13561356
},
13571357
"pricingModal": {
13581358
"title": "Upgrade to Pro",
1359-
"subtitle": "Unlock higher usage limits, all 11 models, and configurable reasoning.",
1359+
"subtitle": "Unlock higher usage limits, all 10 models, and configurable reasoning.",
13601360
"free": "Free",
13611361
"pro": "Pro",
13621362
"current": "Current",
@@ -1370,7 +1370,7 @@
13701370
"freeFeature3": "All debate features",
13711371
"freeFeature4": "3-day free trial",
13721372
"proFeature1": "Expanded AI prep access",
1373-
"proFeature2": "All 11 models, including Claude Opus and Sonnet, Muse Spark, and GLM Flash",
1373+
"proFeature2": "All 10 models, including Claude Opus and Sonnet, Muse Spark, and GLM Flash",
13741374
"proFeature3": "Deep research with Exa",
13751375
"proFeature4": "Priority processing",
13761376
"proFeature5": "All debate features",

‎src/locales/es.json‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@
932932
"trialFeature4": "Acceso por 3 días",
933933
"proFeature1": "Acceso ampliado a preparación con IA",
934934
"proFeature2": "Las 11 herramientas de preparación",
935-
"proFeature3": "Los 11 modelos, incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash",
935+
"proFeature3": "Los 10 modelos, incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash",
936936
"proFeature4": "Soporte prioritario",
937937
"proFeature5": "Investigación Active Grounding™",
938938
"startTrial": "Comenzar Prueba Gratis",
@@ -946,9 +946,9 @@
946946
"faq": {
947947
"title": "Preguntas Frecuentes",
948948
"q1": "¿Cuánto cuesta DebateLab?",
949-
"a1": "DebateLab ofrece una prueba gratis de 3 días. Después, Pro cuesta $5/mes + impuestos para acceso ampliado y los 11 modelos.",
949+
"a1": "DebateLab ofrece una prueba gratis de 3 días. Después, Pro cuesta $5/mes + impuestos para acceso ampliado y los 10 modelos.",
950950
"q2": "¿Qué obtengo con Pro?",
951-
"a2": "Acceso ampliado a preparación con IA, los 11 modelos incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash, investigación Active Grounding™ y soporte prioritario.",
951+
"a2": "Acceso ampliado a preparación con IA, los 10 modelos incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash, investigación Active Grounding™ y soporte prioritario.",
952952
"q3": "¿Puedo cancelar mi suscripción?",
953953
"a3": "Sí, puedes cancelar en cualquier momento desde tu página de Ajustes. Mantendrás el acceso hasta el final de tu período de facturación.",
954954
"q4": "¿La IA inventa cosas?",
@@ -1356,7 +1356,7 @@
13561356
},
13571357
"pricingModal": {
13581358
"title": "Actualizar a Pro",
1359-
"subtitle": "Desbloquea límites de uso más altos, los 11 modelos y razonamiento configurable.",
1359+
"subtitle": "Desbloquea límites de uso más altos, los 10 modelos y razonamiento configurable.",
13601360
"free": "Gratis",
13611361
"pro": "Pro",
13621362
"current": "Actual",
@@ -1370,7 +1370,7 @@
13701370
"freeFeature3": "Todas las funciones de debate",
13711371
"freeFeature4": "Prueba gratis de 3 días",
13721372
"proFeature1": "Acceso ampliado a preparación con IA",
1373-
"proFeature2": "Los 11 modelos, incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash",
1373+
"proFeature2": "Los 10 modelos, incluidos Claude Opus y Sonnet, Muse Spark y GLM Flash",
13741374
"proFeature3": "Investigación profunda con Exa",
13751375
"proFeature4": "Procesamiento prioritario",
13761376
"proFeature5": "Todas las funciones de debate",

‎src/locales/hu.json‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -932,7 +932,7 @@
932932
"trialFeature4": "3 napos hozzáférés",
933933
"proFeature1": "Bővített MI felkészülési hozzáférés",
934934
"proFeature2": "Mind a 11 felkészülési eszköz",
935-
"proFeature3": "Mind a 11 modell, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash",
935+
"proFeature3": "Mind a 10 modell, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash",
936936
"proFeature4": "Elsőbbségi támogatás",
937937
"proFeature5": "Active Grounding™ kutatás",
938938
"startTrial": "Ingyenes Próba Indítása",
@@ -946,9 +946,9 @@
946946
"faq": {
947947
"title": "Gyakran Ismételt Kérdések",
948948
"q1": "Mennyibe kerül a DebateLab?",
949-
"a1": "A DebateLab 3 napos ingyenes próbát kínál. Ezután a Pro $5/hó + adó bővített hozzáférést és mind a 11 modellt kínálja.",
949+
"a1": "A DebateLab 3 napos ingyenes próbát kínál. Ezután a Pro $5/hó + adó bővített hozzáférést és mind a 10 modellt kínálja.",
950950
"q2": "Mit kapok a Pro-val?",
951-
"a2": "Bővített MI felkészülési hozzáférés mind a 11 modellel, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash modellekkel, Active Grounding™ kutatással és elsőbbségi támogatással.",
951+
"a2": "Bővített MI felkészülési hozzáférés mind a 10 modellel, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash modellekkel, Active Grounding™ kutatással és elsőbbségi támogatással.",
952952
"q3": "Lemondhatom az előfizetésem?",
953953
"a3": "Igen, bármikor lemondhatod a Beállítások oldalon. A számlázási időszak végéig megtartod a hozzáférést.",
954954
"q4": "Az MI kitalál dolgokat?",
@@ -1356,7 +1356,7 @@
13561356
},
13571357
"pricingModal": {
13581358
"title": "Frissítés Pro-ra",
1359-
"subtitle": "Oldd fel a magasabb használati keretet, mind a 11 modellt és a beállítható érvelést.",
1359+
"subtitle": "Oldd fel a magasabb használati keretet, mind a 10 modellt és a beállítható érvelést.",
13601360
"free": "Ingyenes",
13611361
"pro": "Pro",
13621362
"current": "Jelenlegi",
@@ -1370,7 +1370,7 @@
13701370
"freeFeature3": "Minden vitafunkció",
13711371
"freeFeature4": "3 napos ingyenes próba",
13721372
"proFeature1": "Bővített MI felkészülési hozzáférés",
1373-
"proFeature2": "Mind a 11 modell, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash",
1373+
"proFeature2": "Mind a 10 modell, köztük a Claude Opus és Sonnet, a Muse Spark és a GLM Flash",
13741374
"proFeature3": "Mélyreható kutatás Exa-val",
13751375
"proFeature4": "Elsőbbségi feldolgozás",
13761376
"proFeature5": "Minden vitafunkció",

‎src/test/ai/streaming.test.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,38 +88,38 @@ describe('AI streaming helpers', () => {
8888
});
8989

9090
it('enables streaming for basic OpenRouter ask chats', () => {
91-
expect(isAskStreamingSupported({ provider: 'openrouter', model: 'openai/gpt-5.6-luna' })).toBe(true);
91+
expect(isAskStreamingSupported({ provider: 'openrouter', model: 'openai/gpt-6-luna' })).toBe(true);
9292
expect(isAskStreamingSupported({ provider: 'openai', model: 'gpt-5.4-mini' })).toBe(false);
9393
expect(isAskStreamingSupported({ provider: 'google', model: 'gemini-3-flash-preview' })).toBe(false);
9494
expect(isAskStreamingSupported({ provider: 'anthropic', model: 'claude-haiku-4-5-20251001' })).toBe(false);
9595
expect(isAskStreamingSupported({ provider: 'unknown' as string, model: 'x' })).toBe(false);
9696
expect(isAskStreamingSupported(
97-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
97+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
9898
{ citationMode: true }
9999
)).toBe(false);
100100
expect(isAskStreamingSupported(
101-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
101+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
102102
{ webSearch: true }
103103
)).toBe(false);
104104
expect(isAskStreamingSupported(
105-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
105+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
106106
{ prosConsMode: true }
107107
)).toBe(false);
108108
expect(isAskStreamingSupported(
109-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
109+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
110110
{ argumentMapMode: true }
111111
)).toBe(false);
112112
expect(isAskStreamingSupported(
113-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
113+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
114114
{ mode: 'clarify' }
115115
)).toBe(false);
116116
expect(isAskStreamingSupported(
117-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
117+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
118118
{ mode: 'general' }
119119
)).toBe(true);
120120
for (const mode of ['clarify', 'summarize', 'proscons', 'argumentmap']) {
121121
expect(isAskStreamingSupported(
122-
{ provider: 'openrouter', model: 'openai/gpt-5.6-luna' },
122+
{ provider: 'openrouter', model: 'openai/gpt-6-luna' },
123123
{ mode }
124124
)).toBe(false);
125125
}

‎src/test/debate/debate-context.test.tsx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ describe('Current Debate context in requests and the Review control', () => {
128128
});
129129

130130
const brainstormInput = { motion: 'This House would make public transport free', side: 'pro' as const, outputMode: 'topfive' as const, language: 'en' };
131-
const config = { provider: 'openrouter' as const, model: 'openai/gpt-5.6-luna' };
131+
const config = { provider: 'openrouter' as const, model: 'openai/gpt-6-luna' };
132132
const lastBody = () => (supabaseMock.functions.invoke.mock.calls.at(-1) as unknown as [string, { body: Record<string, unknown> }])[1].body;
133133

134134
it('sends IDs only, and a Review choice lasts for exactly one successful request', async () => {

‎src/test/security-hardening.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ describe('security hardening regressions', () => {
7676
it('uses allowlisted model/provider pairs and SSRF-safe citation verification', () => {
7777
expect(modelCatalog).toContain('id: "z-ai/glm-5.3-flash"');
7878
expect(modelCatalog).toContain('id: "anthropic/claude-haiku-5.5"');
79-
expect(modelCatalog).toContain('id: "openai/gpt-5.6-luna"');
79+
expect(modelCatalog).toContain('id: "openai/gpt-6-luna"');
8080
expect(modelCatalog).toContain('id: "google/gemini-3.8-flash"');
8181
expect(ai).toContain('function modelForRequest');
8282
expect(stream).toContain('isModelSelection(rawModel)');

0 commit comments

Comments
 (0)