11import { getLowerBaseModelName } from "."
2- import { CLAUDE_SUPPORTED_WEBSEARCH_CHECK , CODE_CHECK , DOUBAO_THINKING_MODEL_CHECK , EMBEDDING_CHECK , FUNCTION_CALLING_CHECK , GEMINI_SEARCH_CHECK , REASONING_CHECK , RERANKING_CHECK , TEXT_TO_IMAGE_CHECK , VISION_CHECK } from "./regex" ;
3- import { PERPLEXITY_MODELS } from "@/constants/models" ;
2+ import { NOT_TOOL_CALL_MODELS , notVisionModels , PERPLEXITY_MODELS , TOOL_CALL_MODELS , visionModels } from "@/constants/models" ;
43
54// Import all model logos using barrel exports
65import {
@@ -26,7 +25,7 @@ import { YoudaoLogo, NomicLogo } from '@/assets/images/providers'
2625
2726export function isRerankModel ( model_id : string ) : boolean {
2827 const modelId = getLowerBaseModelName ( model_id )
29- return model_id ? RERANKING_CHECK . test ( modelId ) || false : false
28+ return model_id ? / (?: r e r a n k | r e - r a n k | r e - r a n k e r | r e - r a n k i n g | r e t r i e v a l | r e t r i e v e r ) / i . test ( modelId ) || false : false
3029}
3130
3231export function isEmbeddingModel ( model_id : string , provider : string ) : boolean {
@@ -41,10 +40,10 @@ export function isEmbeddingModel(model_id: string, provider: string): boolean {
4140 }
4241
4342 if ( provider === 'doubao' || modelId . includes ( 'doubao' ) ) {
44- return EMBEDDING_CHECK . test ( modelId )
43+ return / (?: ^ t e x t - | e m b e d | b g e - | e 5 - | L L M 2 V e c | r e t r i e v a l | u a e - | g t e - | j i n a - c l i p | j i n a - e m b e d d i n g s | v o y a g e - ) / i . test ( modelId )
4544 }
4645
47- return EMBEDDING_CHECK . test ( modelId ) || false
46+ return / (?: ^ t e x t - | e m b e d | b g e - | e 5 - | L L M 2 V e c | r e t r i e v a l | u a e - | g t e - | j i n a - c l i p | j i n a - e m b e d d i n g s | v o y a g e - ) / i . test ( modelId ) || false
4847}
4948
5049export function isFunctionCallingModel ( model_id : string , provider : string ) : boolean {
@@ -59,7 +58,10 @@ export function isFunctionCallingModel(model_id: string, provider: string): bool
5958 }
6059
6160 if ( provider === 'doubao' || modelId . includes ( 'doubao' ) ) {
62- return FUNCTION_CALLING_CHECK . test ( modelId ) || FUNCTION_CALLING_CHECK . test ( modelId )
61+ return new RegExp (
62+ `\\b(?!(?:${ NOT_TOOL_CALL_MODELS . join ( '|' ) } )\\b)(?:${ TOOL_CALL_MODELS . join ( '|' ) } )\\b` ,
63+ 'i'
64+ ) . test ( modelId )
6365 }
6466
6567 if ( [ 'deepseek' , 'anthropic' ] . includes ( provider ) ) {
@@ -70,7 +72,10 @@ export function isFunctionCallingModel(model_id: string, provider: string): bool
7072 return true
7173 }
7274
73- return FUNCTION_CALLING_CHECK . test ( modelId )
75+ return new RegExp (
76+ `\\b(?!(?:${ NOT_TOOL_CALL_MODELS . join ( '|' ) } )\\b)(?:${ TOOL_CALL_MODELS . join ( '|' ) } )\\b` ,
77+ 'i'
78+ ) . test ( modelId )
7479}
7580
7681export function isVisionModel ( model_id : string , provider : string ) : boolean {
@@ -79,11 +84,10 @@ export function isVisionModel(model_id: string, provider: string): boolean {
7984 }
8085
8186 const modelId = getLowerBaseModelName ( model_id )
82- if ( provider === 'doubao' || modelId . includes ( 'doubao' ) ) {
83- return VISION_CHECK . test ( modelId ) || false
84- }
85-
86- return VISION_CHECK . test ( modelId ) || false
87+ return new RegExp (
88+ `\\b(?!(?:${ notVisionModels . join ( '|' ) } )\\b)(${ visionModels . join ( '|' ) } )\\b` ,
89+ 'i'
90+ ) . test ( modelId ) || false
8791}
8892
8993export function isCodeModel ( model_id : string , provider : string ) : boolean {
@@ -92,7 +96,7 @@ export function isCodeModel(model_id: string, provider: string): boolean {
9296 }
9397
9498 const modelId = getLowerBaseModelName ( model_id )
95- return CODE_CHECK . test ( modelId ) || false
99+ return / (?: ^ o 3 $ | . * ( c o d e | c l a u d e \s + s o n n e t | c l a u d e \s + o p u s | g p t - 4 \. 1 | g p t - 4 o | g p t - 5 | g e m i n i [ \s - ] + 2 \. 5 | o 4 - m i n i | k i m i - k 2 ) . * ) / i . test ( modelId ) || false
96100}
97101
98102export function isReasoningModel ( model_id : string , provider : string ) : boolean {
@@ -103,14 +107,14 @@ export function isReasoningModel(model_id: string, provider: string): boolean {
103107 const modelId = getLowerBaseModelName ( model_id )
104108
105109 // Check if it's a text-to-image model (merged from isTextToImageModel)
106- if ( TEXT_TO_IMAGE_CHECK . test ( modelId ) ) {
110+ if ( / f l u x | d i f f u s i o n | s t a b i l i t y a i | s d - | d a l l | c o g v i e w | j a n u s | m i d j o u r n e y | m j - | i m a g e | g p t - i m a g e / i . test ( modelId ) ) {
107111 return false
108112 }
109113
110114 if ( provider === 'doubao' || modelId . includes ( 'doubao' ) ) {
111115 return (
112- REASONING_CHECK . test ( modelId ) ||
113- DOUBAO_THINKING_MODEL_CHECK . test ( getLowerBaseModelName ( model_id , '/' ) ) ||
116+ / ^ ( o \d + (?: - [ \w - ] + ) ? | . * \b (?: r e a s o n i n g | r e a s o n e r | t h i n k i n g ) \b . * | . * - [ r R ] \d + . * | . * \b q w q (?: - [ \w - ] + ) ? \b . * | . * \b h u n y u a n - t 1 (?: - [ \w - ] + ) ? \b . * | . * \b g l m - z e r o - p r e v i e w \b . * | . * \b g r o k - (?: 3 - m i n i | 4 ) (?: - [ \w - ] + ) ? \b . * ) $ / i . test ( modelId ) ||
117+ / d o u b a o - (?: 1 [ . - ] 5 - t h i n k i n g - v i s i o n - p r o | 1 [ . - ] 5 - t h i n k i n g - p r o - m | s e e d - 1 [ . - ] 6 (?: - f l a s h ) ? (? ! - (?: t h i n k i n g ) (?: - | $ ) ) ) (?: - [ \w - ] + ) * / i . test ( getLowerBaseModelName ( model_id , '/' ) ) ||
114118 false
115119 )
116120 }
@@ -163,7 +167,7 @@ export function isReasoningModel(model_id: string, provider: string): boolean {
163167 'qwen-plus-0714' , 'qwen-plus-2025-07-14' , 'qwen-turbo' , 'qwen-turbo-latest' ,
164168 'qwen-turbo-0428' , 'qwen-turbo-2025-04-28' , 'qwen-turbo-0715' , 'qwen-turbo-2025-07-15'
165169 ] . includes ( qwenModelId )
166-
170+
167171 isQwenReasoning = isSupportedThinkingTokenQwen || qwenModelId . includes ( 'qwq' ) || qwenModelId . includes ( 'qvq' )
168172 }
169173
@@ -207,7 +211,7 @@ export function isReasoningModel(model_id: string, provider: string): boolean {
207211 return true
208212 }
209213
210- return REASONING_CHECK . test ( modelId ) || false
214+ return / ^ ( o \d + (?: - [ \w - ] + ) ? | . * \b (?: r e a s o n i n g | r e a s o n e r | t h i n k i n g ) \b . * | . * - [ r R ] \d + . * | . * \b q w q (?: - [ \w - ] + ) ? \b . * | . * \b h u n y u a n - t 1 (?: - [ \w - ] + ) ? \b . * | . * \b g l m - z e r o - p r e v i e w \b . * | . * \b g r o k - (?: 3 - m i n i | 4 ) (?: - [ \w - ] + ) ? \b . * ) $ / i . test ( modelId ) || false
211215}
212216
213217export function isWebSearchModel ( model_id : string , provider : string ) : boolean {
@@ -219,7 +223,10 @@ export function isWebSearchModel(model_id: string, provider: string): boolean {
219223
220224 // Anthropic model check (merged from isAnthropicModel)
221225 if ( modelId . startsWith ( 'claude' ) ) {
222- return CLAUDE_SUPPORTED_WEBSEARCH_CHECK . test ( modelId )
226+ return new RegExp (
227+ `\\b(?:claude-3(-|\\.)(7|5)-sonnet(?:-[\\w-]+)|claude-3(-|\\.)5-haiku(?:-[\\w-]+)|claude-sonnet-4(?:-[\\w-]+)?|claude-opus-4(?:-[\\w-]+)?)\\b` ,
228+ 'i'
229+ ) . test ( modelId )
223230 }
224231
225232 if ( provider === 'grok' ) {
@@ -232,13 +239,13 @@ export function isWebSearchModel(model_id: string, provider: string): boolean {
232239 }
233240
234241 if ( provider === 'gemini' || provider === 'vertexai' ) {
235- return GEMINI_SEARCH_CHECK . test ( modelId )
242+ return new RegExp ( 'gemini-2\\..*' , 'i' ) . test ( modelId )
236243 }
237244
238245 if ( provider === 'openai' ) {
239246 // OpenAI web search model check (merged from isOpenAIWebSearchModel)
240247 if (
241- GEMINI_SEARCH_CHECK . test ( modelId ) ||
248+ new RegExp ( 'gemini-2\\..*' , 'i' ) . test ( modelId ) ||
242249 modelId . includes ( 'gpt-4o-search-preview' ) ||
243250 modelId . includes ( 'gpt-4o-mini-search-preview' ) ||
244251 ( modelId . includes ( 'gpt-4.1' ) && ! modelId . includes ( 'gpt-4.1-nano' ) ) ||
@@ -268,7 +275,7 @@ export function isWebSearchModel(model_id: string, provider: string): boolean {
268275 }
269276
270277 if ( provider === 'aihubmix' ) {
271- if ( ! modelId . endsWith ( '-search' ) && GEMINI_SEARCH_CHECK . test ( modelId ) ) {
278+ if ( ! modelId . endsWith ( '-search' ) && new RegExp ( 'gemini-2\\..*' , 'i' ) . test ( modelId ) ) {
272279 return true
273280 }
274281
@@ -299,32 +306,32 @@ export function getModelLogo(modelId: string) {
299306 const logoMap = {
300307 pixtral : PixtralModelLogo ,
301308 jina : JinaModelLogo ,
302- abab : MinimaxModelLogo ,
303- minimax : MinimaxModelLogo ,
304- o1 : ChatGPTo1ModelLogo ,
305- o3 : ChatGPTo1ModelLogo ,
306- o4 : ChatGPTo1ModelLogo ,
309+ abab : MinimaxModelLogo ,
310+ minimax : MinimaxModelLogo ,
311+ o1 : ChatGPTo1ModelLogo ,
312+ o3 : ChatGPTo1ModelLogo ,
313+ o4 : ChatGPTo1ModelLogo ,
307314 'gpt-image' : ChatGPTImageModelLogo ,
308- 'gpt-3' : ChatGPT35ModelLogo ,
309- 'gpt-4' : ChatGPT4ModelLogo ,
315+ 'gpt-3' : ChatGPT35ModelLogo ,
316+ 'gpt-4' : ChatGPT4ModelLogo ,
310317 'gpt-5-mini' : GPT5MiniModelLogo ,
311318 'gpt-5-nano' : GPT5NanoModelLogo ,
312319 'gpt-5-chat' : GPT5ChatModelLogo ,
313320 'gpt-5' : GPT5ModelLogo ,
314- gpts : ChatGPT4ModelLogo ,
315- 'gpt-oss(?:-[\\w-]+)' : ChatGptModelLogo ,
316- 'text-moderation' : ChatGptModelLogo ,
317- 'babbage-' : ChatGptModelLogo ,
318- 'sora-' : ChatGptModelLogo ,
319- '(^|/)omni-' : ChatGptModelLogo ,
320- 'Embedding-V1' : WenxinModelLogo ,
321- 'text-embedding-v' : QwenModelLogo ,
322- 'text-embedding' : ChatGptModelLogo ,
323- 'davinci-' : ChatGptModelLogo ,
324- glm : ChatGLMModelLogo ,
325- deepseek : DeepSeekModelLogo ,
326- '(qwen|qwq|qwq-|qvq-)' : QwenModelLogo ,
327- gemma : GemmaModelLogo ,
321+ gpts : ChatGPT4ModelLogo ,
322+ 'gpt-oss(?:-[\\w-]+)' : ChatGptModelLogo ,
323+ 'text-moderation' : ChatGptModelLogo ,
324+ 'babbage-' : ChatGptModelLogo ,
325+ 'sora-' : ChatGptModelLogo ,
326+ '(^|/)omni-' : ChatGptModelLogo ,
327+ 'Embedding-V1' : WenxinModelLogo ,
328+ 'text-embedding-v' : QwenModelLogo ,
329+ 'text-embedding' : ChatGptModelLogo ,
330+ 'davinci-' : ChatGptModelLogo ,
331+ glm : ChatGLMModelLogo ,
332+ deepseek : DeepSeekModelLogo ,
333+ '(qwen|qwq|qwq-|qvq-)' : QwenModelLogo ,
334+ gemma : GemmaModelLogo ,
328335 'yi-' : YiModelLogo ,
329336 llama : LlamaModelLogo ,
330337 mixtral : MistralModelLogo ,
0 commit comments