@rudderjs/ai 1.17.2 → 1.18.0

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 (377) hide show
  1. package/README.md +19 -1274
  2. package/dist/budget-orm/index.d.ts +1 -95
  3. package/dist/budget-orm/index.d.ts.map +1 -1
  4. package/dist/budget-orm/index.js +4 -176
  5. package/dist/budget-orm/index.js.map +1 -1
  6. package/dist/chat-mentions.d.ts +1 -58
  7. package/dist/chat-mentions.d.ts.map +1 -1
  8. package/dist/chat-mentions.js +4 -80
  9. package/dist/chat-mentions.js.map +1 -1
  10. package/dist/commands/ai-eval.d.ts +1 -92
  11. package/dist/commands/ai-eval.d.ts.map +1 -1
  12. package/dist/commands/ai-eval.js +4 -377
  13. package/dist/commands/ai-eval.js.map +1 -1
  14. package/dist/commands/make-agent.d.ts +1 -2
  15. package/dist/commands/make-agent.d.ts.map +1 -1
  16. package/dist/commands/make-agent.js +4 -22
  17. package/dist/commands/make-agent.js.map +1 -1
  18. package/dist/computer-use/index.d.ts +1 -52
  19. package/dist/computer-use/index.d.ts.map +1 -1
  20. package/dist/computer-use/index.js +4 -50
  21. package/dist/computer-use/index.js.map +1 -1
  22. package/dist/conversation-orm/index.d.ts +1 -108
  23. package/dist/conversation-orm/index.d.ts.map +1 -1
  24. package/dist/conversation-orm/index.js +4 -214
  25. package/dist/conversation-orm/index.js.map +1 -1
  26. package/dist/doctor.d.ts +1 -1
  27. package/dist/doctor.d.ts.map +1 -1
  28. package/dist/doctor.js +4 -65
  29. package/dist/doctor.js.map +1 -1
  30. package/dist/eval/index.d.ts +1 -270
  31. package/dist/eval/index.d.ts.map +1 -1
  32. package/dist/eval/index.js +4 -509
  33. package/dist/eval/index.js.map +1 -1
  34. package/dist/gateway/index.d.ts +1 -10
  35. package/dist/gateway/index.d.ts.map +1 -1
  36. package/dist/gateway/index.js +4 -10
  37. package/dist/gateway/index.js.map +1 -1
  38. package/dist/index.d.ts +1 -66
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -78
  41. package/dist/index.js.map +1 -1
  42. package/dist/mcp/index.d.ts +1 -15
  43. package/dist/mcp/index.d.ts.map +1 -1
  44. package/dist/mcp/index.js +4 -14
  45. package/dist/mcp/index.js.map +1 -1
  46. package/dist/memory-embedding/index.d.ts +1 -120
  47. package/dist/memory-embedding/index.d.ts.map +1 -1
  48. package/dist/memory-embedding/index.js +4 -228
  49. package/dist/memory-embedding/index.js.map +1 -1
  50. package/dist/memory-orm/index.d.ts +1 -117
  51. package/dist/memory-orm/index.d.ts.map +1 -1
  52. package/dist/memory-orm/index.js +4 -186
  53. package/dist/memory-orm/index.js.map +1 -1
  54. package/dist/node/index.d.ts +1 -2
  55. package/dist/node/index.d.ts.map +1 -1
  56. package/dist/node/index.js +4 -2
  57. package/dist/node/index.js.map +1 -1
  58. package/dist/observers.d.ts +1 -129
  59. package/dist/observers.d.ts.map +1 -1
  60. package/dist/observers.js +4 -39
  61. package/dist/observers.js.map +1 -1
  62. package/dist/react/index.d.ts +1 -15
  63. package/dist/react/index.d.ts.map +1 -1
  64. package/dist/react/index.js +4 -15
  65. package/dist/react/index.js.map +1 -1
  66. package/dist/server/index.d.ts +1 -1
  67. package/dist/server/index.d.ts.map +1 -1
  68. package/dist/server/index.js +4 -1
  69. package/dist/server/index.js.map +1 -1
  70. package/package.json +9 -13
  71. package/boost/guidelines.md +0 -260
  72. package/boost/skills/ai-agents/SKILL.md +0 -240
  73. package/boost/skills/ai-tools/SKILL.md +0 -260
  74. package/dist/agent-run-store.d.ts +0 -161
  75. package/dist/agent-run-store.d.ts.map +0 -1
  76. package/dist/agent-run-store.js +0 -98
  77. package/dist/agent-run-store.js.map +0 -1
  78. package/dist/agent-sse.d.ts +0 -153
  79. package/dist/agent-sse.d.ts.map +0 -1
  80. package/dist/agent-sse.js +0 -282
  81. package/dist/agent-sse.js.map +0 -1
  82. package/dist/agent.d.ts +0 -508
  83. package/dist/agent.d.ts.map +0 -1
  84. package/dist/agent.js +0 -1538
  85. package/dist/agent.js.map +0 -1
  86. package/dist/attachment.d.ts +0 -31
  87. package/dist/attachment.d.ts.map +0 -1
  88. package/dist/attachment.js +0 -89
  89. package/dist/attachment.js.map +0 -1
  90. package/dist/audio.d.ts +0 -45
  91. package/dist/audio.d.ts.map +0 -1
  92. package/dist/audio.js +0 -93
  93. package/dist/audio.js.map +0 -1
  94. package/dist/base64.d.ts +0 -7
  95. package/dist/base64.d.ts.map +0 -1
  96. package/dist/base64.js +0 -39
  97. package/dist/base64.js.map +0 -1
  98. package/dist/budget/pricing.d.ts +0 -124
  99. package/dist/budget/pricing.d.ts.map +0 -1
  100. package/dist/budget/pricing.js +0 -175
  101. package/dist/budget/pricing.js.map +0 -1
  102. package/dist/budget/storage.d.ts +0 -104
  103. package/dist/budget/storage.d.ts.map +0 -1
  104. package/dist/budget/storage.js +0 -0
  105. package/dist/budget/storage.js.map +0 -1
  106. package/dist/budget/with-budget.d.ts +0 -119
  107. package/dist/budget/with-budget.d.ts.map +0 -1
  108. package/dist/budget/with-budget.js +0 -175
  109. package/dist/budget/with-budget.js.map +0 -1
  110. package/dist/cached-embedding.d.ts +0 -14
  111. package/dist/cached-embedding.d.ts.map +0 -1
  112. package/dist/cached-embedding.js +0 -44
  113. package/dist/cached-embedding.js.map +0 -1
  114. package/dist/computer-use/actions.d.ts +0 -214
  115. package/dist/computer-use/actions.d.ts.map +0 -1
  116. package/dist/computer-use/actions.js +0 -48
  117. package/dist/computer-use/actions.js.map +0 -1
  118. package/dist/computer-use/errors.d.ts +0 -57
  119. package/dist/computer-use/errors.d.ts.map +0 -1
  120. package/dist/computer-use/errors.js +0 -76
  121. package/dist/computer-use/errors.js.map +0 -1
  122. package/dist/computer-use/playwright.d.ts +0 -76
  123. package/dist/computer-use/playwright.d.ts.map +0 -1
  124. package/dist/computer-use/playwright.js +0 -270
  125. package/dist/computer-use/playwright.js.map +0 -1
  126. package/dist/computer-use/tool.d.ts +0 -154
  127. package/dist/computer-use/tool.d.ts.map +0 -1
  128. package/dist/computer-use/tool.js +0 -210
  129. package/dist/computer-use/tool.js.map +0 -1
  130. package/dist/continuation-validation.d.ts +0 -85
  131. package/dist/continuation-validation.d.ts.map +0 -1
  132. package/dist/continuation-validation.js +0 -166
  133. package/dist/continuation-validation.js.map +0 -1
  134. package/dist/conversation-persistence.d.ts +0 -46
  135. package/dist/conversation-persistence.d.ts.map +0 -1
  136. package/dist/conversation-persistence.js +0 -176
  137. package/dist/conversation-persistence.js.map +0 -1
  138. package/dist/conversation.d.ts +0 -11
  139. package/dist/conversation.d.ts.map +0 -1
  140. package/dist/conversation.js +0 -55
  141. package/dist/conversation.js.map +0 -1
  142. package/dist/eval/fixtures.d.ts +0 -65
  143. package/dist/eval/fixtures.d.ts.map +0 -1
  144. package/dist/eval/fixtures.js +0 -110
  145. package/dist/eval/fixtures.js.map +0 -1
  146. package/dist/eval/html-reporter.d.ts +0 -25
  147. package/dist/eval/html-reporter.d.ts.map +0 -1
  148. package/dist/eval/html-reporter.js +0 -209
  149. package/dist/eval/html-reporter.js.map +0 -1
  150. package/dist/eval/json-reporter.d.ts +0 -43
  151. package/dist/eval/json-reporter.d.ts.map +0 -1
  152. package/dist/eval/json-reporter.js +0 -40
  153. package/dist/eval/json-reporter.js.map +0 -1
  154. package/dist/facade.d.ts +0 -96
  155. package/dist/facade.d.ts.map +0 -1
  156. package/dist/facade.js +0 -146
  157. package/dist/facade.js.map +0 -1
  158. package/dist/fake.d.ts +0 -201
  159. package/dist/fake.d.ts.map +0 -1
  160. package/dist/fake.js +0 -428
  161. package/dist/fake.js.map +0 -1
  162. package/dist/file-search.d.ts +0 -168
  163. package/dist/file-search.d.ts.map +0 -1
  164. package/dist/file-search.js +0 -158
  165. package/dist/file-search.js.map +0 -1
  166. package/dist/files.d.ts +0 -27
  167. package/dist/files.d.ts.map +0 -1
  168. package/dist/files.js +0 -44
  169. package/dist/files.js.map +0 -1
  170. package/dist/gateway/http-gateway-adapter.d.ts +0 -94
  171. package/dist/gateway/http-gateway-adapter.d.ts.map +0 -1
  172. package/dist/gateway/http-gateway-adapter.js +0 -106
  173. package/dist/gateway/http-gateway-adapter.js.map +0 -1
  174. package/dist/gateway/sse.d.ts +0 -28
  175. package/dist/gateway/sse.d.ts.map +0 -1
  176. package/dist/gateway/sse.js +0 -78
  177. package/dist/gateway/sse.js.map +0 -1
  178. package/dist/handoff.d.ts +0 -95
  179. package/dist/handoff.d.ts.map +0 -1
  180. package/dist/handoff.js +0 -78
  181. package/dist/handoff.js.map +0 -1
  182. package/dist/handoffs-driver.d.ts +0 -58
  183. package/dist/handoffs-driver.d.ts.map +0 -1
  184. package/dist/handoffs-driver.js +0 -103
  185. package/dist/handoffs-driver.js.map +0 -1
  186. package/dist/image.d.ts +0 -40
  187. package/dist/image.d.ts.map +0 -1
  188. package/dist/image.js +0 -109
  189. package/dist/image.js.map +0 -1
  190. package/dist/mcp/client-tools.d.ts +0 -39
  191. package/dist/mcp/client-tools.d.ts.map +0 -1
  192. package/dist/mcp/client-tools.js +0 -147
  193. package/dist/mcp/client-tools.js.map +0 -1
  194. package/dist/mcp/server-from-agent.d.ts +0 -24
  195. package/dist/mcp/server-from-agent.d.ts.map +0 -1
  196. package/dist/mcp/server-from-agent.js +0 -113
  197. package/dist/mcp/server-from-agent.js.map +0 -1
  198. package/dist/mcp/types.d.ts +0 -64
  199. package/dist/mcp/types.d.ts.map +0 -1
  200. package/dist/mcp/types.js +0 -6
  201. package/dist/mcp/types.js.map +0 -1
  202. package/dist/memory-extract.d.ts +0 -60
  203. package/dist/memory-extract.d.ts.map +0 -1
  204. package/dist/memory-extract.js +0 -163
  205. package/dist/memory-extract.js.map +0 -1
  206. package/dist/memory-inject.d.ts +0 -39
  207. package/dist/memory-inject.d.ts.map +0 -1
  208. package/dist/memory-inject.js +0 -135
  209. package/dist/memory-inject.js.map +0 -1
  210. package/dist/memory.d.ts +0 -55
  211. package/dist/memory.d.ts.map +0 -1
  212. package/dist/memory.js +0 -132
  213. package/dist/memory.js.map +0 -1
  214. package/dist/middleware.d.ts +0 -18
  215. package/dist/middleware.d.ts.map +0 -1
  216. package/dist/middleware.js +0 -72
  217. package/dist/middleware.js.map +0 -1
  218. package/dist/node/attachment.d.ts +0 -6
  219. package/dist/node/attachment.d.ts.map +0 -1
  220. package/dist/node/attachment.js +0 -35
  221. package/dist/node/attachment.js.map +0 -1
  222. package/dist/node/transcription.d.ts +0 -4
  223. package/dist/node/transcription.d.ts.map +0 -1
  224. package/dist/node/transcription.js +0 -8
  225. package/dist/node/transcription.js.map +0 -1
  226. package/dist/output.d.ts +0 -22
  227. package/dist/output.d.ts.map +0 -1
  228. package/dist/output.js +0 -60
  229. package/dist/output.js.map +0 -1
  230. package/dist/provider-tools.d.ts +0 -87
  231. package/dist/provider-tools.d.ts.map +0 -1
  232. package/dist/provider-tools.js +0 -189
  233. package/dist/provider-tools.js.map +0 -1
  234. package/dist/providers/anthropic.d.ts +0 -24
  235. package/dist/providers/anthropic.d.ts.map +0 -1
  236. package/dist/providers/anthropic.js +0 -405
  237. package/dist/providers/anthropic.js.map +0 -1
  238. package/dist/providers/azure.d.ts +0 -13
  239. package/dist/providers/azure.d.ts.map +0 -1
  240. package/dist/providers/azure.js +0 -15
  241. package/dist/providers/azure.js.map +0 -1
  242. package/dist/providers/bedrock.d.ts +0 -75
  243. package/dist/providers/bedrock.d.ts.map +0 -1
  244. package/dist/providers/bedrock.js +0 -181
  245. package/dist/providers/bedrock.js.map +0 -1
  246. package/dist/providers/cohere.d.ts +0 -13
  247. package/dist/providers/cohere.d.ts.map +0 -1
  248. package/dist/providers/cohere.js +0 -87
  249. package/dist/providers/cohere.js.map +0 -1
  250. package/dist/providers/deepseek.d.ts +0 -12
  251. package/dist/providers/deepseek.d.ts.map +0 -1
  252. package/dist/providers/deepseek.js +0 -15
  253. package/dist/providers/deepseek.js.map +0 -1
  254. package/dist/providers/elevenlabs.d.ts +0 -98
  255. package/dist/providers/elevenlabs.d.ts.map +0 -1
  256. package/dist/providers/elevenlabs.js +0 -229
  257. package/dist/providers/elevenlabs.js.map +0 -1
  258. package/dist/providers/google-cache-registry.d.ts +0 -132
  259. package/dist/providers/google-cache-registry.d.ts.map +0 -1
  260. package/dist/providers/google-cache-registry.js +0 -209
  261. package/dist/providers/google-cache-registry.js.map +0 -1
  262. package/dist/providers/google.d.ts +0 -38
  263. package/dist/providers/google.d.ts.map +0 -1
  264. package/dist/providers/google.js +0 -903
  265. package/dist/providers/google.js.map +0 -1
  266. package/dist/providers/groq.d.ts +0 -12
  267. package/dist/providers/groq.d.ts.map +0 -1
  268. package/dist/providers/groq.js +0 -15
  269. package/dist/providers/groq.js.map +0 -1
  270. package/dist/providers/jina.d.ts +0 -13
  271. package/dist/providers/jina.d.ts.map +0 -1
  272. package/dist/providers/jina.js +0 -90
  273. package/dist/providers/jina.js.map +0 -1
  274. package/dist/providers/mistral.d.ts +0 -13
  275. package/dist/providers/mistral.d.ts.map +0 -1
  276. package/dist/providers/mistral.js +0 -46
  277. package/dist/providers/mistral.js.map +0 -1
  278. package/dist/providers/ollama.d.ts +0 -11
  279. package/dist/providers/ollama.d.ts.map +0 -1
  280. package/dist/providers/ollama.js +0 -15
  281. package/dist/providers/ollama.js.map +0 -1
  282. package/dist/providers/openai.d.ts +0 -79
  283. package/dist/providers/openai.d.ts.map +0 -1
  284. package/dist/providers/openai.js +0 -792
  285. package/dist/providers/openai.js.map +0 -1
  286. package/dist/providers/openrouter.d.ts +0 -43
  287. package/dist/providers/openrouter.d.ts.map +0 -1
  288. package/dist/providers/openrouter.js +0 -21
  289. package/dist/providers/openrouter.js.map +0 -1
  290. package/dist/providers/voyage.d.ts +0 -91
  291. package/dist/providers/voyage.d.ts.map +0 -1
  292. package/dist/providers/voyage.js +0 -166
  293. package/dist/providers/voyage.js.map +0 -1
  294. package/dist/providers/xai.d.ts +0 -12
  295. package/dist/providers/xai.d.ts.map +0 -1
  296. package/dist/providers/xai.js +0 -15
  297. package/dist/providers/xai.js.map +0 -1
  298. package/dist/queue-job.d.ts +0 -100
  299. package/dist/queue-job.d.ts.map +0 -1
  300. package/dist/queue-job.js +0 -185
  301. package/dist/queue-job.js.map +0 -1
  302. package/dist/react/agent-run.d.ts +0 -111
  303. package/dist/react/agent-run.d.ts.map +0 -1
  304. package/dist/react/agent-run.js +0 -107
  305. package/dist/react/agent-run.js.map +0 -1
  306. package/dist/react/useAgentRun.d.ts +0 -68
  307. package/dist/react/useAgentRun.d.ts.map +0 -1
  308. package/dist/react/useAgentRun.js +0 -125
  309. package/dist/react/useAgentRun.js.map +0 -1
  310. package/dist/registry.d.ts +0 -45
  311. package/dist/registry.d.ts.map +0 -1
  312. package/dist/registry.js +0 -131
  313. package/dist/registry.js.map +0 -1
  314. package/dist/rerank.d.ts +0 -20
  315. package/dist/rerank.d.ts.map +0 -1
  316. package/dist/rerank.js +0 -40
  317. package/dist/rerank.js.map +0 -1
  318. package/dist/resume-approval.d.ts +0 -30
  319. package/dist/resume-approval.d.ts.map +0 -1
  320. package/dist/resume-approval.js +0 -147
  321. package/dist/resume-approval.js.map +0 -1
  322. package/dist/sanitize-conversation.d.ts +0 -43
  323. package/dist/sanitize-conversation.d.ts.map +0 -1
  324. package/dist/sanitize-conversation.js +0 -85
  325. package/dist/sanitize-conversation.js.map +0 -1
  326. package/dist/scoped-tool.d.ts +0 -98
  327. package/dist/scoped-tool.d.ts.map +0 -1
  328. package/dist/scoped-tool.js +0 -174
  329. package/dist/scoped-tool.js.map +0 -1
  330. package/dist/server/provider.d.ts +0 -22
  331. package/dist/server/provider.d.ts.map +0 -1
  332. package/dist/server/provider.js +0 -194
  333. package/dist/server/provider.js.map +0 -1
  334. package/dist/similarity-search.d.ts +0 -163
  335. package/dist/similarity-search.d.ts.map +0 -1
  336. package/dist/similarity-search.js +0 -147
  337. package/dist/similarity-search.js.map +0 -1
  338. package/dist/sub-agent-run-store.d.ts +0 -157
  339. package/dist/sub-agent-run-store.d.ts.map +0 -1
  340. package/dist/sub-agent-run-store.js +0 -87
  341. package/dist/sub-agent-run-store.js.map +0 -1
  342. package/dist/tool-execution.d.ts +0 -16
  343. package/dist/tool-execution.d.ts.map +0 -1
  344. package/dist/tool-execution.js +0 -498
  345. package/dist/tool-execution.js.map +0 -1
  346. package/dist/tool-helpers.d.ts +0 -77
  347. package/dist/tool-helpers.d.ts.map +0 -1
  348. package/dist/tool-helpers.js +0 -117
  349. package/dist/tool-helpers.js.map +0 -1
  350. package/dist/tool.d.ts +0 -216
  351. package/dist/tool.d.ts.map +0 -1
  352. package/dist/tool.js +0 -175
  353. package/dist/tool.js.map +0 -1
  354. package/dist/transcription.d.ts +0 -42
  355. package/dist/transcription.d.ts.map +0 -1
  356. package/dist/transcription.js +0 -77
  357. package/dist/transcription.js.map +0 -1
  358. package/dist/types.d.ts +0 -1020
  359. package/dist/types.d.ts.map +0 -1
  360. package/dist/types.js +0 -2
  361. package/dist/types.js.map +0 -1
  362. package/dist/util/hash.d.ts +0 -11
  363. package/dist/util/hash.d.ts.map +0 -1
  364. package/dist/util/hash.js +0 -23
  365. package/dist/util/hash.js.map +0 -1
  366. package/dist/vector-stores/index.d.ts +0 -96
  367. package/dist/vector-stores/index.d.ts.map +0 -1
  368. package/dist/vector-stores/index.js +0 -153
  369. package/dist/vector-stores/index.js.map +0 -1
  370. package/dist/vercel-protocol.d.ts +0 -18
  371. package/dist/vercel-protocol.d.ts.map +0 -1
  372. package/dist/vercel-protocol.js +0 -75
  373. package/dist/vercel-protocol.js.map +0 -1
  374. package/dist/zod-to-json-schema.d.ts +0 -16
  375. package/dist/zod-to-json-schema.d.ts.map +0 -1
  376. package/dist/zod-to-json-schema.js +0 -17
  377. package/dist/zod-to-json-schema.js.map +0 -1
