|
|
@@ -1712,6 +1712,7 @@ describe('plugin registration and config', () => {
|
|
|
description: 'Stronger agentic coding, knowledge, and difficult reasoning; suited to complex or quality-critical tasks at higher cost.',
|
|
|
inputModalities: ['text'],
|
|
|
},
|
|
|
+ { provider: 'deepseek-official', id: 'deepseek-v4-flash-vision-exp', name: 'DeepSeek-V4-Flash-Vision-Exp', inputModalities: ['text', 'image'] },
|
|
|
])
|
|
|
await expect(ctx.llm.resolveModelInfo('deepseek-official', 'deepseek-flash'))
|
|
|
.resolves.toMatchObject({
|
|
|
@@ -1734,14 +1735,18 @@ describe('plugin registration and config', () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
- it.each(['deepseek-v4-flash', 'deepseek-v4-pro'])('keeps %s available with its V4 capabilities', async (model) => {
|
|
|
+ it.each([
|
|
|
+ { model: 'deepseek-v4-flash', inputModalities: ['text'] },
|
|
|
+ { model: 'deepseek-v4-pro', inputModalities: ['text'] },
|
|
|
+ { model: 'deepseek-v4-flash-vision-exp', inputModalities: ['text', 'image'] },
|
|
|
+ ])('keeps $model available with its V4 capabilities', async ({ model, inputModalities }) => {
|
|
|
const ctx = new Context()
|
|
|
await ctx.plugin(LlmRuntime)
|
|
|
await ctx.plugin(LlmDeepSeek, { baseURL: 'http://127.0.0.1:1' })
|
|
|
const info = await ctx.llm.resolveModelInfo('deepseek-official', model)
|
|
|
expect(info).toMatchObject({
|
|
|
id: model,
|
|
|
- inputModalities: ['text'],
|
|
|
+ inputModalities,
|
|
|
context: { contextWindow: 1_000_000 },
|
|
|
defaultMaxTokens: 256_000,
|
|
|
})
|
|
|
@@ -1846,6 +1851,7 @@ describe('plugin registration and config', () => {
|
|
|
description: 'Stronger agentic coding, knowledge, and difficult reasoning; suited to complex or quality-critical tasks at higher cost.',
|
|
|
inputModalities: ['text'],
|
|
|
},
|
|
|
+ { provider: 'deepseek-official', id: 'deepseek-v4-flash-vision-exp', name: 'DeepSeek-V4-Flash-Vision-Exp', inputModalities: ['text', 'image'] },
|
|
|
])
|
|
|
})
|
|
|
|
|
|
@@ -2161,7 +2167,7 @@ describe('plugin registration and config', () => {
|
|
|
// First-boot onboarding: the route registers so models stay discoverable;
|
|
|
// only the request itself needs a key.
|
|
|
expect(ctx.llm.listProviders()).toEqual([{ id: 'deepseek-official', name: 'DeepSeek' }])
|
|
|
- await expect(ctx.llm.listModels('deepseek-official')).resolves.toHaveLength(3)
|
|
|
+ await expect(ctx.llm.listModels('deepseek-official')).resolves.toHaveLength(4)
|
|
|
const first = await assemble(ctx, { model: 'deepseek-v4-flash', messages: [] })
|
|
|
expect(first.finish).toMatchObject({ kind: 'error', failure: { code: 'MISSING_CREDENTIAL' } })
|
|
|
// The guidance leads with the managed credential store.
|
|
|
@@ -2249,7 +2255,7 @@ describe('plugin registration and config', () => {
|
|
|
expect(adapter).toBeInstanceOf(DeepSeekAdapter)
|
|
|
// Direct embedding shares the plugin's one resolve step, so it advertises
|
|
|
// the same default catalog instead of a divergent empty one.
|
|
|
- await expect(adapter.listModels('deepseek-official')).resolves.toHaveLength(3)
|
|
|
+ await expect(adapter.listModels('deepseek-official')).resolves.toHaveLength(4)
|
|
|
})
|
|
|
|
|
|
it('resolves connection facts and the credential exactly once per stream call', async () => {
|