@rudderjs/ai 1.17.3 → 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,158 +0,0 @@
1
- /**
2
- * `fileSearch({ stores, where?, maxResults?, name?, description? })` — agent
3
- * tool factory for hosted vector-store retrieval (#B8 Phase 2).
4
- *
5
- * Wraps OpenAI's native `file_search` tool. The tool object is tagged with
6
- * `providerHint: { type: 'file-search', ... }`; the OpenAI adapter's
7
- * `toOpenAITools` recognizes the hint and emits the native
8
- * `{ type: 'file_search', vector_store_ids, filters, max_num_results }`
9
- * block instead of a generic function-call shape. The model runs the search
10
- * server-side and the results land in the assistant message — no agent-loop
11
- * tool round-trip on the hosted path.
12
- *
13
- * # Hosted on OpenAI today
14
- *
15
- * Other providers see the tool as a regular function-call tool with the
16
- * placeholder `{ query: string }` schema — without an `execute` they pause
17
- * for client tools, which is degraded. Phase 3 will add a `fallback` opt
18
- * that installs an `execute` delegating to `similaritySearch` over a local
19
- * pgvector model.
20
- *
21
- * # Wiring
22
- *
23
- * ```ts
24
- * import { Agent, fileSearch, VectorStores } from '@rudderjs/ai'
25
- *
26
- * const kb = await VectorStores.get('vs_abc123')
27
- *
28
- * class SupportAgent extends Agent {
29
- * model() { return 'openai/gpt-4o' }
30
- * tools() {
31
- * return [
32
- * fileSearch({
33
- * stores: [kb.id],
34
- * where: { author: 'Alice', year: 2026 },
35
- * maxResults: 10,
36
- * }),
37
- * ]
38
- * }
39
- * }
40
- * ```
41
- *
42
- * # Metadata filter sugar
43
- *
44
- * `where: { author: 'Alice', year: 2026 }` is shorthand for the typed
45
- * OpenAI filter shape `{ type: 'and', filters: [{ type: 'eq', key: 'author',
46
- * value: 'Alice' }, { type: 'eq', key: 'year', value: 2026 }] }`. Either
47
- * shape works — pass the typed object form for `gt` / `lt` / `or`.
48
- */
49
- import { z } from 'zod';
50
- import { similaritySearch } from './similarity-search.js';
51
- /**
52
- * Symbol-tagged marker identifying a file-search tool. Mirrors the
53
- * `COMPUTER_USE_MARKER` pattern — `Symbol.for(...)` so cross-bundle /
54
- * cross-realm checks succeed even when `@rudderjs/ai` loads twice.
55
- */
56
- export const FILE_SEARCH_MARKER = Symbol.for('rudderjs.ai.file-search');
57
- /**
58
- * Default tool name. OpenAI's native `file_search` tool expects calls to
59
- * land on a tool literally named `file_search` — the model is trained on
60
- * that identifier. Apps can override via `opts.name` but usually shouldn't.
61
- */
62
- export const FILE_SEARCH_TOOL_NAME = 'file_search';
63
- const DEFAULT_DESCRIPTION = 'Search the configured knowledge base(s) for documents relevant to the query. ' +
64
- 'Returns the most relevant passages alongside the source document metadata.';
65
- /** Build the agent tool. See module JSDoc for usage. */
66
- export function fileSearch(opts) {
67
- if (!Array.isArray(opts.stores) || opts.stores.length === 0) {
68
- throw new Error('[Rudder AI] fileSearch({ stores }) requires at least one vector-store id. ' +
69
- 'Create a store via `VectorStores.create(...)` and pass its `id`.');
70
- }
71
- const name = opts.name ?? FILE_SEARCH_TOOL_NAME;
72
- const description = opts.description ?? DEFAULT_DESCRIPTION;
73
- const filters = opts.where !== undefined ? normalizeWhere(opts.where) : undefined;
74
- // The provider hint is the load-bearing piece — adapters recognizing
75
- // `type === 'file-search'` substitute their native tool block.
76
- const providerHint = { type: 'file-search', vector_store_ids: opts.stores };
77
- if (filters)
78
- providerHint['filters'] = filters;
79
- if (opts.maxResults !== undefined)
80
- providerHint['max_num_results'] = opts.maxResults;
81
- const definition = {
82
- name,
83
- description,
84
- // Placeholder schema. Non-OpenAI providers see this and treat the
85
- // tool as a normal function-call. OpenAI's native block drops it.
86
- inputSchema: z.object({ query: z.string().describe('Natural-language query.') }),
87
- providerHint,
88
- };
89
- // Build the fallback execute when configured. The inner similaritySearch
90
- // tool's name/description are overridden so structural identity stays on
91
- // the outer fileSearch (the model still sees the same tool and prompt).
92
- let execute;
93
- let toModelOutput;
94
- if (opts.fallback) {
95
- const inner = similaritySearch({
96
- ...opts.fallback,
97
- name,
98
- description,
99
- });
100
- execute = inner.execute;
101
- toModelOutput = inner.toModelOutput;
102
- }
103
- const tool = {
104
- [FILE_SEARCH_MARKER]: true,
105
- definition,
106
- ...(execute ? { execute } : {}),
107
- ...(toModelOutput ? { toModelOutput } : {}),
108
- toSchema() {
109
- const schema = {
110
- name,
111
- description,
112
- parameters: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },
113
- providerHint,
114
- };
115
- return schema;
116
- },
117
- };
118
- return tool;
119
- }
120
- /**
121
- * Structural typeguard. Mirrors `isComputerUseTool` / `isHandoffTool` —
122
- * tools are plain objects tagged with `Symbol.for(...)` markers so the
123
- * loop and adapters can detect them without coupling to a class.
124
- */
125
- export function isFileSearchTool(t) {
126
- if (t === null || typeof t !== 'object')
127
- return false;
128
- const marker = t[FILE_SEARCH_MARKER];
129
- return marker === true;
130
- }
131
- /**
132
- * Lower the user-friendly `where` shape to OpenAI's typed filter object.
133
- *
134
- * - `{ author: 'Alice', year: 2026 }` → `{ type: 'and', filters: [eq, eq] }`
135
- * - `{ type: 'eq' | ... }` → pass-through
136
- * - `{ type: 'and' | 'or', filters }` → pass-through
137
- *
138
- * A single-key sugar object short-circuits to the bare `eq` (no `and`
139
- * wrapper), matching OpenAI's recommended shape.
140
- */
141
- export function normalizeWhere(where) {
142
- if (isTypedFilter(where))
143
- return where;
144
- const entries = Object.entries(where);
145
- if (entries.length === 0) {
146
- throw new Error('[Rudder AI] fileSearch({ where }) must contain at least one key.');
147
- }
148
- const eqs = entries.map(([key, value]) => ({ type: 'eq', key, value }));
149
- return eqs.length === 1 ? eqs[0] : { type: 'and', filters: eqs };
150
- }
151
- function isTypedFilter(w) {
152
- if (typeof w !== 'object' || w === null)
153
- return false;
154
- const t = w.type;
155
- return typeof t === 'string'
156
- && (t === 'eq' || t === 'ne' || t === 'gt' || t === 'gte' || t === 'lt' || t === 'lte' || t === 'and' || t === 'or');
157
- }
158
- //# sourceMappingURL=file-search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-search.js","sourceRoot":"","sources":["../src/file-search.ts"],"names":[],"mappings":"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"}
package/dist/files.d.ts DELETED
@@ -1,27 +0,0 @@
1
- import type { FileUploadResult, FileListResult, FileContent } from './types.js';
2
- /**
3
- * Provider file management — upload, list, delete, and retrieve files
4
- * on provider platforms (OpenAI, Anthropic, Google).
5
- *
6
- * @example
7
- * const files = AI.files('openai')
8
- * const uploaded = await files.upload('./report.pdf', { purpose: 'assistants' })
9
- * const list = await files.list()
10
- * await files.delete(uploaded.id)
11
- */
12
- export declare class FileManager {
13
- private readonly providerName;
14
- private constructor();
15
- static for(providerName: string): FileManager;
16
- /** Upload a file to the provider */
17
- upload(filePath: string, options?: {
18
- purpose?: string | undefined;
19
- }): Promise<FileUploadResult>;
20
- /** List all files on the provider */
21
- list(): Promise<FileListResult>;
22
- /** Delete a file by ID */
23
- delete(fileId: string): Promise<void>;
24
- /** Retrieve file content by ID (not all providers support this) */
25
- retrieve(fileId: string): Promise<FileContent>;
26
- }
27
- //# sourceMappingURL=files.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE/E;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACF,OAAO,CAAC,QAAQ,CAAC,YAAY;IAAjD,OAAO;IAEP,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAI7C,oCAAoC;IAC9B,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKrG,qCAAqC;IAC/B,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC;IAKrC,0BAA0B;IACpB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3C,mEAAmE;IAC7D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAOrD"}
package/dist/files.js DELETED
@@ -1,44 +0,0 @@
1
- import { AiRegistry } from './registry.js';
2
- /**
3
- * Provider file management — upload, list, delete, and retrieve files
4
- * on provider platforms (OpenAI, Anthropic, Google).
5
- *
6
- * @example
7
- * const files = AI.files('openai')
8
- * const uploaded = await files.upload('./report.pdf', { purpose: 'assistants' })
9
- * const list = await files.list()
10
- * await files.delete(uploaded.id)
11
- */
12
- export class FileManager {
13
- providerName;
14
- constructor(providerName) {
15
- this.providerName = providerName;
16
- }
17
- static for(providerName) {
18
- return new FileManager(providerName);
19
- }
20
- /** Upload a file to the provider */
21
- async upload(filePath, options) {
22
- const adapter = AiRegistry.resolveFiles(this.providerName);
23
- return adapter.upload({ filePath, purpose: options?.purpose });
24
- }
25
- /** List all files on the provider */
26
- async list() {
27
- const adapter = AiRegistry.resolveFiles(this.providerName);
28
- return adapter.list();
29
- }
30
- /** Delete a file by ID */
31
- async delete(fileId) {
32
- const adapter = AiRegistry.resolveFiles(this.providerName);
33
- return adapter.delete(fileId);
34
- }
35
- /** Retrieve file content by ID (not all providers support this) */
36
- async retrieve(fileId) {
37
- const adapter = AiRegistry.resolveFiles(this.providerName);
38
- if (!adapter.retrieve) {
39
- throw new Error(`[Rudder AI] Provider "${this.providerName}" does not support file retrieval.`);
40
- }
41
- return adapter.retrieve(fileId);
42
- }
43
- }
44
- //# sourceMappingURL=files.js.map
package/dist/files.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IACe;IAArC,YAAqC,YAAoB;QAApB,iBAAY,GAAZ,YAAY,CAAQ;IAAG,CAAC;IAE7D,MAAM,CAAC,GAAG,CAAC,YAAoB;QAC7B,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,CAAA;IACtC,CAAC;IAED,oCAAoC;IACpC,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,OAA0C;QACvE,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAChE,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC;IAED,0BAA0B;IAC1B,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC1D,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,YAAY,oCAAoC,CAAC,CAAA;QACjG,CAAC;QACD,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;CACF"}
@@ -1,94 +0,0 @@
1
- import type { ProviderAdapter, ProviderRequestOptions, ProviderResponse, StreamChunk } from '../types.js';
2
- import { type SseEvent } from './sse.js';
3
- /**
4
- * Connection config shared by every gateway adapter. Subclasses may extend
5
- * this with gateway-specific fields (region, project id, ...).
6
- */
7
- export interface GatewayAdapterConfig {
8
- /** Base URL of the gateway endpoint. */
9
- baseUrl: string;
10
- /** Optional API key — surfaced for {@link HttpGatewayAdapter.buildHeaders}. */
11
- apiKey?: string | undefined;
12
- /** Static headers merged into every request (auth from `buildHeaders` wins). */
13
- headers?: Record<string, string> | undefined;
14
- }
15
- /** Context passed to the request-shaping hooks. */
16
- export interface GatewayRequestContext {
17
- /** `true` for the streaming (`stream()`) path, `false` for `generate()`. */
18
- stream: boolean;
19
- }
20
- /**
21
- * Abstract template for normalizing an upstream LLM gateway behind the
22
- * framework's {@link ProviderAdapter} contract.
23
- *
24
- * This is the Laravel custom-driver pattern (Template Method): the base class
25
- * owns the reusable lifecycle — `fetch`, JSON / SSE handling, `AbortSignal`
26
- * wiring, and error mapping — and leaves four `protected abstract` hooks for
27
- * the gateway's wire format:
28
- *
29
- * - {@link buildHeaders} — the gateway's auth scheme.
30
- * - {@link buildRequestBody} — map {@link ProviderRequestOptions} → the
31
- * gateway's request envelope.
32
- * - {@link parseResponse} — map a non-streaming response → {@link ProviderResponse}.
33
- * - {@link parseStreamEvent} — map one {@link SseEvent} → zero or more
34
- * {@link StreamChunk}s.
35
- *
36
- * Reach for this only when the gateway's wire format matches no built-in
37
- * provider. An OpenAI- or Anthropic-compatible gateway needs no subclass:
38
- * register the `openai` / `anthropic` driver with a `baseUrl` override instead.
39
- *
40
- * Register a subclass through the usual factory path — `AiRegistry.register()`
41
- * (the framework's `extend()` equivalent).
42
- *
43
- * @example
44
- * ```ts
45
- * class AcmeGatewayAdapter extends HttpGatewayAdapter {
46
- * protected buildHeaders() {
47
- * return { authorization: `Bearer ${this.config.apiKey}` }
48
- * }
49
- * protected buildRequestBody(o: ProviderRequestOptions, ctx: GatewayRequestContext) {
50
- * return { model: this.model, messages: o.messages, stream: ctx.stream }
51
- * }
52
- * protected parseResponse(json: any): ProviderResponse {
53
- * return {
54
- * message: { role: 'assistant', content: json.text },
55
- * usage: { promptTokens: json.usage.in, completionTokens: json.usage.out, totalTokens: json.usage.total },
56
- * finishReason: 'stop',
57
- * }
58
- * }
59
- * protected parseStreamEvent(e: SseEvent): StreamChunk[] {
60
- * if (e.data === '[DONE]') return [{ type: 'finish', finishReason: 'stop' }]
61
- * const { delta } = JSON.parse(e.data)
62
- * return delta ? [{ type: 'text-delta', text: delta }] : []
63
- * }
64
- * }
65
- * ```
66
- */
67
- export declare abstract class HttpGatewayAdapter implements ProviderAdapter {
68
- protected readonly config: GatewayAdapterConfig;
69
- protected readonly model: string;
70
- constructor(config: GatewayAdapterConfig, model: string);
71
- generate(options: ProviderRequestOptions): Promise<ProviderResponse>;
72
- stream(options: ProviderRequestOptions): AsyncIterable<StreamChunk>;
73
- /** Perform the POST, wire the abort signal, and map error responses. */
74
- private send;
75
- /**
76
- * Resolve the request URL. Defaults to {@link GatewayAdapterConfig.baseUrl}
77
- * for both paths; override to append a path or branch on `ctx.stream`.
78
- */
79
- protected endpoint(_ctx: GatewayRequestContext): string;
80
- /**
81
- * Map a non-2xx response to an error. Override to parse a gateway-specific
82
- * error envelope. The default reads the body as text and throws.
83
- */
84
- protected onErrorResponse(res: Response): Promise<never>;
85
- /** Auth/identity headers for every request (merged over `config.headers`). */
86
- protected abstract buildHeaders(): Record<string, string>;
87
- /** Map the framework request to the gateway's request envelope. */
88
- protected abstract buildRequestBody(options: ProviderRequestOptions, ctx: GatewayRequestContext): unknown;
89
- /** Map a complete (non-streaming) gateway response to a {@link ProviderResponse}. */
90
- protected abstract parseResponse(json: unknown): ProviderResponse;
91
- /** Map one parsed {@link SseEvent} to zero or more {@link StreamChunk}s. */
92
- protected abstract parseStreamEvent(event: SseEvent): StreamChunk[];
93
- }
94
- //# sourceMappingURL=http-gateway-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-gateway-adapter.d.ts","sourceRoot":"","sources":["../../src/gateway/http-gateway-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EACZ,MAAM,aAAa,CAAA;AACpB,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAA;AAExD;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;CAC7C;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,8BAAsB,kBAAmB,YAAW,eAAe;IAE/D,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB;IAC/C,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM;gBADb,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,MAAM;IAG5B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMnE,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAAC,WAAW,CAAC;IAY1E,wEAAwE;YAC1D,IAAI;IAiBlB;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM;IAIvD;;;OAGG;cACa,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAS9D,8EAA8E;IAC9E,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzD,mEAAmE;IACnE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CACjC,OAAO,EAAE,sBAAsB,EAC/B,GAAG,EAAE,qBAAqB,GACzB,OAAO;IAEV,qFAAqF;IACrF,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;IAEjE,4EAA4E;IAC5E,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,EAAE;CACpE"}
@@ -1,106 +0,0 @@
1
- import { parseSseStream } from './sse.js';
2
- /**
3
- * Abstract template for normalizing an upstream LLM gateway behind the
4
- * framework's {@link ProviderAdapter} contract.
5
- *
6
- * This is the Laravel custom-driver pattern (Template Method): the base class
7
- * owns the reusable lifecycle — `fetch`, JSON / SSE handling, `AbortSignal`
8
- * wiring, and error mapping — and leaves four `protected abstract` hooks for
9
- * the gateway's wire format:
10
- *
11
- * - {@link buildHeaders} — the gateway's auth scheme.
12
- * - {@link buildRequestBody} — map {@link ProviderRequestOptions} → the
13
- * gateway's request envelope.
14
- * - {@link parseResponse} — map a non-streaming response → {@link ProviderResponse}.
15
- * - {@link parseStreamEvent} — map one {@link SseEvent} → zero or more
16
- * {@link StreamChunk}s.
17
- *
18
- * Reach for this only when the gateway's wire format matches no built-in
19
- * provider. An OpenAI- or Anthropic-compatible gateway needs no subclass:
20
- * register the `openai` / `anthropic` driver with a `baseUrl` override instead.
21
- *
22
- * Register a subclass through the usual factory path — `AiRegistry.register()`
23
- * (the framework's `extend()` equivalent).
24
- *
25
- * @example
26
- * ```ts
27
- * class AcmeGatewayAdapter extends HttpGatewayAdapter {
28
- * protected buildHeaders() {
29
- * return { authorization: `Bearer ${this.config.apiKey}` }
30
- * }
31
- * protected buildRequestBody(o: ProviderRequestOptions, ctx: GatewayRequestContext) {
32
- * return { model: this.model, messages: o.messages, stream: ctx.stream }
33
- * }
34
- * protected parseResponse(json: any): ProviderResponse {
35
- * return {
36
- * message: { role: 'assistant', content: json.text },
37
- * usage: { promptTokens: json.usage.in, completionTokens: json.usage.out, totalTokens: json.usage.total },
38
- * finishReason: 'stop',
39
- * }
40
- * }
41
- * protected parseStreamEvent(e: SseEvent): StreamChunk[] {
42
- * if (e.data === '[DONE]') return [{ type: 'finish', finishReason: 'stop' }]
43
- * const { delta } = JSON.parse(e.data)
44
- * return delta ? [{ type: 'text-delta', text: delta }] : []
45
- * }
46
- * }
47
- * ```
48
- */
49
- export class HttpGatewayAdapter {
50
- config;
51
- model;
52
- constructor(config, model) {
53
- this.config = config;
54
- this.model = model;
55
- }
56
- async generate(options) {
57
- const res = await this.send(options, { stream: false });
58
- const json = (await res.json());
59
- return this.parseResponse(json);
60
- }
61
- async *stream(options) {
62
- const res = await this.send(options, { stream: true });
63
- if (!res.body) {
64
- throw new Error('[Rudder AI] Gateway stream response had no body');
65
- }
66
- for await (const event of parseSseStream(res.body, options.signal)) {
67
- for (const chunk of this.parseStreamEvent(event))
68
- yield chunk;
69
- }
70
- }
71
- // ─── reusable plumbing ─────────────────────────────────────
72
- /** Perform the POST, wire the abort signal, and map error responses. */
73
- async send(options, ctx) {
74
- const headers = {
75
- 'content-type': 'application/json',
76
- accept: ctx.stream ? 'text/event-stream' : 'application/json',
77
- ...this.config.headers,
78
- ...this.buildHeaders(),
79
- };
80
- const res = await fetch(this.endpoint(ctx), {
81
- method: 'POST',
82
- headers,
83
- body: JSON.stringify(this.buildRequestBody(options, ctx)),
84
- ...(options.signal ? { signal: options.signal } : {}),
85
- });
86
- if (!res.ok)
87
- await this.onErrorResponse(res);
88
- return res;
89
- }
90
- /**
91
- * Resolve the request URL. Defaults to {@link GatewayAdapterConfig.baseUrl}
92
- * for both paths; override to append a path or branch on `ctx.stream`.
93
- */
94
- endpoint(_ctx) {
95
- return this.config.baseUrl;
96
- }
97
- /**
98
- * Map a non-2xx response to an error. Override to parse a gateway-specific
99
- * error envelope. The default reads the body as text and throws.
100
- */
101
- async onErrorResponse(res) {
102
- const body = await res.text().catch(() => '');
103
- throw new Error(`[Rudder AI] Gateway request failed: ${res.status} ${res.statusText}${body ? ` — ${body}` : ''}`);
104
- }
105
- }
106
- //# sourceMappingURL=http-gateway-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-gateway-adapter.js","sourceRoot":"","sources":["../../src/gateway/http-gateway-adapter.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAiB,MAAM,UAAU,CAAA;AAqBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,OAAgB,kBAAkB;IAEjB;IACA;IAFrB,YACqB,MAA4B,EAC5B,KAAa;QADb,WAAM,GAAN,MAAM,CAAsB;QAC5B,UAAK,GAAL,KAAK,CAAQ;IAC/B,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,OAA+B;QAC5C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QACvD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAA;QAC1C,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,OAA+B;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAA;QACpE,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAA;QAC/D,CAAC;IACH,CAAC;IAED,8DAA8D;IAE9D,wEAAwE;IAChE,KAAK,CAAC,IAAI,CAAC,OAA+B,EAAE,GAA0B;QAC5E,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB;YAC7D,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;YACtB,GAAG,IAAI,CAAC,YAAY,EAAE;SACvB,CAAA;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACzD,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAC5C,OAAO,GAAG,CAAA;IACZ,CAAC;IAED;;;OAGG;IACO,QAAQ,CAAC,IAA2B;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAA;IAC5B,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,eAAe,CAAC,GAAa;QAC3C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,IAAI,KAAK,CACb,uCAAuC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACjG,CAAA;IACH,CAAC;CAkBF"}
@@ -1,28 +0,0 @@
1
- /**
2
- * A single Server-Sent Event frame, parsed from a `text/event-stream` body.
3
- *
4
- * Only the two fields LLM gateways use in practice are surfaced: the optional
5
- * `event:` name and the (possibly multi-line) `data:` payload. Comment lines
6
- * (`:`-prefixed) and `id:` / `retry:` fields are consumed and ignored.
7
- */
8
- export interface SseEvent {
9
- /** The `event:` field, if the frame declared one. */
10
- event?: string | undefined;
11
- /** The concatenated `data:` payload (multiple `data:` lines joined by `\n`). */
12
- data: string;
13
- }
14
- /**
15
- * Frame a `text/event-stream` response body into {@link SseEvent}s.
16
- *
17
- * Standalone and dependency-free so the gateway template ships its own
18
- * framing — every built-in chat provider streams through a vendor SDK, so
19
- * there is no shared framer to reuse. Handles `\n` and `\r\n` line endings,
20
- * multi-line `data:` payloads, and back-pressure-friendly chunk boundaries
21
- * (an event split across two network reads is buffered until complete).
22
- *
23
- * Aborts cleanly: when `signal` fires, the reader is cancelled and iteration
24
- * ends. A trailing event with no terminating blank line is still yielded once
25
- * the stream closes.
26
- */
27
- export declare function parseSseStream(body: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<SseEvent>;
28
- //# sourceMappingURL=sse.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/gateway/sse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;;;;;;;;;;GAYG;AACH,wBAAuB,cAAc,CACnC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,cAAc,CAAC,QAAQ,CAAC,CAuC1B"}
@@ -1,78 +0,0 @@
1
- /**
2
- * Frame a `text/event-stream` response body into {@link SseEvent}s.
3
- *
4
- * Standalone and dependency-free so the gateway template ships its own
5
- * framing — every built-in chat provider streams through a vendor SDK, so
6
- * there is no shared framer to reuse. Handles `\n` and `\r\n` line endings,
7
- * multi-line `data:` payloads, and back-pressure-friendly chunk boundaries
8
- * (an event split across two network reads is buffered until complete).
9
- *
10
- * Aborts cleanly: when `signal` fires, the reader is cancelled and iteration
11
- * ends. A trailing event with no terminating blank line is still yielded once
12
- * the stream closes.
13
- */
14
- export async function* parseSseStream(body, signal) {
15
- const reader = body.getReader();
16
- const decoder = new TextDecoder();
17
- let buffer = '';
18
- const onAbort = () => {
19
- void reader.cancel().catch(() => { });
20
- };
21
- signal?.addEventListener('abort', onAbort, { once: true });
22
- try {
23
- while (true) {
24
- if (signal?.aborted)
25
- return;
26
- const { done, value } = await reader.read();
27
- if (done)
28
- break;
29
- buffer += decoder.decode(value, { stream: true });
30
- // Events are separated by a blank line. Normalize CRLF to LF first so a
31
- // single split handles both endings.
32
- let sep;
33
- buffer = buffer.replace(/\r\n/g, '\n');
34
- while ((sep = buffer.indexOf('\n\n')) !== -1) {
35
- const raw = buffer.slice(0, sep);
36
- buffer = buffer.slice(sep + 2);
37
- const event = parseFrame(raw);
38
- if (event)
39
- yield event;
40
- }
41
- }
42
- // Flush a final frame that arrived without a trailing blank line.
43
- const tail = (buffer + decoder.decode()).replace(/\r\n/g, '\n').trim();
44
- if (tail) {
45
- const event = parseFrame(tail);
46
- if (event)
47
- yield event;
48
- }
49
- }
50
- finally {
51
- signal?.removeEventListener('abort', onAbort);
52
- reader.releaseLock();
53
- }
54
- }
55
- /** Parse one raw SSE frame (the text between blank-line separators). */
56
- function parseFrame(raw) {
57
- let event;
58
- const dataLines = [];
59
- for (const line of raw.split('\n')) {
60
- if (line === '' || line.startsWith(':'))
61
- continue; // blank or comment
62
- const colon = line.indexOf(':');
63
- const field = colon === -1 ? line : line.slice(0, colon);
64
- // Per spec, a single leading space after the colon is stripped.
65
- let value = colon === -1 ? '' : line.slice(colon + 1);
66
- if (value.startsWith(' '))
67
- value = value.slice(1);
68
- if (field === 'event')
69
- event = value;
70
- else if (field === 'data')
71
- dataLines.push(value);
72
- // id / retry / unknown fields ignored
73
- }
74
- if (dataLines.length === 0 && event === undefined)
75
- return null;
76
- return { ...(event !== undefined ? { event } : {}), data: dataLines.join('\n') };
77
- }
78
- //# sourceMappingURL=sse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/gateway/sse.ts"],"names":[],"mappings":"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"}