Skip to content

Commit bd3fa90

Browse files
committed
fix(MOC-236): #477 bot review round-9(vision/audio 多模态 chat 模型保留进池)
NON_CHAT_MODEL_KEYWORDS 含 vision/audio,但 moonshot-...-vision-preview / gpt-4o-audio-preview 等是多模态 chat 模型(只是支持图/音输入),按子串剔会把合法 chat 模型 静默踢出池、在 Codex picker 消失。移除 vision/audio;保留 embedding/rerank/moderation/ whisper/tts/image(真非 chat,image 是生成端点无 chat 同名变体)。+1 单测。
1 parent 10bcaa8 commit bd3fa90

1 file changed

Lines changed: 49 additions & 3 deletions

File tree

  • src-tauri/src/admin/handlers/providers

src-tauri/src/admin/handlers/providers/models.rs

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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 变体。
214220
const 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(
669673
mod 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

Comments
 (0)