From 61b7e41e76b351e9c7bc99d200f5961da51a2eb3 Mon Sep 17 00:00:00 2001 From: Yunare Maia Date: Sun, 23 Aug 2026 12:05:10 +0000 Subject: [PATCH 1/9] fix(core): add DeepSeek V4 Flash Vision to model metadata deepseek-v4-flash-vision-exp is returned by the first-party /models endpoint but was absent from STATIC_MODEL_METADATA, causing Maka to classify it as text-only and filter image attachments before the request reaches the provider. Add the model ID with vision capability to both STATIC_MODEL_METADATA and CURATED_CATALOG_FALLBACK_MODELS so the existing DeepSeek adapter passes image content through. Fixes: #3417 Signed-off-by: Yunare Maia --- packages/core/src/model-metadata.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 5949b79fad..4d76c78feb 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -435,6 +435,10 @@ const STATIC_MODEL_METADATA: Partial Date: Sun, 23 Aug 2026 13:21:52 +0000 Subject: [PATCH 2/9] style: apply biome formatting to model metadata (CI fix) --- packages/core/src/model-metadata.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 4d76c78feb..3f65fed90a 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -584,7 +584,13 @@ const CURATED_CATALOG_FALLBACK_MODELS: Partial Date: Mon, 24 Aug 2026 17:32:33 +0000 Subject: [PATCH 3/9] fix(core): include 'low' effort for deepseek-v4-flash-vision-exp Per review: models.dev (refreshed 2026-08-21), the official Thinking Mode guide, and the deepseek-v4-pro entry all confirm low/high/max. The pinned ['high','max'] was inherited from the stale pre-0731 sibling entry. --- packages/core/src/model-metadata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 3f65fed90a..40549c0a5f 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -437,7 +437,7 @@ const STATIC_MODEL_METADATA: Partial Date: Tue, 25 Aug 2026 12:46:37 +0000 Subject: [PATCH 4/9] fix(core): declare text/image modalities for deepseek-v4-flash-vision-exp Add the explicit modalities entry suggested in review so attachment routing sees image input without relying on generated snapshots, and add a focused regression test covering vision resolution, input modalities, and fallback-catalog presence for the bare model id. Co-authored-by: Yunare Maia --- .../core/src/__tests__/model-metadata.test.ts | 27 +++++++++++++++++++ packages/core/src/model-metadata.ts | 1 + 2 files changed, 28 insertions(+) diff --git a/packages/core/src/__tests__/model-metadata.test.ts b/packages/core/src/__tests__/model-metadata.test.ts index 9eb6090bf8..b5c6a833ef 100644 --- a/packages/core/src/__tests__/model-metadata.test.ts +++ b/packages/core/src/__tests__/model-metadata.test.ts @@ -20,8 +20,10 @@ import { strict as assert } from 'node:assert'; import { describe, it } from 'node:test'; import { + curatedCatalogFallbackModelsForProvider, lookupModelMetadata, openAiAdapterApiProtocol, + resolveModelInputModalities, resolveModelVisionSupport, } from '../model-metadata.js'; import type { ModelInfo, ProviderType } from '../llm-connections.js'; @@ -105,3 +107,28 @@ describe('openAiAdapterApiProtocol', () => { assert.equal(openAiAdapterApiProtocol('minimax-m3', 'opencode-go'), 'openai-chat'); }); }); + +describe('deepseek v4 flash vision exp metadata regression', () => { + it('resolves the bare model id with vision support', () => { + assert.equal( + resolveModelVisionSupport('deepseek', undefined, 'deepseek-v4-flash-vision-exp'), + true, + ); + }); + + it('accepts both text and image input modalities', () => { + const input = resolveModelInputModalities( + 'deepseek', + undefined, + 'deepseek-v4-flash-vision-exp', + ); + assert.ok(input.includes('text')); + assert.ok(input.includes('image')); + }); + + it('keeps the model present in the deepseek fallback catalog', () => { + assert.ok( + curatedCatalogFallbackModelsForProvider('deepseek')?.includes('deepseek-v4-flash-vision-exp'), + ); + }); +}); diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 40549c0a5f..6780e1dd61 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -438,6 +438,7 @@ const STATIC_MODEL_METADATA: Partial Date: Tue, 25 Aug 2026 12:58:12 +0000 Subject: [PATCH 5/9] chore: re-trigger CI after upstream main repair (#3796) From 1dd8f70142a420dc65c2fb6bf168a2c1a0e2d03d Mon Sep 17 00:00:00 2001 From: Yunare Maia Date: Thu, 27 Aug 2026 21:28:42 +0000 Subject: [PATCH 6/9] fix(core): add displayName, description, lastUpdated for deepseek-v4-flash-vision-exp Addresses reviewer feedback on #3605: adds displayName, description, and lastUpdated fields to the STATIC_MODEL_METADATA entry so the model picker shows a friendly name instead of the bare model ID. Co-authored-by: Astro-Han --- packages/core/src/model-metadata.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 6780e1dd61..622b2c3af5 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -439,6 +439,9 @@ const STATIC_MODEL_METADATA: Partial Date: Thu, 27 Aug 2026 21:44:44 +0000 Subject: [PATCH 7/9] style(core): biome format model-metadata.ts (description line wrap) --- packages/core/src/model-metadata.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 622b2c3af5..01c586d871 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -440,7 +440,8 @@ const STATIC_MODEL_METADATA: Partial Date: Fri, 28 Aug 2026 02:37:05 +0000 Subject: [PATCH 8/9] test(core): add regression tests for DeepSeek V4 Flash Vision metadata - Added tests to verify vision support, modalities, and metadata lookup - Added catalog test for V4 vision model display metadata - Fixes reviewer feedback on #3605 --- .../core/src/__tests__/model-catalog.test.ts | 31 ++++++++++++++ .../core/src/__tests__/model-metadata.test.ts | 41 +++++++++++++++++++ packages/core/src/model-metadata.ts | 10 +++-- 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/packages/core/src/__tests__/model-catalog.test.ts b/packages/core/src/__tests__/model-catalog.test.ts index 85ac3287b3..81b36bbfff 100644 --- a/packages/core/src/__tests__/model-catalog.test.ts +++ b/packages/core/src/__tests__/model-catalog.test.ts @@ -351,3 +351,34 @@ test('Alibaba (China) catalogs Qwen3.8 Max as the default model on the China end assert.deepEqual(model?.modalities, { input: ['text', 'image', 'pdf'], output: ['text'] }); assert.equal(model?.canUseAsChatDefault, true); }); + +test('DeepSeek catalogs the V4 vision model display metadata from a bare provider id', () => { + const modelId = 'deepseek-v4-flash-vision-exp'; + const [model] = buildConnectionModelCatalogEntries({ + connection: { + slug: 'deepseek', + providerType: 'deepseek', + defaultModel: modelId, + models: [{ id: modelId }], + modelSource: 'fetched', + }, + }); + + assert.equal(model?.displayName, 'DeepSeek-V4-Flash-Vision-Exp'); + assert.equal( + model?.description, + 'Experimental DeepSeek V4 Flash model for image understanding and multimodal agent tasks', + ); + assert.equal(model?.docsUrl, 'https://api-docs.deepseek.com/guides/vision/'); + assert.equal(model?.contextWindow, 1_000_000); + assert.equal(model?.maxOutputTokens, 384_000); + assert.equal(model?.structuredOutput, true); + assert.equal(model?.lastUpdated, '2026-08-21'); + assert.deepEqual(model?.capabilities, { + reasoning: true, + functionCalling: true, + vision: true, + }); + assert.deepEqual(model?.modalities, { input: ['text', 'image'], output: ['text'] }); + assert.equal(model?.canUseAsChatDefault, true); +}); diff --git a/packages/core/src/__tests__/model-metadata.test.ts b/packages/core/src/__tests__/model-metadata.test.ts index b5c6a833ef..1eda691041 100644 --- a/packages/core/src/__tests__/model-metadata.test.ts +++ b/packages/core/src/__tests__/model-metadata.test.ts @@ -20,6 +20,7 @@ import { strict as assert } from 'node:assert'; import { describe, it } from 'node:test'; import { + buildConnectionModelCatalogEntries, curatedCatalogFallbackModelsForProvider, lookupModelMetadata, openAiAdapterApiProtocol, @@ -131,4 +132,44 @@ describe('deepseek v4 flash vision exp metadata regression', () => { curatedCatalogFallbackModelsForProvider('deepseek')?.includes('deepseek-v4-flash-vision-exp'), ); }); + + it('returns expected metadata from lookupModelMetadata', () => { + const modelId = 'deepseek-v4-flash-vision-exp'; + const metadata = lookupModelMetadata('deepseek', modelId); + + assert.equal(metadata.displayName, 'DeepSeek-V4-Flash-Vision-Exp'); + assert.equal( + metadata.description, + 'Experimental DeepSeek V4 Flash model for image understanding and multimodal agent tasks', + ); + assert.equal(metadata.docsUrl, 'https://api-docs.deepseek.com/guides/vision/'); + assert.equal(metadata.contextWindow, 1_000_000); + assert.equal(metadata.maxOutputTokens, 384_000); + assert.equal(metadata.structuredOutput, true); + assert.equal(metadata.lastUpdated, '2026-08-21'); + assert.deepEqual(metadata.thinkingOptions, { + efforts: ['low', 'high', 'max'], + toggle: true, + }); + assert.equal(metadata.capabilities?.vision, true); + assert.deepEqual(metadata.modalities, { input: ['text', 'image'], output: ['text'] }); + }); + + it('is recognized from a bare discovered id', () => { + const modelId = 'deepseek-v4-flash-vision-exp'; + const discovered: ModelInfo[] = [{ id: modelId }]; + const metadata = lookupModelMetadata('deepseek', modelId); + + assert.equal(metadata.displayName, 'DeepSeek-V4-Flash-Vision-Exp'); + assert.equal(metadata.capabilities?.vision, true); + assert.deepEqual(resolveModelInputModalities('deepseek', discovered, modelId), [ + 'text', + 'image', + ]); + assert.equal(resolveModelVisionSupport('deepseek', discovered, modelId), true); + assert.equal( + resolveModelVisionSupport('deepseek', [{ id: 'deepseek-v4-flash' }], 'deepseek-v4-flash'), + false, + ); + }); }); diff --git a/packages/core/src/model-metadata.ts b/packages/core/src/model-metadata.ts index 01c586d871..79afdd0da8 100644 --- a/packages/core/src/model-metadata.ts +++ b/packages/core/src/model-metadata.ts @@ -439,10 +439,14 @@ const STATIC_MODEL_METADATA: Partial Date: Fri, 28 Aug 2026 02:41:53 +0000 Subject: [PATCH 9/9] fix(test): remove buildConnectionModelCatalogEntries import from model-metadata.test.ts The function is exported from model-catalog.ts, not model-metadata.ts. Local vitest runs pass because it compiles differently than tsc. --- packages/core/src/__tests__/model-metadata.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/__tests__/model-metadata.test.ts b/packages/core/src/__tests__/model-metadata.test.ts index 1eda691041..32f543b784 100644 --- a/packages/core/src/__tests__/model-metadata.test.ts +++ b/packages/core/src/__tests__/model-metadata.test.ts @@ -20,7 +20,6 @@ import { strict as assert } from 'node:assert'; import { describe, it } from 'node:test'; import { - buildConnectionModelCatalogEntries, curatedCatalogFallbackModelsForProvider, lookupModelMetadata, openAiAdapterApiProtocol,