assemble.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. /**
  2. * Test helper: drive `ctx.llm.stream()` through a `BlockAssembler` and return
  3. * the assembled message + usage + finish reason. This exercises the same
  4. * streaming path production uses (the loop), rather than a service-level
  5. * one-shot convenience method.
  6. */
  7. import { BlockAssembler } from '@deepseek-ai/dsh-llm'
  8. import type { Context } from 'cordis'
  9. import type { FinishReason, GenerateOptions, Message, TokenUsage } from '@deepseek-ai/dsh-llm'
  10. export interface AssembledResult {
  11. message: Message
  12. usage?: TokenUsage
  13. finish: FinishReason
  14. }
  15. export async function assemble(ctx: Context, options: Omit<GenerateOptions, 'provider'> & { provider?: string }): Promise<AssembledResult> {
  16. const assembler = new BlockAssembler()
  17. const request = { provider: 'deepseek', ...options }
  18. for await (const chunk of ctx.llm.stream(request)) assembler.push(chunk)
  19. return {
  20. message: {
  21. ...assembler.message(),
  22. provenance: {
  23. provider: request.provider,
  24. model: request.model,
  25. ...assembler.replayState === undefined ? {} : { replayState: assembler.replayState },
  26. },
  27. },
  28. ...assembler.usage !== undefined ? { usage: assembler.usage } : {},
  29. finish: assembler.finish,
  30. }
  31. }