|
|
@@ -1698,6 +1698,20 @@ describe('plugin registration and config', () => {
|
|
|
expect(ctx.llm.listProviders()).toEqual([{ id: 'deepseek-official', name: 'DeepSeek' }])
|
|
|
await expect(ctx.llm.listModels('deepseek-official')).resolves.toEqual([
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-flash', name: 'DeepSeek-V41-Flash', inputModalities: ['text', 'image'] },
|
|
|
+ {
|
|
|
+ provider: 'deepseek-official',
|
|
|
+ id: 'deepseek-v4-flash',
|
|
|
+ name: 'DeepSeek-V4-Flash',
|
|
|
+ description: 'Fast, efficient, and economical; suited to focused, routine, or parallel tasks.',
|
|
|
+ inputModalities: ['text'],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ provider: 'deepseek-official',
|
|
|
+ id: 'deepseek-v4-pro',
|
|
|
+ name: 'DeepSeek-V4-Pro',
|
|
|
+ description: 'Stronger agentic coding, knowledge, and difficult reasoning; suited to complex or quality-critical tasks at higher cost.',
|
|
|
+ inputModalities: ['text'],
|
|
|
+ },
|
|
|
])
|
|
|
await expect(ctx.llm.resolveModelInfo('deepseek-official', 'deepseek-flash'))
|
|
|
.resolves.toMatchObject({
|
|
|
@@ -1720,6 +1734,20 @@ describe('plugin registration and config', () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
+ it.each(['deepseek-v4-flash', 'deepseek-v4-pro'])('keeps %s available with its V4 capabilities', async (model) => {
|
|
|
+ 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'],
|
|
|
+ context: { contextWindow: 1_000_000 },
|
|
|
+ defaultMaxTokens: 256_000,
|
|
|
+ })
|
|
|
+ expect(info?.systemPromptUpdate).toBeUndefined()
|
|
|
+ })
|
|
|
+
|
|
|
it.each(['off', 'low', 'max'] as const)('uses the configured %s reasoning default', async (effort) => {
|
|
|
const ctx = new Context()
|
|
|
await ctx.plugin(LlmRuntime)
|
|
|
@@ -1804,6 +1832,20 @@ describe('plugin registration and config', () => {
|
|
|
LlmDeepSeek.apply(ctx, { baseURL: 'http://127.0.0.1:1' })
|
|
|
await expect(ctx.llm.listModels('deepseek-official')).resolves.toEqual([
|
|
|
{ provider: 'deepseek-official', id: 'deepseek-flash', name: 'DeepSeek-V41-Flash', inputModalities: ['text', 'image'] },
|
|
|
+ {
|
|
|
+ provider: 'deepseek-official',
|
|
|
+ id: 'deepseek-v4-flash',
|
|
|
+ name: 'DeepSeek-V4-Flash',
|
|
|
+ description: 'Fast, efficient, and economical; suited to focused, routine, or parallel tasks.',
|
|
|
+ inputModalities: ['text'],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ provider: 'deepseek-official',
|
|
|
+ id: 'deepseek-v4-pro',
|
|
|
+ name: 'DeepSeek-V4-Pro',
|
|
|
+ description: 'Stronger agentic coding, knowledge, and difficult reasoning; suited to complex or quality-critical tasks at higher cost.',
|
|
|
+ inputModalities: ['text'],
|
|
|
+ },
|
|
|
])
|
|
|
})
|
|
|
|
|
|
@@ -2119,7 +2161,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(1)
|
|
|
+ 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.
|
|
|
@@ -2207,7 +2249,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(1)
|
|
|
+ await expect(adapter.listModels('deepseek-official')).resolves.toHaveLength(3)
|
|
|
})
|
|
|
|
|
|
it('resolves connection facts and the credential exactly once per stream call', async () => {
|