Skip to content

Commit 39e0996

Browse files
committed
Auto-commit before deployment
1 parent a4b2e51 commit 39e0996

File tree

18 files changed

+97
-4
lines changed

18 files changed

+97
-4
lines changed

apps/web/lib/services/rate-limit.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const MODEL_LIMITS_MAP = {
1818
[ModelEnum.GEMINI_2_5_FLASH_LITE]: GEMINI_LIMITS.FLASH_LITE,
1919
[ModelEnum.GEMINI_2_5_FLASH]: GEMINI_LIMITS.FLASH,
2020
[ModelEnum.GEMINI_2_5_PRO]: GEMINI_LIMITS.PRO,
21+
[ModelEnum.GEMINI_3_FLASH]: GEMINI_LIMITS.FLASH_3,
2122
} as const;
2223

2324
// Legacy support
@@ -418,7 +419,9 @@ export async function checkRateLimit(
418419
// VT+ users using other Gemini models must check both model-specific AND Flash Lite quotas
419420
if (
420421
isVTPlusUser
421-
&& (modelId === ModelEnum.GEMINI_2_5_FLASH || modelId === ModelEnum.GEMINI_2_5_PRO)
422+
&& (modelId === ModelEnum.GEMINI_2_5_FLASH
423+
|| modelId === ModelEnum.GEMINI_2_5_PRO
424+
|| modelId === ModelEnum.GEMINI_3_FLASH)
422425
) {
423426
return await checkDualQuotaLimits(userId, modelId);
424427
}
@@ -597,7 +600,9 @@ export async function recordRequest(
597600
// VT+ users using other Gemini models must record in both quotas (model-specific + shared Flash Lite quota)
598601
if (
599602
isVTPlusUser
600-
&& (modelId === ModelEnum.GEMINI_2_5_FLASH || modelId === ModelEnum.GEMINI_2_5_PRO)
603+
&& (modelId === ModelEnum.GEMINI_2_5_FLASH
604+
|| modelId === ModelEnum.GEMINI_2_5_PRO
605+
|| modelId === ModelEnum.GEMINI_3_FLASH)
601606
) {
602607
await recordDualQuotaUsage(userId, modelId, vtPlusFeature);
603608
return;
@@ -720,7 +725,9 @@ export async function getRateLimitStatus(
720725
// VT+ users using other Gemini models need dual quota status
721726
if (
722727
isVTPlusUser
723-
&& (modelId === ModelEnum.GEMINI_2_5_FLASH || modelId === ModelEnum.GEMINI_2_5_PRO)
728+
&& (modelId === ModelEnum.GEMINI_2_5_FLASH
729+
|| modelId === ModelEnum.GEMINI_2_5_PRO
730+
|| modelId === ModelEnum.GEMINI_3_FLASH)
724731
) {
725732
return await getDualQuotaStatus(userId, modelId);
726733
}

packages/ai/cache/gemini-cache.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export type GoogleModelCacheableId =
1717
| 'models/gemini-2.5-pro'
1818
| 'models/gemini-flash-latest'
1919
| 'models/gemini-flash-lite-latest'
20+
| 'models/gemini-3-flash-preview'
2021
| 'models/gemini-1.5-flash-001'
2122
| 'models/gemini-1.5-pro-001';
2223

@@ -117,6 +118,8 @@ export function isModelCacheable(modelId: string): modelId is GoogleModelCacheab
117118
const cacheableModels: GoogleModelCacheableId[] = [
118119
'models/gemini-2.5-pro',
119120
'models/gemini-flash-latest',
121+
'models/gemini-flash-lite-latest',
122+
'models/gemini-3-flash-preview',
120123
'models/gemini-1.5-flash-001',
121124
'models/gemini-1.5-pro-001',
122125
];
@@ -134,6 +137,8 @@ export function getGeminiCacheableModelId(modelEnum: ModelEnumType): GoogleModel
134137
return 'models/gemini-flash-latest';
135138
case ModelEnumValues.GEMINI_2_5_FLASH_LITE:
136139
return 'models/gemini-flash-lite-latest';
140+
case ModelEnumValues.GEMINI_3_FLASH:
141+
return 'models/gemini-3-flash-preview';
137142
default:
138143
return null;
139144
}

packages/ai/model-enum.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export const ModelEnum = {
66
GEMINI_2_5_FLASH_LITE: 'gemini-flash-lite-latest',
77
GEMINI_2_5_FLASH: 'gemini-flash-latest',
88
GEMINI_2_5_PRO: 'gemini-2.5-pro',
9+
GEMINI_3_FLASH: 'gemini-3-flash-preview',
910
GEMINI_2_5_FLASH_IMAGE: 'gemini-2.5-flash-image',
1011
GPT_4o_Mini: 'gpt-4o-mini',
1112
GPT_4o: 'gpt-4o',

packages/ai/models.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,13 @@ export const models: Model[] = [
143143
maxTokens: 1_048_576,
144144
contextWindow: 1_048_576,
145145
},
146+
{
147+
id: ModelEnum.GEMINI_3_FLASH,
148+
name: 'Gemini 3 Flash',
149+
provider: 'google',
150+
maxTokens: 65_536,
151+
contextWindow: 1_048_576,
152+
},
146153
{
147154
id: ModelEnum.GEMINI_2_5_FLASH_IMAGE,
148155
name: 'Gemini 2.5 Flash Image',
@@ -265,6 +272,8 @@ export const getModelFromChatMode = (mode?: string): ModelEnum => {
265272
return ModelEnum.GEMINI_2_5_PRO;
266273
case ChatMode.GEMINI_2_5_FLASH:
267274
return ModelEnum.GEMINI_2_5_FLASH;
275+
case ChatMode.GEMINI_3_FLASH:
276+
return ModelEnum.GEMINI_3_FLASH;
268277
case ChatMode.DEEPSEEK_R1_FIREWORKS:
269278
return ModelEnum.DEEPSEEK_R1_FIREWORKS;
270279
case ChatMode.KIMI_K2_INSTRUCT_FIREWORKS:
@@ -336,6 +345,7 @@ export const getChatModeMaxTokens = (mode: ChatMode) => {
336345
case ChatMode.GEMINI_2_5_PRO:
337346
case ChatMode.GEMINI_2_5_FLASH:
338347
case ChatMode.GEMINI_2_5_FLASH_LITE:
348+
case ChatMode.GEMINI_3_FLASH:
339349
return 1_048_576;
340350
case ChatMode.CLAUDE_4_1_OPUS:
341351
case ChatMode.CLAUDE_4_SONNET:
@@ -418,6 +428,7 @@ export const supportsNativeWebSearch = (model: ModelEnum): boolean => {
418428
ModelEnum.GEMINI_2_5_FLASH,
419429
ModelEnum.GEMINI_2_5_FLASH_LITE,
420430
ModelEnum.GEMINI_2_5_PRO,
431+
ModelEnum.GEMINI_3_FLASH,
421432
];
422433

423434
return googleModels.includes(model);
@@ -513,6 +524,7 @@ export const supportsReasoning = (model: ModelEnum): boolean => {
513524
ModelEnum.GEMINI_2_5_FLASH,
514525
ModelEnum.GEMINI_2_5_PRO,
515526
ModelEnum.GEMINI_2_5_FLASH_LITE,
527+
ModelEnum.GEMINI_3_FLASH,
516528
];
517529

518530
// OpenAI reasoning models
@@ -562,6 +574,7 @@ export const supportsTools = (model: ModelEnum): boolean => {
562574
ModelEnum.GEMINI_2_5_FLASH,
563575
ModelEnum.GEMINI_2_5_PRO,
564576
ModelEnum.GEMINI_2_5_FLASH_LITE,
577+
ModelEnum.GEMINI_3_FLASH,
565578
];
566579

567580
// OpenRouter models that support tools
@@ -611,6 +624,7 @@ export const getReasoningType = (model: ModelEnum): ReasoningType => {
611624
ModelEnum.GEMINI_2_5_FLASH,
612625
ModelEnum.GEMINI_2_5_PRO,
613626
ModelEnum.GEMINI_2_5_FLASH_LITE,
627+
ModelEnum.GEMINI_3_FLASH,
614628
];
615629

616630
if (geminiThinkingModels.includes(model)) {

packages/ai/tools/registry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class ToolRegistry {
6464
ModelEnum.GEMINI_2_5_PRO,
6565
ModelEnum.GEMINI_2_5_FLASH,
6666
ModelEnum.GEMINI_2_5_FLASH_LITE,
67+
ModelEnum.GEMINI_3_FLASH,
6768
];
6869

6970
// In production, filter by available API keys or environment config

packages/ai/workflow/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,7 @@ export const selectAvailableModel = (
16051605
[ModelEnum.GEMINI_2_5_FLASH]: 'GEMINI_API_KEY',
16061606
[ModelEnum.GEMINI_2_5_FLASH_LITE]: 'GEMINI_API_KEY',
16071607
[ModelEnum.GEMINI_2_5_PRO]: 'GEMINI_API_KEY',
1608+
[ModelEnum.GEMINI_3_FLASH]: 'GEMINI_API_KEY',
16081609
// OpenAI models
16091610
[ModelEnum.GPT_5]: 'OPENAI_API_KEY',
16101611
[ModelEnum.GPT_4o_Mini]: 'OPENAI_API_KEY',

packages/common/components/api-key-prompt-modal.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const getRequiredApiKeyForMode = (chatMode: ChatMode): keyof ApiKeys | null => {
3838
case ChatMode.GEMINI_2_5_FLASH_LITE:
3939
case ChatMode.GEMINI_2_5_FLASH:
4040
case ChatMode.GEMINI_2_5_PRO:
41+
case ChatMode.GEMINI_3_FLASH:
4142
return 'GEMINI_API_KEY';
4243
case ChatMode.CLAUDE_SONNET_4_5:
4344
case ChatMode.CLAUDE_4_SONNET:

packages/common/components/byok-validation-dialog.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const CHAT_MODE_TO_API_KEY: ProviderKeyMapping = {
3838
[ChatMode.GEMINI_2_5_PRO]: 'GEMINI_API_KEY',
3939
[ChatMode.GEMINI_2_5_FLASH]: 'GEMINI_API_KEY',
4040
[ChatMode.GEMINI_2_5_FLASH_LITE]: 'GEMINI_API_KEY',
41+
[ChatMode.GEMINI_3_FLASH]: 'GEMINI_API_KEY',
4142
// Anthropic models
4243
[ChatMode.CLAUDE_4_1_OPUS]: 'ANTHROPIC_API_KEY',
4344
[ChatMode.CLAUDE_4_SONNET]: 'ANTHROPIC_API_KEY',

packages/common/components/chat-input/chat-config.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const getChatModeFromModel = (model: Model): ChatMode | null => {
2828
'Gemini 2.5 Pro': ChatMode.GEMINI_2_5_PRO,
2929
'Gemini 2.5 Flash': ChatMode.GEMINI_2_5_FLASH,
3030
'Gemini 2.5 Flash Lite': ChatMode.GEMINI_2_5_FLASH_LITE,
31+
'Gemini 3 Flash': ChatMode.GEMINI_3_FLASH,
3132
// Anthropic models
3233
'Claude 4.1 Opus': ChatMode.CLAUDE_4_1_OPUS,
3334
'Claude 4 Sonnet': ChatMode.CLAUDE_4_SONNET,
@@ -97,6 +98,7 @@ export const hasReasoningCapability = (chatMode: ChatMode): boolean => {
9798
ChatMode.GEMINI_2_5_PRO,
9899
ChatMode.GEMINI_2_5_FLASH,
99100
ChatMode.GEMINI_2_5_FLASH_LITE,
101+
ChatMode.GEMINI_3_FLASH,
100102

101103
// xAI reasoning models
102104
ChatMode.GROK_4,
@@ -249,6 +251,14 @@ export const modelOptionsByProvider = {
249251
providerIcon: getProviderIcon('google', 14),
250252
requiredApiKey: 'GEMINI_API_KEY' as keyof ApiKeys,
251253
},
254+
{
255+
label: 'Gemini 3 Flash',
256+
value: ChatMode.GEMINI_3_FLASH,
257+
webSearch: true,
258+
icon: <Brain className='text-purple-500' size={16} />,
259+
providerIcon: getProviderIcon('google', 14),
260+
requiredApiKey: 'GEMINI_API_KEY' as keyof ApiKeys,
261+
},
252262
],
253263
OpenAI: [
254264
{

packages/common/components/multi-model-usage-meter.tsx

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ const MODEL_CONFIG = {
4040
description: 'Advanced capabilities',
4141
limits: GEMINI_LIMITS.PRO,
4242
},
43+
[ModelEnum.GEMINI_3_FLASH]: {
44+
name: 'Gemini 3 Flash',
45+
description: 'Most intelligent and fast',
46+
limits: GEMINI_LIMITS.FLASH_3,
47+
},
4348
} as const;
4449

4550
// Models array constant to prevent re-renders
@@ -207,6 +212,10 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
207212
label: `${MODEL_CONFIG[ModelEnum.GEMINI_2_5_PRO].name}`,
208213
color: 'hsl(var(--chart-3))',
209214
},
215+
'flash-3': {
216+
label: `${MODEL_CONFIG[ModelEnum.GEMINI_3_FLASH].name}`,
217+
color: 'hsl(var(--chart-4))',
218+
},
210219
}}
211220
className='min-h-[240px] w-full max-w-full overflow-hidden'
212221
>
@@ -223,6 +232,8 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
223232
modelStatuses[ModelEnum.GEMINI_2_5_FLASH]?.dailyUsed || 0;
224233
const proUsage = modelStatuses[ModelEnum.GEMINI_2_5_PRO]?.dailyUsed
225234
|| 0;
235+
const flash3Usage =
236+
modelStatuses[ModelEnum.GEMINI_3_FLASH]?.dailyUsed || 0;
226237

227238
// Generate hourly data points from 00:00 to current hour + 2 offset
228239
for (let hour = 0; hour <= Math.min(currentHour + 2, 23); hour++) {
@@ -235,6 +246,7 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
235246
'flash-lite-2-5': 0,
236247
'flash-2-5': 0,
237248
'pro-2-5': 0,
249+
'flash-3': 0,
238250
});
239251
} else if (hour <= currentHour) {
240252
// Gradually increase to current usage at current hour
@@ -244,6 +256,7 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
244256
'flash-lite-2-5': Math.round(flashLiteUsage * progress),
245257
'flash-2-5': Math.round(flashUsage * progress),
246258
'pro-2-5': Math.round(proUsage * progress),
259+
'flash-3': Math.round(flash3Usage * progress),
247260
});
248261
} else {
249262
// Future hours show current total (flat line)
@@ -252,6 +265,7 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
252265
'flash-lite-2-5': flashLiteUsage,
253266
'flash-2-5': flashUsage,
254267
'pro-2-5': proUsage,
268+
'flash-3': flash3Usage,
255269
});
256270
}
257271
}
@@ -329,6 +343,18 @@ export default function MultiModelUsageMeter({ userId, className }: MultiModelUs
329343
fill: 'var(--color-pro-2-5)',
330344
}}
331345
/>
346+
<Line
347+
type='monotone'
348+
dataKey='flash-3'
349+
stroke='var(--color-flash-3)'
350+
strokeWidth={2}
351+
dot={false}
352+
activeDot={{
353+
r: 4,
354+
strokeWidth: 2,
355+
fill: 'var(--color-flash-3)',
356+
}}
357+
/>
332358
</LineChart>
333359
</ChartContainer>
334360

0 commit comments

Comments
 (0)