provider.e2e.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { afterEach, describe, expect, it } from 'vitest'
  2. import { Context } from 'cordis'
  3. import LlmService from '@deepseek-ai/dsh-llm'
  4. import * as LlmDeepSeek from '@deepseek-ai/dsh-llm-deepseek'
  5. import SessionStore, { SessionId } from '@deepseek-ai/dsh-session'
  6. import SessionTitleService from '@deepseek-ai/dsh-session-title'
  7. import * as FirstMessageTitleProvider from '@deepseek-ai/dsh-session-title-first-message-llm'
  8. const contexts: Context[] = []
  9. afterEach(async () => {
  10. await Promise.all(contexts.splice(0).map(ctx => ctx.fiber.dispose()))
  11. })
  12. describe.skipIf(!process.env.DEEPSEEK_API_KEY)('first-message title provider with real DeepSeek API', () => {
  13. it('replaces the fallback with a short model title', async () => {
  14. const ctx = new Context()
  15. contexts.push(ctx)
  16. await ctx.plugin(LlmService)
  17. await ctx.plugin(LlmDeepSeek, { thinking: 'disabled' })
  18. await ctx.plugin(SessionStore)
  19. await ctx.plugin(SessionTitleService, {
  20. fallbackMaxWords: 5,
  21. fallbackMaxBytes: 40,
  22. maxTitleBytes: 80,
  23. })
  24. await ctx.plugin(FirstMessageTitleProvider, {
  25. targetWords: 5,
  26. targetCjkCharacters: 10,
  27. maxInputBytes: 4_096,
  28. maxOutputTokens: 64,
  29. timeoutMs: 60_000,
  30. provider: 'deepseek',
  31. model: 'deepseek-v4-flash',
  32. })
  33. const session = ctx.sessions.create(SessionId('real-title-provider'))
  34. session.append('turn/start', {
  35. turn: 1,
  36. trigger: { kind: 'message', source: { kind: 'user' } },
  37. })
  38. const message = session.append('user/message', {
  39. content: [{ type: 'text', text: 'Explain why append-only logs make session titles durable.' }],
  40. source: { kind: 'user' },
  41. }, { surfaceOp: 'append' })
  42. const title = await ctx.sessionTitle.refresh(session)
  43. expect(title).toMatchObject({
  44. messageSeqs: [message.seq],
  45. source: {
  46. kind: 'provider',
  47. provider: 'session-title-first-message-llm',
  48. model: { provider: 'deepseek', model: 'deepseek-v4-flash' },
  49. },
  50. })
  51. expect(title?.title.length).toBeGreaterThan(0)
  52. expect(Buffer.byteLength(title?.title ?? '', 'utf8')).toBeLessThanOrEqual(80)
  53. })
  54. })