{"version":3,"file":"openai_stream_fixtures.cjs","names":[],"sources":["../../../src/utils/testing/openai_stream_fixtures.ts"],"sourcesContent":["import type { OpenAICompletionsStreamChunk } from \"../../language_models/openai_completions_stream.js\";\n\nexport function asAsyncIterable<T>(items: T[]): AsyncIterable<T> {\n  return {\n    async *[Symbol.asyncIterator]() {\n      for (const item of items) {\n        yield item;\n      }\n    },\n  };\n}\n\nexport function openAITextOnlyChunksWithUsage(\n  model = \"test-model\"\n): OpenAICompletionsStreamChunk[] {\n  const chunks = openAITextOnlyChunks(model);\n  const last = chunks[chunks.length - 1]!;\n  chunks[chunks.length - 1] = {\n    ...last,\n    usage: {\n      prompt_tokens: 10,\n      completion_tokens: 2,\n      total_tokens: 12,\n    },\n  };\n  return chunks;\n}\n\nexport function openAITextOnlyChunks(\n  model = \"test-model\"\n): OpenAICompletionsStreamChunk[] {\n  return [\n    {\n      id: \"chatcmpl-text\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: { role: \"assistant\", content: \"Hello\" },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-text\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: { content: \" world\" },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-text\",\n      model,\n      choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }],\n    },\n  ];\n}\n\nexport function openAIReasoningTextChunks(\n  model = \"test-model\"\n): OpenAICompletionsStreamChunk[] {\n  return [\n    {\n      id: \"chatcmpl-reason\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: { role: \"assistant\", reasoning_content: \"Let me reason...\" },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-reason\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: { content: \"Answer.\" },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-reason\",\n      model,\n      choices: [{ index: 0, delta: {}, finish_reason: \"stop\" }],\n    },\n  ];\n}\n\nexport function openAIToolCallChunks(\n  model = \"test-model\"\n): OpenAICompletionsStreamChunk[] {\n  return [\n    {\n      id: \"chatcmpl-tools\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: { role: \"assistant\", content: \"Let me search.\" },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-tools\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: {\n            tool_calls: [\n              {\n                index: 0,\n                id: \"call_abc\",\n                type: \"function\",\n                function: { name: \"web_search\", arguments: '{\"query\"' },\n              },\n            ],\n          },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-tools\",\n      model,\n      choices: [\n        {\n          index: 0,\n          delta: {\n            tool_calls: [\n              {\n                index: 0,\n                function: { arguments: ':\"weather\"}' },\n              },\n            ],\n          },\n          finish_reason: null,\n        },\n      ],\n    },\n    {\n      id: \"chatcmpl-tools\",\n      model,\n      choices: [{ index: 0, delta: {}, finish_reason: \"tool_calls\" }],\n    },\n  ];\n}\n\nexport function sseResponseFromOpenAIChunks(\n  chunks: OpenAICompletionsStreamChunk[]\n): Response {\n  const encoder = new TextEncoder();\n  return new Response(\n    new ReadableStream({\n      start(controller) {\n        for (const chunk of chunks) {\n          controller.enqueue(\n            encoder.encode(`data: ${JSON.stringify(chunk)}\\n\\n`)\n          );\n        }\n        controller.close();\n      },\n    }),\n    { status: 200, headers: { \"Content-Type\": \"text/event-stream\" } }\n  );\n}\n"],"mappings":";AAEA,SAAgB,gBAAmB,OAA8B;CAC/D,OAAO,EACL,QAAQ,OAAO,iBAAiB;EAC9B,KAAK,MAAM,QAAQ,OACjB,MAAM;CAEV,EACF;AACF;AAEA,SAAgB,8BACd,QAAQ,cACwB;CAChC,MAAM,SAAS,qBAAqB,KAAK;CACzC,MAAM,OAAO,OAAO,OAAO,SAAS;CACpC,OAAO,OAAO,SAAS,KAAK;EAC1B,GAAG;EACH,OAAO;GACL,eAAe;GACf,mBAAmB;GACnB,cAAc;EAChB;CACF;CACA,OAAO;AACT;AAEA,SAAgB,qBACd,QAAQ,cACwB;CAChC,OAAO;EACL;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO;KAAE,MAAM;KAAa,SAAS;IAAQ;IAC7C,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO,EAAE,SAAS,SAAS;IAC3B,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CAAC;IAAE,OAAO;IAAG,OAAO,CAAC;IAAG,eAAe;GAAO,CAAC;EAC1D;CACF;AACF;AAEA,SAAgB,0BACd,QAAQ,cACwB;CAChC,OAAO;EACL;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO;KAAE,MAAM;KAAa,mBAAmB;IAAmB;IAClE,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO,EAAE,SAAS,UAAU;IAC5B,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CAAC;IAAE,OAAO;IAAG,OAAO,CAAC;IAAG,eAAe;GAAO,CAAC;EAC1D;CACF;AACF;AAEA,SAAgB,qBACd,QAAQ,cACwB;CAChC,OAAO;EACL;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO;KAAE,MAAM;KAAa,SAAS;IAAiB;IACtD,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO,EACL,YAAY,CACV;KACE,OAAO;KACP,IAAI;KACJ,MAAM;KACN,UAAU;MAAE,MAAM;MAAc,WAAW;KAAW;IACxD,CACF,EACF;IACA,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CACP;IACE,OAAO;IACP,OAAO,EACL,YAAY,CACV;KACE,OAAO;KACP,UAAU,EAAE,WAAW,gBAAc;IACvC,CACF,EACF;IACA,eAAe;GACjB,CACF;EACF;EACA;GACE,IAAI;GACJ;GACA,SAAS,CAAC;IAAE,OAAO;IAAG,OAAO,CAAC;IAAG,eAAe;GAAa,CAAC;EAChE;CACF;AACF;AAEA,SAAgB,4BACd,QACU;CACV,MAAM,UAAU,IAAI,YAAY;CAChC,OAAO,IAAI,SACT,IAAI,eAAe,EACjB,MAAM,YAAY;EAChB,KAAK,MAAM,SAAS,QAClB,WAAW,QACT,QAAQ,OAAO,SAAS,KAAK,UAAU,KAAK,EAAE,KAAK,CACrD;EAEF,WAAW,MAAM;CACnB,EACF,CAAC,GACD;EAAE,QAAQ;EAAK,SAAS,EAAE,gBAAgB,oBAAoB;CAAE,CAClE;AACF"}