@@ -210,16 +210,20 @@ fn extract_model_ids(payload: &Value) -> Vec<String> {
210210 ids
211211}
212212
213- /// 非 chat 模型关键词(embedding / rerank / 语音 / 图像 等)—— 这些不能服务 chat 请求。
213+ /// 非 chat 模型关键词(embedding / rerank / 审核 / 语音转写 / 语音合成 / 图像生成)——
214+ /// 这些**真正**不能服务 chat 请求。
215+ ///
216+ /// **不含** `vision` / `audio`:多模态 chat 模型常带这些词(`moonshot-v1-8k-vision-preview`、
217+ /// `gpt-4o-audio-preview` 等仍是 chat 模型,只是支持图/音输入),按子串剔除会把合法 chat 模型
218+ /// 静默踢出池、在 Codex picker 里消失(#477 bot review P2 round-9)。`image` 保留:`gpt-image-1`
219+ /// 等是图像**生成**端点、非 chat,且无以 `image` 命名的常见 chat 变体。
214220const NON_CHAT_MODEL_KEYWORDS : & [ & str ] = & [
215221 "embedding" ,
216222 "rerank" ,
217223 "moderation" ,
218224 "whisper" ,
219225 "tts" ,
220226 "image" ,
221- "vision" ,
222- "audio" ,
223227] ;
224228
225229/// 只保留可用于 chat 的模型 id(过滤 embedding/rerank/语音/图像);**全被过滤则返回空**
@@ -669,6 +673,48 @@ pub async fn autofill_provider_models(
669673mod tests {
670674 use super :: * ;
671675
676+ #[ test]
677+ fn chat_usable_keeps_vision_audio_drops_true_non_chat ( ) {
678+ // #477 P2 round-9:vision / audio 多模态 chat 模型必须保留;只剔真正非 chat 的。
679+ let ids: Vec < String > = [
680+ "moonshot-v1-8k-vision-preview" ,
681+ "gpt-4o-audio-preview" ,
682+ "deepseek-chat" ,
683+ "text-embedding-3-large" ,
684+ "bge-reranker-v2" ,
685+ "whisper-1" ,
686+ "tts-1" ,
687+ "gpt-image-1" ,
688+ "omni-moderation-latest" ,
689+ ]
690+ . iter ( )
691+ . map ( |s| s. to_string ( ) )
692+ . collect ( ) ;
693+ let kept = chat_usable_model_ids ( & ids) ;
694+ assert ! (
695+ kept. contains( & "moonshot-v1-8k-vision-preview" . to_string( ) ) ,
696+ "vision 是 chat"
697+ ) ;
698+ assert ! (
699+ kept. contains( & "gpt-4o-audio-preview" . to_string( ) ) ,
700+ "audio 是 chat"
701+ ) ;
702+ assert ! ( kept. contains( & "deepseek-chat" . to_string( ) ) ) ;
703+ for dropped in [
704+ "text-embedding-3-large" ,
705+ "bge-reranker-v2" ,
706+ "whisper-1" ,
707+ "tts-1" ,
708+ "gpt-image-1" ,
709+ "omni-moderation-latest" ,
710+ ] {
711+ assert ! (
712+ !kept. iter( ) . any( |m| m == dropped) ,
713+ "{dropped} 应被过滤(真非 chat)"
714+ ) ;
715+ }
716+ }
717+
672718 #[ test]
673719 fn provider_is_bailian_token_plan_matches_only_token_plan_host ( ) {
674720 assert ! ( provider_is_bailian_token_plan( & json!( {
0 commit comments