@cloudflare/tanstack-ai 0.1.6 → 0.1.8

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 (176) hide show
  1. package/README.md +35 -6
  2. package/dist/adapters/anthropic.cjs +32 -11
  3. package/dist/adapters/anthropic.cjs.map +1 -1
  4. package/dist/adapters/anthropic.d.cts +23 -5
  5. package/dist/adapters/anthropic.d.mts +23 -0
  6. package/dist/adapters/anthropic.mjs +30 -0
  7. package/dist/adapters/anthropic.mjs.map +1 -0
  8. package/dist/adapters/gemini.cjs +83 -20
  9. package/dist/adapters/gemini.cjs.map +1 -1
  10. package/dist/adapters/gemini.d.cts +52 -14
  11. package/dist/adapters/gemini.d.mts +52 -0
  12. package/dist/adapters/gemini.mjs +76 -0
  13. package/dist/adapters/gemini.mjs.map +1 -0
  14. package/dist/adapters/grok.cjs +44 -15
  15. package/dist/adapters/grok.cjs.map +1 -1
  16. package/dist/adapters/grok.d.cts +26 -9
  17. package/dist/adapters/grok.d.mts +26 -0
  18. package/dist/adapters/grok.mjs +40 -0
  19. package/dist/adapters/grok.mjs.map +1 -0
  20. package/dist/adapters/openai.cjs +76 -27
  21. package/dist/adapters/openai.cjs.map +1 -1
  22. package/dist/adapters/openai.d.cts +45 -17
  23. package/dist/adapters/openai.d.mts +45 -0
  24. package/dist/adapters/openai.mjs +66 -0
  25. package/dist/adapters/openai.mjs.map +1 -0
  26. package/dist/adapters/openrouter.cjs +83 -11
  27. package/dist/adapters/openrouter.cjs.map +1 -1
  28. package/dist/adapters/openrouter.d.cts +39 -7
  29. package/dist/adapters/openrouter.d.mts +39 -0
  30. package/dist/adapters/openrouter.mjs +81 -0
  31. package/dist/adapters/openrouter.mjs.map +1 -0
  32. package/dist/adapters/workers-ai-image.cjs +97 -11
  33. package/dist/adapters/workers-ai-image.cjs.map +1 -1
  34. package/dist/adapters/workers-ai-image.d.cts +41 -3
  35. package/dist/adapters/workers-ai-image.d.mts +41 -0
  36. package/dist/adapters/workers-ai-image.mjs +96 -0
  37. package/dist/adapters/workers-ai-image.mjs.map +1 -0
  38. package/dist/adapters/workers-ai-summarize.cjs +86 -10
  39. package/dist/adapters/workers-ai-summarize.cjs.map +1 -1
  40. package/dist/adapters/workers-ai-summarize.d.cts +42 -3
  41. package/dist/adapters/workers-ai-summarize.d.mts +42 -0
  42. package/dist/adapters/workers-ai-summarize.mjs +85 -0
  43. package/dist/adapters/workers-ai-summarize.mjs.map +1 -0
  44. package/dist/adapters/workers-ai-transcription.cjs +200 -11
  45. package/dist/adapters/workers-ai-transcription.cjs.map +1 -1
  46. package/dist/adapters/workers-ai-transcription.d.cts +74 -3
  47. package/dist/adapters/workers-ai-transcription.d.mts +74 -0
  48. package/dist/adapters/workers-ai-transcription.mjs +199 -0
  49. package/dist/adapters/workers-ai-transcription.mjs.map +1 -0
  50. package/dist/adapters/workers-ai-tts.cjs +112 -11
  51. package/dist/adapters/workers-ai-tts.cjs.map +1 -1
  52. package/dist/adapters/workers-ai-tts.d.cts +54 -3
  53. package/dist/adapters/workers-ai-tts.d.mts +54 -0
  54. package/dist/adapters/workers-ai-tts.mjs +111 -0
  55. package/dist/adapters/workers-ai-tts.mjs.map +1 -0
  56. package/dist/adapters/workers-ai.cjs +4 -11
  57. package/dist/adapters/workers-ai.d.cts +45 -3
  58. package/dist/adapters/workers-ai.d.mts +45 -0
  59. package/dist/adapters/workers-ai.mjs +481 -0
  60. package/dist/adapters/workers-ai.mjs.map +1 -0
  61. package/dist/binary-C9FAYwZj.cjs +70 -0
  62. package/dist/binary-C9FAYwZj.cjs.map +1 -0
  63. package/dist/binary-p4H_N_3M.mjs +59 -0
  64. package/dist/binary-p4H_N_3M.mjs.map +1 -0
  65. package/dist/create-fetcher-6p6heb85.d.mts +93 -0
  66. package/dist/create-fetcher-By-hTiT9.cjs +312 -0
  67. package/dist/create-fetcher-By-hTiT9.cjs.map +1 -0
  68. package/dist/create-fetcher-CeUOJgrh.mjs +283 -0
  69. package/dist/create-fetcher-CeUOJgrh.mjs.map +1 -0
  70. package/dist/create-fetcher-vAQ8WW-p.d.cts +93 -0
  71. package/dist/defineProperty-CbyrzcbA.mjs +39 -0
  72. package/dist/defineProperty-DQoAg20E.cjs +44 -0
  73. package/dist/index.cjs +50 -97
  74. package/dist/index.d.cts +12 -64
  75. package/dist/index.d.mts +12 -0
  76. package/dist/index.mjs +11 -0
  77. package/dist/workers-ai-BOZ5iyhY.cjs +521 -0
  78. package/dist/workers-ai-BOZ5iyhY.cjs.map +1 -0
  79. package/dist/workers-ai-rest-CkNCtBwv.cjs +85 -0
  80. package/dist/workers-ai-rest-CkNCtBwv.cjs.map +1 -0
  81. package/dist/workers-ai-rest-GKy2r7eG.mjs +74 -0
  82. package/dist/workers-ai-rest-GKy2r7eG.mjs.map +1 -0
  83. package/package.json +73 -40
  84. package/dist/_tsup-dts-rollup.d.cts +0 -837
  85. package/dist/_tsup-dts-rollup.d.ts +0 -837
  86. package/dist/adapters/anthropic.d.ts +0 -5
  87. package/dist/adapters/anthropic.js +0 -13
  88. package/dist/adapters/anthropic.js.map +0 -1
  89. package/dist/adapters/gemini.d.ts +0 -14
  90. package/dist/adapters/gemini.js +0 -22
  91. package/dist/adapters/gemini.js.map +0 -1
  92. package/dist/adapters/grok.d.ts +0 -9
  93. package/dist/adapters/grok.js +0 -17
  94. package/dist/adapters/grok.js.map +0 -1
  95. package/dist/adapters/openai.d.ts +0 -17
  96. package/dist/adapters/openai.js +0 -29
  97. package/dist/adapters/openai.js.map +0 -1
  98. package/dist/adapters/openrouter.d.ts +0 -7
  99. package/dist/adapters/openrouter.js +0 -13
  100. package/dist/adapters/openrouter.js.map +0 -1
  101. package/dist/adapters/workers-ai-image.d.ts +0 -3
  102. package/dist/adapters/workers-ai-image.js +0 -13
  103. package/dist/adapters/workers-ai-image.js.map +0 -1
  104. package/dist/adapters/workers-ai-summarize.d.ts +0 -3
  105. package/dist/adapters/workers-ai-summarize.js +0 -12
  106. package/dist/adapters/workers-ai-summarize.js.map +0 -1
  107. package/dist/adapters/workers-ai-transcription.d.ts +0 -3
  108. package/dist/adapters/workers-ai-transcription.js +0 -13
  109. package/dist/adapters/workers-ai-transcription.js.map +0 -1
  110. package/dist/adapters/workers-ai-tts.d.ts +0 -3
  111. package/dist/adapters/workers-ai-tts.js +0 -13
  112. package/dist/adapters/workers-ai-tts.js.map +0 -1
  113. package/dist/adapters/workers-ai.cjs.map +0 -1
  114. package/dist/adapters/workers-ai.d.ts +0 -3
  115. package/dist/adapters/workers-ai.js +0 -11
  116. package/dist/adapters/workers-ai.js.map +0 -1
  117. package/dist/chunk-2VII5BK2.js +0 -42
  118. package/dist/chunk-2VII5BK2.js.map +0 -1
  119. package/dist/chunk-3VQDXJLW.cjs +0 -46
  120. package/dist/chunk-3VQDXJLW.cjs.map +0 -1
  121. package/dist/chunk-3WK5ZD57.js +0 -57
  122. package/dist/chunk-3WK5ZD57.js.map +0 -1
  123. package/dist/chunk-4DE2IREA.cjs +0 -8
  124. package/dist/chunk-4DE2IREA.cjs.map +0 -1
  125. package/dist/chunk-53A2QIXV.js +0 -98
  126. package/dist/chunk-53A2QIXV.js.map +0 -1
  127. package/dist/chunk-6MEX2ZSM.cjs +0 -48
  128. package/dist/chunk-6MEX2ZSM.cjs.map +0 -1
  129. package/dist/chunk-7HSUHP63.cjs +0 -42
  130. package/dist/chunk-7HSUHP63.cjs.map +0 -1
  131. package/dist/chunk-AIAJANLC.js +0 -327
  132. package/dist/chunk-AIAJANLC.js.map +0 -1
  133. package/dist/chunk-CB3PSZY2.cjs +0 -218
  134. package/dist/chunk-CB3PSZY2.cjs.map +0 -1
  135. package/dist/chunk-FQE2UKUU.cjs +0 -57
  136. package/dist/chunk-FQE2UKUU.cjs.map +0 -1
  137. package/dist/chunk-GL3HHR4M.js +0 -523
  138. package/dist/chunk-GL3HHR4M.js.map +0 -1
  139. package/dist/chunk-J5DSSZTO.js +0 -71
  140. package/dist/chunk-J5DSSZTO.js.map +0 -1
  141. package/dist/chunk-JRFPCMSE.js +0 -57
  142. package/dist/chunk-JRFPCMSE.js.map +0 -1
  143. package/dist/chunk-KWYOUT2Y.js +0 -111
  144. package/dist/chunk-KWYOUT2Y.js.map +0 -1
  145. package/dist/chunk-MJ45L566.cjs +0 -57
  146. package/dist/chunk-MJ45L566.cjs.map +0 -1
  147. package/dist/chunk-N6U27RQW.cjs +0 -111
  148. package/dist/chunk-N6U27RQW.cjs.map +0 -1
  149. package/dist/chunk-NH3FF5JC.js +0 -86
  150. package/dist/chunk-NH3FF5JC.js.map +0 -1
  151. package/dist/chunk-OFUYHQZE.cjs +0 -31
  152. package/dist/chunk-OFUYHQZE.cjs.map +0 -1
  153. package/dist/chunk-OUEAAP25.cjs +0 -523
  154. package/dist/chunk-OUEAAP25.cjs.map +0 -1
  155. package/dist/chunk-Q33U5I5S.js +0 -31
  156. package/dist/chunk-Q33U5I5S.js.map +0 -1
  157. package/dist/chunk-V4LKHWJA.cjs +0 -71
  158. package/dist/chunk-V4LKHWJA.cjs.map +0 -1
  159. package/dist/chunk-V6TY7KAL.js +0 -8
  160. package/dist/chunk-V6TY7KAL.js.map +0 -1
  161. package/dist/chunk-WBTQKWFN.cjs +0 -327
  162. package/dist/chunk-WBTQKWFN.cjs.map +0 -1
  163. package/dist/chunk-XU7YEPML.js +0 -46
  164. package/dist/chunk-XU7YEPML.js.map +0 -1
  165. package/dist/chunk-YCGNMVQZ.js +0 -218
  166. package/dist/chunk-YCGNMVQZ.js.map +0 -1
  167. package/dist/chunk-Z5ZC5ZOQ.js +0 -48
  168. package/dist/chunk-Z5ZC5ZOQ.js.map +0 -1
  169. package/dist/chunk-ZFB72L57.cjs +0 -86
  170. package/dist/chunk-ZFB72L57.cjs.map +0 -1
  171. package/dist/chunk-ZGLSJM26.cjs +0 -98
  172. package/dist/chunk-ZGLSJM26.cjs.map +0 -1
  173. package/dist/index.cjs.map +0 -1
  174. package/dist/index.d.ts +0 -64
  175. package/dist/index.js +0 -97
  176. package/dist/index.js.map +0 -1
