mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
The native adapter's route was named deepseek, colliding with pi-ai's catalog provider of the same name, so the two DeepSeek paths could never be mounted side by side. The web settings page needs both configurable at once. Compositions, fixtures, goldens, scaffolding defaults, and docs all move together (pre-release, no shim); TUI/session-query-spill/ missing-credential goldens re-recorded through their keyless refresh modes because provider-name length shifts box padding and spill truncation points.
61 lines
2.2 KiB
TypeScript
61 lines
2.2 KiB
TypeScript
import { createUserMessage } from '@deepseek-ai/dsh-llm'
|
|
import { afterEach, describe, expect, it } from 'vitest'
|
|
import { Context } from 'cordis'
|
|
import LlmService from '@deepseek-ai/dsh-llm'
|
|
import * as LlmDeepSeek from '@deepseek-ai/dsh-llm-deepseek'
|
|
import SessionStore, { SessionId } from '@deepseek-ai/dsh-session'
|
|
import SessionTitleService from '@deepseek-ai/dsh-session-title'
|
|
import * as FirstMessageTitleProvider from '@deepseek-ai/dsh-session-title-first-message-llm'
|
|
|
|
const contexts: Context[] = []
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(contexts.splice(0).map(ctx => ctx.fiber.dispose()))
|
|
})
|
|
|
|
describe.skipIf(!process.env.DEEPSEEK_API_KEY)('first-message title provider with real DeepSeek API', () => {
|
|
it('replaces the fallback with a short model title', async () => {
|
|
const ctx = new Context()
|
|
contexts.push(ctx)
|
|
await ctx.plugin(LlmService)
|
|
await ctx.plugin(LlmDeepSeek, { thinking: 'disabled' })
|
|
await ctx.plugin(SessionStore)
|
|
await ctx.plugin(SessionTitleService, {
|
|
fallbackMaxWords: 5,
|
|
fallbackMaxBytes: 40,
|
|
maxTitleBytes: 80,
|
|
})
|
|
await ctx.plugin(FirstMessageTitleProvider, {
|
|
targetWords: 5,
|
|
targetCjkCharacters: 10,
|
|
maxInputBytes: 4_096,
|
|
maxOutputTokens: 64,
|
|
timeoutMs: 60_000,
|
|
provider: 'deepseek-official',
|
|
model: 'deepseek-v4-flash',
|
|
})
|
|
const session = ctx.sessions.create(SessionId('real-title-provider'))
|
|
session.append('turn/start', {
|
|
turn: 1,
|
|
trigger: { kind: 'message', source: { kind: 'user' } },
|
|
})
|
|
const message = session.append('user/message', createUserMessage({
|
|
content: [{ type: 'text', text: 'Explain why append-only logs make session titles durable.' }],
|
|
source: { kind: 'user' },
|
|
}), { surfaceOp: 'append' })
|
|
|
|
const title = await ctx.sessionTitle.refresh(session)
|
|
|
|
expect(title).toMatchObject({
|
|
messageSeqs: [message.seq],
|
|
source: {
|
|
kind: 'provider',
|
|
provider: 'session-title-first-message-llm',
|
|
model: { provider: 'deepseek-official', model: 'deepseek-v4-flash' },
|
|
},
|
|
})
|
|
expect(title?.title.length).toBeGreaterThan(0)
|
|
expect(Buffer.byteLength(title?.title ?? '', 'utf8')).toBeLessThanOrEqual(80)
|
|
})
|
|
})
|