|
|
@@ -117,10 +117,7 @@ describe('DeepSeekAdapter against a mock server', () => {
|
|
|
return Promise.resolve({ ref, data: Uint8Array.of(1, 2, 3) })
|
|
|
}),
|
|
|
} as unknown as AttachmentStore
|
|
|
- const adapter = adapterOf({
|
|
|
- baseURL: server.url,
|
|
|
- models: [{ id: 'deepseek-v4-flash-vision-exp', inputModalities: ['text', 'image'] }],
|
|
|
- }, attachments)
|
|
|
+ const adapter = adapterOf({ baseURL: server.url }, attachments)
|
|
|
|
|
|
await drain(adapter.stream({
|
|
|
provider: 'deepseek-official',
|
|
|
@@ -765,6 +762,7 @@ describe('plugin registration and config', () => {
|
|
|
await expect(ctx.llm.listModels('deepseek-official')).resolves.toEqual([
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-v4-flash', name: 'DeepSeek-V4-Flash', inputModalities: ['text'] },
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-v4-pro', name: 'DeepSeek-V4-Pro', 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-v4-flash'))
|
|
|
.resolves.toMatchObject({
|
|
|
@@ -783,6 +781,15 @@ describe('plugin registration and config', () => {
|
|
|
defaultEffort: ReasoningEffortId('high'),
|
|
|
},
|
|
|
})
|
|
|
+ await expect(ctx.llm.resolveModelInfo('deepseek-official', 'deepseek-v4-flash-vision-exp'))
|
|
|
+ .resolves.toMatchObject({
|
|
|
+ provider: 'deepseek-official',
|
|
|
+ id: 'deepseek-v4-flash-vision-exp',
|
|
|
+ name: 'DeepSeek-V4-Flash-Vision-Exp',
|
|
|
+ inputModalities: ['text', 'image'],
|
|
|
+ context: { contextWindow: 1_000_000 },
|
|
|
+ defaultMaxTokens: 256_000,
|
|
|
+ })
|
|
|
})
|
|
|
|
|
|
it.each(['off', 'low', 'max'] as const)('uses the configured %s reasoning default', async (effort) => {
|
|
|
@@ -862,6 +869,7 @@ describe('plugin registration and config', () => {
|
|
|
await expect(ctx.llm.listModels('deepseek-official')).resolves.toEqual([
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-v4-flash', name: 'DeepSeek-V4-Flash', inputModalities: ['text'] },
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-v4-pro', name: 'DeepSeek-V4-Pro', inputModalities: ['text'] },
|
|
|
+ { provider: 'deepseek-official', id: 'deepseek-v4-flash-vision-exp', name: 'DeepSeek-V4-Flash-Vision-Exp', inputModalities: ['text', 'image'] },
|
|
|
])
|
|
|
})
|
|
|
|
|
|
@@ -1051,7 +1059,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(2)
|
|
|
+ await expect(ctx.llm.listModels('deepseek-official')).resolves.toHaveLength(3)
|
|
|
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.
|
|
|
@@ -1139,7 +1147,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(2)
|
|
|
+ await expect(adapter.listModels('deepseek-official')).resolves.toHaveLength(3)
|
|
|
})
|
|
|
|
|
|
it('resolves connection facts and the credential exactly once per stream call', async () => {
|