mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-09-02 01:20:23 +08:00
feat: add glm vision model check (#741)
* Implement GLM model identification logic
Add checks for GLM text and visual model naming conventions.
* fix: simplify GLM vision detection and add tests
- Remove redundant includes("v-") check that could cause false positives
on model names containing "dev-", "csv-", etc.
- Remove unnecessary includes("v") pre-check
- Update comments with real GLM model names
- Add unit tests for GLM text and vision models
* feat: add vision detection for MiniMax, Moonshot, and fix Qwen
- Add MiniMax text model detection (M2.x series are text-only)
- Add Moonshot v1 text model detection (moonshot-v1-* are text-only)
- Add qwen3.5-flash to Qwen vision model exceptions
- Add unit tests for all new model checks
---------
Co-authored-by: dayuan.jiang <jdy.toh@gmail.com>
This commit is contained in:
@@ -1335,6 +1335,16 @@ export function supportsImageInput(modelId: string): boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
// Moonshot text models (moonshot-v1 series are text-only)
|
||||
if (lowerModelId.includes("moonshot-v1") && !hasVisionIndicator) {
|
||||
return false
|
||||
}
|
||||
|
||||
// MiniMax text models (MiniMax-M2.x series are text-only)
|
||||
if (lowerModelId.includes("minimax") && !hasVisionIndicator) {
|
||||
return false
|
||||
}
|
||||
|
||||
// DeepSeek text models (not vision variants)
|
||||
if (lowerModelId.includes("deepseek") && !hasVisionIndicator) {
|
||||
return false
|
||||
@@ -1345,11 +1355,20 @@ export function supportsImageInput(modelId: string): boolean {
|
||||
if (
|
||||
lowerModelId.includes("qwen") &&
|
||||
!hasVisionIndicator &&
|
||||
!lowerModelId.includes("qwen3.5-plus")
|
||||
!lowerModelId.includes("qwen3.5-plus") &&
|
||||
!lowerModelId.includes("qwen3.5-flash")
|
||||
) {
|
||||
return false
|
||||
}
|
||||
|
||||
// GLM text models (not vision variants)
|
||||
// GLM vision models: glm-4v, glm-4v-9b, glm-4.1v-9b-thinking
|
||||
if (lowerModelId.includes("glm") && !hasVisionIndicator) {
|
||||
if (!/[\d.]v/.test(lowerModelId)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// Default: assume model supports images
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -174,6 +174,19 @@ describe("supportsImageInput", () => {
|
||||
expect(supportsImageInput("moonshotai/kimi-k2.5")).toBe(true)
|
||||
})
|
||||
|
||||
it("returns false for Moonshot v1 text models", () => {
|
||||
expect(supportsImageInput("moonshot-v1-8k")).toBe(false)
|
||||
expect(supportsImageInput("moonshot-v1-32k")).toBe(false)
|
||||
expect(supportsImageInput("moonshot-v1-128k")).toBe(false)
|
||||
})
|
||||
|
||||
it("returns false for MiniMax text models", () => {
|
||||
expect(supportsImageInput("MiniMax-M2.7")).toBe(false)
|
||||
expect(supportsImageInput("MiniMax-M2.5")).toBe(false)
|
||||
expect(supportsImageInput("MiniMax-M2")).toBe(false)
|
||||
expect(supportsImageInput("MiniMax-M2.5-highspeed")).toBe(false)
|
||||
})
|
||||
|
||||
it("returns false for DeepSeek text models", () => {
|
||||
expect(supportsImageInput("deepseek-chat")).toBe(false)
|
||||
expect(supportsImageInput("deepseek-coder")).toBe(false)
|
||||
@@ -182,6 +195,30 @@ describe("supportsImageInput", () => {
|
||||
it("returns false for Qwen text models", () => {
|
||||
expect(supportsImageInput("qwen-turbo")).toBe(false)
|
||||
expect(supportsImageInput("qwen-plus")).toBe(false)
|
||||
expect(supportsImageInput("qwen3-max")).toBe(false)
|
||||
})
|
||||
|
||||
it("returns true for Qwen vision models", () => {
|
||||
expect(supportsImageInput("qwen-vl")).toBe(true)
|
||||
expect(supportsImageInput("qwen3.5-plus")).toBe(true)
|
||||
expect(supportsImageInput("qwen3.5-flash")).toBe(true)
|
||||
expect(supportsImageInput("qwen3-vl-plus")).toBe(true)
|
||||
expect(supportsImageInput("qwen3-vl-flash")).toBe(true)
|
||||
})
|
||||
|
||||
it("returns false for GLM text models", () => {
|
||||
expect(supportsImageInput("glm-4")).toBe(false)
|
||||
expect(supportsImageInput("glm-4-plus")).toBe(false)
|
||||
expect(supportsImageInput("glm-4-flash")).toBe(false)
|
||||
expect(supportsImageInput("glm-4-long")).toBe(false)
|
||||
expect(supportsImageInput("glm-4.7")).toBe(false)
|
||||
expect(supportsImageInput("glm-5")).toBe(false)
|
||||
})
|
||||
|
||||
it("returns true for GLM vision models", () => {
|
||||
expect(supportsImageInput("glm-4v")).toBe(true)
|
||||
expect(supportsImageInput("glm-4v-9b")).toBe(true)
|
||||
expect(supportsImageInput("glm-4.1v-9b-thinking")).toBe(true)
|
||||
})
|
||||
|
||||
it("returns true for Claude and GPT models by default", () => {
|
||||
|
||||
Reference in New Issue
Block a user