@cloudflare/tanstack-ai 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +9 -0
  2. package/dist/_tsup-dts-rollup.d.cts +13 -4
  3. package/dist/_tsup-dts-rollup.d.ts +13 -4
  4. package/dist/adapters/anthropic.cjs +3 -3
  5. package/dist/adapters/anthropic.js +2 -2
  6. package/dist/adapters/grok.cjs +3 -3
  7. package/dist/adapters/grok.js +2 -2
  8. package/dist/adapters/openai.cjs +3 -3
  9. package/dist/adapters/openai.js +2 -2
  10. package/dist/adapters/openrouter.cjs +3 -3
  11. package/dist/adapters/openrouter.js +2 -2
  12. package/dist/adapters/workers-ai-image.cjs +3 -3
  13. package/dist/adapters/workers-ai-image.js +2 -2
  14. package/dist/adapters/workers-ai-summarize.cjs +3 -3
  15. package/dist/adapters/workers-ai-summarize.js +2 -2
  16. package/dist/adapters/workers-ai-transcription.cjs +3 -3
  17. package/dist/adapters/workers-ai-transcription.js +2 -2
  18. package/dist/adapters/workers-ai-tts.cjs +3 -3
  19. package/dist/adapters/workers-ai-tts.js +2 -2
  20. package/dist/adapters/workers-ai.cjs +3 -3
  21. package/dist/adapters/workers-ai.js +2 -2
  22. package/dist/{chunk-AYTKQRE4.cjs → chunk-45DEJBFY.cjs} +6 -6
  23. package/dist/{chunk-AYTKQRE4.cjs.map → chunk-45DEJBFY.cjs.map} +1 -1
  24. package/dist/{chunk-JK5ZFOZZ.js → chunk-4HOZDNW6.js} +2 -2
  25. package/dist/{chunk-IMURYJRF.cjs → chunk-53RO5I22.cjs} +33 -36
  26. package/dist/chunk-53RO5I22.cjs.map +1 -0
  27. package/dist/{chunk-T5KPTTLK.js → chunk-627RVSSB.js} +2 -2
  28. package/dist/{chunk-O7MBRPCW.js → chunk-727MRLUF.js} +26 -29
  29. package/dist/chunk-727MRLUF.js.map +1 -0
  30. package/dist/{chunk-7KZQWFUE.cjs → chunk-7YINQQCY.cjs} +3 -3
  31. package/dist/chunk-7YINQQCY.cjs.map +1 -0
  32. package/dist/{chunk-DSBHOQQ4.js → chunk-AJMCHPPR.js} +2 -2
  33. package/dist/chunk-AJMCHPPR.js.map +1 -0
  34. package/dist/{chunk-ARLHMZ5B.cjs → chunk-CPOXZIMA.cjs} +6 -6
  35. package/dist/{chunk-ARLHMZ5B.cjs.map → chunk-CPOXZIMA.cjs.map} +1 -1
  36. package/dist/{chunk-7SKFZ4SU.cjs → chunk-DQGO754X.cjs} +5 -5
  37. package/dist/{chunk-7SKFZ4SU.cjs.map → chunk-DQGO754X.cjs.map} +1 -1
  38. package/dist/{chunk-LG2I3ANT.cjs → chunk-DTGQYEJ2.cjs} +49 -33
  39. package/dist/chunk-DTGQYEJ2.cjs.map +1 -0
  40. package/dist/{chunk-2QN5XFI2.js → chunk-GST6AT3R.js} +2 -2
  41. package/dist/{chunk-3KUHT3K6.js → chunk-HDDZEGLC.js} +46 -30
  42. package/dist/chunk-HDDZEGLC.js.map +1 -0
  43. package/dist/{chunk-Y7W7NDVS.js → chunk-HFZK4C5B.js} +2 -2
  44. package/dist/{chunk-ZHTFBZXJ.cjs → chunk-IL6PTKJE.cjs} +6 -6
  45. package/dist/{chunk-ZHTFBZXJ.cjs.map → chunk-IL6PTKJE.cjs.map} +1 -1
  46. package/dist/{chunk-ICHJ2G63.cjs → chunk-MPVUETJY.cjs} +3 -3
  47. package/dist/{chunk-ICHJ2G63.cjs.map → chunk-MPVUETJY.cjs.map} +1 -1
  48. package/dist/{chunk-OKU3GB5P.js → chunk-PMPGIUVA.js} +2 -2
  49. package/dist/{chunk-UWBO33IG.cjs → chunk-QUS7INYA.cjs} +5 -5
  50. package/dist/{chunk-UWBO33IG.cjs.map → chunk-QUS7INYA.cjs.map} +1 -1
  51. package/dist/{chunk-5A2F2QCL.js → chunk-RKBJLYVO.js} +2 -2
  52. package/dist/{chunk-DZZVI4W5.js → chunk-XCLZJGUI.js} +2 -2
  53. package/dist/{chunk-IDPLTBQX.cjs → chunk-Y2PUBTP5.cjs} +6 -6
  54. package/dist/{chunk-IDPLTBQX.cjs.map → chunk-Y2PUBTP5.cjs.map} +1 -1
  55. package/dist/index.cjs +11 -11
  56. package/dist/index.js +10 -10
  57. package/package.json +11 -10
  58. package/dist/chunk-3KUHT3K6.js.map +0 -1
  59. package/dist/chunk-7KZQWFUE.cjs.map +0 -1
  60. package/dist/chunk-DSBHOQQ4.js.map +0 -1
  61. package/dist/chunk-IMURYJRF.cjs.map +0 -1
  62. package/dist/chunk-LG2I3ANT.cjs.map +0 -1
  63. package/dist/chunk-O7MBRPCW.js.map +0 -1
  64. /package/dist/{chunk-JK5ZFOZZ.js.map → chunk-4HOZDNW6.js.map} +0 -0
  65. /package/dist/{chunk-T5KPTTLK.js.map → chunk-627RVSSB.js.map} +0 -0
  66. /package/dist/{chunk-2QN5XFI2.js.map → chunk-GST6AT3R.js.map} +0 -0
  67. /package/dist/{chunk-Y7W7NDVS.js.map → chunk-HFZK4C5B.js.map} +0 -0
  68. /package/dist/{chunk-OKU3GB5P.js.map → chunk-PMPGIUVA.js.map} +0 -0
  69. /package/dist/{chunk-5A2F2QCL.js.map → chunk-RKBJLYVO.js.map} +0 -0
  70. /package/dist/{chunk-DZZVI4W5.js.map → chunk-XCLZJGUI.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-ZHTFBZXJ.cjs","../src/adapters/workers-ai-image.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-ZHTFBZXJ.cjs","sourcesContent":[null,"import { BaseImageAdapter } from \"@tanstack/ai/adapters\";\nimport type { ImageGenerationOptions, ImageGenerationResult } from \"@tanstack/ai\";\nimport type { AiModels, BaseAiTextToImage } from \"@cloudflare/workers-types\";\nimport {\n\ttype WorkersAiAdapterConfig,\n\ttype WorkersAiDirectBindingConfig,\n\ttype AiGatewayAdapterConfig,\n\tcreateGatewayFetch,\n\tisDirectBindingConfig,\n\tisDirectCredentialsConfig,\n\tvalidateWorkersAiConfig,\n} from \"../utils/create-fetcher\";\nimport { workersAiRestFetch } from \"../utils/workers-ai-rest\";\nimport { binaryToBase64, uint8ArrayToBase64 } from \"../utils/binary\";\nimport type { WorkersAiDirectCredentialsConfig } from \"../utils/create-fetcher\";\n\n// ---------------------------------------------------------------------------\n// Model type derived from @cloudflare/workers-types\n// ---------------------------------------------------------------------------\n\nexport type WorkersAiImageModel =\n\t| { [K in keyof AiModels]: AiModels[K] extends BaseAiTextToImage ? K : never }[keyof AiModels]\n\t| (string & {});\n\n// ---------------------------------------------------------------------------\n// WorkersAiImageAdapter: image generation via Workers AI\n// Extends BaseImageAdapter so it works with TanStack AI's generateImage()\n// ---------------------------------------------------------------------------\n\nexport class WorkersAiImageAdapter extends BaseImageAdapter<WorkersAiImageModel> {\n\treadonly name = \"workers-ai-image\" as const;\n\tprivate adapterConfig: WorkersAiAdapterConfig;\n\n\tconstructor(config: WorkersAiAdapterConfig, model: WorkersAiImageModel) {\n\t\tsuper({}, model);\n\t\tvalidateWorkersAiConfig(config);\n\t\tthis.adapterConfig = config;\n\t}\n\n\tasync generateImages(options: ImageGenerationOptions): Promise<ImageGenerationResult> {\n\t\tconst { prompt, size, modelOptions } = options;\n\t\tconst extra: Record<string, unknown> = { ...modelOptions };\n\n\t\t// Note: Workers AI Stable Diffusion models only generate a single image\n\t\t// per request — there is no multi-image parameter. `numberOfImages` from\n\t\t// the TanStack AI options is intentionally not forwarded. Use\n\t\t// `modelOptions.num_steps` to control the number of diffusion steps.\n\n\t\tif (size) {\n\t\t\tconst [w, h] = size.split(\"x\");\n\t\t\tif (w) extra.width = Number(w);\n\t\t\tif (h) extra.height = Number(h);\n\t\t}\n\n\t\tif (isDirectBindingConfig(this.adapterConfig)) {\n\t\t\treturn this.generateViaBinding(prompt, extra);\n\t\t}\n\n\t\tif (isDirectCredentialsConfig(this.adapterConfig)) {\n\t\t\treturn this.generateViaRest(prompt, extra);\n\t\t}\n\n\t\t// Gateway mode\n\t\treturn this.generateViaGateway(prompt, extra);\n\t}\n\n\tprivate async generateViaBinding(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst ai = (this.adapterConfig as WorkersAiDirectBindingConfig).binding;\n\t\tconst result = await ai.run(this.model, { prompt, ...options });\n\n\t\tconst b64 = await binaryToBase64(result, \"image\");\n\t\treturn this.wrapResult(b64);\n\t}\n\n\tprivate async generateViaRest(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\t\tconst response = await workersAiRestFetch(\n\t\t\tconfig,\n\t\t\tthis.model,\n\t\t\t{ prompt, ...options },\n\t\t\t{ label: \"Workers AI image\", signal: (options as { signal?: AbortSignal }).signal },\n\t\t);\n\n\t\tconst buffer = await response.arrayBuffer();\n\t\treturn this.wrapResult(uint8ArrayToBase64(new Uint8Array(buffer)));\n\t}\n\n\tprivate async generateViaGateway(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst gatewayConfig = this.adapterConfig as AiGatewayAdapterConfig;\n\t\tconst gatewayFetch = createGatewayFetch(\"workers-ai\", gatewayConfig);\n\n\t\t// The URL here is a placeholder — createGatewayFetch for \"workers-ai\" extracts\n\t\t// the model from the body, sets it as the endpoint, and routes through the gateway.\n\t\t// The actual URL path is not used.\n\t\tconst response = await gatewayFetch(\"https://api.cloudflare.com/v1/images/generations\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: this.model,\n\t\t\t\tprompt,\n\t\t\t\t...options,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(\n\t\t\t\t`Workers AI image gateway request failed (${response.status}): ${errorText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst buffer = await response.arrayBuffer();\n\t\treturn this.wrapResult(uint8ArrayToBase64(new Uint8Array(buffer)));\n\t}\n\n\t/** Wrap a base64 image string into the standard ImageGenerationResult. */\n\tprivate wrapResult(b64: string): ImageGenerationResult {\n\t\treturn {\n\t\t\tid: this.generateId(),\n\t\t\tmodel: this.model,\n\t\t\timages: [{ b64Json: b64 }],\n\t\t};\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Workers AI image generation adapter.\n *\n * Works with TanStack AI's `generateImage()` activity function:\n * ```ts\n * import { generateImage } from \"@tanstack/ai\";\n * import { createWorkersAiImage } from \"@cloudflare/tanstack-ai\";\n *\n * const adapter = createWorkersAiImage(\n * \"@cf/stabilityai/stable-diffusion-xl-base-1.0\",\n * { binding: env.AI },\n * );\n *\n * const result = await generateImage({ adapter, prompt: \"a cat in space\" });\n * ```\n *\n * Note: Factory takes `(model, config)` for ergonomics — the class constructor\n * uses `(config, model)` to match TanStack AI's upstream convention.\n */\nexport function createWorkersAiImage(model: WorkersAiImageModel, config: WorkersAiAdapterConfig) {\n\treturn new WorkersAiImageAdapter(config, model);\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-IL6PTKJE.cjs","../src/adapters/workers-ai-image.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-IL6PTKJE.cjs","sourcesContent":[null,"import { BaseImageAdapter } from \"@tanstack/ai/adapters\";\nimport type { ImageGenerationOptions, ImageGenerationResult } from \"@tanstack/ai\";\nimport type { AiModels, BaseAiTextToImage } from \"@cloudflare/workers-types\";\nimport {\n\ttype WorkersAiAdapterConfig,\n\ttype WorkersAiDirectBindingConfig,\n\ttype AiGatewayAdapterConfig,\n\tcreateGatewayFetch,\n\tisDirectBindingConfig,\n\tisDirectCredentialsConfig,\n\tvalidateWorkersAiConfig,\n} from \"../utils/create-fetcher\";\nimport { workersAiRestFetch } from \"../utils/workers-ai-rest\";\nimport { binaryToBase64, uint8ArrayToBase64 } from \"../utils/binary\";\nimport type { WorkersAiDirectCredentialsConfig } from \"../utils/create-fetcher\";\n\n// ---------------------------------------------------------------------------\n// Model type derived from @cloudflare/workers-types\n// ---------------------------------------------------------------------------\n\nexport type WorkersAiImageModel =\n\t| { [K in keyof AiModels]: AiModels[K] extends BaseAiTextToImage ? K : never }[keyof AiModels]\n\t| (string & {});\n\n// ---------------------------------------------------------------------------\n// WorkersAiImageAdapter: image generation via Workers AI\n// Extends BaseImageAdapter so it works with TanStack AI's generateImage()\n// ---------------------------------------------------------------------------\n\nexport class WorkersAiImageAdapter extends BaseImageAdapter<WorkersAiImageModel> {\n\treadonly name = \"workers-ai-image\" as const;\n\tprivate adapterConfig: WorkersAiAdapterConfig;\n\n\tconstructor(config: WorkersAiAdapterConfig, model: WorkersAiImageModel) {\n\t\tsuper({}, model);\n\t\tvalidateWorkersAiConfig(config);\n\t\tthis.adapterConfig = config;\n\t}\n\n\tasync generateImages(options: ImageGenerationOptions): Promise<ImageGenerationResult> {\n\t\tconst { prompt, size, modelOptions } = options;\n\t\tconst extra: Record<string, unknown> = { ...modelOptions };\n\n\t\t// Note: Workers AI Stable Diffusion models only generate a single image\n\t\t// per request — there is no multi-image parameter. `numberOfImages` from\n\t\t// the TanStack AI options is intentionally not forwarded. Use\n\t\t// `modelOptions.num_steps` to control the number of diffusion steps.\n\n\t\tif (size) {\n\t\t\tconst [w, h] = size.split(\"x\");\n\t\t\tif (w) extra.width = Number(w);\n\t\t\tif (h) extra.height = Number(h);\n\t\t}\n\n\t\tif (isDirectBindingConfig(this.adapterConfig)) {\n\t\t\treturn this.generateViaBinding(prompt, extra);\n\t\t}\n\n\t\tif (isDirectCredentialsConfig(this.adapterConfig)) {\n\t\t\treturn this.generateViaRest(prompt, extra);\n\t\t}\n\n\t\t// Gateway mode\n\t\treturn this.generateViaGateway(prompt, extra);\n\t}\n\n\tprivate async generateViaBinding(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst ai = (this.adapterConfig as WorkersAiDirectBindingConfig).binding;\n\t\tconst result = await ai.run(this.model, { prompt, ...options });\n\n\t\tconst b64 = await binaryToBase64(result, \"image\");\n\t\treturn this.wrapResult(b64);\n\t}\n\n\tprivate async generateViaRest(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\t\tconst response = await workersAiRestFetch(\n\t\t\tconfig,\n\t\t\tthis.model,\n\t\t\t{ prompt, ...options },\n\t\t\t{ label: \"Workers AI image\", signal: (options as { signal?: AbortSignal }).signal },\n\t\t);\n\n\t\tconst buffer = await response.arrayBuffer();\n\t\treturn this.wrapResult(uint8ArrayToBase64(new Uint8Array(buffer)));\n\t}\n\n\tprivate async generateViaGateway(\n\t\tprompt: string,\n\t\toptions: Record<string, unknown>,\n\t): Promise<ImageGenerationResult> {\n\t\tconst gatewayConfig = this.adapterConfig as AiGatewayAdapterConfig;\n\t\tconst gatewayFetch = createGatewayFetch(\"workers-ai\", gatewayConfig);\n\n\t\t// The URL here is a placeholder — createGatewayFetch for \"workers-ai\" extracts\n\t\t// the model from the body, sets it as the endpoint, and routes through the gateway.\n\t\t// The actual URL path is not used.\n\t\tconst response = await gatewayFetch(\"https://api.cloudflare.com/v1/images/generations\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: this.model,\n\t\t\t\tprompt,\n\t\t\t\t...options,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(\n\t\t\t\t`Workers AI image gateway request failed (${response.status}): ${errorText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst buffer = await response.arrayBuffer();\n\t\treturn this.wrapResult(uint8ArrayToBase64(new Uint8Array(buffer)));\n\t}\n\n\t/** Wrap a base64 image string into the standard ImageGenerationResult. */\n\tprivate wrapResult(b64: string): ImageGenerationResult {\n\t\treturn {\n\t\t\tid: this.generateId(),\n\t\t\tmodel: this.model,\n\t\t\timages: [{ b64Json: b64 }],\n\t\t};\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Workers AI image generation adapter.\n *\n * Works with TanStack AI's `generateImage()` activity function:\n * ```ts\n * import { generateImage } from \"@tanstack/ai\";\n * import { createWorkersAiImage } from \"@cloudflare/tanstack-ai\";\n *\n * const adapter = createWorkersAiImage(\n * \"@cf/stabilityai/stable-diffusion-xl-base-1.0\",\n * { binding: env.AI },\n * );\n *\n * const result = await generateImage({ adapter, prompt: \"a cat in space\" });\n * ```\n *\n * Note: Factory takes `(model, config)` for ergonomics — the class constructor\n * uses `(config, model)` to match TanStack AI's upstream convention.\n */\nexport function createWorkersAiImage(model: WorkersAiImageModel, config: WorkersAiAdapterConfig) {\n\treturn new WorkersAiImageAdapter(config, model);\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkIMURYJRFcjs = require('./chunk-IMURYJRF.cjs');
3
+ var _chunk53RO5I22cjs = require('./chunk-53RO5I22.cjs');
4
4
 
5
5
  // src/adapters/openai.ts
6
6
 
@@ -19,7 +19,7 @@ var _aiopenai = require('@tanstack/ai-openai');
19
19
  function buildOpenAiConfig(provider, config) {
20
20
  return {
21
21
  apiKey: _nullishCoalesce(config.apiKey, () => ( "unused")),
22
- fetch: _chunkIMURYJRFcjs.createGatewayFetch.call(void 0, provider, config)
22
+ fetch: _chunk53RO5I22cjs.createGatewayFetch.call(void 0, provider, config)
23
23
  };
24
24
  }
25
25
  function createOpenAiChat(model, config) {
@@ -54,4 +54,4 @@ function createOpenAiVideo(model, config) {
54
54
 
55
55
 
56
56
  exports.OPENAI_CHAT_MODELS = _aiopenai.OPENAI_CHAT_MODELS; exports.OPENAI_IMAGE_MODELS = _aiopenai.OPENAI_IMAGE_MODELS; exports.OPENAI_TRANSCRIPTION_MODELS = _aiopenai.OPENAI_TRANSCRIPTION_MODELS; exports.OPENAI_TTS_MODELS = _aiopenai.OPENAI_TTS_MODELS; exports.OPENAI_VIDEO_MODELS = _aiopenai.OPENAI_VIDEO_MODELS; exports.createOpenAiChat = createOpenAiChat; exports.createOpenAiSummarize = createOpenAiSummarize; exports.createOpenAiImage = createOpenAiImage; exports.createOpenAiTranscription = createOpenAiTranscription; exports.createOpenAiTts = createOpenAiTts; exports.createOpenAiVideo = createOpenAiVideo;
57
- //# sourceMappingURL=chunk-ICHJ2G63.cjs.map
57
+ //# sourceMappingURL=chunk-MPVUETJY.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-ICHJ2G63.cjs","../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,+CAMM;AASP,SAAS,iBAAA,CAAkB,QAAA,EAAkB,MAAA,EAA6B;AACzE,EAAA,OAAO;AAAA,IACN,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,IACzB,KAAA,EAAO,kDAAA,QAAmB,EAAU,MAAM;AAAA,EAC3C,CAAA;AACD;AAQO,SAAS,gBAAA,CAAiB,KAAA,EAAwB,MAAA,EAA6B;AACrF,EAAA,OAAO,IAAI,gCAAA,CAAkB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACxE;AAOO,SAAS,qBAAA,CAAsB,KAAA,EAAwB,MAAA,EAA6B;AAC1F,EAAA,OAAO,IAAI,qCAAA,CAAuB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AAC7E;AAOO,SAAS,iBAAA,CAAkB,KAAA,EAAyB,MAAA,EAA6B;AACvF,EAAA,OAAO,IAAI,iCAAA,CAAmB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACzE;AAOO,SAAS,yBAAA,CACf,KAAA,EACA,MAAA,EACC;AACD,EAAA,OAAO,IAAI,yCAAA,CAA2B,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACjF;AAOO,SAAS,eAAA,CAAgB,KAAA,EAAuB,MAAA,EAA6B;AACnF,EAAA,OAAO,IAAI,+BAAA,CAAiB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACvE;AAOO,SAAS,iBAAA,CAAkB,KAAA,EAAyB,MAAA,EAA6B;AACvF,EAAA,OAAO,IAAI,iCAAA,CAAmB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACzE;AD/CA;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,smBAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-ICHJ2G63.cjs","sourcesContent":[null,"import {\n\tOpenAIImageAdapter,\n\tOpenAISummarizeAdapter,\n\tOpenAITextAdapter,\n\tOpenAITranscriptionAdapter,\n\tOpenAITTSAdapter,\n\tOpenAIVideoAdapter,\n\tOPENAI_CHAT_MODELS,\n\tOPENAI_IMAGE_MODELS,\n\tOPENAI_TRANSCRIPTION_MODELS,\n\tOPENAI_TTS_MODELS,\n\tOPENAI_VIDEO_MODELS,\n\ttype OpenAIChatModel,\n\ttype OpenAIImageModel,\n\ttype OpenAITranscriptionModel,\n\ttype OpenAITTSModel,\n\ttype OpenAIVideoModel,\n} from \"@tanstack/ai-openai\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type OpenAiGatewayConfig = AiGatewayAdapterConfig;\n\n/**\n * Builds an OpenAI-compatible config that injects the gateway fetch.\n * OpenAITextConfig extends OpenAI SDK's ClientOptions, which supports a `fetch` parameter.\n */\nfunction buildOpenAiConfig(provider: string, config: OpenAiGatewayConfig) {\n\treturn {\n\t\tapiKey: config.apiKey ?? \"unused\",\n\t\tfetch: createGatewayFetch(provider, config),\n\t};\n}\n\n/**\n * Creates an OpenAI chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n * @param model The OpenAI model to use\n * @param config Configuration options\n */\nexport function createOpenAiChat(model: OpenAIChatModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAITextAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI summarize adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI model to use\n * @param config Configuration options\n */\nexport function createOpenAiSummarize(model: OpenAIChatModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAISummarizeAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI image adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI image model to use\n * @param config Configuration options\n */\nexport function createOpenAiImage(model: OpenAIImageModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAIImageAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI transcription adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI transcription model to use\n * @param config Configuration options\n */\nexport function createOpenAiTranscription(\n\tmodel: OpenAITranscriptionModel,\n\tconfig: OpenAiGatewayConfig,\n) {\n\treturn new OpenAITranscriptionAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI TTS adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI TTS model to use\n * @param config Configuration options\n */\nexport function createOpenAiTts(model: OpenAITTSModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAITTSAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI video adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI video model to use\n * @param config Configuration options\n */\nexport function createOpenAiVideo(model: OpenAIVideoModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAIVideoAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\nexport {\n\tOPENAI_CHAT_MODELS,\n\tOPENAI_IMAGE_MODELS,\n\tOPENAI_TRANSCRIPTION_MODELS,\n\tOPENAI_TTS_MODELS,\n\tOPENAI_VIDEO_MODELS,\n\ttype OpenAIChatModel,\n\ttype OpenAIImageModel,\n\ttype OpenAITranscriptionModel,\n\ttype OpenAITTSModel,\n\ttype OpenAIVideoModel,\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-MPVUETJY.cjs","../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA,+CAMM;AASP,SAAS,iBAAA,CAAkB,QAAA,EAAkB,MAAA,EAA6B;AACzE,EAAA,OAAO;AAAA,IACN,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,IACzB,KAAA,EAAO,kDAAA,QAAmB,EAAU,MAAM;AAAA,EAC3C,CAAA;AACD;AAQO,SAAS,gBAAA,CAAiB,KAAA,EAAwB,MAAA,EAA6B;AACrF,EAAA,OAAO,IAAI,gCAAA,CAAkB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACxE;AAOO,SAAS,qBAAA,CAAsB,KAAA,EAAwB,MAAA,EAA6B;AAC1F,EAAA,OAAO,IAAI,qCAAA,CAAuB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AAC7E;AAOO,SAAS,iBAAA,CAAkB,KAAA,EAAyB,MAAA,EAA6B;AACvF,EAAA,OAAO,IAAI,iCAAA,CAAmB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACzE;AAOO,SAAS,yBAAA,CACf,KAAA,EACA,MAAA,EACC;AACD,EAAA,OAAO,IAAI,yCAAA,CAA2B,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACjF;AAOO,SAAS,eAAA,CAAgB,KAAA,EAAuB,MAAA,EAA6B;AACnF,EAAA,OAAO,IAAI,+BAAA,CAAiB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACvE;AAOO,SAAS,iBAAA,CAAkB,KAAA,EAAyB,MAAA,EAA6B;AACvF,EAAA,OAAO,IAAI,iCAAA,CAAmB,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG,KAAK,CAAA;AACzE;AD/CA;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,smBAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-MPVUETJY.cjs","sourcesContent":[null,"import {\n\tOpenAIImageAdapter,\n\tOpenAISummarizeAdapter,\n\tOpenAITextAdapter,\n\tOpenAITranscriptionAdapter,\n\tOpenAITTSAdapter,\n\tOpenAIVideoAdapter,\n\tOPENAI_CHAT_MODELS,\n\tOPENAI_IMAGE_MODELS,\n\tOPENAI_TRANSCRIPTION_MODELS,\n\tOPENAI_TTS_MODELS,\n\tOPENAI_VIDEO_MODELS,\n\ttype OpenAIChatModel,\n\ttype OpenAIImageModel,\n\ttype OpenAITranscriptionModel,\n\ttype OpenAITTSModel,\n\ttype OpenAIVideoModel,\n} from \"@tanstack/ai-openai\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type OpenAiGatewayConfig = AiGatewayAdapterConfig;\n\n/**\n * Builds an OpenAI-compatible config that injects the gateway fetch.\n * OpenAITextConfig extends OpenAI SDK's ClientOptions, which supports a `fetch` parameter.\n */\nfunction buildOpenAiConfig(provider: string, config: OpenAiGatewayConfig) {\n\treturn {\n\t\tapiKey: config.apiKey ?? \"unused\",\n\t\tfetch: createGatewayFetch(provider, config),\n\t};\n}\n\n/**\n * Creates an OpenAI chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n * @param model The OpenAI model to use\n * @param config Configuration options\n */\nexport function createOpenAiChat(model: OpenAIChatModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAITextAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI summarize adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI model to use\n * @param config Configuration options\n */\nexport function createOpenAiSummarize(model: OpenAIChatModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAISummarizeAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI image adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI image model to use\n * @param config Configuration options\n */\nexport function createOpenAiImage(model: OpenAIImageModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAIImageAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI transcription adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI transcription model to use\n * @param config Configuration options\n */\nexport function createOpenAiTranscription(\n\tmodel: OpenAITranscriptionModel,\n\tconfig: OpenAiGatewayConfig,\n) {\n\treturn new OpenAITranscriptionAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI TTS adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI TTS model to use\n * @param config Configuration options\n */\nexport function createOpenAiTts(model: OpenAITTSModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAITTSAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\n/**\n * Creates an OpenAI video adapter which uses Cloudflare AI Gateway.\n * @param model The OpenAI video model to use\n * @param config Configuration options\n */\nexport function createOpenAiVideo(model: OpenAIVideoModel, config: OpenAiGatewayConfig) {\n\treturn new OpenAIVideoAdapter(buildOpenAiConfig(\"openai\", config), model);\n}\n\nexport {\n\tOPENAI_CHAT_MODELS,\n\tOPENAI_IMAGE_MODELS,\n\tOPENAI_TRANSCRIPTION_MODELS,\n\tOPENAI_TTS_MODELS,\n\tOPENAI_VIDEO_MODELS,\n\ttype OpenAIChatModel,\n\ttype OpenAIImageModel,\n\ttype OpenAITranscriptionModel,\n\ttype OpenAITTSModel,\n\ttype OpenAIVideoModel,\n};\n"]}
@@ -6,7 +6,7 @@ import {
6
6
  isDirectBindingConfig,
7
7
  isDirectCredentialsConfig,
8
8
  validateWorkersAiConfig
9
- } from "./chunk-O7MBRPCW.js";
9
+ } from "./chunk-727MRLUF.js";
10
10
  import {
11
11
  __publicField
12
12
  } from "./chunk-V6TY7KAL.js";
@@ -83,4 +83,4 @@ export {
83
83
  WorkersAiSummarizeAdapter,
84
84
  createWorkersAiSummarize
85
85
  };
86
- //# sourceMappingURL=chunk-OKU3GB5P.js.map
86
+ //# sourceMappingURL=chunk-PMPGIUVA.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkIMURYJRFcjs = require('./chunk-IMURYJRF.cjs');
3
+ var _chunk53RO5I22cjs = require('./chunk-53RO5I22.cjs');
4
4
 
5
5
  // src/adapters/grok.ts
6
6
 
@@ -14,7 +14,7 @@ function createGrokChat(model, config) {
14
14
  return new (0, _aigrok.GrokTextAdapter)(
15
15
  {
16
16
  apiKey: _nullishCoalesce(config.apiKey, () => ( "unused")),
17
- fetch: _chunkIMURYJRFcjs.createGatewayFetch.call(void 0, "grok", config)
17
+ fetch: _chunk53RO5I22cjs.createGatewayFetch.call(void 0, "grok", config)
18
18
  },
19
19
  model
20
20
  );
@@ -23,7 +23,7 @@ function createGrokImage(model, config) {
23
23
  return new (0, _aigrok.GrokImageAdapter)(
24
24
  {
25
25
  apiKey: _nullishCoalesce(config.apiKey, () => ( "unused")),
26
- fetch: _chunkIMURYJRFcjs.createGatewayFetch.call(void 0, "grok", config)
26
+ fetch: _chunk53RO5I22cjs.createGatewayFetch.call(void 0, "grok", config)
27
27
  },
28
28
  model
29
29
  );
@@ -32,7 +32,7 @@ function createGrokSummarize(model, config) {
32
32
  return new (0, _aigrok.GrokSummarizeAdapter)(
33
33
  {
34
34
  apiKey: _nullishCoalesce(config.apiKey, () => ( "unused")),
35
- fetch: _chunkIMURYJRFcjs.createGatewayFetch.call(void 0, "grok", config)
35
+ fetch: _chunk53RO5I22cjs.createGatewayFetch.call(void 0, "grok", config)
36
36
  },
37
37
  model
38
38
  );
@@ -45,4 +45,4 @@ function createGrokSummarize(model, config) {
45
45
 
46
46
 
47
47
  exports.GROK_CHAT_MODELS = _aigrok.GROK_CHAT_MODELS; exports.GROK_IMAGE_MODELS = _aigrok.GROK_IMAGE_MODELS; exports.createGrokChat = createGrokChat; exports.createGrokImage = createGrokImage; exports.createGrokSummarize = createGrokSummarize;
48
- //# sourceMappingURL=chunk-UWBO33IG.cjs.map
48
+ //# sourceMappingURL=chunk-QUS7INYA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-UWBO33IG.cjs","../src/adapters/grok.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACC;AACA;AACA;AACA;AACA;AAAA,2CAIM;AAYA,SAAS,cAAA,CAAe,KAAA,EAAsB,MAAA,EAA2B;AAC/E,EAAA,OAAO,IAAI,4BAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;AAMO,SAAS,eAAA,CAAgB,KAAA,EAAuB,MAAA,EAA2B;AACjF,EAAA,OAAO,IAAI,6BAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;AAMO,SAAS,mBAAA,CAAoB,KAAA,EAA2B,MAAA,EAA2B;AACzF,EAAA,OAAO,IAAI,iCAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;ADlBA;AACA;AACE;AACA;AACA;AACA;AACA;AACF,kPAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-UWBO33IG.cjs","sourcesContent":[null,"import {\n\tGrokTextAdapter,\n\tGrokImageAdapter,\n\tGrokSummarizeAdapter,\n\tGROK_CHAT_MODELS,\n\tGROK_IMAGE_MODELS,\n\ttype GrokChatModel,\n\ttype GrokImageModel,\n\ttype GrokSummarizeModel,\n} from \"@tanstack/ai-grok\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type GrokGatewayConfig = AiGatewayAdapterConfig;\n\n/**\n * Creates a Grok chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n *\n * Since GrokTextConfig extends the OpenAI SDK's ClientOptions,\n * we can inject the gateway fetch directly — no subclassing needed.\n */\nexport function createGrokChat(model: GrokChatModel, config: GrokGatewayConfig) {\n\treturn new GrokTextAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\n/**\n * Creates a Grok image adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createGrokImage(model: GrokImageModel, config: GrokGatewayConfig) {\n\treturn new GrokImageAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\n/**\n * Creates a Grok summarize adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createGrokSummarize(model: GrokSummarizeModel, config: GrokGatewayConfig) {\n\treturn new GrokSummarizeAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\nexport {\n\tGROK_CHAT_MODELS,\n\tGROK_IMAGE_MODELS,\n\ttype GrokChatModel,\n\ttype GrokImageModel,\n\ttype GrokSummarizeModel,\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-QUS7INYA.cjs","../src/adapters/grok.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACC;AACA;AACA;AACA;AACA;AAAA,2CAIM;AAYA,SAAS,cAAA,CAAe,KAAA,EAAsB,MAAA,EAA2B;AAC/E,EAAA,OAAO,IAAI,4BAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;AAMO,SAAS,eAAA,CAAgB,KAAA,EAAuB,MAAA,EAA2B;AACjF,EAAA,OAAO,IAAI,6BAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;AAMO,SAAS,mBAAA,CAAoB,KAAA,EAA2B,MAAA,EAA2B;AACzF,EAAA,OAAO,IAAI,iCAAA;AAAA,IACV;AAAA,MACC,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,MACzB,KAAA,EAAO,kDAAA,MAAmB,EAAQ,MAAM;AAAA,IACzC,CAAA;AAAA,IACA;AAAA,EACD,CAAA;AACD;ADlBA;AACA;AACE;AACA;AACA;AACA;AACA;AACF,kPAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-QUS7INYA.cjs","sourcesContent":[null,"import {\n\tGrokTextAdapter,\n\tGrokImageAdapter,\n\tGrokSummarizeAdapter,\n\tGROK_CHAT_MODELS,\n\tGROK_IMAGE_MODELS,\n\ttype GrokChatModel,\n\ttype GrokImageModel,\n\ttype GrokSummarizeModel,\n} from \"@tanstack/ai-grok\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type GrokGatewayConfig = AiGatewayAdapterConfig;\n\n/**\n * Creates a Grok chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n *\n * Since GrokTextConfig extends the OpenAI SDK's ClientOptions,\n * we can inject the gateway fetch directly — no subclassing needed.\n */\nexport function createGrokChat(model: GrokChatModel, config: GrokGatewayConfig) {\n\treturn new GrokTextAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\n/**\n * Creates a Grok image adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createGrokImage(model: GrokImageModel, config: GrokGatewayConfig) {\n\treturn new GrokImageAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\n/**\n * Creates a Grok summarize adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createGrokSummarize(model: GrokSummarizeModel, config: GrokGatewayConfig) {\n\treturn new GrokSummarizeAdapter(\n\t\t{\n\t\t\tapiKey: config.apiKey ?? \"unused\",\n\t\t\tfetch: createGatewayFetch(\"grok\", config),\n\t\t},\n\t\tmodel,\n\t);\n}\n\nexport {\n\tGROK_CHAT_MODELS,\n\tGROK_IMAGE_MODELS,\n\ttype GrokChatModel,\n\ttype GrokImageModel,\n\ttype GrokSummarizeModel,\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createGatewayFetch
3
- } from "./chunk-O7MBRPCW.js";
3
+ } from "./chunk-727MRLUF.js";
4
4
 
5
5
  // src/adapters/openai.ts
6
6
  import {
@@ -54,4 +54,4 @@ export {
54
54
  createOpenAiTts,
55
55
  createOpenAiVideo
56
56
  };
57
- //# sourceMappingURL=chunk-5A2F2QCL.js.map
57
+ //# sourceMappingURL=chunk-RKBJLYVO.js.map
@@ -10,7 +10,7 @@ import {
10
10
  isDirectBindingConfig,
11
11
  isDirectCredentialsConfig,
12
12
  validateWorkersAiConfig
13
- } from "./chunk-O7MBRPCW.js";
13
+ } from "./chunk-727MRLUF.js";
14
14
  import {
15
15
  __publicField
16
16
  } from "./chunk-V6TY7KAL.js";
@@ -95,4 +95,4 @@ export {
95
95
  WorkersAiImageAdapter,
96
96
  createWorkersAiImage
97
97
  };
98
- //# sourceMappingURL=chunk-DZZVI4W5.js.map
98
+ //# sourceMappingURL=chunk-XCLZJGUI.js.map
@@ -6,7 +6,7 @@ var _chunk7HSUHP63cjs = require('./chunk-7HSUHP63.cjs');
6
6
 
7
7
 
8
8
 
9
- var _chunkIMURYJRFcjs = require('./chunk-IMURYJRF.cjs');
9
+ var _chunk53RO5I22cjs = require('./chunk-53RO5I22.cjs');
10
10
 
11
11
 
12
12
  var _chunk4DE2IREAcjs = require('./chunk-4DE2IREA.cjs');
@@ -18,17 +18,17 @@ var WorkersAiSummarizeAdapter = class extends _adapters.BaseSummarizeAdapter {
18
18
  super({}, model);
19
19
  _chunk4DE2IREAcjs.__publicField.call(void 0, this, "name", "workers-ai-summarize");
20
20
  _chunk4DE2IREAcjs.__publicField.call(void 0, this, "adapterConfig");
21
- _chunkIMURYJRFcjs.validateWorkersAiConfig.call(void 0, config);
21
+ _chunk53RO5I22cjs.validateWorkersAiConfig.call(void 0, config);
22
22
  this.adapterConfig = config;
23
23
  }
24
24
  async summarize(options) {
25
25
  const { text, maxLength } = options;
26
26
  const payload = { input_text: text };
27
27
  if (maxLength != null) payload.max_length = maxLength;
28
- if (_chunkIMURYJRFcjs.isDirectBindingConfig.call(void 0, this.adapterConfig)) {
28
+ if (_chunk53RO5I22cjs.isDirectBindingConfig.call(void 0, this.adapterConfig)) {
29
29
  return this.summarizeViaBinding(payload);
30
30
  }
31
- if (_chunkIMURYJRFcjs.isDirectCredentialsConfig.call(void 0, this.adapterConfig)) {
31
+ if (_chunk53RO5I22cjs.isDirectCredentialsConfig.call(void 0, this.adapterConfig)) {
32
32
  return this.summarizeViaRest(payload);
33
33
  }
34
34
  return this.summarizeViaGateway(payload);
@@ -48,7 +48,7 @@ var WorkersAiSummarizeAdapter = class extends _adapters.BaseSummarizeAdapter {
48
48
  }
49
49
  async summarizeViaGateway(payload) {
50
50
  const gatewayConfig = this.adapterConfig;
51
- const gatewayFetch = _chunkIMURYJRFcjs.createGatewayFetch.call(void 0, "workers-ai", gatewayConfig);
51
+ const gatewayFetch = _chunk53RO5I22cjs.createGatewayFetch.call(void 0, "workers-ai", gatewayConfig);
52
52
  const response = await gatewayFetch("https://api.cloudflare.com/v1/ai/summarization", {
53
53
  method: "POST",
54
54
  body: JSON.stringify({
@@ -83,4 +83,4 @@ function createWorkersAiSummarize(model, config) {
83
83
 
84
84
 
85
85
  exports.WorkersAiSummarizeAdapter = WorkersAiSummarizeAdapter; exports.createWorkersAiSummarize = createWorkersAiSummarize;
86
- //# sourceMappingURL=chunk-IDPLTBQX.cjs.map
86
+ //# sourceMappingURL=chunk-Y2PUBTP5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-IDPLTBQX.cjs","../src/adapters/workers-ai-summarize.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-IDPLTBQX.cjs","sourcesContent":[null,"import { BaseSummarizeAdapter } from \"@tanstack/ai/adapters\";\nimport type { SummarizationOptions, SummarizationResult } from \"@tanstack/ai\";\nimport {\n\ttype WorkersAiAdapterConfig,\n\ttype WorkersAiDirectBindingConfig,\n\ttype WorkersAiDirectCredentialsConfig,\n\ttype AiGatewayAdapterConfig,\n\tcreateGatewayFetch,\n\tisDirectBindingConfig,\n\tisDirectCredentialsConfig,\n\tvalidateWorkersAiConfig,\n} from \"../utils/create-fetcher\";\nimport { workersAiRestFetch } from \"../utils/workers-ai-rest\";\n\n// ---------------------------------------------------------------------------\n// Model types\n// ---------------------------------------------------------------------------\n\n/**\n * Workers AI models that support summarization.\n */\nexport type WorkersAiSummarizeModel = \"@cf/facebook/bart-large-cnn\" | (string & {});\n\n// ---------------------------------------------------------------------------\n// WorkersAiSummarizeAdapter\n// ---------------------------------------------------------------------------\n\nexport class WorkersAiSummarizeAdapter extends BaseSummarizeAdapter<WorkersAiSummarizeModel> {\n\treadonly name = \"workers-ai-summarize\" as const;\n\tprivate adapterConfig: WorkersAiAdapterConfig;\n\n\tconstructor(config: WorkersAiAdapterConfig, model: WorkersAiSummarizeModel) {\n\t\tsuper({}, model);\n\t\tvalidateWorkersAiConfig(config);\n\t\tthis.adapterConfig = config;\n\t}\n\n\tasync summarize(options: SummarizationOptions): Promise<SummarizationResult> {\n\t\tconst { text, maxLength } = options;\n\n\t\tconst payload: Record<string, unknown> = { input_text: text };\n\t\tif (maxLength != null) payload.max_length = maxLength;\n\n\t\tif (isDirectBindingConfig(this.adapterConfig)) {\n\t\t\treturn this.summarizeViaBinding(payload);\n\t\t}\n\n\t\tif (isDirectCredentialsConfig(this.adapterConfig)) {\n\t\t\treturn this.summarizeViaRest(payload);\n\t\t}\n\n\t\treturn this.summarizeViaGateway(payload);\n\t}\n\n\tprivate async summarizeViaBinding(\n\t\tpayload: Record<string, unknown>,\n\t): Promise<SummarizationResult> {\n\t\tconst ai = (this.adapterConfig as WorkersAiDirectBindingConfig).binding;\n\t\tconst result = (await ai.run(this.model, payload)) as Record<string, unknown>;\n\t\treturn this.wrapResult((result.summary as string) ?? \"\");\n\t}\n\n\tprivate async summarizeViaRest(payload: Record<string, unknown>): Promise<SummarizationResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\t\tconst response = await workersAiRestFetch(config, this.model, payload, {\n\t\t\tlabel: \"Workers AI summarize\",\n\t\t});\n\n\t\tconst data = (await response.json()) as { result?: { summary?: string } };\n\t\treturn this.wrapResult(data.result?.summary ?? \"\");\n\t}\n\n\tprivate async summarizeViaGateway(\n\t\tpayload: Record<string, unknown>,\n\t): Promise<SummarizationResult> {\n\t\tconst gatewayConfig = this.adapterConfig as AiGatewayAdapterConfig;\n\t\tconst gatewayFetch = createGatewayFetch(\"workers-ai\", gatewayConfig);\n\n\t\t// The URL here is a placeholder — createGatewayFetch for \"workers-ai\" extracts\n\t\t// the model from the body, sets it as the endpoint, and routes through the gateway.\n\t\t// The actual URL path is not used.\n\t\tconst response = await gatewayFetch(\"https://api.cloudflare.com/v1/ai/summarization\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: this.model,\n\t\t\t\t...payload,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(\n\t\t\t\t`Workers AI summarize gateway request failed (${response.status}): ${errorText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await response.json()) as { result?: { summary?: string }; summary?: string };\n\t\treturn this.wrapResult(data.result?.summary ?? data.summary ?? \"\");\n\t}\n\n\tprivate wrapResult(summary: string): SummarizationResult {\n\t\treturn {\n\t\t\tid: this.generateId(),\n\t\t\tmodel: this.model,\n\t\t\tsummary,\n\t\t\t// BART-large-CNN doesn't return token usage\n\t\t\tusage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n\t\t};\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Workers AI summarization adapter.\n *\n * Works with TanStack AI's `summarize()` activity function:\n * ```ts\n * import { summarize } from \"@tanstack/ai\";\n * import { createWorkersAiSummarize } from \"@cloudflare/tanstack-ai\";\n *\n * const adapter = createWorkersAiSummarize(\"@cf/facebook/bart-large-cnn\", {\n * binding: env.AI,\n * });\n *\n * const result = await summarize({ adapter, text: \"Long article here...\" });\n * // result.summary\n * ```\n *\n * Note: Factory takes `(model, config)` for ergonomics — the class constructor\n * uses `(config, model)` to match TanStack AI's upstream convention.\n */\nexport function createWorkersAiSummarize(\n\tmodel: WorkersAiSummarizeModel,\n\tconfig: WorkersAiAdapterConfig,\n) {\n\treturn new WorkersAiSummarizeAdapter(config, model);\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-Y2PUBTP5.cjs","../src/adapters/workers-ai-summarize.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-Y2PUBTP5.cjs","sourcesContent":[null,"import { BaseSummarizeAdapter } from \"@tanstack/ai/adapters\";\nimport type { SummarizationOptions, SummarizationResult } from \"@tanstack/ai\";\nimport {\n\ttype WorkersAiAdapterConfig,\n\ttype WorkersAiDirectBindingConfig,\n\ttype WorkersAiDirectCredentialsConfig,\n\ttype AiGatewayAdapterConfig,\n\tcreateGatewayFetch,\n\tisDirectBindingConfig,\n\tisDirectCredentialsConfig,\n\tvalidateWorkersAiConfig,\n} from \"../utils/create-fetcher\";\nimport { workersAiRestFetch } from \"../utils/workers-ai-rest\";\n\n// ---------------------------------------------------------------------------\n// Model types\n// ---------------------------------------------------------------------------\n\n/**\n * Workers AI models that support summarization.\n */\nexport type WorkersAiSummarizeModel = \"@cf/facebook/bart-large-cnn\" | (string & {});\n\n// ---------------------------------------------------------------------------\n// WorkersAiSummarizeAdapter\n// ---------------------------------------------------------------------------\n\nexport class WorkersAiSummarizeAdapter extends BaseSummarizeAdapter<WorkersAiSummarizeModel> {\n\treadonly name = \"workers-ai-summarize\" as const;\n\tprivate adapterConfig: WorkersAiAdapterConfig;\n\n\tconstructor(config: WorkersAiAdapterConfig, model: WorkersAiSummarizeModel) {\n\t\tsuper({}, model);\n\t\tvalidateWorkersAiConfig(config);\n\t\tthis.adapterConfig = config;\n\t}\n\n\tasync summarize(options: SummarizationOptions): Promise<SummarizationResult> {\n\t\tconst { text, maxLength } = options;\n\n\t\tconst payload: Record<string, unknown> = { input_text: text };\n\t\tif (maxLength != null) payload.max_length = maxLength;\n\n\t\tif (isDirectBindingConfig(this.adapterConfig)) {\n\t\t\treturn this.summarizeViaBinding(payload);\n\t\t}\n\n\t\tif (isDirectCredentialsConfig(this.adapterConfig)) {\n\t\t\treturn this.summarizeViaRest(payload);\n\t\t}\n\n\t\treturn this.summarizeViaGateway(payload);\n\t}\n\n\tprivate async summarizeViaBinding(\n\t\tpayload: Record<string, unknown>,\n\t): Promise<SummarizationResult> {\n\t\tconst ai = (this.adapterConfig as WorkersAiDirectBindingConfig).binding;\n\t\tconst result = (await ai.run(this.model, payload)) as Record<string, unknown>;\n\t\treturn this.wrapResult((result.summary as string) ?? \"\");\n\t}\n\n\tprivate async summarizeViaRest(payload: Record<string, unknown>): Promise<SummarizationResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\t\tconst response = await workersAiRestFetch(config, this.model, payload, {\n\t\t\tlabel: \"Workers AI summarize\",\n\t\t});\n\n\t\tconst data = (await response.json()) as { result?: { summary?: string } };\n\t\treturn this.wrapResult(data.result?.summary ?? \"\");\n\t}\n\n\tprivate async summarizeViaGateway(\n\t\tpayload: Record<string, unknown>,\n\t): Promise<SummarizationResult> {\n\t\tconst gatewayConfig = this.adapterConfig as AiGatewayAdapterConfig;\n\t\tconst gatewayFetch = createGatewayFetch(\"workers-ai\", gatewayConfig);\n\n\t\t// The URL here is a placeholder — createGatewayFetch for \"workers-ai\" extracts\n\t\t// the model from the body, sets it as the endpoint, and routes through the gateway.\n\t\t// The actual URL path is not used.\n\t\tconst response = await gatewayFetch(\"https://api.cloudflare.com/v1/ai/summarization\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: this.model,\n\t\t\t\t...payload,\n\t\t\t}),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst errorText = await response.text();\n\t\t\tthrow new Error(\n\t\t\t\t`Workers AI summarize gateway request failed (${response.status}): ${errorText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await response.json()) as { result?: { summary?: string }; summary?: string };\n\t\treturn this.wrapResult(data.result?.summary ?? data.summary ?? \"\");\n\t}\n\n\tprivate wrapResult(summary: string): SummarizationResult {\n\t\treturn {\n\t\t\tid: this.generateId(),\n\t\t\tmodel: this.model,\n\t\t\tsummary,\n\t\t\t// BART-large-CNN doesn't return token usage\n\t\t\tusage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n\t\t};\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Workers AI summarization adapter.\n *\n * Works with TanStack AI's `summarize()` activity function:\n * ```ts\n * import { summarize } from \"@tanstack/ai\";\n * import { createWorkersAiSummarize } from \"@cloudflare/tanstack-ai\";\n *\n * const adapter = createWorkersAiSummarize(\"@cf/facebook/bart-large-cnn\", {\n * binding: env.AI,\n * });\n *\n * const result = await summarize({ adapter, text: \"Long article here...\" });\n * // result.summary\n * ```\n *\n * Note: Factory takes `(model, config)` for ergonomics — the class constructor\n * uses `(config, model)` to match TanStack AI's upstream convention.\n */\nexport function createWorkersAiSummarize(\n\tmodel: WorkersAiSummarizeModel,\n\tconfig: WorkersAiAdapterConfig,\n) {\n\treturn new WorkersAiSummarizeAdapter(config, model);\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,17 +1,17 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkAYTKQRE4cjs = require('./chunk-AYTKQRE4.cjs');
3
+ var _chunk45DEJBFYcjs = require('./chunk-45DEJBFY.cjs');
4
4
 
5
5
 
6
- var _chunkARLHMZ5Bcjs = require('./chunk-ARLHMZ5B.cjs');
6
+ var _chunkCPOXZIMAcjs = require('./chunk-CPOXZIMA.cjs');
7
7
 
8
8
 
9
- var _chunkLG2I3ANTcjs = require('./chunk-LG2I3ANT.cjs');
9
+ var _chunkDTGQYEJ2cjs = require('./chunk-DTGQYEJ2.cjs');
10
10
 
11
11
 
12
12
 
13
13
 
14
- var _chunk7KZQWFUEcjs = require('./chunk-7KZQWFUE.cjs');
14
+ var _chunk7YINQQCYcjs = require('./chunk-7YINQQCY.cjs');
15
15
 
16
16
 
17
17
 
@@ -28,7 +28,7 @@ var _chunkV4LKHWJAcjs = require('./chunk-V4LKHWJA.cjs');
28
28
 
29
29
 
30
30
 
31
- var _chunkUWBO33IGcjs = require('./chunk-UWBO33IG.cjs');
31
+ var _chunkQUS7INYAcjs = require('./chunk-QUS7INYA.cjs');
32
32
 
33
33
 
34
34
 
@@ -41,21 +41,21 @@ var _chunkUWBO33IGcjs = require('./chunk-UWBO33IG.cjs');
41
41
 
42
42
 
43
43
 
44
- var _chunkICHJ2G63cjs = require('./chunk-ICHJ2G63.cjs');
44
+ var _chunkMPVUETJYcjs = require('./chunk-MPVUETJY.cjs');
45
45
 
46
46
 
47
47
 
48
48
 
49
- var _chunk7SKFZ4SUcjs = require('./chunk-7SKFZ4SU.cjs');
49
+ var _chunkDQGO754Xcjs = require('./chunk-DQGO754X.cjs');
50
50
 
51
51
 
52
- var _chunkZHTFBZXJcjs = require('./chunk-ZHTFBZXJ.cjs');
52
+ var _chunkIL6PTKJEcjs = require('./chunk-IL6PTKJE.cjs');
53
53
  require('./chunk-3VQDXJLW.cjs');
54
54
 
55
55
 
56
- var _chunkIDPLTBQXcjs = require('./chunk-IDPLTBQX.cjs');
56
+ var _chunkY2PUBTP5cjs = require('./chunk-Y2PUBTP5.cjs');
57
57
  require('./chunk-7HSUHP63.cjs');
58
- require('./chunk-IMURYJRF.cjs');
58
+ require('./chunk-53RO5I22.cjs');
59
59
  require('./chunk-4DE2IREA.cjs');
60
60
 
61
61
 
@@ -93,5 +93,5 @@ require('./chunk-4DE2IREA.cjs');
93
93
 
94
94
 
95
95
 
96
- exports.ANTHROPIC_MODELS = _chunk7KZQWFUEcjs.ANTHROPIC_MODELS; exports.GROK_CHAT_MODELS = _chunkUWBO33IGcjs.GROK_CHAT_MODELS; exports.GROK_IMAGE_MODELS = _chunkUWBO33IGcjs.GROK_IMAGE_MODELS; exports.GeminiImageModels = _chunkV4LKHWJAcjs.GeminiImageModels; exports.GeminiSummarizeModels = _chunkV4LKHWJAcjs.GeminiSummarizeModels; exports.GeminiTTSModels = _chunkV4LKHWJAcjs.GeminiTTSModels; exports.GeminiTextModels = _chunkV4LKHWJAcjs.GeminiTextModels; exports.OPENAI_CHAT_MODELS = _chunkICHJ2G63cjs.OPENAI_CHAT_MODELS; exports.OPENAI_IMAGE_MODELS = _chunkICHJ2G63cjs.OPENAI_IMAGE_MODELS; exports.OPENAI_TRANSCRIPTION_MODELS = _chunkICHJ2G63cjs.OPENAI_TRANSCRIPTION_MODELS; exports.OPENAI_TTS_MODELS = _chunkICHJ2G63cjs.OPENAI_TTS_MODELS; exports.OPENAI_VIDEO_MODELS = _chunkICHJ2G63cjs.OPENAI_VIDEO_MODELS; exports.createAnthropicChat = _chunk7KZQWFUEcjs.createAnthropicChat; exports.createAnthropicSummarize = _chunk7KZQWFUEcjs.createAnthropicSummarize; exports.createGeminiChat = _chunkV4LKHWJAcjs.createGeminiChat; exports.createGeminiImage = _chunkV4LKHWJAcjs.createGeminiImage; exports.createGeminiSummarize = _chunkV4LKHWJAcjs.createGeminiSummarize; exports.createGeminiTts = _chunkV4LKHWJAcjs.createGeminiTts; exports.createGrokChat = _chunkUWBO33IGcjs.createGrokChat; exports.createGrokImage = _chunkUWBO33IGcjs.createGrokImage; exports.createGrokSummarize = _chunkUWBO33IGcjs.createGrokSummarize; exports.createOpenAiChat = _chunkICHJ2G63cjs.createOpenAiChat; exports.createOpenAiImage = _chunkICHJ2G63cjs.createOpenAiImage; exports.createOpenAiSummarize = _chunkICHJ2G63cjs.createOpenAiSummarize; exports.createOpenAiTranscription = _chunkICHJ2G63cjs.createOpenAiTranscription; exports.createOpenAiTts = _chunkICHJ2G63cjs.createOpenAiTts; exports.createOpenAiVideo = _chunkICHJ2G63cjs.createOpenAiVideo; exports.createOpenRouterChat = _chunk7SKFZ4SUcjs.createOpenRouterChat; exports.createOpenRouterImage = _chunk7SKFZ4SUcjs.createOpenRouterImage; exports.createOpenRouterSummarize = _chunk7SKFZ4SUcjs.createOpenRouterSummarize; exports.createWorkersAiChat = _chunkLG2I3ANTcjs.createWorkersAiChat; exports.createWorkersAiImage = _chunkZHTFBZXJcjs.createWorkersAiImage; exports.createWorkersAiSummarize = _chunkIDPLTBQXcjs.createWorkersAiSummarize; exports.createWorkersAiTranscription = _chunkAYTKQRE4cjs.createWorkersAiTranscription; exports.createWorkersAiTts = _chunkARLHMZ5Bcjs.createWorkersAiTts;
96
+ exports.ANTHROPIC_MODELS = _chunk7YINQQCYcjs.ANTHROPIC_MODELS; exports.GROK_CHAT_MODELS = _chunkQUS7INYAcjs.GROK_CHAT_MODELS; exports.GROK_IMAGE_MODELS = _chunkQUS7INYAcjs.GROK_IMAGE_MODELS; exports.GeminiImageModels = _chunkV4LKHWJAcjs.GeminiImageModels; exports.GeminiSummarizeModels = _chunkV4LKHWJAcjs.GeminiSummarizeModels; exports.GeminiTTSModels = _chunkV4LKHWJAcjs.GeminiTTSModels; exports.GeminiTextModels = _chunkV4LKHWJAcjs.GeminiTextModels; exports.OPENAI_CHAT_MODELS = _chunkMPVUETJYcjs.OPENAI_CHAT_MODELS; exports.OPENAI_IMAGE_MODELS = _chunkMPVUETJYcjs.OPENAI_IMAGE_MODELS; exports.OPENAI_TRANSCRIPTION_MODELS = _chunkMPVUETJYcjs.OPENAI_TRANSCRIPTION_MODELS; exports.OPENAI_TTS_MODELS = _chunkMPVUETJYcjs.OPENAI_TTS_MODELS; exports.OPENAI_VIDEO_MODELS = _chunkMPVUETJYcjs.OPENAI_VIDEO_MODELS; exports.createAnthropicChat = _chunk7YINQQCYcjs.createAnthropicChat; exports.createAnthropicSummarize = _chunk7YINQQCYcjs.createAnthropicSummarize; exports.createGeminiChat = _chunkV4LKHWJAcjs.createGeminiChat; exports.createGeminiImage = _chunkV4LKHWJAcjs.createGeminiImage; exports.createGeminiSummarize = _chunkV4LKHWJAcjs.createGeminiSummarize; exports.createGeminiTts = _chunkV4LKHWJAcjs.createGeminiTts; exports.createGrokChat = _chunkQUS7INYAcjs.createGrokChat; exports.createGrokImage = _chunkQUS7INYAcjs.createGrokImage; exports.createGrokSummarize = _chunkQUS7INYAcjs.createGrokSummarize; exports.createOpenAiChat = _chunkMPVUETJYcjs.createOpenAiChat; exports.createOpenAiImage = _chunkMPVUETJYcjs.createOpenAiImage; exports.createOpenAiSummarize = _chunkMPVUETJYcjs.createOpenAiSummarize; exports.createOpenAiTranscription = _chunkMPVUETJYcjs.createOpenAiTranscription; exports.createOpenAiTts = _chunkMPVUETJYcjs.createOpenAiTts; exports.createOpenAiVideo = _chunkMPVUETJYcjs.createOpenAiVideo; exports.createOpenRouterChat = _chunkDQGO754Xcjs.createOpenRouterChat; exports.createOpenRouterImage = _chunkDQGO754Xcjs.createOpenRouterImage; exports.createOpenRouterSummarize = _chunkDQGO754Xcjs.createOpenRouterSummarize; exports.createWorkersAiChat = _chunkDTGQYEJ2cjs.createWorkersAiChat; exports.createWorkersAiImage = _chunkIL6PTKJEcjs.createWorkersAiImage; exports.createWorkersAiSummarize = _chunkY2PUBTP5cjs.createWorkersAiSummarize; exports.createWorkersAiTranscription = _chunk45DEJBFYcjs.createWorkersAiTranscription; exports.createWorkersAiTts = _chunkCPOXZIMAcjs.createWorkersAiTts;
97
97
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  createWorkersAiTranscription
3
- } from "./chunk-T5KPTTLK.js";
3
+ } from "./chunk-627RVSSB.js";
4
4
  import {
5
5
  createWorkersAiTts
6
- } from "./chunk-2QN5XFI2.js";
6
+ } from "./chunk-GST6AT3R.js";
7
7
  import {
8
8
  createWorkersAiChat
9
- } from "./chunk-3KUHT3K6.js";
9
+ } from "./chunk-HDDZEGLC.js";
10
10
  import {
11
11
  ANTHROPIC_MODELS,
12
12
  createAnthropicChat,
13
13
  createAnthropicSummarize
14
- } from "./chunk-DSBHOQQ4.js";
14
+ } from "./chunk-AJMCHPPR.js";
15
15
  import {
16
16
  GeminiImageModels,
17
17
  GeminiSummarizeModels,
@@ -28,7 +28,7 @@ import {
28
28
  createGrokChat,
29
29
  createGrokImage,
30
30
  createGrokSummarize
31
- } from "./chunk-Y7W7NDVS.js";
31
+ } from "./chunk-HFZK4C5B.js";
32
32
  import {
33
33
  OPENAI_CHAT_MODELS,
34
34
  OPENAI_IMAGE_MODELS,
@@ -41,21 +41,21 @@ import {
41
41
  createOpenAiTranscription,
42
42
  createOpenAiTts,
43
43
  createOpenAiVideo
44
- } from "./chunk-5A2F2QCL.js";
44
+ } from "./chunk-RKBJLYVO.js";
45
45
  import {
46
46
  createOpenRouterChat,
47
47
  createOpenRouterImage,
48
48
  createOpenRouterSummarize
49
- } from "./chunk-JK5ZFOZZ.js";
49
+ } from "./chunk-4HOZDNW6.js";
50
50
  import {
51
51
  createWorkersAiImage
52
- } from "./chunk-DZZVI4W5.js";
52
+ } from "./chunk-XCLZJGUI.js";
53
53
  import "./chunk-XU7YEPML.js";
54
54
  import {
55
55
  createWorkersAiSummarize
56
- } from "./chunk-OKU3GB5P.js";
56
+ } from "./chunk-PMPGIUVA.js";
57
57
  import "./chunk-2VII5BK2.js";
58
- import "./chunk-O7MBRPCW.js";
58
+ import "./chunk-727MRLUF.js";
59
59
  import "./chunk-V6TY7KAL.js";
60
60
  export {
61
61
  ANTHROPIC_MODELS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudflare/tanstack-ai",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Use TanStack AI with Cloudflare Workers AI and AI Gateway",
5
5
  "keywords": [
6
6
  "ai",
@@ -88,32 +88,33 @@
88
88
  "access": "public"
89
89
  },
90
90
  "dependencies": {
91
- "openai": "^6.21.0"
91
+ "openai": "^6.22.0"
92
92
  },
93
93
  "devDependencies": {
94
- "@cloudflare/workers-types": "^4.20260212.0",
95
- "@microsoft/api-extractor": "^7.56.3",
96
- "@tanstack/ai": "^0.5.0",
97
- "dotenv": "^17.2.4"
94
+ "@cloudflare/workers-types": "^4.20260227.0",
95
+ "@microsoft/api-extractor": "^7.57.1",
96
+ "@tanstack/ai": "^0.5.1",
97
+ "dotenv": "^17.3.1"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@tanstack/ai": "^0.5.0"
101
101
  },
102
102
  "optionalDependencies": {
103
- "@anthropic-ai/sdk": "^0.74.0",
104
- "@google/genai": "^1.41.0",
103
+ "@anthropic-ai/sdk": "^0.78.0",
104
+ "@google/genai": "^1.42.0",
105
105
  "@openrouter/sdk": "^0.8.0",
106
106
  "@tanstack/ai-anthropic": "^0.5.0",
107
107
  "@tanstack/ai-gemini": "^0.5.0",
108
108
  "@tanstack/ai-grok": "^0.5.0",
109
109
  "@tanstack/ai-openai": "^0.5.0",
110
- "@tanstack/ai-openrouter": "^0.5.0"
110
+ "@tanstack/ai-openrouter": "^0.5.1"
111
111
  },
112
112
  "scripts": {
113
113
  "build": "rm -rf dist && tsup --config tsup.config.ts",
114
114
  "format": "biome format --write",
115
115
  "type-check": "tsc --noEmit",
116
- "test": "vitest",
116
+ "test": "vitest --run",
117
+ "test:watch": "vitest",
117
118
  "test:ci": "vitest --watch=false",
118
119
  "test:e2e": "vitest --config vitest.e2e.config.ts --watch=false",
119
120
  "test:e2e:rest": "vitest --config vitest.e2e.config.ts --watch=false test/e2e/workers-ai-rest.e2e.test.ts",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters/workers-ai.ts"],"sourcesContent":["import type { AiModels, BaseAiTextGeneration } from \"@cloudflare/workers-types\";\nimport type { StreamChunk, TextOptions } from \"@tanstack/ai\";\nimport {\n\tBaseTextAdapter,\n\ttype StructuredOutputOptions,\n\ttype StructuredOutputResult,\n} from \"@tanstack/ai/adapters\";\nimport OpenAI from \"openai\";\nimport {\n\ttype WorkersAiAdapterConfig,\n\ttype AiGatewayAdapterConfig,\n\tcreateGatewayFetch,\n\tcreateWorkersAiBindingFetch,\n\tisDirectBindingConfig,\n\tisDirectCredentialsConfig,\n\tvalidateWorkersAiConfig,\n} from \"../utils/create-fetcher\";\n\n// ---------------------------------------------------------------------------\n// Model types derived from @cloudflare/workers-types\n// ---------------------------------------------------------------------------\n\nexport type WorkersAiTextModel =\n\t| {\n\t\t\t[K in keyof AiModels]: AiModels[K] extends BaseAiTextGeneration ? K : never;\n\t }[keyof AiModels]\n\t| (string & {});\n\n// ---------------------------------------------------------------------------\n// Helpers: build the right OpenAI client depending on config mode\n// ---------------------------------------------------------------------------\n\nfunction buildWorkersAiClient(config: WorkersAiAdapterConfig): OpenAI {\n\tvalidateWorkersAiConfig(config);\n\n\tif (isDirectBindingConfig(config)) {\n\t\t// Plain binding mode: shim translates OpenAI fetch calls to env.AI.run()\n\t\treturn new OpenAI({\n\t\t\tapiKey: \"unused\",\n\t\t\tfetch: createWorkersAiBindingFetch(config.binding),\n\t\t});\n\t}\n\n\tif (isDirectCredentialsConfig(config)) {\n\t\t// Plain REST mode: point OpenAI SDK at Workers AI's OpenAI-compatible endpoint\n\t\treturn new OpenAI({\n\t\t\tbaseURL: `https://api.cloudflare.com/client/v4/accounts/${config.accountId}/ai/v1`,\n\t\t\tapiKey: config.apiKey,\n\t\t});\n\t}\n\n\t// Gateway mode (existing): use createGatewayFetch\n\tconst gatewayConfig = config as AiGatewayAdapterConfig;\n\treturn new OpenAI({\n\t\tfetch: createGatewayFetch(\"workers-ai\", gatewayConfig),\n\t\tapiKey: gatewayConfig.apiKey ?? \"unused\",\n\t});\n}\n\n// ---------------------------------------------------------------------------\n// Shared message-building helpers\n// ---------------------------------------------------------------------------\n\ninterface MessageLike {\n\trole: string;\n\tcontent: string | null | Array<{ type: string; content?: string }>;\n\ttoolCalls?: Array<{\n\t\tid: string;\n\t\tfunction: { name: string; arguments: string };\n\t}>;\n\ttoolCallId?: string;\n}\n\nfunction extractTextContent(\n\tcontent: string | null | Array<{ type: string; content?: string }>,\n): string {\n\tif (content === null) return \"\";\n\tif (typeof content === \"string\") return content;\n\treturn content\n\t\t.filter((p) => p.type === \"text\")\n\t\t.map((p) => p.content || \"\")\n\t\t.join(\"\");\n}\n\n/**\n * Build OpenAI-compatible user message content, preserving image parts.\n *\n * If the content has only text parts, returns a plain string.\n * If it includes image parts, returns an array of content parts in\n * OpenAI's multi-modal format (text + image_url).\n */\nfunction buildUserContent(\n\tcontent: string | null | Array<{ type: string; content?: string; image_url?: unknown }>,\n): string | OpenAI.Chat.ChatCompletionContentPart[] {\n\tif (content === null) return \"\";\n\tif (typeof content === \"string\") return content;\n\n\tconst hasImages = content.some((p) => p.type === \"image_url\" || p.type === \"image\");\n\tif (!hasImages) {\n\t\t// No images — return plain text for simpler messages\n\t\treturn content\n\t\t\t.filter((p) => p.type === \"text\")\n\t\t\t.map((p) => p.content || \"\")\n\t\t\t.join(\"\");\n\t}\n\n\t// Multi-modal: build array of text + image_url parts\n\tconst parts: OpenAI.Chat.ChatCompletionContentPart[] = [];\n\tfor (const part of content) {\n\t\tif (part.type === \"text\" && part.content) {\n\t\t\tparts.push({ type: \"text\", text: part.content });\n\t\t} else if (part.type === \"image_url\" && part.content) {\n\t\t\tparts.push({\n\t\t\t\ttype: \"image_url\",\n\t\t\t\timage_url: { url: part.content },\n\t\t\t});\n\t\t} else if (part.type === \"image_url\" && part.image_url) {\n\t\t\tparts.push({\n\t\t\t\ttype: \"image_url\",\n\t\t\t\timage_url: part.image_url as OpenAI.Chat.ChatCompletionContentPartImage.ImageURL,\n\t\t\t});\n\t\t}\n\t}\n\treturn parts;\n}\n\nfunction buildOpenAIMessages(\n\tsystemPrompts: string[] | undefined,\n\tmessages: MessageLike[],\n\toptions?: { includeToolMessages?: boolean },\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n\tconst includeTools = options?.includeToolMessages ?? true;\n\tconst openAIMessages: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n\n\tif (systemPrompts && systemPrompts.length > 0) {\n\t\topenAIMessages.push({\n\t\t\trole: \"system\",\n\t\t\tcontent: systemPrompts.join(\"\\n\"),\n\t\t});\n\t}\n\n\tfor (const message of messages) {\n\t\tif (message.role === \"user\") {\n\t\t\topenAIMessages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: buildUserContent(message.content),\n\t\t\t});\n\t\t} else if (message.role === \"assistant\") {\n\t\t\tconst assistantMessage: OpenAI.Chat.ChatCompletionAssistantMessageParam = {\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: extractTextContent(message.content),\n\t\t\t};\n\t\t\tif (includeTools && message.toolCalls && message.toolCalls.length > 0) {\n\t\t\t\tassistantMessage.tool_calls = message.toolCalls.map((tc) => ({\n\t\t\t\t\tid: tc.id,\n\t\t\t\t\ttype: \"function\" as const,\n\t\t\t\t\tfunction: {\n\t\t\t\t\t\tname: tc.function.name,\n\t\t\t\t\t\targuments: tc.function.arguments,\n\t\t\t\t\t},\n\t\t\t\t}));\n\t\t\t}\n\t\t\topenAIMessages.push(assistantMessage);\n\t\t} else if (includeTools && message.role === \"tool\") {\n\t\t\tlet toolContent: string;\n\t\t\tif (typeof message.content === \"string\") {\n\t\t\t\ttry {\n\t\t\t\t\tJSON.parse(message.content);\n\t\t\t\t\ttoolContent = message.content;\n\t\t\t\t} catch {\n\t\t\t\t\ttoolContent = JSON.stringify(message.content);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttoolContent = JSON.stringify(message.content);\n\t\t\t}\n\t\t\topenAIMessages.push({\n\t\t\t\trole: \"tool\",\n\t\t\t\ttool_call_id: message.toolCallId || `tool_${crypto.randomUUID().slice(0, 8)}`,\n\t\t\t\tcontent: toolContent,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn openAIMessages;\n}\n\nfunction buildOpenAITools(\n\ttools: Array<{ name: string; description: string; inputSchema?: unknown }> | undefined,\n): OpenAI.Chat.ChatCompletionTool[] | undefined {\n\tif (!tools) return undefined;\n\treturn tools.map((tool) => ({\n\t\ttype: \"function\" as const,\n\t\tfunction: {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.inputSchema as Record<string, unknown>,\n\t\t},\n\t}));\n}\n\n// ---------------------------------------------------------------------------\n// ID generation\n// ---------------------------------------------------------------------------\n\nfunction generateId(prefix: string): string {\n\treturn `${prefix}-${crypto.randomUUID()}`;\n}\n\n// ---------------------------------------------------------------------------\n// WorkersAiTextAdapter: chat / structured output via OpenAI Chat Completions\n// ---------------------------------------------------------------------------\n\n// TODO: Replace `any` generic params with proper types once BaseTextAdapter's\n// provider-options generics stabilize. Workers AI doesn't have provider-specific\n// options in the TanStack sense, so `any` is pragmatic for now.\nexport class WorkersAiTextAdapter<TModel extends WorkersAiTextModel> extends BaseTextAdapter<\n\tTModel,\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BaseTextAdapter generic params are opaque\n\tany,\n\tany,\n\tany\n> {\n\tname = \"workers-ai\" as const;\n\n\tprivate client: OpenAI;\n\n\tconstructor(model: TModel, config: WorkersAiAdapterConfig) {\n\t\tsuper({ apiKey: \"unused\" }, model);\n\t\tthis.client = buildWorkersAiClient(config);\n\t}\n\n\tasync *chatStream(options: TextOptions<any>): AsyncIterable<StreamChunk> {\n\t\tconst { systemPrompts, messages, tools, temperature, model } = options;\n\n\t\tconst openAIMessages = buildOpenAIMessages(systemPrompts, messages);\n\t\tconst openAITools = buildOpenAITools(tools);\n\n\t\tconst timestamp = Date.now();\n\t\tconst runId = generateId(\"workers-ai\");\n\t\tconst messageId = generateId(\"workers-ai\");\n\t\tlet hasEmittedRunStarted = false;\n\t\tlet hasEmittedTextMessageStart = false;\n\t\tlet accumulatedContent = \"\";\n\t\tlet hasEmittedStepStarted = false;\n\t\tlet accumulatedReasoning = \"\";\n\t\tconst stepId = generateId(\"workers-ai-step\");\n\t\tlet hasReceivedFinishReason = false;\n\t\tconst toolCallsInProgress = new Map<\n\t\t\tnumber,\n\t\t\t{ id: string; name: string; arguments: string; started: boolean }\n\t\t>();\n\n\t\ttry {\n\t\t\tlet stream: AsyncIterable<OpenAI.Chat.Completions.ChatCompletionChunk>;\n\t\t\ttry {\n\t\t\t\tstream = await this.client.chat.completions.create({\n\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\tmessages: openAIMessages,\n\t\t\t\t\ttools: openAITools,\n\t\t\t\t\ttemperature,\n\t\t\t\t\tstream: true,\n\t\t\t\t\tstream_options: { include_usage: true },\n\t\t\t\t});\n\t\t\t} catch (streamError: unknown) {\n\t\t\t\t// Some models (e.g. GPT-OSS) don't support streaming via the REST API.\n\t\t\t\t// Fall back to a non-streaming call and yield the result as a single chunk.\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[tanstack-ai] Streaming failed, falling back to non-streaming:\",\n\t\t\t\t\tstreamError instanceof Error ? streamError.message : streamError,\n\t\t\t\t);\n\t\t\t\tconst nonStreamResult = await this.client.chat.completions.create({\n\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\tmessages: openAIMessages,\n\t\t\t\t\ttools: openAITools,\n\t\t\t\t\ttemperature,\n\t\t\t\t});\n\n\t\t\t\tyield {\n\t\t\t\t\ttype: \"RUN_STARTED\",\n\t\t\t\t\trunId,\n\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\ttimestamp,\n\t\t\t\t} satisfies StreamChunk;\n\n\t\t\t\tconst msg = nonStreamResult.choices[0]?.message;\n\t\t\t\tif (msg?.content) {\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"TEXT_MESSAGE_START\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"TEXT_MESSAGE_CONTENT\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\tdelta: msg.content,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"TEXT_MESSAGE_END\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\n\t\t\t\tif (msg?.tool_calls) {\n\t\t\t\t\tfor (const tc of msg.tool_calls) {\n\t\t\t\t\t\tif (tc.type !== \"function\") continue;\n\t\t\t\t\t\tconst fn = tc.function;\n\t\t\t\t\t\tlet parsedInput: unknown = {};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tparsedInput = fn.arguments ? JSON.parse(fn.arguments) : {};\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tparsedInput = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"TOOL_CALL_START\",\n\t\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\t\ttoolName: fn.name,\n\t\t\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\tindex: 0,\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"TOOL_CALL_END\",\n\t\t\t\t\t\t\ttoolCallId: tc.id,\n\t\t\t\t\t\t\ttoolName: fn.name,\n\t\t\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\tinput: parsedInput,\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst finishReason = nonStreamResult.choices[0]?.finish_reason;\n\t\t\t\tyield {\n\t\t\t\t\ttype: \"RUN_FINISHED\",\n\t\t\t\t\trunId,\n\t\t\t\t\tmodel: nonStreamResult.model || model || this.model,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tusage: nonStreamResult.usage\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tpromptTokens: nonStreamResult.usage.prompt_tokens,\n\t\t\t\t\t\t\t\tcompletionTokens: nonStreamResult.usage.completion_tokens,\n\t\t\t\t\t\t\t\ttotalTokens: nonStreamResult.usage.total_tokens,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tfinishReason:\n\t\t\t\t\t\tfinishReason === \"tool_calls\" || finishReason === \"function_call\"\n\t\t\t\t\t\t\t? \"tool_calls\"\n\t\t\t\t\t\t\t: ((finishReason as \"stop\" | \"length\" | \"content_filter\") ?? \"stop\"),\n\t\t\t\t} satisfies StreamChunk;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor await (const chunk of stream) {\n\t\t\t\tif (!chunk.choices || chunk.choices.length === 0) continue;\n\t\t\t\tconst choice = chunk.choices[0];\n\t\t\t\tif (!choice) continue;\n\n\t\t\t\t// Emit RUN_STARTED on first chunk\n\t\t\t\tif (!hasEmittedRunStarted) {\n\t\t\t\t\thasEmittedRunStarted = true;\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"RUN_STARTED\",\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\n\t\t\t\tconst delta = choice.delta;\n\n\t\t\t\t// Reasoning content (used by models like QwQ, DeepSeek R1, Kimi K2.5)\n\t\t\t\t// The OpenAI SDK doesn't type this field, but models send it as an extension.\n\t\t\t\tconst reasoningContent = (delta as Record<string, unknown>).reasoning_content as\n\t\t\t\t\t| string\n\t\t\t\t\t| undefined;\n\t\t\t\tif (reasoningContent) {\n\t\t\t\t\t// RUN_STARTED is already guaranteed by the guard above\n\t\t\t\t\tif (!hasEmittedStepStarted) {\n\t\t\t\t\t\thasEmittedStepStarted = true;\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"STEP_STARTED\",\n\t\t\t\t\t\t\tstepId,\n\t\t\t\t\t\t\tstepType: \"thinking\",\n\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t}\n\t\t\t\t\taccumulatedReasoning += reasoningContent;\n\t\t\t\t\t// TODO: TanStack AI's StreamProcessor currently treats STEP_FINISHED as an\n\t\t\t\t\t// incremental reasoning event (with `delta` + accumulated `content`), so we\n\t\t\t\t\t// emit one per token. If TanStack AI adds a dedicated STEP_CONTENT event\n\t\t\t\t\t// type, this should be updated to emit STEP_CONTENT per token and a single\n\t\t\t\t\t// STEP_FINISHED when reasoning ends (i.e. when the first non-reasoning\n\t\t\t\t\t// content or finish_reason arrives).\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"STEP_FINISHED\",\n\t\t\t\t\t\tstepId,\n\t\t\t\t\t\tdelta: reasoningContent,\n\t\t\t\t\t\tcontent: accumulatedReasoning,\n\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\n\t\t\t\t// Text content\n\t\t\t\tif (delta.content) {\n\t\t\t\t\tif (!hasEmittedTextMessageStart) {\n\t\t\t\t\t\thasEmittedTextMessageStart = true;\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"TEXT_MESSAGE_START\",\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t}\n\n\t\t\t\t\taccumulatedContent += delta.content;\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"TEXT_MESSAGE_CONTENT\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\tdelta: delta.content,\n\t\t\t\t\t\tcontent: accumulatedContent,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\n\t\t\t\t// Tool calls\n\t\t\t\tif (delta.tool_calls) {\n\t\t\t\t\tfor (const toolCallDelta of delta.tool_calls) {\n\t\t\t\t\t\tconst index = toolCallDelta.index;\n\n\t\t\t\t\t\tif (!toolCallsInProgress.has(index)) {\n\t\t\t\t\t\t\ttoolCallsInProgress.set(index, {\n\t\t\t\t\t\t\t\tid: toolCallDelta.id || \"\",\n\t\t\t\t\t\t\t\tname: toolCallDelta.function?.name || \"\",\n\t\t\t\t\t\t\t\targuments: \"\",\n\t\t\t\t\t\t\t\tstarted: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst toolCall = toolCallsInProgress.get(index)!;\n\n\t\t\t\t\t\tif (toolCallDelta.id) {\n\t\t\t\t\t\t\ttoolCall.id = toolCallDelta.id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (toolCallDelta.function?.name) {\n\t\t\t\t\t\t\ttoolCall.name = toolCallDelta.function.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (toolCallDelta.function?.arguments) {\n\t\t\t\t\t\t\ttoolCall.arguments += toolCallDelta.function.arguments;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Emit TOOL_CALL_START once we have id and name\n\t\t\t\t\t\tif (toolCall.id && toolCall.name && !toolCall.started) {\n\t\t\t\t\t\t\ttoolCall.started = true;\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"TOOL_CALL_START\",\n\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Stream tool call arguments\n\t\t\t\t\t\tif (toolCallDelta.function?.arguments && toolCall.started) {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"TOOL_CALL_ARGS\",\n\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\t\tdelta: toolCallDelta.function.arguments,\n\t\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Finish\n\t\t\t\tif (choice.finish_reason) {\n\t\t\t\t\thasReceivedFinishReason = true;\n\n\t\t\t\t\t// End tool calls\n\t\t\t\t\tif (choice.finish_reason === \"tool_calls\" || toolCallsInProgress.size > 0) {\n\t\t\t\t\t\tfor (const [, toolCall] of toolCallsInProgress) {\n\t\t\t\t\t\t\tlet parsedInput: unknown = {};\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tparsedInput = toolCall.arguments\n\t\t\t\t\t\t\t\t\t? JSON.parse(toolCall.arguments)\n\t\t\t\t\t\t\t\t\t: {};\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tparsedInput = {};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\ttype: \"TOOL_CALL_END\",\n\t\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\t\tinput: parsedInput,\n\t\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst computedFinishReason =\n\t\t\t\t\t\tchoice.finish_reason === \"tool_calls\" ||\n\t\t\t\t\t\tchoice.finish_reason === \"function_call\" ||\n\t\t\t\t\t\ttoolCallsInProgress.size > 0\n\t\t\t\t\t\t\t? \"tool_calls\"\n\t\t\t\t\t\t\t: (choice.finish_reason as \"stop\" | \"length\" | \"content_filter\");\n\n\t\t\t\t\t// End text message if started\n\t\t\t\t\tif (hasEmittedTextMessageStart) {\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"TEXT_MESSAGE_END\",\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Emit RUN_FINISHED\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"RUN_FINISHED\",\n\t\t\t\t\t\trunId,\n\t\t\t\t\t\tmodel: chunk.model || model || this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\tusage: chunk.usage\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tpromptTokens: chunk.usage.prompt_tokens,\n\t\t\t\t\t\t\t\t\tcompletionTokens: chunk.usage.completion_tokens,\n\t\t\t\t\t\t\t\t\ttotalTokens: chunk.usage.total_tokens,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\tfinishReason: computedFinishReason,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Premature stream termination: the stream ended without a finish_reason.\n\t\t\t// This can happen when Workers AI truncates a response or the connection drops.\n\t\t\t// Emit proper closing events so the consumer doesn't hang.\n\t\t\tif (hasEmittedRunStarted && !hasReceivedFinishReason) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t\"[tanstack-ai] Stream ended without finish_reason — possible truncation or connection drop\",\n\t\t\t\t);\n\n\t\t\t\t// Close any open tool calls\n\t\t\t\tfor (const [, toolCall] of toolCallsInProgress) {\n\t\t\t\t\tif (toolCall.started) {\n\t\t\t\t\t\tlet parsedInput: unknown = {};\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tparsedInput = toolCall.arguments ? JSON.parse(toolCall.arguments) : {};\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tparsedInput = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\ttype: \"TOOL_CALL_END\",\n\t\t\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\tinput: parsedInput,\n\t\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Close text message if open\n\t\t\t\tif (hasEmittedTextMessageStart) {\n\t\t\t\t\tyield {\n\t\t\t\t\t\ttype: \"TEXT_MESSAGE_END\",\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t} satisfies StreamChunk;\n\t\t\t\t}\n\n\t\t\t\tyield {\n\t\t\t\t\ttype: \"RUN_FINISHED\",\n\t\t\t\t\trunId,\n\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tfinishReason: \"stop\",\n\t\t\t\t} satisfies StreamChunk;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst code =\n\t\t\t\terror instanceof Error ? (error as Error & { code?: string }).code : undefined;\n\t\t\tif (!hasEmittedRunStarted) {\n\t\t\t\tyield {\n\t\t\t\t\ttype: \"RUN_STARTED\",\n\t\t\t\t\trunId,\n\t\t\t\t\tmodel: model ?? this.model,\n\t\t\t\t\ttimestamp,\n\t\t\t\t} satisfies StreamChunk;\n\t\t\t}\n\t\t\tyield {\n\t\t\t\ttype: \"RUN_ERROR\",\n\t\t\t\trunId,\n\t\t\t\tmodel: model ?? this.model,\n\t\t\t\ttimestamp,\n\t\t\t\terror: {\n\t\t\t\t\tmessage: message || \"Unknown error\",\n\t\t\t\t\tcode,\n\t\t\t\t},\n\t\t\t} satisfies StreamChunk;\n\t\t}\n\t}\n\n\tasync structuredOutput(\n\t\toptions: StructuredOutputOptions<any>,\n\t): Promise<StructuredOutputResult<unknown>> {\n\t\tconst { outputSchema, chatOptions } = options;\n\t\tconst { systemPrompts, messages, temperature, model } = chatOptions;\n\n\t\tconst openAIMessages = buildOpenAIMessages(systemPrompts, messages, {\n\t\t\tincludeToolMessages: false,\n\t\t});\n\n\t\tconst response = await this.client.chat.completions.create({\n\t\t\tmodel: model ?? this.model,\n\t\t\tmessages: openAIMessages,\n\t\t\ttemperature,\n\t\t\tstream: false,\n\t\t\tresponse_format: {\n\t\t\t\ttype: \"json_schema\",\n\t\t\t\tjson_schema: {\n\t\t\t\t\tname: \"structured_output\",\n\t\t\t\t\tstrict: true,\n\t\t\t\t\tschema: outputSchema,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst choice = response.choices?.[0];\n\n\t\tif (!choice) {\n\t\t\tthrow new Error(\n\t\t\t\t`Workers AI structured output returned no choices: ${JSON.stringify(response)}`,\n\t\t\t);\n\t\t}\n\n\t\tconst rawContent = choice.message?.content ?? \"\";\n\n\t\t// Workers AI REST endpoint may return `content` as an already-parsed object\n\t\t// when using json_schema response format, so normalise both cases.\n\t\tlet data: unknown;\n\t\tlet rawText: string;\n\n\t\tif (typeof rawContent === \"string\") {\n\t\t\trawText = rawContent;\n\t\t\ttry {\n\t\t\t\tdata = JSON.parse(rawText);\n\t\t\t} catch {\n\t\t\t\tdata = rawText;\n\t\t\t}\n\t\t} else {\n\t\t\t// Already an object — stringify for rawText, use directly for data\n\t\t\tdata = rawContent;\n\t\t\trawText = JSON.stringify(rawContent);\n\t\t}\n\n\t\treturn { data, rawText };\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory functions\n// ---------------------------------------------------------------------------\n\nexport function createWorkersAiChat(model: WorkersAiTextModel, config: WorkersAiAdapterConfig) {\n\treturn new WorkersAiTextAdapter(model, config);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-7KZQWFUE.cjs","../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA;AACC;AACA;AACA;AAAA,qDAEM;AAMP,SAAS,oBAAA,CAAqB,MAAA,EAAgC;AAC7D,EAAA,OAAO;AAAA,IACN,MAAA,mBAAQ,MAAA,CAAO,MAAA,UAAU,UAAA;AAAA,IACzB,KAAA,EAAO,kDAAA,WAAmB,EAAa,MAAA,EAAQ;AAAA,MAC9C,mBAAA,mBAAqB,MAAA,CAAO,gBAAA,UAAoB;AAAA,IACjD,CAAC;AAAA,EACF,CAAA;AACD;AASO,SAAS,mBAAA,CACf,KAAA,EACA,MAAA,EACiB;AACjB,EAAA,OAAO,IAAI,sCAAA,CAAqB,oBAAA,CAAqB,MAAM,CAAA,EAAG,KAAK,CAAA;AACpE;AAMO,SAAS,wBAAA,CACf,KAAA,EACA,MAAA,EACC;AACD,EAAA,OAAO,IAAI,2CAAA,CAA0B,oBAAA,CAAqB,MAAM,CAAA,EAAG,KAAK,CAAA;AACzE;ADnBA;AACA;AACE;AACA;AACA;AACF,yKAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/chunk-7KZQWFUE.cjs","sourcesContent":[null,"import {\n\tAnthropicTextAdapter,\n\tAnthropicSummarizeAdapter,\n\tANTHROPIC_MODELS,\n\ttype AnthropicChatModel,\n} from \"@tanstack/ai-anthropic\";\nimport type { AnyTextAdapter } from \"@tanstack/ai\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type AnthropicGatewayConfig = AiGatewayAdapterConfig & { anthropicVersion?: string };\n\nfunction buildAnthropicConfig(config: AnthropicGatewayConfig) {\n\treturn {\n\t\tapiKey: config.apiKey ?? \"unused\",\n\t\tfetch: createGatewayFetch(\"anthropic\", config, {\n\t\t\t\"anthropic-version\": config.anthropicVersion ?? \"2023-06-01\",\n\t\t}),\n\t};\n}\n\n/**\n * Creates an Anthropic chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n *\n * Since AnthropicTextConfig extends the Anthropic SDK's ClientOptions,\n * we can inject the gateway fetch directly — no subclassing needed.\n */\nexport function createAnthropicChat(\n\tmodel: AnthropicChatModel,\n\tconfig: AnthropicGatewayConfig,\n): AnyTextAdapter {\n\treturn new AnthropicTextAdapter(buildAnthropicConfig(config), model);\n}\n\n/**\n * Creates an Anthropic summarize adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createAnthropicSummarize(\n\tmodel: AnthropicChatModel,\n\tconfig: AnthropicGatewayConfig,\n) {\n\treturn new AnthropicSummarizeAdapter(buildAnthropicConfig(config), model);\n}\n\nexport { ANTHROPIC_MODELS, type AnthropicChatModel };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters/anthropic.ts"],"sourcesContent":["import {\n\tAnthropicTextAdapter,\n\tAnthropicSummarizeAdapter,\n\tANTHROPIC_MODELS,\n\ttype AnthropicChatModel,\n} from \"@tanstack/ai-anthropic\";\nimport type { AnyTextAdapter } from \"@tanstack/ai\";\nimport { createGatewayFetch, type AiGatewayAdapterConfig } from \"../utils/create-fetcher\";\n\nexport type AnthropicGatewayConfig = AiGatewayAdapterConfig & { anthropicVersion?: string };\n\nfunction buildAnthropicConfig(config: AnthropicGatewayConfig) {\n\treturn {\n\t\tapiKey: config.apiKey ?? \"unused\",\n\t\tfetch: createGatewayFetch(\"anthropic\", config, {\n\t\t\t\"anthropic-version\": config.anthropicVersion ?? \"2023-06-01\",\n\t\t}),\n\t};\n}\n\n/**\n * Creates an Anthropic chat adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n *\n * Since AnthropicTextConfig extends the Anthropic SDK's ClientOptions,\n * we can inject the gateway fetch directly — no subclassing needed.\n */\nexport function createAnthropicChat(\n\tmodel: AnthropicChatModel,\n\tconfig: AnthropicGatewayConfig,\n): AnyTextAdapter {\n\treturn new AnthropicTextAdapter(buildAnthropicConfig(config), model);\n}\n\n/**\n * Creates an Anthropic summarize adapter which uses Cloudflare AI Gateway.\n * Supports both binding and credential-based configurations.\n */\nexport function createAnthropicSummarize(\n\tmodel: AnthropicChatModel,\n\tconfig: AnthropicGatewayConfig,\n) {\n\treturn new AnthropicSummarizeAdapter(buildAnthropicConfig(config), model);\n}\n\nexport { ANTHROPIC_MODELS, type AnthropicChatModel };\n"],"mappings":";;;;;AAAA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OAEM;AAMP,SAAS,qBAAqB,QAAgC;AAC7D,SAAO;AAAA,IACN,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,mBAAmB,aAAa,QAAQ;AAAA,MAC9C,qBAAqB,OAAO,oBAAoB;AAAA,IACjD,CAAC;AAAA,EACF;AACD;AASO,SAAS,oBACf,OACA,QACiB;AACjB,SAAO,IAAI,qBAAqB,qBAAqB,MAAM,GAAG,KAAK;AACpE;AAMO,SAAS,yBACf,OACA,QACC;AACD,SAAO,IAAI,0BAA0B,qBAAqB,MAAM,GAAG,KAAK;AACzE;","names":[]}