model-selection.spec.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { describe, expect, it } from 'vitest'
  2. import { Context } from '@deepseek-ai/cordis'
  3. import SystemPrompt from '@deepseek-ai/dsh-system-prompt'
  4. import {
  5. agentEvents,
  6. installModelSelection,
  7. type Agent,
  8. type ModelSelectionRef,
  9. } from '../src/index.ts'
  10. import { ReasoningEffortId, type LlmCallConfig } from '@deepseek-ai/dsh-llm'
  11. describe('installModelSelection()', () => {
  12. it('snapshots prompt variables and request routing together, then disposes both listeners', async () => {
  13. const ctx = new Context()
  14. await ctx.plugin(SystemPrompt)
  15. const selection: ModelSelectionRef = { current: undefined, assembled: undefined }
  16. const dispose = installModelSelection(ctx, selection)
  17. const agent = {} as Agent
  18. const seed: LlmCallConfig = { provider: 'seed', model: 'seed', temperature: 0.2 }
  19. const signal = new AbortController().signal
  20. expect((await ctx.systemPrompt.assemble()).variables).toEqual({})
  21. await expect(agentEvents(ctx, agent).waterfall(
  22. 'agent/request', { turn: 1, step: 0, signal }, () => Promise.resolve(seed),
  23. )).resolves.toBe(seed)
  24. selection.current = {
  25. provider: 'alpha',
  26. model: 'a1',
  27. reasoningEffort: ReasoningEffortId('high'),
  28. }
  29. expect((await ctx.systemPrompt.assemble()).variables).toMatchObject({ provider: 'alpha', model: 'a1' })
  30. selection.current = { provider: 'beta', model: 'b1' }
  31. await expect(agentEvents(ctx, agent).waterfall(
  32. 'agent/request', { turn: 1, step: 0, signal }, () => Promise.resolve(seed),
  33. )).resolves.toEqual({
  34. provider: 'alpha',
  35. model: 'a1',
  36. reasoningEffort: ReasoningEffortId('high'),
  37. temperature: 0.2,
  38. })
  39. expect((await ctx.systemPrompt.assemble()).variables).toMatchObject({ provider: 'beta', model: 'b1' })
  40. const inherited: LlmCallConfig = {
  41. provider: 'alpha',
  42. model: 'a1',
  43. reasoningEffort: ReasoningEffortId('max'),
  44. temperature: 0.2,
  45. }
  46. await expect(agentEvents(ctx, agent).waterfall(
  47. 'agent/request', { turn: 1, step: 1, signal }, () => Promise.resolve(inherited),
  48. )).resolves.toEqual({ provider: 'beta', model: 'b1', temperature: 0.2 })
  49. dispose()
  50. expect((await ctx.systemPrompt.assemble()).variables).toEqual({})
  51. await expect(agentEvents(ctx, agent).waterfall(
  52. 'agent/request', { turn: 2, step: 0, signal }, () => Promise.resolve(seed),
  53. )).resolves.toBe(seed)
  54. await ctx.fiber.dispose()
  55. })
  56. })