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, }) 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) }) })