@@ -1,3 +1,42 @@
1
- export { createWorkersAiSummarize_alias_1 as createWorkersAiSummarize } from '../_tsup-dts-rollup.cjs';
2
- export { WorkersAiSummarizeModel_alias_1 as WorkersAiSummarizeModel } from '../_tsup-dts-rollup.cjs';
3
- export { WorkersAiSummarizeAdapter } from '../_tsup-dts-rollup.cjs';
1
+ import { i as WorkersAiAdapterConfig } from "../create-fetcher-vAQ8WW-p.cjs";
2
+ import { SummarizationOptions, SummarizationResult } from "@tanstack/ai";
3
+ import { BaseSummarizeAdapter } from "@tanstack/ai/adapters";
4
+
5
+ //#region src/adapters/workers-ai-summarize.d.ts
6
+ /**
7
+ * Workers AI models that support summarization.
8
+ */
9
+ type WorkersAiSummarizeModel = "@cf/facebook/bart-large-cnn" | (string & {});
10
+ declare class WorkersAiSummarizeAdapter extends BaseSummarizeAdapter<WorkersAiSummarizeModel> {
11
+ readonly name: "workers-ai-summarize";
12
+ private adapterConfig;
13
+ constructor(config: WorkersAiAdapterConfig, model: WorkersAiSummarizeModel);
14
+ summarize(options: SummarizationOptions): Promise<SummarizationResult>;
15
+ private summarizeViaBinding;
16
+ private summarizeViaRest;
17
+ private summarizeViaGateway;
18
+ private wrapResult;
19
+ }
20
+ /**
21
+ * Creates a Workers AI summarization adapter.
22
+ *
23
+ * Works with TanStack AI's `summarize()` activity function:
24
+ * ```ts
25
+ * import { summarize } from "@tanstack/ai";
26
+ * import { createWorkersAiSummarize } from "@cloudflare/tanstack-ai";
27
+ *
28
+ * const adapter = createWorkersAiSummarize("@cf/facebook/bart-large-cnn", {
29
+ * binding: env.AI,
30
+ * });
31
+ *
32
+ * const result = await summarize({ adapter, text: "Long article here..." });
33
+ * // result.summary
34
+ * ```
35
+ *
36
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
37
+ * uses `(config, model)` to match TanStack AI's upstream convention.
38
+ */
39
+ declare function createWorkersAiSummarize(model: WorkersAiSummarizeModel, config: WorkersAiAdapterConfig): WorkersAiSummarizeAdapter;
40
+ //#endregion
41
+ export { WorkersAiSummarizeAdapter, WorkersAiSummarizeModel, createWorkersAiSummarize };
42
+ //# sourceMappingURL=workers-ai-summarize.d.cts.map
@@ -0,0 +1,42 @@
1
+ import { i as WorkersAiAdapterConfig } from "../create-fetcher-6p6heb85.mjs";
2
+ import { BaseSummarizeAdapter } from "@tanstack/ai/adapters";
3
+ import { SummarizationOptions, SummarizationResult } from "@tanstack/ai";
4
+
5
+ //#region src/adapters/workers-ai-summarize.d.ts
6
+ /**
7
+ * Workers AI models that support summarization.
8
+ */
9
+ type WorkersAiSummarizeModel = "@cf/facebook/bart-large-cnn" | (string & {});
10
+ declare class WorkersAiSummarizeAdapter extends BaseSummarizeAdapter<WorkersAiSummarizeModel> {
11
+ readonly name: "workers-ai-summarize";
12
+ private adapterConfig;
13
+ constructor(config: WorkersAiAdapterConfig, model: WorkersAiSummarizeModel);
14
+ summarize(options: SummarizationOptions): Promise<SummarizationResult>;
15
+ private summarizeViaBinding;
16
+ private summarizeViaRest;
17
+ private summarizeViaGateway;
18
+ private wrapResult;
19
+ }
20
+ /**
21
+ * Creates a Workers AI summarization adapter.
22
+ *
23
+ * Works with TanStack AI's `summarize()` activity function:
24
+ * ```ts
25
+ * import { summarize } from "@tanstack/ai";
26
+ * import { createWorkersAiSummarize } from "@cloudflare/tanstack-ai";
27
+ *
28
+ * const adapter = createWorkersAiSummarize("@cf/facebook/bart-large-cnn", {
29
+ * binding: env.AI,
30
+ * });
31
+ *
32
+ * const result = await summarize({ adapter, text: "Long article here..." });
33
+ * // result.summary
34
+ * ```
35
+ *
36
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
37
+ * uses `(config, model)` to match TanStack AI's upstream convention.
38
+ */
39
+ declare function createWorkersAiSummarize(model: WorkersAiSummarizeModel, config: WorkersAiAdapterConfig): WorkersAiSummarizeAdapter;
40
+ //#endregion
41
+ export { WorkersAiSummarizeAdapter, WorkersAiSummarizeModel, createWorkersAiSummarize };
42
+ //# sourceMappingURL=workers-ai-summarize.d.mts.map
@@ -0,0 +1,85 @@
1
+ import { a as validateWorkersAiConfig, i as isDirectCredentialsConfig, r as isDirectBindingConfig, t as createGatewayFetch } from "../create-fetcher-CeUOJgrh.mjs";
2
+ import { t as _defineProperty } from "../defineProperty-CbyrzcbA.mjs";
3
+ import { t as workersAiRestFetch } from "../workers-ai-rest-GKy2r7eG.mjs";
4
+ import { BaseSummarizeAdapter } from "@tanstack/ai/adapters";
5
+ //#region src/adapters/workers-ai-summarize.ts
6
+ var WorkersAiSummarizeAdapter = class extends BaseSummarizeAdapter {
7
+ constructor(config, model) {
8
+ super({}, model);
9
+ _defineProperty(this, "name", "workers-ai-summarize");
10
+ _defineProperty(this, "adapterConfig", void 0);
11
+ validateWorkersAiConfig(config);
12
+ this.adapterConfig = config;
13
+ }
14
+ async summarize(options) {
15
+ const { text, maxLength } = options;
16
+ const payload = { input_text: text };
17
+ if (maxLength != null) payload.max_length = maxLength;
18
+ if (isDirectBindingConfig(this.adapterConfig)) return this.summarizeViaBinding(payload);
19
+ if (isDirectCredentialsConfig(this.adapterConfig)) return this.summarizeViaRest(payload);
20
+ return this.summarizeViaGateway(payload);
21
+ }
22
+ async summarizeViaBinding(payload) {
23
+ const result = await this.adapterConfig.binding.run(this.model, payload);
24
+ return this.wrapResult(result.summary ?? "");
25
+ }
26
+ async summarizeViaRest(payload) {
27
+ const config = this.adapterConfig;
28
+ const data = await (await workersAiRestFetch(config, this.model, payload, { label: "Workers AI summarize" })).json();
29
+ return this.wrapResult(data.result?.summary ?? "");
30
+ }
31
+ async summarizeViaGateway(payload) {
32
+ const gatewayConfig = this.adapterConfig;
33
+ const response = await createGatewayFetch("workers-ai", gatewayConfig)("https://api.cloudflare.com/v1/ai/summarization", {
34
+ method: "POST",
35
+ body: JSON.stringify({
36
+ model: this.model,
37
+ ...payload
38
+ })
39
+ });
40
+ if (!response.ok) {
41
+ const errorText = await response.text();
42
+ throw new Error(`Workers AI summarize gateway request failed (${response.status}): ${errorText}`);
43
+ }
44
+ const data = await response.json();
45
+ return this.wrapResult(data.result?.summary ?? data.summary ?? "");
46
+ }
47
+ wrapResult(summary) {
48
+ return {
49
+ id: this.generateId(),
50
+ model: this.model,
51
+ summary,
52
+ usage: {
53
+ promptTokens: 0,
54
+ completionTokens: 0,
55
+ totalTokens: 0
56
+ }
57
+ };
58
+ }
59
+ };
60
+ /**
61
+ * Creates a Workers AI summarization adapter.
62
+ *
63
+ * Works with TanStack AI's `summarize()` activity function:
64
+ * ```ts
65
+ * import { summarize } from "@tanstack/ai";
66
+ * import { createWorkersAiSummarize } from "@cloudflare/tanstack-ai";
67
+ *
68
+ * const adapter = createWorkersAiSummarize("@cf/facebook/bart-large-cnn", {
69
+ * binding: env.AI,
70
+ * });
71
+ *
72
+ * const result = await summarize({ adapter, text: "Long article here..." });
73
+ * // result.summary
74
+ * ```
75
+ *
76
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
77
+ * uses `(config, model)` to match TanStack AI's upstream convention.
78
+ */
79
+ function createWorkersAiSummarize(model, config) {
80
+ return new WorkersAiSummarizeAdapter(config, model);
81
+ }
82
+ //#endregion
83
+ export { WorkersAiSummarizeAdapter, createWorkersAiSummarize };
84
+
85
+ //# sourceMappingURL=workers-ai-summarize.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workers-ai-summarize.mjs","names":[],"sources":["../../src/adapters/workers-ai-summarize.ts"],"sourcesContent":["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"],"mappings":";;;;;AA2BA,IAAa,4BAAb,cAA+C,qBAA8C;CAI5F,YAAY,QAAgC,OAAgC;AAC3E,QAAM,EAAE,EAAE,MAAM;wBAJR,QAAO,uBAAgC;wBACxC,iBAAA,KAAA,EAAsC;AAI7C,0BAAwB,OAAO;AAC/B,OAAK,gBAAgB;;CAGtB,MAAM,UAAU,SAA6D;EAC5E,MAAM,EAAE,MAAM,cAAc;EAE5B,MAAM,UAAmC,EAAE,YAAY,MAAM;AAC7D,MAAI,aAAa,KAAM,SAAQ,aAAa;AAE5C,MAAI,sBAAsB,KAAK,cAAc,CAC5C,QAAO,KAAK,oBAAoB,QAAQ;AAGzC,MAAI,0BAA0B,KAAK,cAAc,CAChD,QAAO,KAAK,iBAAiB,QAAQ;AAGtC,SAAO,KAAK,oBAAoB,QAAQ;;CAGzC,MAAc,oBACb,SAC+B;EAE/B,MAAM,SAAU,MADJ,KAAK,cAA+C,QACvC,IAAI,KAAK,OAAO,QAAQ;AACjD,SAAO,KAAK,WAAY,OAAO,WAAsB,GAAG;;CAGzD,MAAc,iBAAiB,SAAgE;EAC9F,MAAM,SAAS,KAAK;EAKpB,MAAM,OAAQ,OAJG,MAAM,mBAAmB,QAAQ,KAAK,OAAO,SAAS,EACtE,OAAO,wBACP,CAAC,EAE2B,MAAM;AACnC,SAAO,KAAK,WAAW,KAAK,QAAQ,WAAW,GAAG;;CAGnD,MAAc,oBACb,SAC+B;EAC/B,MAAM,gBAAgB,KAAK;EAM3B,MAAM,WAAW,MALI,mBAAmB,cAAc,cAAc,CAKhC,kDAAkD;GACrF,QAAQ;GACR,MAAM,KAAK,UAAU;IACpB,OAAO,KAAK;IACZ,GAAG;IACH,CAAC;GACF,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GACjB,MAAM,YAAY,MAAM,SAAS,MAAM;AACvC,SAAM,IAAI,MACT,gDAAgD,SAAS,OAAO,KAAK,YACrE;;EAGF,MAAM,OAAQ,MAAM,SAAS,MAAM;AACnC,SAAO,KAAK,WAAW,KAAK,QAAQ,WAAW,KAAK,WAAW,GAAG;;CAGnE,WAAmB,SAAsC;AACxD,SAAO;GACN,IAAI,KAAK,YAAY;GACrB,OAAO,KAAK;GACZ;GAEA,OAAO;IAAE,cAAc;IAAG,kBAAkB;IAAG,aAAa;IAAG;GAC/D;;;;;;;;;;;;;;;;;;;;;;AA2BH,SAAgB,yBACf,OACA,QACC;AACD,QAAO,IAAI,0BAA0B,QAAQ,MAAM"}
@@ -1,13 +1,202 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../workers-ai-BOZ5iyhY.cjs");
3
+ const require_create_fetcher = require("../create-fetcher-By-hTiT9.cjs");
4
+ const require_defineProperty = require("../defineProperty-DQoAg20E.cjs");
5
+ const require_workers_ai_rest = require("../workers-ai-rest-CkNCtBwv.cjs");
6
+ const require_binary = require("../binary-C9FAYwZj.cjs");
7
+ let _tanstack_ai_adapters = require("@tanstack/ai/adapters");
8
+ //#region src/adapters/workers-ai-transcription.ts
9
+ var WorkersAiTranscriptionAdapter = class extends _tanstack_ai_adapters.BaseTranscriptionAdapter {
10
+ constructor(config, model) {
11
+ super({}, model);
12
+ require_defineProperty._defineProperty(this, "name", "workers-ai-transcription");
13
+ require_defineProperty._defineProperty(this, "adapterConfig", void 0);
14
+ require_create_fetcher.validateWorkersAiConfig(config);
15
+ this.adapterConfig = config;
16
+ }
17
+ async transcribe(options) {
18
+ const { audio, language, prompt, modelOptions } = options;
19
+ const audioBytes = await normalizeAudioToBytes(audio);
20
+ const extra = { ...modelOptions };
21
+ if (language) extra.language = language;
22
+ if (prompt) extra.initial_prompt = prompt;
23
+ const audioPayload = this.buildAudioPayload(audioBytes, audio);
24
+ if (require_create_fetcher.isDirectBindingConfig(this.adapterConfig)) return this.transcribeViaBinding(audioPayload, extra);
25
+ if (require_create_fetcher.isDirectCredentialsConfig(this.adapterConfig)) {
26
+ if (this.model === "@cf/deepgram/nova-3") return this.transcribeViaRestBinary(audioBytes, audio, extra);
27
+ return this.transcribeViaRest(audioPayload, extra);
28
+ }
29
+ return this.transcribeViaGateway(audioPayload, extra);
30
+ }
31
+ /**
32
+ * Build the audio field for the request payload, handling model-specific formats.
33
+ *
34
+ * - `@cf/deepgram/nova-3` requires `{ body: base64, contentType: "audio/..." }`
35
+ * - `@cf/openai/whisper-large-v3-turbo` REST/gateway accepts a base64 string
36
+ * - Other Whisper models accept `number[]` (binding) or base64 (REST)
37
+ */
38
+ buildAudioPayload(audioBytes, originalAudio) {
39
+ if (this.model === "@cf/deepgram/nova-3") return { audio: {
40
+ body: require_binary.uint8ArrayToBase64(new Uint8Array(audioBytes)),
41
+ contentType: detectAudioContentType(originalAudio)
42
+ } };
43
+ if (this.model === "@cf/openai/whisper-large-v3-turbo") return { audio: require_binary.uint8ArrayToBase64(new Uint8Array(audioBytes)) };
44
+ return { audio: audioBytes };
45
+ }
46
+ async transcribeViaBinding(audioPayload, options) {
47
+ const result = await this.adapterConfig.binding.run(this.model, {
48
+ ...audioPayload,
49
+ ...options
50
+ });
51
+ return this.normalizeResult(result);
52
+ }
53
+ async transcribeViaRest(audioPayload, options) {
54
+ const config = this.adapterConfig;
55
+ const data = await (await require_workers_ai_rest.workersAiRestFetch(config, this.model, {
56
+ ...audioPayload,
57
+ ...options
58
+ }, {
59
+ label: "Workers AI transcription",
60
+ signal: options.signal
61
+ })).json();
62
+ return this.normalizeResult(data.result ?? data);
63
+ }
64
+ /**
65
+ * Transcribe via REST using raw binary audio.
66
+ * Required for models like Deepgram Nova-3 that expect raw audio bytes
67
+ * with a Content-Type header (e.g. "audio/wav") instead of JSON.
68
+ */
69
+ async transcribeViaRestBinary(audioBytes, originalAudio, options) {
70
+ const config = this.adapterConfig;
71
+ const contentType = detectAudioContentType(originalAudio);
72
+ const data = await (await require_workers_ai_rest.workersAiRestFetchBinary(config, this.model, new Uint8Array(audioBytes), contentType, {
73
+ label: "Workers AI transcription",
74
+ signal: options.signal
75
+ })).json();
76
+ return this.normalizeResult(data.result ?? data);
77
+ }
78
+ async transcribeViaGateway(audioPayload, options) {
79
+ const gatewayConfig = this.adapterConfig;
80
+ const response = await require_create_fetcher.createGatewayFetch("workers-ai", gatewayConfig)("https://api.cloudflare.com/v1/audio/transcriptions", {
81
+ method: "POST",
82
+ body: JSON.stringify({
83
+ model: this.model,
84
+ ...audioPayload,
85
+ ...options
86
+ })
87
+ });
88
+ if (!response.ok) {
89
+ const errorText = await response.text();
90
+ throw new Error(`Workers AI transcription gateway request failed (${response.status}): ${errorText}`);
91
+ }
92
+ const data = await response.json();
93
+ return this.normalizeResult(data);
94
+ }
95
+ /**
96
+ * Normalize Workers AI transcription results into the standard
97
+ * TanStack AI TranscriptionResult shape.
98
+ *
99
+ * Handles three response formats:
100
+ * - Whisper: `{ text, words?, vtt? }`
101
+ * - Whisper v3-turbo: `{ text, segments?, transcription_info? }`
102
+ * - Deepgram Nova-3: `{ results: { channels: [{ alternatives: [{ transcript, words }] }] } }`
103
+ */
104
+ normalizeResult(raw) {
105
+ const results = raw.results;
106
+ if (results?.channels) {
107
+ const alt = results.channels?.[0]?.alternatives?.[0];
108
+ const text = alt?.transcript ?? "";
109
+ const result = {
110
+ id: this.generateId(),
111
+ model: this.model,
112
+ text
113
+ };
114
+ if (alt?.words && Array.isArray(alt.words)) result.words = alt.words.map((w) => ({
115
+ word: w.word ?? "",
116
+ start: w.start ?? 0,
117
+ end: w.end ?? 0
118
+ }));
119
+ return result;
120
+ }
121
+ const result = {
122
+ id: this.generateId(),
123
+ model: this.model,
124
+ text: raw.text ?? ""
125
+ };
126
+ const transcriptionInfo = raw.transcription_info;
127
+ if (transcriptionInfo?.language) result.language = transcriptionInfo.language;
128
+ if (transcriptionInfo?.duration != null) result.duration = transcriptionInfo.duration;
129
+ if (raw.segments && Array.isArray(raw.segments)) result.segments = raw.segments.map((seg, idx) => ({
130
+ id: idx,
131
+ text: seg.text ?? "",
132
+ start: seg.start ?? 0,
133
+ end: seg.end ?? 0
134
+ }));
135
+ if (raw.words && Array.isArray(raw.words)) result.words = raw.words.map((w) => ({
136
+ word: w.word ?? "",
137
+ start: w.start ?? 0,
138
+ end: w.end ?? 0
139
+ }));
140
+ return result;
141
+ }
142
+ };
143
+ /**
144
+ * Creates a Workers AI transcription adapter for speech-to-text.
145
+ *
146
+ * Works with TanStack AI's `generateTranscription()` activity function:
147
+ * ```ts
148
+ * import { generateTranscription } from "@tanstack/ai";
149
+ * import { createWorkersAiTranscription } from "@cloudflare/tanstack-ai";
150
+ *
151
+ * const adapter = createWorkersAiTranscription(
152
+ * "@cf/openai/whisper-large-v3-turbo",
153
+ * { binding: env.AI },
154
+ * );
155
+ *
156
+ * const result = await generateTranscription({ adapter, audio: audioData });
157
+ * // result.text — the transcribed text
158
+ * ```
159
+ *
160
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
161
+ * uses `(config, model)` to match TanStack AI's upstream convention.
162
+ */
163
+ function createWorkersAiTranscription(model, config) {
164
+ return new WorkersAiTranscriptionAdapter(config, model);
165
+ }
166
+ /**
167
+ * Normalize various audio input formats into a number[] (raw bytes).
168
+ *
169
+ * Note: `File extends Blob`, so `File` instances are handled by the
170
+ * `instanceof Blob` branch. `Blob.arrayBuffer()` always reads the full
171
+ * contents regardless of any prior reads — there's no cursor to worry about.
172
+ */
173
+ async function normalizeAudioToBytes(audio) {
174
+ if (audio instanceof ArrayBuffer) return Array.from(new Uint8Array(audio));
175
+ if (audio instanceof Blob) {
176
+ const buffer = await audio.arrayBuffer();
177
+ return Array.from(new Uint8Array(buffer));
178
+ }
179
+ if (typeof audio === "string") {
180
+ const binary = atob(audio);
181
+ const bytes = new Uint8Array(binary.length);
182
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
183
+ return Array.from(bytes);
184
+ }
185
+ throw new Error("Unsupported audio format. Expected string, File, Blob, or ArrayBuffer.");
186
+ }
187
+ /**
188
+ * Detect the MIME type of the audio input for models that require it
189
+ * (e.g., Deepgram Nova-3).
190
+ *
191
+ * - `File` / `Blob`: use the `.type` property (e.g., "audio/wav")
192
+ * - `ArrayBuffer` / `string`: defaults to "audio/wav"
193
+ */
194
+ function detectAudioContentType(audio) {
195
+ if (audio instanceof Blob && audio.type) return audio.type;
196
+ return "audio/wav";
197
+ }
198
+ //#endregion
199
+ exports.WorkersAiTranscriptionAdapter = WorkersAiTranscriptionAdapter;
200
+ exports.createWorkersAiTranscription = createWorkersAiTranscription;
2
201
 
