@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,45 +0,0 @@
1
- import type { AiModelConfig, ProviderFactory, ProviderAdapter, RerankingAdapter, FileAdapter, VectorStoreAdapter } from './types.js';
2
- /**
3
- * Try a list of provider/model strings in order until one succeeds.
4
- *
5
- * Used by the media-generation paths (Image, Audio, Transcription) to give
6
- * the same failover ergonomics agents already have. The first model is the
7
- * "primary"; the rest are fallbacks. Errors from earlier candidates are
8
- * swallowed; only the last error is thrown if every candidate fails.
9
- *
10
- * The agent loop has its own failover wired into LoopContext (telemetry,
11
- * abort handling, observer attempts counter). This is a simpler helper for
12
- * single-shot calls outside the agent loop.
13
- *
14
- * @param primary The user's chosen model string (e.g. `'openai/dall-e-3'`).
15
- * @param fallbacks Additional candidates to try on failure.
16
- * @param call Receives each candidate model string and runs the work.
17
- */
18
- export declare function tryWithFailover<T>(primary: string, fallbacks: readonly string[], call: (modelString: string) => Promise<T>): Promise<T>;
19
- export declare class AiRegistry {
20
- /** Register a provider factory */
21
- static register(factory: ProviderFactory): void;
22
- /** Get a registered provider factory by name */
23
- static getFactory(name: string): ProviderFactory;
24
- /** Set the default provider/model string */
25
- static setDefault(modelString: string): void;
26
- /** Get the default provider/model string */
27
- static getDefault(): string;
28
- /** Parse 'provider/model' string into [providerName, modelId] */
29
- static parseModelString(modelString: string): [string, string];
30
- /** Resolve a provider/model string to a ProviderAdapter */
31
- static resolve(modelString: string): ProviderAdapter;
32
- /** Resolve a provider/model string to a RerankingAdapter */
33
- static resolveReranking(modelString: string): RerankingAdapter;
34
- /** Resolve a file adapter for a provider name */
35
- static resolveFiles(providerName: string): FileAdapter;
36
- /** Resolve a vector-store adapter for a provider name (#B8) */
37
- static resolveVectorStores(providerName: string): VectorStoreAdapter;
38
- /** Set available models for user selection */
39
- static setModels(models: AiModelConfig[]): void;
40
- /** Get available models */
41
- static getModels(): AiModelConfig[];
42
- /** Test-cleanup hook (public — other packages reset across the boundary). */
43
- static reset(): void;
44
- }
45
- //# sourceMappingURL=registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpI;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAaZ;AA4CD,qBAAa,UAAU;IACrB,kCAAkC;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI/C,gDAAgD;IAChD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAMhD,4CAA4C;IAC5C,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAI5C,4CAA4C;IAC5C,MAAM,CAAC,UAAU,IAAI,MAAM;IAK3B,iEAAiE;IACjE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAM9D,2DAA2D;IAC3D,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe;IAMpD,4DAA4D;IAC5D,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB;IAY9D,iDAAiD;IACjD,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,WAAW;IAWtD,+DAA+D;IAC/D,MAAM,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB;IAYpE,8CAA8C;IAC9C,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI;IAI/C,2BAA2B;IAC3B,MAAM,CAAC,SAAS,IAAI,aAAa,EAAE;IAInC,6EAA6E;IAC7E,MAAM,CAAC,KAAK,IAAI,IAAI;CAMrB"}
package/dist/registry.js DELETED
@@ -1,131 +0,0 @@
1
- /**
2
- * Try a list of provider/model strings in order until one succeeds.
3
- *
4
- * Used by the media-generation paths (Image, Audio, Transcription) to give
5
- * the same failover ergonomics agents already have. The first model is the
6
- * "primary"; the rest are fallbacks. Errors from earlier candidates are
7
- * swallowed; only the last error is thrown if every candidate fails.
8
- *
9
- * The agent loop has its own failover wired into LoopContext (telemetry,
10
- * abort handling, observer attempts counter). This is a simpler helper for
11
- * single-shot calls outside the agent loop.
12
- *
13
- * @param primary The user's chosen model string (e.g. `'openai/dall-e-3'`).
14
- * @param fallbacks Additional candidates to try on failure.
15
- * @param call Receives each candidate model string and runs the work.
16
- */
17
- export async function tryWithFailover(primary, fallbacks, call) {
18
- const candidates = fallbacks.length > 0
19
- ? [primary, ...fallbacks.filter((m) => m !== primary)]
20
- : [primary];
21
- let lastError;
22
- for (const m of candidates) {
23
- try {
24
- return await call(m);
25
- }
26
- catch (err) {
27
- lastError = err instanceof Error ? err : new Error(String(err));
28
- }
29
- }
30
- throw lastError ?? new Error('[Rudder AI] No provider available for failover.');
31
- }
32
- const _g = globalThis;
33
- if (!_g['__rudderjs_ai_registry__']) {
34
- _g['__rudderjs_ai_registry__'] = {
35
- factories: new Map(),
36
- default: null,
37
- models: [],
38
- };
39
- }
40
- const _store = _g['__rudderjs_ai_registry__'];
41
- // Reset listeners — modules that hold registry-shaped caches (e.g. the
42
- // facade's embedding-adapter cache) subscribe here so `AiRegistry.reset()`
43
- // clears them in lock-step. Survives reload via the same global slot.
44
- if (!_g['__rudderjs_ai_reset_listeners__']) {
45
- _g['__rudderjs_ai_reset_listeners__'] = new Set();
46
- }
47
- const _resetListeners = _g['__rudderjs_ai_reset_listeners__'];
48
- /** Test-cleanup hook (@internal — subscribe to `AiRegistry.reset()` to clear adjacent caches. ). Kept public — other packages reset across the boundary. */
49
- export function _onAiRegistryReset(fn) { _resetListeners.add(fn); }
50
- export class AiRegistry {
51
- /** Register a provider factory */
52
- static register(factory) {
53
- _store.factories.set(factory.name, factory);
54
- }
55
- /** Get a registered provider factory by name */
56
- static getFactory(name) {
57
- const f = _store.factories.get(name);
58
- if (!f)
59
- throw new Error(`[Rudder AI] Unknown AI provider "${name}". Register it first.`);
60
- return f;
61
- }
62
- /** Set the default provider/model string */
63
- static setDefault(modelString) {
64
- _store.default = modelString;
65
- }
66
- /** Get the default provider/model string */
67
- static getDefault() {
68
- if (!_store.default)
69
- throw new Error('[Rudder AI] No default model set. Add ai() to providers with a config.');
70
- return _store.default;
71
- }
72
- /** Parse 'provider/model' string into [providerName, modelId] */
73
- static parseModelString(modelString) {
74
- const slash = modelString.indexOf('/');
75
- if (slash === -1)
76
- throw new Error(`[Rudder AI] Invalid model string "${modelString}". Expected "provider/model" format.`);
77
- return [modelString.slice(0, slash), modelString.slice(slash + 1)];
78
- }
79
- /** Resolve a provider/model string to a ProviderAdapter */
80
- static resolve(modelString) {
81
- const [providerName, model] = this.parseModelString(modelString);
82
- const factory = this.getFactory(providerName);
83
- return factory.create(model);
84
- }
85
- /** Resolve a provider/model string to a RerankingAdapter */
86
- static resolveReranking(modelString) {
87
- const [providerName, model] = this.parseModelString(modelString);
88
- const factory = this.getFactory(providerName);
89
- if (!factory.createReranking) {
90
- throw new Error(`[Rudder AI] Provider "${providerName}" does not support reranking. ` +
91
- `Use a provider that implements createReranking() (e.g. cohere, jina).`);
92
- }
93
- return factory.createReranking(model);
94
- }
95
- /** Resolve a file adapter for a provider name */
96
- static resolveFiles(providerName) {
97
- const factory = this.getFactory(providerName);
98
- if (!factory.createFiles) {
99
- throw new Error(`[Rudder AI] Provider "${providerName}" does not support file management. ` +
100
- `Use a provider that implements createFiles() (e.g. openai, anthropic, google).`);
101
- }
102
- return factory.createFiles();
103
- }
104
- /** Resolve a vector-store adapter for a provider name (#B8) */
105
- static resolveVectorStores(providerName) {
106
- const factory = this.getFactory(providerName);
107
- if (!factory.createVectorStores) {
108
- throw new Error(`[Rudder AI] Provider "${providerName}" does not support hosted vector stores. ` +
109
- `Use a provider that implements createVectorStores() (e.g. openai). ` +
110
- `For self-hosted RAG, use similaritySearch() against an @rudderjs/orm Model with a pgvector column.`);
111
- }
112
- return factory.createVectorStores();
113
- }
114
- /** Set available models for user selection */
115
- static setModels(models) {
116
- _store.models = models;
117
- }
118
- /** Get available models */
119
- static getModels() {
120
- return _store.models;
121
- }
122
- /** Test-cleanup hook (public — other packages reset across the boundary). */
123
- static reset() {
124
- _store.factories.clear();
125
- _store.default = null;
126
- _store.models = [];
127
- for (const fn of _resetListeners)
128
- fn();
129
- }
130
- }
131
- //# sourceMappingURL=registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/rerank.d.ts DELETED
@@ -1,20 +0,0 @@
1
- import type { RerankingResult } from './types.js';
2
- /**
3
- * Fluent reranking builder.
4
- *
5
- * @example
6
- * const result = await Reranker.of('search query', documents).topK(5).rank()
7
- * const result = await Reranker.of('query', docs).model('cohere/rerank-v3.5').rank()
8
- */
9
- export declare class Reranker {
10
- private readonly _query;
11
- private readonly _documents;
12
- private _model;
13
- private _topK;
14
- private constructor();
15
- static of(query: string, documents: string[]): Reranker;
16
- model(model: string): this;
17
- topK(k: number): this;
18
- rank(): Promise<RerankingResult>;
19
- }
20
- //# sourceMappingURL=rerank.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rerank.d.ts","sourceRoot":"","sources":["../src/rerank.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;GAMG;AACH,qBAAa,QAAQ;IAKjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,KAAK,CAAoB;IAEjC,OAAO;IAKP,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ;IAIvD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKf,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;CAWvC"}
package/dist/rerank.js DELETED
@@ -1,40 +0,0 @@
1
- import { AiRegistry } from './registry.js';
2
- /**
3
- * Fluent reranking builder.
4
- *
5
- * @example
6
- * const result = await Reranker.of('search query', documents).topK(5).rank()
7
- * const result = await Reranker.of('query', docs).model('cohere/rerank-v3.5').rank()
8
- */
9
- export class Reranker {
10
- _query;
11
- _documents;
12
- _model;
13
- _topK;
14
- constructor(_query, _documents) {
15
- this._query = _query;
16
- this._documents = _documents;
17
- }
18
- static of(query, documents) {
19
- return new Reranker(query, documents);
20
- }
21
- model(model) {
22
- this._model = model;
23
- return this;
24
- }
25
- topK(k) {
26
- this._topK = k;
27
- return this;
28
- }
29
- async rank() {
30
- const modelStr = this._model ?? AiRegistry.getDefault();
31
- const adapter = AiRegistry.resolveReranking(modelStr);
32
- return adapter.rerank({
33
- query: this._query,
34
- documents: this._documents,
35
- model: modelStr,
36
- topK: this._topK,
37
- });
38
- }
39
- }
40
- //# sourceMappingURL=rerank.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rerank.js","sourceRoot":"","sources":["../src/rerank.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAG1C;;;;;;GAMG;AACH,MAAM,OAAO,QAAQ;IAKA;IACA;IALX,MAAM,CAAoB;IAC1B,KAAK,CAAoB;IAEjC,YACmB,MAAc,EACd,UAAoB;QADpB,WAAM,GAAN,MAAM,CAAQ;QACd,eAAU,GAAV,UAAU,CAAU;IACpC,CAAC;IAEJ,MAAM,CAAC,EAAE,CAAC,KAAa,EAAE,SAAmB;QAC1C,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,CAAS;QACZ,IAAI,CAAC,KAAK,GAAG,CAAC,CAAA;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,CAAA;QACvD,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QAErD,OAAO,OAAO,CAAC,MAAM,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -1,30 +0,0 @@
1
- import type { AgentPromptOptions, AiMessage, AnyTool, ToolCall } from './types.js';
2
- /**
3
- * When continuing a chat after a stop-on-approval round-trip, the supplied
4
- * `messages` array ends with an `assistant` message whose `toolCalls` were
5
- * never fulfilled (the loop paused before executing them). Most providers
6
- * (Anthropic in particular) reject such conversations because every
7
- * `tool_use` block must be followed by a matching `tool_result`.
8
- *
9
- * This helper detects that case, executes the pending **server** tool calls
10
- * (honoring `approvedToolCallIds` / `rejectedToolCallIds`), appends the
11
- * resulting tool messages to `messages` in place, and returns them. The
12
- * caller can attach the returned list to `AgentResponse.resumedToolMessages`
13
- * so that the panels dispatcher persists them in the conversation store.
14
- *
15
- * Client tools (no `execute`) must come back from the browser with their
16
- * tool result already in the conversation, so the trailing assistant message
17
- * will not have unmatched `toolCalls` for them — they're handled outside.
18
- */
19
- export declare function resumePendingToolCalls(deps: {
20
- messages: AiMessage[];
21
- toolMap: Map<string, AnyTool>;
22
- options: AgentPromptOptions | undefined;
23
- }): Promise<{
24
- resumed: AiMessage[];
25
- approvalStillRequired: {
26
- toolCall: ToolCall;
27
- isClientTool: boolean;
28
- } | undefined;
29
- }>;
30
- //# sourceMappingURL=resume-approval.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume-approval.d.ts","sourceRoot":"","sources":["../src/resume-approval.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAElF;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,SAAS,EAAE,CAAA;IACrB,OAAO,EAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAG,kBAAkB,GAAG,SAAS,CAAA;CACzC,GAAG,OAAO,CAAC;IACV,OAAO,EAAgB,SAAS,EAAE,CAAA;IAClC,qBAAqB,EAAE;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAA;CACjF,CAAC,CA8HD"}
@@ -1,147 +0,0 @@
1
- import { applyToModelOutput, evaluateApproval, executeMaybeStreaming, validateToolArgs, } from './tool-helpers.js';
2
- /**
3
- * When continuing a chat after a stop-on-approval round-trip, the supplied
4
- * `messages` array ends with an `assistant` message whose `toolCalls` were
5
- * never fulfilled (the loop paused before executing them). Most providers
6
- * (Anthropic in particular) reject such conversations because every
7
- * `tool_use` block must be followed by a matching `tool_result`.
8
- *
9
- * This helper detects that case, executes the pending **server** tool calls
10
- * (honoring `approvedToolCallIds` / `rejectedToolCallIds`), appends the
11
- * resulting tool messages to `messages` in place, and returns them. The
12
- * caller can attach the returned list to `AgentResponse.resumedToolMessages`
13
- * so that the panels dispatcher persists them in the conversation store.
14
- *
15
- * Client tools (no `execute`) must come back from the browser with their
16
- * tool result already in the conversation, so the trailing assistant message
17
- * will not have unmatched `toolCalls` for them — they're handled outside.
18
- */
19
- export async function resumePendingToolCalls(deps) {
20
- const { messages, toolMap, options } = deps;
21
- // Strip trailing pending-approval placeholders from a prior partial resume.
22
- // They were synthesized so every `tool_use` in the parent assistant message
23
- // had a matching `tool_result` during the pause; on resume we re-walk the
24
- // parent and append fresh results (real or placeholder) based on the
25
- // latest approval state.
26
- while (messages.length > 0) {
27
- const tail = messages[messages.length - 1];
28
- if (tail.role === 'tool' && tail._pending) {
29
- messages.pop();
30
- }
31
- else
32
- break;
33
- }
34
- // Find the parent assistant message — it's the most recent assistant
35
- // message immediately followed only by tool messages. On a fresh pause
36
- // there are no tools yet; on a subsequent resume the parent is buried
37
- // under the real tool results we appended last time.
38
- let parentIdx = messages.length - 1;
39
- while (parentIdx >= 0 && messages[parentIdx].role === 'tool')
40
- parentIdx--;
41
- const last = parentIdx >= 0 ? messages[parentIdx] : undefined;
42
- if (!last || last.role !== 'assistant' || !last.toolCalls || last.toolCalls.length === 0) {
43
- return { resumed: [], approvalStillRequired: undefined };
44
- }
45
- // Collect tool-call ids already resolved in a prior partial resume — those
46
- // trail the parent assistant as non-`_pending` tool messages. Skipping
47
- // them on the next walk avoids double-executing approved tools.
48
- const alreadyResolved = new Set();
49
- for (let i = parentIdx + 1; i < messages.length; i++) {
50
- const m = messages[i];
51
- if (m.role !== 'tool')
52
- break;
53
- if (!m._pending && m.toolCallId)
54
- alreadyResolved.add(m.toolCallId);
55
- }
56
- const resumed = [];
57
- let approvalStillRequired;
58
- for (let i = 0; i < last.toolCalls.length; i++) {
59
- const tc = last.toolCalls[i];
60
- if (alreadyResolved.has(tc.id))
61
- continue;
62
- const tool = toolMap.get(tc.name);
63
- if (!tool) {
64
- const err = `Error: Unknown tool "${tc.name}"`;
65
- const m = { role: 'tool', content: err, toolCallId: tc.id };
66
- messages.push(m);
67
- resumed.push(m);
68
- continue;
69
- }
70
- if (!tool.execute) {
71
- // Client tool whose result is missing from the supplied messages.
72
- // Surface an error so the model can recover instead of hanging.
73
- const err = `Error: client tool "${tc.name}" was not executed by the browser`;
74
- const m = { role: 'tool', content: err, toolCallId: tc.id };
75
- messages.push(m);
76
- resumed.push(m);
77
- continue;
78
- }
79
- const decision = await evaluateApproval(tool, tc, options);
80
- if (decision === 'rejected') {
81
- const rej = { rejected: true, reason: 'User rejected this tool call' };
82
- const m = { role: 'tool', content: JSON.stringify(rej), toolCallId: tc.id };
83
- messages.push(m);
84
- resumed.push(m);
85
- continue;
86
- }
87
- if (decision === 'pending') {
88
- // Still pending — the user hasn't decided on this call yet. Stop
89
- // executing further tools AND synthesize placeholder tool messages for
90
- // every unresolved sibling (including this one), so Anthropic's
91
- // "every tool_use needs a matching tool_result" invariant holds while
92
- // the loop is paused. The next resume strips these placeholders and
93
- // re-walks based on the fresh approval state.
94
- approvalStillRequired = { toolCall: tc, isClientTool: false };
95
- for (let j = i; j < last.toolCalls.length; j++) {
96
- const sib = last.toolCalls[j];
97
- if (alreadyResolved.has(sib.id))
98
- continue;
99
- messages.push({
100
- role: 'tool',
101
- content: 'Tool call pending user approval — execution deferred.',
102
- toolCallId: sib.id,
103
- _pending: true,
104
- });
105
- }
106
- break;
107
- }
108
- // Validate args before executing on resume. Approval-resume bypasses
109
- // middleware so we use the raw tc.arguments. On failure, feed the
110
- // structured error to the model so it can correct itself.
111
- const validation = validateToolArgs(tool, tc.arguments);
112
- if (!validation.ok) {
113
- const m = { role: 'tool', content: JSON.stringify(validation.error), toolCallId: tc.id };
114
- messages.push(m);
115
- resumed.push(m);
116
- continue;
117
- }
118
- try {
119
- // Drain generator yields silently — approval-resume runs outside the
120
- // stream, so any preliminary updates are discarded; only the final
121
- // return value is captured.
122
- const execGen = executeMaybeStreaming(tool, validation.value, { toolCallId: tc.id });
123
- let result;
124
- while (true) {
125
- const step = await execGen.next();
126
- if (step.done) {
127
- result = step.value;
128
- break;
129
- }
130
- }
131
- // Approval-resume has no middleware context here, so toModelOutput
132
- // errors fall back silently to default stringification (R6).
133
- const content = await applyToModelOutput(tool, result);
134
- const m = { role: 'tool', content, toolCallId: tc.id };
135
- messages.push(m);
136
- resumed.push(m);
137
- }
138
- catch (err) {
139
- const errMsg = `Error: ${err instanceof Error ? err.message : String(err)}`;
140
- const m = { role: 'tool', content: errMsg, toolCallId: tc.id };
141
- messages.push(m);
142
- resumed.push(m);
143
- }
144
- }
145
- return { resumed, approvalStillRequired };
146
- }
147
- //# sourceMappingURL=resume-approval.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resume-approval.js","sourceRoot":"","sources":["../src/resume-approval.ts"],"names":[],"mappings":"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"}
@@ -1,43 +0,0 @@
1
- /**
2
- * Make a loaded conversation history safe to replay against any provider by
3
- * enforcing the tool-call / tool-result invariant in BOTH directions.
4
- *
5
- * Anthropic's Messages API requires every `tool_use` block to be followed by
6
- * `tool_result` blocks for all of its ids. OpenAI-compatible providers
7
- * (DeepSeek, OpenRouter, Azure) are stricter still: a `role:'tool'` message
8
- * must immediately follow the `assistant` + `tool_calls` that declared its id,
9
- * and an unanswered `tool_calls` is equally rejected, surfacing as
10
- * `400 Messages with role 'tool' must be a response to a preceding message
11
- * with 'tool_calls'`. A conversation interrupted mid-turn (a crash after the
12
- * assistant message persisted but before all tool results landed; a client
13
- * failure that never replayed the results) leaves a malformed graph in the
14
- * store, and replaying it 400s.
15
- *
16
- * {@link sanitizeConversation} walks the messages in order:
17
- *
18
- * - **Complete tool turn** (every declared id has a matching result in the
19
- * immediately-following tool run) is kept, with the results re-emitted in
20
- * `toolCalls` order, exactly one per call. Any extra / duplicate / orphan
21
- * tool message interleaved in that run is dropped.
22
- * - **Dangling tool turn** (one or more declared ids unanswered) has its
23
- * assistant `toolCalls` stripped; the text `content` is preserved as a
24
- * plain assistant message (an empty one is dropped entirely); the partial
25
- * tool results are dropped.
26
- * - **Orphan tool result** (a `role:'tool'` message whose parent assistant
27
- * is missing or was dropped as dangling) is dropped. Replaying it trips
28
- * the 400 above on OpenAI-compatible providers and a BadRequestError on
29
- * Anthropic.
30
- *
31
- * Unlike the wire-level normalizer the provider adapters apply (which
32
- * SYNTHESIZES stub results so an in-flight request stays well-formed), the
33
- * load boundary DROPS incomplete turns: an interrupted turn is abandoned
34
- * history, and a fake "result missing" message would pollute the model's
35
- * future context.
36
- *
37
- * Pure and idempotent: safe to apply at any load boundary, and re-running over
38
- * an already-sanitized array is a no-op. {@link OrmConversationStore} applies
39
- * it in `load()` so persisted histories are replay-safe by default.
40
- */
41
- import type { AiMessage } from './types.js';
42
- export declare function sanitizeConversation(messages: AiMessage[]): AiMessage[];
43
- //# sourceMappingURL=sanitize-conversation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-conversation.d.ts","sourceRoot":"","sources":["../src/sanitize-conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAgDvE"}
@@ -1,85 +0,0 @@
1
- /**
2
- * Make a loaded conversation history safe to replay against any provider by
3
- * enforcing the tool-call / tool-result invariant in BOTH directions.
4
- *
5
- * Anthropic's Messages API requires every `tool_use` block to be followed by
6
- * `tool_result` blocks for all of its ids. OpenAI-compatible providers
7
- * (DeepSeek, OpenRouter, Azure) are stricter still: a `role:'tool'` message
8
- * must immediately follow the `assistant` + `tool_calls` that declared its id,
9
- * and an unanswered `tool_calls` is equally rejected, surfacing as
10
- * `400 Messages with role 'tool' must be a response to a preceding message
11
- * with 'tool_calls'`. A conversation interrupted mid-turn (a crash after the
12
- * assistant message persisted but before all tool results landed; a client
13
- * failure that never replayed the results) leaves a malformed graph in the
14
- * store, and replaying it 400s.
15
- *
16
- * {@link sanitizeConversation} walks the messages in order:
17
- *
18
- * - **Complete tool turn** (every declared id has a matching result in the
19
- * immediately-following tool run) is kept, with the results re-emitted in
20
- * `toolCalls` order, exactly one per call. Any extra / duplicate / orphan
21
- * tool message interleaved in that run is dropped.
22
- * - **Dangling tool turn** (one or more declared ids unanswered) has its
23
- * assistant `toolCalls` stripped; the text `content` is preserved as a
24
- * plain assistant message (an empty one is dropped entirely); the partial
25
- * tool results are dropped.
26
- * - **Orphan tool result** (a `role:'tool'` message whose parent assistant
27
- * is missing or was dropped as dangling) is dropped. Replaying it trips
28
- * the 400 above on OpenAI-compatible providers and a BadRequestError on
29
- * Anthropic.
30
- *
31
- * Unlike the wire-level normalizer the provider adapters apply (which
32
- * SYNTHESIZES stub results so an in-flight request stays well-formed), the
33
- * load boundary DROPS incomplete turns: an interrupted turn is abandoned
34
- * history, and a fake "result missing" message would pollute the model's
35
- * future context.
36
- *
37
- * Pure and idempotent: safe to apply at any load boundary, and re-running over
38
- * an already-sanitized array is a no-op. {@link OrmConversationStore} applies
39
- * it in `load()` so persisted histories are replay-safe by default.
40
- */
41
- export function sanitizeConversation(messages) {
42
- const result = [];
43
- for (let i = 0; i < messages.length; i++) {
44
- const msg = messages[i];
45
- // A `tool` message reaching the top level was not consumed by a complete
46
- // assistant turn below (those advance `i` past their results), so its
47
- // parent is missing or was dropped as dangling. It is an orphan; drop it.
48
- if (msg.role === 'tool')
49
- continue;
50
- if (msg.role !== 'assistant' || !msg.toolCalls?.length) {
51
- result.push(msg);
52
- continue;
53
- }
54
- const wanted = msg.toolCalls.map(tc => tc.id).filter(Boolean);
55
- // Map the immediately-following tool run by id (first result per id wins).
56
- const resultsById = new Map();
57
- let j = i + 1;
58
- while (j < messages.length && messages[j].role === 'tool') {
59
- const t = messages[j];
60
- const tid = t.toolCallId;
61
- if (tid && !resultsById.has(tid))
62
- resultsById.set(tid, t);
63
- j++;
64
- }
65
- const allCovered = wanted.every(id => resultsById.has(id));
66
- if (allCovered) {
67
- // Emit the assistant followed by exactly one result per call, in
68
- // `toolCalls` order. This normalizes ordering and drops any extra /
69
- // orphan tool message that was interleaved in the run.
70
- result.push(msg);
71
- for (const tc of msg.toolCalls)
72
- result.push(resultsById.get(tc.id));
73
- i = j - 1;
74
- continue;
75
- }
76
- // Dangling: strip toolCalls, drop the partial tool results, keep any text.
77
- const text = typeof msg.content === 'string' ? msg.content : '';
78
- if (text.trim() !== '') {
79
- result.push({ role: 'assistant', content: msg.content });
80
- }
81
- i = j - 1;
82
- }
83
- return result;
84
- }
85
- //# sourceMappingURL=sanitize-conversation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitize-conversation.js","sourceRoot":"","sources":["../src/sanitize-conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,MAAM,UAAU,oBAAoB,CAAC,QAAqB;IACxD,MAAM,MAAM,GAAgB,EAAE,CAAA;IAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QAExB,yEAAyE;QACzE,sEAAsE;QACtE,0EAA0E;QAC1E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,SAAQ;QAEjC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,SAAQ;QACV,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAE7D,2EAA2E;QAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAA;YACxB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YACzD,CAAC,EAAE,CAAA;QACL,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,iEAAiE;YACjE,oEAAoE;YACpE,uDAAuD;YACvD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAE,CAAC,CAAA;YACpE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACT,SAAQ;QACV,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;QAC/D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QAC1D,CAAC;QACD,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}