@@ -1,117 +0,0 @@
1
- /**
2
- * Detect an async generator (the value returned by `async function*` or any
3
- * object implementing the AsyncGenerator protocol). We use a structural check
4
- * because the executor may not be authored as a literal `async function*`
5
- * (e.g. wrapped or returned from a factory).
6
- */
7
- export function isAsyncGenerator(value) {
8
- if (value === null || typeof value !== 'object')
9
- return false;
10
- const v = value;
11
- return typeof v.next === 'function'
12
- && typeof v.return === 'function'
13
- && typeof v[Symbol.asyncIterator] === 'function';
14
- }
15
- /**
16
- * Uniformly iterate a tool's `execute`, whether it returns a value, a
17
- * promise, or an async generator.
18
- *
19
- * The helper is itself an async generator: each `yield` is a preliminary
20
- * tool-update payload (only generator-style executes produce these), and the
21
- * generator's `return` value is the final tool result.
22
- *
23
- * Streaming callers iterate and emit `tool-update` chunks live as updates
24
- * arrive. Non-streaming callers iterate and discard yields, capturing only
25
- * the final return value — same tool definition works in both modes.
26
- */
27
- export async function* executeMaybeStreaming(tool, args, ctx) {
28
- const execute = tool.execute;
29
- if (!execute) {
30
- throw new Error('Tool has no execute function');
31
- }
32
- const ret = execute(args, ctx);
33
- if (isAsyncGenerator(ret)) {
34
- while (true) {
35
- const step = await ret.next();
36
- if (step.done)
37
- return step.value;
38
- yield step.value;
39
- }
40
- }
41
- return await ret;
42
- }
43
- /**
44
- * Validate a tool call's arguments against the tool's `inputSchema`. On
45
- * success, the parsed value is returned — zod transforms (`.transform`,
46
- * `.default`, type coercion) are applied, so `execute` receives the
47
- * canonical shape the schema describes. On failure, a structured error
48
- * suitable for feeding back to the model is returned.
49
- */
50
- export function validateToolArgs(tool, args) {
51
- const parsed = tool.definition.inputSchema.safeParse(args);
52
- if (parsed.success) {
53
- return { ok: true, value: parsed.data };
54
- }
55
- return {
56
- ok: false,
57
- error: {
58
- error: 'invalid_arguments',
59
- message: `Tool "${tool.definition.name}" received arguments that did not match its inputSchema.`,
60
- issues: parsed.error.issues.map(i => ({
61
- path: i.path.map(seg => String(seg)).join('.'),
62
- message: i.message,
63
- })),
64
- },
65
- };
66
- }
67
- /**
68
- * Default stringification used for the `tool` role message content when a
69
- * tool has no `toModelOutput` transform: pass through strings, JSON-encode
70
- * everything else.
71
- */
72
- export function defaultStringify(value) {
73
- return typeof value === 'string' ? value : JSON.stringify(value);
74
- }
75
- /**
76
- * Convert a tool's structured `result` into the string the **model** will
77
- * see on its next step. Honors `tool.toModelOutput` when present, falling
78
- * back to {@link defaultStringify}.
79
- *
80
- * Per R6 in the ai-loop-parity plan: a throwing `toModelOutput` MUST NOT
81
- * crash the loop. We swallow the error, route it through `onError`
82
- * middleware so it stays observable, and use the default stringification
83
- * as a safety net.
84
- */
85
- export async function applyToModelOutput(tool, result, onError) {
86
- if (tool.toModelOutput) {
87
- try {
88
- return await tool.toModelOutput(result);
89
- }
90
- catch (err) {
91
- if (onError)
92
- await onError(err);
93
- }
94
- }
95
- return defaultStringify(result);
96
- }
97
- /**
98
- * Resolve `needsApproval` for a tool call, taking into account the
99
- * client-supplied `approvedToolCallIds` / `rejectedToolCallIds` lists.
100
- *
101
- * Returns:
102
- * - `'allow'` — execute the tool normally (default; also when approved)
103
- * - `'pending'` — needsApproval is truthy and the call has not been approved
104
- * - `'rejected'` — the call appears in `rejectedToolCallIds`
105
- */
106
- export async function evaluateApproval(tool, tc, options) {
107
- const needs = tool.definition.needsApproval;
108
- const requires = typeof needs === 'function' ? await needs(tc.arguments) : !!needs;
109
- if (!requires)
110
- return 'allow';
111
- if (options?.rejectedToolCallIds?.includes(tc.id))
112
- return 'rejected';
113
- if (options?.approvedToolCallIds?.includes(tc.id))
114
- return 'allow';
115
- return 'pending';
116
- }
117
- //# sourceMappingURL=tool-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../src/tool-helpers.ts"],"names":[],"mappings":"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"}
package/dist/tool.d.ts DELETED
@@ -1,216 +0,0 @@
1
- import type { z } from 'zod';
2
- import type { Tool, ToolCall, ToolCallContext, ToolDefinitionOptions, ToolDefinitionSchema, ToolExecuteFn } from './types.js';
3
- /**
4
- * Control chunk a server tool can `yield` from an `async function*`
5
- * execute to pause the enclosing agent loop and surface a set of CLIENT
6
- * tool calls to the caller — as if the model itself had emitted them.
7
- *
8
- * This is the sanctioned way for a server tool to inject client-tool
9
- * calls into the parent loop's pending list. The agent loop iterating
10
- * the execute generator recognizes the shape via the reserved `__rudderjs`
11
- * discriminator, appends `toolCalls` to the parent's
12
- * `pendingClientToolCalls`, sets the stop-for-client-tools flag, and —
13
- * critically — does NOT push an error tool_result / tool message for the
14
- * yielding tool call. The yielding tool's own call remains orphaned in
15
- * the parent's message history until the caller resolves it on
16
- * continuation (typically by computing a final result from whatever the
17
- * client-side tool execution returned).
18
- *
19
- * Why a yield instead of a throw:
20
- * - Symmetry with the existing `tool-update` yield protocol — no parallel
21
- * catch-based control path.
22
- * - Middleware can observe pauses through `runOnChunk`; a thrown error
23
- * would route through `onError` and muddle telemetry.
24
- * - Exceptions signal "something went wrong"; this is not an error.
25
- * - Platform-level feature: any server tool can yield this, not just
26
- * nested agent runners. E.g., a tool that wants the browser's
27
- * geolocation, clipboard, or a user file upload.
28
- *
29
- * **Primary use case today:** nested agent runners (`run_agent` in
30
- * panels). A runner that streams a sub-agent server-side can hit a pause
31
- * point when the sub-agent's model calls a client tool. Those calls have
32
- * to execute in the browser, not server-side, so the parent loop must
33
- * surface them to its own caller.
34
- *
35
- * Tools that yield this chunk are responsible for persisting any state
36
- * they need to resume the inner work on continuation (usually in a cache
37
- * or runStore). `@rudderjs/ai` does not know or care about that state —
38
- * it just propagates the pause. The optional `resumeHandle` is an opaque
39
- * string the tool author owns; the agent loop never inspects it.
40
- *
41
- * Tool authors should construct this via {@link pauseForClientTools},
42
- * not by hand, so future shape changes stay source-compatible.
43
- */
44
- export interface PauseForClientToolsChunk {
45
- /** Reserved discriminator. Namespaced to avoid colliding with user data. */
46
- readonly __rudderjs: 'pause_for_client_tools';
47
- readonly toolCalls: ToolCall[];
48
- readonly resumeHandle?: string;
49
- }
50
- /**
51
- * Construct a pause control chunk for `yield`ing from a server tool's
52
- * async-generator execute.
53
- *
54
- * @example
55
- * .server(async function* (input, ctx) {
56
- * const subRunId = await persistSubRunState(...)
57
- * yield pauseForClientTools(subAgentPending, subRunId)
58
- * // Unreachable — the loop halts iteration after the pause chunk.
59
- * return undefined as never
60
- * })
61
- */
62
- export declare function pauseForClientTools(toolCalls: ToolCall[], resumeHandle?: string): PauseForClientToolsChunk;
63
- /**
64
- * Structural typeguard for a pause chunk. Used by the agent loop to
65
- * detect pauses mid-execute without requiring tool authors to import any
66
- * `@rudderjs/ai` symbol at the yield site — they can yield via
67
- * {@link pauseForClientTools} or construct the object literal directly.
68
- */
69
- export declare function isPauseForClientToolsChunk(value: unknown): value is PauseForClientToolsChunk;
70
- /**
71
- * Control chunk a server tool can `yield` to pause the enclosing agent
72
- * loop on an APPROVAL gate inside a sub-agent — the sibling of
73
- * {@link PauseForClientToolsChunk} for the
74
- * `finishReason === 'tool_approval_required'` case.
75
- *
76
- * The agent loop iterating the execute generator recognizes the shape
77
- * via the reserved `__rudderjs` discriminator, sets
78
- * `loopCtx.pendingApprovalToolCall` from `toolCall`/`isClientTool`,
79
- * flips `loopCtx.loopFinishReason = 'tool_approval_required'` and
80
- * `loopCtx.stopForApproval = true`, and SKIPS the tool_result emission
81
- * for the yielding tool call — the sub-agent's call stays orphaned in
82
- * the parent message history until the approve/reject decision arrives
83
- * via {@link Agent.resumeAsTool}.
84
- *
85
- * The optional `resumeHandle` (typically the `subRunId` the wrapper just
86
- * persisted) is opaque to the framework — tool authors own the lookup.
87
- *
88
- * **Primary use case:** a sub-agent surfaced through
89
- * {@link Agent.asTool} whose model invokes a `.requireApproval(true)`
90
- * tool. The sub-agent loop emits `pending-approval`, the wrapping
91
- * `asTool` generator persists a snapshot with `pauseKind: 'approval'`
92
- * and yields this chunk so the parent loop halts the same way it does
93
- * for client-tool pauses.
94
- *
95
- * Tool authors should construct this via {@link pauseForApproval}, not
96
- * by hand, so future shape changes stay source-compatible.
97
- */
98
- export interface PauseForApprovalChunk {
99
- /** Reserved discriminator. Namespaced to avoid colliding with user data. */
100
- readonly __rudderjs: 'pause_for_approval';
101
- readonly toolCall: ToolCall;
102
- /**
103
- * `true` when the gated call is a client tool (no `execute` on the
104
- * server side); `false` for a server tool the sub-agent would have
105
- * run if approval had been granted.
106
- */
107
- readonly isClientTool: boolean;
108
- readonly resumeHandle?: string;
109
- }
110
- /**
111
- * Construct an approval-pause control chunk for `yield`ing from a server
112
- * tool's async-generator execute.
113
- *
114
- * @example
115
- * .server(async function* (input, ctx) {
116
- * const subRunId = await persistSubRunState(...)
117
- * yield pauseForApproval(innerToolCall, isClientTool, subRunId)
118
- * return undefined as never
119
- * })
120
- */
121
- export declare function pauseForApproval(toolCall: ToolCall, isClientTool: boolean, resumeHandle?: string): PauseForApprovalChunk;
122
- /**
123
- * Structural typeguard for an approval-pause chunk. Mirrors
124
- * {@link isPauseForClientToolsChunk} so the parent loop can recognize a
125
- * pause without forcing tool authors to import any `@rudderjs/ai` symbol
126
- * at the yield site.
127
- */
128
- export declare function isPauseForApprovalChunk(value: unknown): value is PauseForApprovalChunk;
129
- /**
130
- * Builder returned by {@link toolDefinition}. The builder itself is a valid
131
- * `Tool` — call `.server(execute)` to attach a server-side handler, or use
132
- * the builder as-is to register a client tool (no `execute`).
133
- */
134
- export declare class ToolBuilder<TInput extends z.ZodType = z.ZodType, TOutput extends z.ZodType = z.ZodType> implements Tool<z.infer<TInput>, never> {
135
- readonly options: ToolDefinitionOptions<TInput, TOutput>;
136
- readonly definition: ToolDefinitionOptions;
137
- /** Builders are valid client tools — `execute` is intentionally absent. */
138
- readonly execute?: undefined;
139
- constructor(options: ToolDefinitionOptions<TInput, TOutput>);
140
- /**
141
- * Attach a server-side handler.
142
- *
143
- * The handler may be a regular async function (single return value) or an
144
- * async generator (`async function*`). Generators can `yield` preliminary
145
- * progress payloads — each yield surfaces as a `tool-update` stream chunk
146
- * while the tool runs. The generator's `return` value becomes the final
147
- * tool result. The same tool definition works in both `agent.prompt()`
148
- * (yields are silently drained) and `agent.stream()`.
149
- */
150
- server<TReturn = unknown, TUpdate = unknown>(execute: (input: z.infer<TInput>, ctx?: ToolCallContext) => AsyncGenerator<TUpdate, TReturn, void>): ServerToolBuilder<z.infer<TInput>, TReturn>;
151
- server<TReturn = unknown>(execute: (input: z.infer<TInput>, ctx?: ToolCallContext) => TReturn | Promise<TReturn>): ServerToolBuilder<z.infer<TInput>, TReturn>;
152
- /** Convert to provider-friendly JSON Schema format */
153
- toSchema(): ToolDefinitionSchema;
154
- }
155
- /**
156
- * Builder returned by {@link ToolBuilder.server}. Itself a valid `Tool`, so
157
- * it can be passed directly into `tools()` arrays — `.toModelOutput(...)` is
158
- * an optional chained refinement, not a required `.build()` step.
159
- *
160
- * Future per-tool refinements (`.onError(...)`, `.middleware(...)`) would slot
161
- * in here in the same chained-builder style.
162
- */
163
- export declare class ServerToolBuilder<TInput = unknown, TOutput = unknown> implements Tool<TInput, TOutput> {
164
- readonly definition: ToolDefinitionOptions;
165
- readonly execute: ToolExecuteFn<TInput, TOutput, unknown>;
166
- readonly toModelOutput?: ((result: TOutput) => string | Promise<string>) | undefined;
167
- constructor(definition: ToolDefinitionOptions, execute: ToolExecuteFn<TInput, TOutput, unknown>, toModelOutput?: (result: TOutput) => string | Promise<string>);
168
- /**
169
- * Declare a transform from this tool's structured result to the string the
170
- * **model** sees on its next step. The UI continues to receive the original
171
- * structured result.
172
- *
173
- * @example
174
- * toolDefinition({...})
175
- * .server(async (input) => bigStructuredResult)
176
- * .modelOutput((result) => `${result.items.length} items found`)
177
- */
178
- modelOutput(fn: (result: TOutput) => string | Promise<string>): ServerToolBuilder<TInput, TOutput>;
179
- }
180
- /**
181
- * Define a tool with typed input/output schemas.
182
- *
183
- * @example Server tool
184
- * const weatherTool = toolDefinition({
185
- * name: 'get_weather',
186
- * description: 'Get weather for a location',
187
- * inputSchema: z.object({ location: z.string() }),
188
- * }).server(async ({ location }) => ({ temp: 72, unit: 'F' }))
189
- *
190
- * @example Client tool (no `.server()`)
191
- * const readFormStateTool = toolDefinition({
192
- * name: 'read_form_state',
193
- * description: 'Read the user\'s current local form values.',
194
- * inputSchema: z.object({ fields: z.array(z.string()).optional() }),
195
- * })
196
- */
197
- export declare function toolDefinition<TInput extends z.ZodType, TOutput extends z.ZodType = z.ZodUndefined>(options: ToolDefinitionOptions<TInput, TOutput>): ToolBuilder<TInput, TOutput>;
198
- /**
199
- * Build a tool whose input/output types are not known at compile time.
200
- *
201
- * Use this when the tool's schema is constructed dynamically from user data
202
- * (e.g. a resource agent that exposes one tool per agent definition).
203
- *
204
- * @example
205
- * const t = dynamicTool({
206
- * name: agentDef.slug,
207
- * description: agentDef.description,
208
- * inputSchema: z.object({}),
209
- * }).server(async () => agentDef.run())
210
- */
211
- export declare function dynamicTool(options: ToolDefinitionOptions): ToolBuilder;
212
- /** Convert any Tool to a ToolDefinitionSchema for provider consumption */
213
- export declare function toolToSchema(tool: {
214
- definition: ToolDefinitionOptions;
215
- }): ToolDefinitionSchema;
216
- //# sourceMappingURL=tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
package/dist/tool.js DELETED
@@ -1,175 +0,0 @@
1
- import { zodToJsonSchema } from './zod-to-json-schema.js';
2
- /**
3
- * Construct a pause control chunk for `yield`ing from a server tool's
4
- * async-generator execute.
5
- *
6
- * @example
7
- * .server(async function* (input, ctx) {
8
- * const subRunId = await persistSubRunState(...)
9
- * yield pauseForClientTools(subAgentPending, subRunId)
10
- * // Unreachable — the loop halts iteration after the pause chunk.
11
- * return undefined as never
12
- * })
13
- */
14
- export function pauseForClientTools(toolCalls, resumeHandle) {
15
- const chunk = resumeHandle !== undefined
16
- ? { __rudderjs: 'pause_for_client_tools', toolCalls, resumeHandle }
17
- : { __rudderjs: 'pause_for_client_tools', toolCalls };
18
- return chunk;
19
- }
20
- /**
21
- * Structural typeguard for a pause chunk. Used by the agent loop to
22
- * detect pauses mid-execute without requiring tool authors to import any
23
- * `@rudderjs/ai` symbol at the yield site — they can yield via
24
- * {@link pauseForClientTools} or construct the object literal directly.
25
- */
26
- export function isPauseForClientToolsChunk(value) {
27
- if (value === null || typeof value !== 'object')
28
- return false;
29
- const v = value;
30
- return v.__rudderjs === 'pause_for_client_tools' && Array.isArray(v.toolCalls);
31
- }
32
- /**
33
- * Construct an approval-pause control chunk for `yield`ing from a server
34
- * tool's async-generator execute.
35
- *
36
- * @example
37
- * .server(async function* (input, ctx) {
38
- * const subRunId = await persistSubRunState(...)
39
- * yield pauseForApproval(innerToolCall, isClientTool, subRunId)
40
- * return undefined as never
41
- * })
42
- */
43
- export function pauseForApproval(toolCall, isClientTool, resumeHandle) {
44
- const chunk = resumeHandle !== undefined
45
- ? { __rudderjs: 'pause_for_approval', toolCall, isClientTool, resumeHandle }
46
- : { __rudderjs: 'pause_for_approval', toolCall, isClientTool };
47
- return chunk;
48
- }
49
- /**
50
- * Structural typeguard for an approval-pause chunk. Mirrors
51
- * {@link isPauseForClientToolsChunk} so the parent loop can recognize a
52
- * pause without forcing tool authors to import any `@rudderjs/ai` symbol
53
- * at the yield site.
54
- */
55
- export function isPauseForApprovalChunk(value) {
56
- if (value === null || typeof value !== 'object')
57
- return false;
58
- const v = value;
59
- return (v.__rudderjs === 'pause_for_approval' &&
60
- typeof v.toolCall === 'object' &&
61
- v.toolCall !== null &&
62
- typeof v.isClientTool === 'boolean');
63
- }
64
- /**
65
- * Builder returned by {@link toolDefinition}. The builder itself is a valid
66
- * `Tool` — call `.server(execute)` to attach a server-side handler, or use
67
- * the builder as-is to register a client tool (no `execute`).
68
- */
69
- export class ToolBuilder {
70
- options;
71
- definition;
72
- /** Builders are valid client tools — `execute` is intentionally absent. */
73
- execute;
74
- constructor(options) {
75
- this.options = options;
76
- this.definition = options;
77
- }
78
- server(execute) {
79
- return new ServerToolBuilder(this.options, execute);
80
- }
81
- /** Convert to provider-friendly JSON Schema format */
82
- toSchema() {
83
- const schema = {
84
- name: this.options.name,
85
- description: this.options.description,
86
- parameters: this.options.jsonSchema ?? zodToJsonSchema(this.options.inputSchema, 'input'),
87
- };
88
- if (this.options.providerHint)
89
- schema.providerHint = this.options.providerHint;
90
- return schema;
91
- }
92
- }
93
- /**
94
- * Builder returned by {@link ToolBuilder.server}. Itself a valid `Tool`, so
95
- * it can be passed directly into `tools()` arrays — `.toModelOutput(...)` is
96
- * an optional chained refinement, not a required `.build()` step.
97
- *
98
- * Future per-tool refinements (`.onError(...)`, `.middleware(...)`) would slot
99
- * in here in the same chained-builder style.
100
- */
101
- export class ServerToolBuilder {
102
- definition;
103
- execute;
104
- toModelOutput;
105
- constructor(definition, execute, toModelOutput) {
106
- this.definition = definition;
107
- this.execute = execute;
108
- if (toModelOutput)
109
- this.toModelOutput = toModelOutput;
110
- }
111
- /**
112
- * Declare a transform from this tool's structured result to the string the
113
- * **model** sees on its next step. The UI continues to receive the original
114
- * structured result.
115
- *
116
- * @example
117
- * toolDefinition({...})
118
- * .server(async (input) => bigStructuredResult)
119
- * .modelOutput((result) => `${result.items.length} items found`)
120
- */
121
- modelOutput(fn) {
122
- return new ServerToolBuilder(this.definition, this.execute, fn);
123
- }
124
- }
125
- /**
126
- * Define a tool with typed input/output schemas.
127
- *
128
- * @example Server tool
129
- * const weatherTool = toolDefinition({
130
- * name: 'get_weather',
131
- * description: 'Get weather for a location',
132
- * inputSchema: z.object({ location: z.string() }),
133
- * }).server(async ({ location }) => ({ temp: 72, unit: 'F' }))
134
- *
135
- * @example Client tool (no `.server()`)
136
- * const readFormStateTool = toolDefinition({
137
- * name: 'read_form_state',
138
- * description: 'Read the user\'s current local form values.',
139
- * inputSchema: z.object({ fields: z.array(z.string()).optional() }),
140
- * })
141
- */
142
- export function toolDefinition(options) {
143
- return new ToolBuilder(options);
144
- }
145
- /**
146
- * Build a tool whose input/output types are not known at compile time.
147
- *
148
- * Use this when the tool's schema is constructed dynamically from user data
149
- * (e.g. a resource agent that exposes one tool per agent definition).
150
- *
151
- * @example
152
- * const t = dynamicTool({
153
- * name: agentDef.slug,
154
- * description: agentDef.description,
155
- * inputSchema: z.object({}),
156
- * }).server(async () => agentDef.run())
157
- */
158
- export function dynamicTool(options) {
159
- return new ToolBuilder(options);
160
- }
161
- /** Convert any Tool to a ToolDefinitionSchema for provider consumption */
162
- export function toolToSchema(tool) {
163
- const schema = {
164
- name: tool.definition.name,
165
- description: tool.definition.description,
166
- parameters: tool.definition.jsonSchema ?? zodToJsonSchema(tool.definition.inputSchema, 'input'),
167
- };
168
- // Propagate provider-specific hints so adapters that recognize the
169
- // `providerHint.type` can substitute their native tool block (see
170
- // `toAnthropicTools` for computer-use, `toOpenAITools` for file-search).
171
- if (tool.definition.providerHint)
172
- schema.providerHint = tool.definition.providerHint;
173
- return schema;
174
- }
175
- //# sourceMappingURL=tool.js.map
package/dist/tool.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../src/tool.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- import type { SpeechToTextResult } from './types.js';
2
- /**
3
- * Fluent builder for speech-to-text transcription.
4
- *
5
- * @example
6
- * const result = await Transcription.fromBytes(bytes).language('en').generate()
7
- *
8
- * For Node-only path-based loading, see `@rudderjs/ai/node`:
9
- * const t = await transcribeFromPath('./audio.mp3')
10
- *
11
- * @example Failover across providers
12
- * const result = await Transcription.fromBytes(bytes)
13
- * .model('openai/whisper-1')
14
- * .failover('google/gemini-2.0-flash-exp')
15
- * .generate()
16
- */
17
- export declare class Transcription {
18
- private readonly _audio;
19
- private _model?;
20
- private _language?;
21
- private _prompt?;
22
- private _failover;
23
- private constructor();
24
- /** Create a Transcription from raw audio bytes */
25
- static fromBytes(bytes: Uint8Array): Transcription;
26
- /** @deprecated Use fromBytes(). Buffer extends Uint8Array, so this is a thin alias. */
27
- static fromBuffer(buffer: Uint8Array): Transcription;
28
- /** Set the STT model (e.g. 'openai/whisper-1') */
29
- model(m: string): this;
30
- /**
31
- * Provider/model strings to try if the primary fails.
32
- * Tried in order; the first to succeed wins.
33
- */
34
- failover(...models: string[]): this;
35
- /** Set the language hint (ISO-639-1, e.g. 'en', 'es', 'fr') */
36
- language(l: string): this;
37
- /** Set an optional prompt to guide transcription style */
38
- prompt(p: string): this;
39
- /** Run the transcription */
40
- generate(): Promise<SpeechToTextResult>;
41
- }
42
- //# sourceMappingURL=transcription.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcription.d.ts","sourceRoot":"","sources":["../src/transcription.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;;;;;;;;;;;GAcG;AACH,qBAAa,aAAa;IAMJ,OAAO,CAAC,QAAQ,CAAC,MAAM;IAL3C,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAQ;IACxB,OAAO,CAAC,SAAS,CAAe;IAEhC,OAAO;IAEP,kDAAkD;IAClD,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa;IAIlD,uFAAuF;IACvF,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa;IAIpD,kDAAkD;IAClD,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKtB;;;OAGG;IACH,QAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAKnC,+DAA+D;IAC/D,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKzB,0DAA0D;IAC1D,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKvB,4BAA4B;IACtB,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC;CAsB9C"}
@@ -1,77 +0,0 @@
1
- import { AiRegistry, tryWithFailover } from './registry.js';
2
- /**
3
- * Fluent builder for speech-to-text transcription.
4
- *
5
- * @example
6
- * const result = await Transcription.fromBytes(bytes).language('en').generate()
7
- *
8
- * For Node-only path-based loading, see `@rudderjs/ai/node`:
9
- * const t = await transcribeFromPath('./audio.mp3')
10
- *
11
- * @example Failover across providers
12
- * const result = await Transcription.fromBytes(bytes)
13
- * .model('openai/whisper-1')
14
- * .failover('google/gemini-2.0-flash-exp')
15
- * .generate()
16
- */
17
- export class Transcription {
18
- _audio;
19
- _model;
20
- _language;
21
- _prompt;
22
- _failover = [];
23
- constructor(_audio) {
24
- this._audio = _audio;
25
- }
26
- /** Create a Transcription from raw audio bytes */
27
- static fromBytes(bytes) {
28
- return new Transcription(bytes);
29
- }
30
- /** @deprecated Use fromBytes(). Buffer extends Uint8Array, so this is a thin alias. */
31
- static fromBuffer(buffer) {
32
- return new Transcription(buffer);
33
- }
34
- /** Set the STT model (e.g. 'openai/whisper-1') */
35
- model(m) {
36
- this._model = m;
37
- return this;
38
- }
39
- /**
40
- * Provider/model strings to try if the primary fails.
41
- * Tried in order; the first to succeed wins.
42
- */
43
- failover(...models) {
44
- this._failover = models;
45
- return this;
46
- }
47
- /** Set the language hint (ISO-639-1, e.g. 'en', 'es', 'fr') */
48
- language(l) {
49
- this._language = l;
50
- return this;
51
- }
52
- /** Set an optional prompt to guide transcription style */
53
- prompt(p) {
54
- this._prompt = p;
55
- return this;
56
- }
57
- /** Run the transcription */
58
- async generate() {
59
- const primary = this._model ?? AiRegistry.getDefault();
60
- return tryWithFailover(primary, this._failover, async (modelString) => {
61
- const [providerName, modelId] = AiRegistry.parseModelString(modelString);
62
- const factory = AiRegistry.getFactory(providerName);
63
- if (!factory.createStt) {
64
- throw new Error(`[Rudder AI] Provider "${providerName}" does not support speech-to-text. ` +
65
- `Use a provider that implements createStt() (e.g. openai).`);
66
- }
67
- const adapter = factory.createStt(modelId);
68
- return adapter.transcribe({
69
- audio: this._audio,
70
- model: modelId,
71
- language: this._language,
72
- prompt: this._prompt,
73
- });
74
- });
75
- }
76
- }
77
- //# sourceMappingURL=transcription.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcription.js","sourceRoot":"","sources":["../src/transcription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG3D;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,aAAa;IAMa;IAL7B,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,SAAS,GAAa,EAAE,CAAA;IAEhC,YAAqC,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE3D,kDAAkD;IAClD,MAAM,CAAC,SAAS,CAAC,KAAiB;QAChC,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,uFAAuF;IACvF,MAAM,CAAC,UAAU,CAAC,MAAkB;QAClC,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED,kDAAkD;IAClD,KAAK,CAAC,CAAS;QACb,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,GAAG,MAAgB;QAC1B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAA;QACvB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,+DAA+D;IAC/D,QAAQ,CAAC,CAAS;QAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAA;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0DAA0D;IAC1D,MAAM,CAAC,CAAS;QACd,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAA;QACtD,OAAO,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACpE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACxE,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;YAEnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,yBAAyB,YAAY,qCAAqC;oBAC1E,2DAA2D,CAC5D,CAAA;YACH,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAC1C,OAAO,OAAO,CAAC,UAAU,CAAC;gBACxB,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,MAAM,EAAE,IAAI,CAAC,OAAO;aACrB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}