3
-
4
- var _chunkCB3PSZY2cjs = require('../chunk-CB3PSZY2.cjs');
5
- require('../chunk-3VQDXJLW.cjs');
6
- require('../chunk-7HSUHP63.cjs');
7
- require('../chunk-WBTQKWFN.cjs');
8
- require('../chunk-4DE2IREA.cjs');
9
-
10
-
11
-
12
- exports.WorkersAiTranscriptionAdapter = _chunkCB3PSZY2cjs.WorkersAiTranscriptionAdapter; exports.createWorkersAiTranscription = _chunkCB3PSZY2cjs.createWorkersAiTranscription;
13
202
  //# sourceMappingURL=workers-ai-transcription.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/ai/ai/packages/tanstack-ai/dist/adapters/workers-ai-transcription.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,yDAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B,iCAA8B;AAC9B;AACE;AACA;AACF,+KAAC","file":"/home/runner/work/ai/ai/packages/tanstack-ai/dist/adapters/workers-ai-transcription.cjs"}
1
+ {"version":3,"file":"workers-ai-transcription.cjs","names":["BaseTranscriptionAdapter","isDirectBindingConfig","isDirectCredentialsConfig","uint8ArrayToBase64","workersAiRestFetch","workersAiRestFetchBinary","createGatewayFetch"],"sources":["../../src/adapters/workers-ai-transcription.ts"],"sourcesContent":["import { BaseTranscriptionAdapter } from \"@tanstack/ai/adapters\";\nimport type { TranscriptionOptions, TranscriptionResult } 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, workersAiRestFetchBinary } from \"../utils/workers-ai-rest\";\nimport { uint8ArrayToBase64 } from \"../utils/binary\";\n\n// ---------------------------------------------------------------------------\n// Model types\n// ---------------------------------------------------------------------------\n\n/**\n * Workers AI models that support speech-to-text transcription.\n *\n * Note: the typed `AiModels` interface in `@cloudflare/workers-types` may lag\n * behind what's deployed. We use a string union here that matches the known\n * models including Deepgram partner models.\n *\n * **Nova-3 note:** `@cf/deepgram/nova-3` uses a different input format than the\n * Whisper models. Via binding it accepts `{ audio: { body: base64, contentType } }`.\n * Via REST it requires multipart form data (not JSON). The adapter handles both.\n */\nexport type WorkersAiTranscriptionModel =\n\t| \"@cf/openai/whisper\"\n\t| \"@cf/openai/whisper-tiny-en\"\n\t| \"@cf/openai/whisper-large-v3-turbo\"\n\t| \"@cf/deepgram/nova-3\"\n\t| (string & {});\n\n// ---------------------------------------------------------------------------\n// WorkersAiTranscriptionAdapter\n// ---------------------------------------------------------------------------\n\nexport class WorkersAiTranscriptionAdapter extends BaseTranscriptionAdapter<WorkersAiTranscriptionModel> {\n\treadonly name = \"workers-ai-transcription\" as const;\n\tprivate adapterConfig: WorkersAiAdapterConfig;\n\n\tconstructor(config: WorkersAiAdapterConfig, model: WorkersAiTranscriptionModel) {\n\t\tsuper({}, model);\n\t\tvalidateWorkersAiConfig(config);\n\t\tthis.adapterConfig = config;\n\t}\n\n\tasync transcribe(options: TranscriptionOptions): Promise<TranscriptionResult> {\n\t\tconst { audio, language, prompt, modelOptions } = options;\n\n\t\t// Normalize audio to raw bytes\n\t\tconst audioBytes = await normalizeAudioToBytes(audio);\n\n\t\tconst extra: Record<string, unknown> = { ...modelOptions };\n\t\tif (language) extra.language = language;\n\t\tif (prompt) extra.initial_prompt = prompt;\n\n\t\t// Build the model-specific audio payload:\n\t\t// - Deepgram Nova-3 (binding): { audio: { body: base64, contentType: \"audio/...\" } }\n\t\t// - Deepgram Nova-3 (REST): multipart FormData (handled separately)\n\t\t// - Whisper Large v3 Turbo (REST/gateway): { audio: base64string }\n\t\t// - Other Whisper models (binding): { audio: number[] }\n\t\tconst audioPayload = this.buildAudioPayload(audioBytes, audio);\n\n\t\tif (isDirectBindingConfig(this.adapterConfig)) {\n\t\t\treturn this.transcribeViaBinding(audioPayload, extra);\n\t\t}\n\n\t\tif (isDirectCredentialsConfig(this.adapterConfig)) {\n\t\t\t// Nova-3 REST requires raw binary audio, not JSON\n\t\t\tif (this.model === \"@cf/deepgram/nova-3\") {\n\t\t\t\treturn this.transcribeViaRestBinary(audioBytes, audio, extra);\n\t\t\t}\n\t\t\treturn this.transcribeViaRest(audioPayload, extra);\n\t\t}\n\n\t\treturn this.transcribeViaGateway(audioPayload, extra);\n\t}\n\n\t/**\n\t * Build the audio field for the request payload, handling model-specific formats.\n\t *\n\t * - `@cf/deepgram/nova-3` requires `{ body: base64, contentType: \"audio/...\" }`\n\t * - `@cf/openai/whisper-large-v3-turbo` REST/gateway accepts a base64 string\n\t * - Other Whisper models accept `number[]` (binding) or base64 (REST)\n\t */\n\tprivate buildAudioPayload(\n\t\taudioBytes: number[],\n\t\toriginalAudio: string | File | Blob | ArrayBuffer,\n\t): Record<string, unknown> {\n\t\tif (this.model === \"@cf/deepgram/nova-3\") {\n\t\t\tconst b64 = uint8ArrayToBase64(new Uint8Array(audioBytes));\n\t\t\tconst contentType = detectAudioContentType(originalAudio);\n\t\t\treturn { audio: { body: b64, contentType } };\n\t\t}\n\n\t\tif (this.model === \"@cf/openai/whisper-large-v3-turbo\") {\n\t\t\treturn { audio: uint8ArrayToBase64(new Uint8Array(audioBytes)) };\n\t\t}\n\n\t\treturn { audio: audioBytes };\n\t}\n\n\tprivate async transcribeViaBinding(\n\t\taudioPayload: Record<string, unknown>,\n\t\toptions: Record<string, unknown>,\n\t): Promise<TranscriptionResult> {\n\t\tconst ai = (this.adapterConfig as WorkersAiDirectBindingConfig).binding;\n\t\tconst result = (await ai.run(this.model, {\n\t\t\t...audioPayload,\n\t\t\t...options,\n\t\t})) as Record<string, unknown>;\n\t\treturn this.normalizeResult(result);\n\t}\n\n\tprivate async transcribeViaRest(\n\t\taudioPayload: Record<string, unknown>,\n\t\toptions: Record<string, unknown>,\n\t): Promise<TranscriptionResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\n\t\tconst response = await workersAiRestFetch(\n\t\t\tconfig,\n\t\t\tthis.model,\n\t\t\t{ ...audioPayload, ...options },\n\t\t\t{\n\t\t\t\tlabel: \"Workers AI transcription\",\n\t\t\t\tsignal: (options as { signal?: AbortSignal }).signal,\n\t\t\t},\n\t\t);\n\n\t\tconst data = (await response.json()) as {\n\t\t\tresult?: Record<string, unknown>;\n\t\t} & Record<string, unknown>;\n\n\t\t// Cloudflare REST API wraps responses in { success, result: {...} }.\n\t\t// Use `data.result` when present, fall back to `data` for direct responses.\n\t\treturn this.normalizeResult(data.result ?? data);\n\t}\n\n\t/**\n\t * Transcribe via REST using raw binary audio.\n\t * Required for models like Deepgram Nova-3 that expect raw audio bytes\n\t * with a Content-Type header (e.g. \"audio/wav\") instead of JSON.\n\t */\n\tprivate async transcribeViaRestBinary(\n\t\taudioBytes: number[],\n\t\toriginalAudio: string | File | Blob | ArrayBuffer,\n\t\toptions: Record<string, unknown>,\n\t): Promise<TranscriptionResult> {\n\t\tconst config = this.adapterConfig as WorkersAiDirectCredentialsConfig;\n\t\tconst contentType = detectAudioContentType(originalAudio);\n\n\t\tconst response = await workersAiRestFetchBinary(\n\t\t\tconfig,\n\t\t\tthis.model,\n\t\t\tnew Uint8Array(audioBytes),\n\t\t\tcontentType,\n\t\t\t{\n\t\t\t\tlabel: \"Workers AI transcription\",\n\t\t\t\tsignal: (options as { signal?: AbortSignal }).signal,\n\t\t\t},\n\t\t);\n\n\t\tconst data = (await response.json()) as {\n\t\t\tresult?: Record<string, unknown>;\n\t\t} & Record<string, unknown>;\n\n\t\treturn this.normalizeResult(data.result ?? data);\n\t}\n\n\tprivate async transcribeViaGateway(\n\t\taudioPayload: Record<string, unknown>,\n\t\toptions: Record<string, unknown>,\n\t): Promise<TranscriptionResult> {\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/audio/transcriptions\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmodel: this.model,\n\t\t\t\t...audioPayload,\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 transcription gateway request failed (${response.status}): ${errorText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await response.json()) as Record<string, unknown>;\n\t\treturn this.normalizeResult(data);\n\t}\n\n\t/**\n\t * Normalize Workers AI transcription results into the standard\n\t * TanStack AI TranscriptionResult shape.\n\t *\n\t * Handles three response formats:\n\t * - Whisper: `{ text, words?, vtt? }`\n\t * - Whisper v3-turbo: `{ text, segments?, transcription_info? }`\n\t * - Deepgram Nova-3: `{ results: { channels: [{ alternatives: [{ transcript, words }] }] } }`\n\t */\n\tprivate normalizeResult(raw: Record<string, unknown>): TranscriptionResult {\n\t\t// Deepgram Nova-3 format: { results: { channels: [{ alternatives: [{ transcript, words }] }] } }\n\t\tconst results = raw.results as Record<string, unknown> | undefined;\n\t\tif (results?.channels) {\n\t\t\tconst channels = results.channels as Array<{\n\t\t\t\talternatives?: Array<{\n\t\t\t\t\ttranscript?: string;\n\t\t\t\t\tconfidence?: number;\n\t\t\t\t\twords?: Array<{ word: string; start: number; end: number; confidence: number }>;\n\t\t\t\t}>;\n\t\t\t}>;\n\t\t\tconst alt = channels?.[0]?.alternatives?.[0];\n\t\t\tconst text = alt?.transcript ?? \"\";\n\t\t\tconst result: TranscriptionResult = {\n\t\t\t\tid: this.generateId(),\n\t\t\t\tmodel: this.model,\n\t\t\t\ttext,\n\t\t\t};\n\t\t\tif (alt?.words && Array.isArray(alt.words)) {\n\t\t\t\tresult.words = alt.words.map((w) => ({\n\t\t\t\t\tword: w.word ?? \"\",\n\t\t\t\t\tstart: w.start ?? 0,\n\t\t\t\t\tend: w.end ?? 0,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\t// Whisper format: { text, words?, vtt? }\n\t\t// Whisper v3-turbo format: { text, segments?, transcription_info? }\n\t\tconst result: TranscriptionResult = {\n\t\t\tid: this.generateId(),\n\t\t\tmodel: this.model,\n\t\t\ttext: (raw.text as string) ?? \"\",\n\t\t};\n\n\t\t// Language from transcription_info (whisper-large-v3-turbo)\n\t\tconst transcriptionInfo = raw.transcription_info as Record<string, unknown> | undefined;\n\t\tif (transcriptionInfo?.language) {\n\t\t\tresult.language = transcriptionInfo.language as string;\n\t\t}\n\n\t\t// Duration\n\t\tif (transcriptionInfo?.duration != null) {\n\t\t\tresult.duration = transcriptionInfo.duration as number;\n\t\t}\n\n\t\t// Segments (whisper-large-v3-turbo returns these)\n\t\tif (raw.segments && Array.isArray(raw.segments)) {\n\t\t\tresult.segments = raw.segments.map((seg: Record<string, unknown>, idx: number) => ({\n\t\t\t\tid: idx,\n\t\t\t\ttext: (seg.text as string) ?? \"\",\n\t\t\t\tstart: (seg.start as number) ?? 0,\n\t\t\t\tend: (seg.end as number) ?? 0,\n\t\t\t}));\n\t\t}\n\n\t\t// Words — basic whisper returns top-level words[], v3-turbo nests them in segments\n\t\tif (raw.words && Array.isArray(raw.words)) {\n\t\t\tresult.words = raw.words.map((w: Record<string, unknown>) => ({\n\t\t\t\tword: (w.word as string) ?? \"\",\n\t\t\t\tstart: (w.start as number) ?? 0,\n\t\t\t\tend: (w.end as number) ?? 0,\n\t\t\t}));\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Creates a Workers AI transcription adapter for speech-to-text.\n *\n * Works with TanStack AI's `generateTranscription()` activity function:\n * ```ts\n * import { generateTranscription } from \"@tanstack/ai\";\n * import { createWorkersAiTranscription } from \"@cloudflare/tanstack-ai\";\n *\n * const adapter = createWorkersAiTranscription(\n * \"@cf/openai/whisper-large-v3-turbo\",\n * { binding: env.AI },\n * );\n *\n * const result = await generateTranscription({ adapter, audio: audioData });\n * // result.text — the transcribed text\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 createWorkersAiTranscription(\n\tmodel: WorkersAiTranscriptionModel,\n\tconfig: WorkersAiAdapterConfig,\n) {\n\treturn new WorkersAiTranscriptionAdapter(config, model);\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize various audio input formats into a number[] (raw bytes).\n *\n * Note: `File extends Blob`, so `File` instances are handled by the\n * `instanceof Blob` branch. `Blob.arrayBuffer()` always reads the full\n * contents regardless of any prior reads — there's no cursor to worry about.\n */\nasync function normalizeAudioToBytes(audio: string | File | Blob | ArrayBuffer): Promise<number[]> {\n\tif (audio instanceof ArrayBuffer) {\n\t\treturn Array.from(new Uint8Array(audio));\n\t}\n\n\tif (audio instanceof Blob) {\n\t\t// This also handles `File` (which extends Blob)\n\t\tconst buffer = await audio.arrayBuffer();\n\t\treturn Array.from(new Uint8Array(buffer));\n\t}\n\n\tif (typeof audio === \"string\") {\n\t\t// Assume base64 string — decode to bytes\n\t\tconst binary = atob(audio);\n\t\tconst bytes = new Uint8Array(binary.length);\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbytes[i] = binary.charCodeAt(i);\n\t\t}\n\t\treturn Array.from(bytes);\n\t}\n\n\tthrow new Error(\"Unsupported audio format. Expected string, File, Blob, or ArrayBuffer.\");\n}\n\n/**\n * Detect the MIME type of the audio input for models that require it\n * (e.g., Deepgram Nova-3).\n *\n * - `File` / `Blob`: use the `.type` property (e.g., \"audio/wav\")\n * - `ArrayBuffer` / `string`: defaults to \"audio/wav\"\n */\nfunction detectAudioContentType(audio: string | File | Blob | ArrayBuffer): string {\n\t// File and Blob carry their own MIME type\n\tif (audio instanceof Blob && audio.type) {\n\t\treturn audio.type;\n\t}\n\n\t// For raw bytes, default to audio/wav — this is the most common\n\t// format for transcription inputs and what the E2E tests use.\n\treturn \"audio/wav\";\n}\n"],"mappings":"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"}
@@ -1,3 +1,74 @@
1
- export { createWorkersAiTranscription_alias_1 as createWorkersAiTranscription } from '../_tsup-dts-rollup.cjs';
2
- export { WorkersAiTranscriptionModel_alias_1 as WorkersAiTranscriptionModel } from '../_tsup-dts-rollup.cjs';
3
- export { WorkersAiTranscriptionAdapter } from '../_tsup-dts-rollup.cjs';
1
+ import { i as WorkersAiAdapterConfig } from "../create-fetcher-vAQ8WW-p.cjs";
2
+ import { TranscriptionOptions, TranscriptionResult } from "@tanstack/ai";
3
+ import { BaseTranscriptionAdapter } from "@tanstack/ai/adapters";
4
+
5
+ //#region src/adapters/workers-ai-transcription.d.ts
6
+ /**
7
+ * Workers AI models that support speech-to-text transcription.
8
+ *
9
+ * Note: the typed `AiModels` interface in `@cloudflare/workers-types` may lag
10
+ * behind what's deployed. We use a string union here that matches the known
11
+ * models including Deepgram partner models.
12
+ *
13
+ * **Nova-3 note:** `@cf/deepgram/nova-3` uses a different input format than the
14
+ * Whisper models. Via binding it accepts `{ audio: { body: base64, contentType } }`.
15
+ * Via REST it requires multipart form data (not JSON). The adapter handles both.
16
+ */
17
+ type WorkersAiTranscriptionModel = "@cf/openai/whisper" | "@cf/openai/whisper-tiny-en" | "@cf/openai/whisper-large-v3-turbo" | "@cf/deepgram/nova-3" | (string & {});
18
+ declare class WorkersAiTranscriptionAdapter extends BaseTranscriptionAdapter<WorkersAiTranscriptionModel> {
19
+ readonly name: "workers-ai-transcription";
20
+ private adapterConfig;
21
+ constructor(config: WorkersAiAdapterConfig, model: WorkersAiTranscriptionModel);
22
+ transcribe(options: TranscriptionOptions): Promise<TranscriptionResult>;
23
+ /**
24
+ * Build the audio field for the request payload, handling model-specific formats.
25
+ *
26
+ * - `@cf/deepgram/nova-3` requires `{ body: base64, contentType: "audio/..." }`
27
+ * - `@cf/openai/whisper-large-v3-turbo` REST/gateway accepts a base64 string
28
+ * - Other Whisper models accept `number[]` (binding) or base64 (REST)
29
+ */
30
+ private buildAudioPayload;
31
+ private transcribeViaBinding;
32
+ private transcribeViaRest;
33
+ /**
34
+ * Transcribe via REST using raw binary audio.
35
+ * Required for models like Deepgram Nova-3 that expect raw audio bytes
36
+ * with a Content-Type header (e.g. "audio/wav") instead of JSON.
37
+ */
38
+ private transcribeViaRestBinary;
39
+ private transcribeViaGateway;
40
+ /**
41
+ * Normalize Workers AI transcription results into the standard
42
+ * TanStack AI TranscriptionResult shape.
43
+ *
44
+ * Handles three response formats:
45
+ * - Whisper: `{ text, words?, vtt? }`
46
+ * - Whisper v3-turbo: `{ text, segments?, transcription_info? }`
47
+ * - Deepgram Nova-3: `{ results: { channels: [{ alternatives: [{ transcript, words }] }] } }`
48
+ */
49
+ private normalizeResult;
50
+ }
51
+ /**
52
+ * Creates a Workers AI transcription adapter for speech-to-text.
53
+ *
54
+ * Works with TanStack AI's `generateTranscription()` activity function:
55
+ * ```ts
56
+ * import { generateTranscription } from "@tanstack/ai";
57
+ * import { createWorkersAiTranscription } from "@cloudflare/tanstack-ai";
58
+ *
59
+ * const adapter = createWorkersAiTranscription(
60
+ * "@cf/openai/whisper-large-v3-turbo",
61
+ * { binding: env.AI },
62
+ * );
63
+ *
64
+ * const result = await generateTranscription({ adapter, audio: audioData });
65
+ * // result.text — the transcribed text
66
+ * ```
67
+ *
68
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
69
+ * uses `(config, model)` to match TanStack AI's upstream convention.
70
+ */
71
+ declare function createWorkersAiTranscription(model: WorkersAiTranscriptionModel, config: WorkersAiAdapterConfig): WorkersAiTranscriptionAdapter;
72
+ //#endregion
73
+ export { WorkersAiTranscriptionAdapter, WorkersAiTranscriptionModel, createWorkersAiTranscription };
74
+ //# sourceMappingURL=workers-ai-transcription.d.cts.map
@@ -0,0 +1,74 @@
1
+ import { i as WorkersAiAdapterConfig } from "../create-fetcher-6p6heb85.mjs";
2
+ import { BaseTranscriptionAdapter } from "@tanstack/ai/adapters";
3
+ import { TranscriptionOptions, TranscriptionResult } from "@tanstack/ai";
4
+
5
+ //#region src/adapters/workers-ai-transcription.d.ts
6
+ /**
7
+ * Workers AI models that support speech-to-text transcription.
8
+ *
9
+ * Note: the typed `AiModels` interface in `@cloudflare/workers-types` may lag
10
+ * behind what's deployed. We use a string union here that matches the known
11
+ * models including Deepgram partner models.
12
+ *
13
+ * **Nova-3 note:** `@cf/deepgram/nova-3` uses a different input format than the
14
+ * Whisper models. Via binding it accepts `{ audio: { body: base64, contentType } }`.
15
+ * Via REST it requires multipart form data (not JSON). The adapter handles both.
16
+ */
17
+ type WorkersAiTranscriptionModel = "@cf/openai/whisper" | "@cf/openai/whisper-tiny-en" | "@cf/openai/whisper-large-v3-turbo" | "@cf/deepgram/nova-3" | (string & {});
18
+ declare class WorkersAiTranscriptionAdapter extends BaseTranscriptionAdapter<WorkersAiTranscriptionModel> {
19
+ readonly name: "workers-ai-transcription";
20
+ private adapterConfig;
21
+ constructor(config: WorkersAiAdapterConfig, model: WorkersAiTranscriptionModel);
22
+ transcribe(options: TranscriptionOptions): Promise<TranscriptionResult>;
23
+ /**
24
+ * Build the audio field for the request payload, handling model-specific formats.
25
+ *
26
+ * - `@cf/deepgram/nova-3` requires `{ body: base64, contentType: "audio/..." }`
27
+ * - `@cf/openai/whisper-large-v3-turbo` REST/gateway accepts a base64 string
28
+ * - Other Whisper models accept `number[]` (binding) or base64 (REST)
29
+ */
30
+ private buildAudioPayload;
31
+ private transcribeViaBinding;
32
+ private transcribeViaRest;
33
+ /**
34
+ * Transcribe via REST using raw binary audio.
35
+ * Required for models like Deepgram Nova-3 that expect raw audio bytes
36
+ * with a Content-Type header (e.g. "audio/wav") instead of JSON.
37
+ */
38
+ private transcribeViaRestBinary;
39
+ private transcribeViaGateway;
40
+ /**
41
+ * Normalize Workers AI transcription results into the standard
42
+ * TanStack AI TranscriptionResult shape.
43
+ *
44
+ * Handles three response formats:
45
+ * - Whisper: `{ text, words?, vtt? }`
46
+ * - Whisper v3-turbo: `{ text, segments?, transcription_info? }`
47
+ * - Deepgram Nova-3: `{ results: { channels: [{ alternatives: [{ transcript, words }] }] } }`
48
+ */
49
+ private normalizeResult;
50
+ }
51
+ /**
52
+ * Creates a Workers AI transcription adapter for speech-to-text.
53
+ *
54
+ * Works with TanStack AI's `generateTranscription()` activity function:
55
+ * ```ts
56
+ * import { generateTranscription } from "@tanstack/ai";
57
+ * import { createWorkersAiTranscription } from "@cloudflare/tanstack-ai";
58
+ *
59
+ * const adapter = createWorkersAiTranscription(
60
+ * "@cf/openai/whisper-large-v3-turbo",
61
+ * { binding: env.AI },
62
+ * );
63
+ *
64
+ * const result = await generateTranscription({ adapter, audio: audioData });
65
+ * // result.text — the transcribed text
66
+ * ```
67
+ *
68
+ * Note: Factory takes `(model, config)` for ergonomics — the class constructor
69
+ * uses `(config, model)` to match TanStack AI's upstream convention.
70
+ */
71
+ declare function createWorkersAiTranscription(model: WorkersAiTranscriptionModel, config: WorkersAiAdapterConfig): WorkersAiTranscriptionAdapter;
72
+ //#endregion
73
+ export { WorkersAiTranscriptionAdapter, WorkersAiTranscriptionModel, createWorkersAiTranscription };
74
+ //# sourceMappingURL=workers-ai-transcription.d.mts.map