@mohamedtebo/convai-platform 1.0.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 (262) hide show
  1. package/README.md +155 -0
  2. package/dist/adapters/index.d.ts +2 -0
  3. package/dist/adapters/index.d.ts.map +1 -0
  4. package/dist/adapters/index.js +6 -0
  5. package/dist/adapters/index.js.map +1 -0
  6. package/dist/adapters/memory-conversation.store.d.ts +12 -0
  7. package/dist/adapters/memory-conversation.store.d.ts.map +1 -0
  8. package/dist/adapters/memory-conversation.store.js +25 -0
  9. package/dist/adapters/memory-conversation.store.js.map +1 -0
  10. package/dist/composed/platform-client.d.ts +29 -0
  11. package/dist/composed/platform-client.d.ts.map +1 -0
  12. package/dist/composed/platform-client.js +16 -0
  13. package/dist/composed/platform-client.js.map +1 -0
  14. package/dist/errors/index.d.ts +4 -0
  15. package/dist/errors/index.d.ts.map +1 -0
  16. package/dist/errors/index.js +11 -0
  17. package/dist/errors/index.js.map +1 -0
  18. package/dist/errors/provider.error.d.ts +16 -0
  19. package/dist/errors/provider.error.d.ts.map +1 -0
  20. package/dist/errors/provider.error.js +15 -0
  21. package/dist/errors/provider.error.js.map +1 -0
  22. package/dist/errors/sdk.error.d.ts +15 -0
  23. package/dist/errors/sdk.error.d.ts.map +1 -0
  24. package/dist/errors/sdk.error.js +16 -0
  25. package/dist/errors/sdk.error.js.map +1 -0
  26. package/dist/errors/tool-loop.error.d.ts +11 -0
  27. package/dist/errors/tool-loop.error.d.ts.map +1 -0
  28. package/dist/errors/tool-loop.error.js +30 -0
  29. package/dist/errors/tool-loop.error.js.map +1 -0
  30. package/dist/factory/index.d.ts +2 -0
  31. package/dist/factory/index.d.ts.map +1 -0
  32. package/dist/factory/index.js +6 -0
  33. package/dist/factory/index.js.map +1 -0
  34. package/dist/factory/provider.factory.d.ts +8 -0
  35. package/dist/factory/provider.factory.d.ts.map +1 -0
  36. package/dist/factory/provider.factory.js +49 -0
  37. package/dist/factory/provider.factory.js.map +1 -0
  38. package/dist/index.d.ts +13 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +34 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/providers/anthropic/anthropic.provider.d.ts +22 -0
  43. package/dist/providers/anthropic/anthropic.provider.d.ts.map +1 -0
  44. package/dist/providers/anthropic/anthropic.provider.js +34 -0
  45. package/dist/providers/anthropic/anthropic.provider.js.map +1 -0
  46. package/dist/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
  47. package/dist/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
  48. package/dist/providers/anthropic/loops/claude-tool.loop.js +58 -0
  49. package/dist/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
  50. package/dist/providers/anthropic/utils/error-mapper.d.ts +4 -0
  51. package/dist/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
  52. package/dist/providers/anthropic/utils/error-mapper.js +35 -0
  53. package/dist/providers/anthropic/utils/error-mapper.js.map +1 -0
  54. package/dist/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
  55. package/dist/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
  56. package/dist/providers/openai/builders/conversation-or-create.builder.js +18 -0
  57. package/dist/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
  58. package/dist/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
  59. package/dist/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
  60. package/dist/providers/openai/loops/assistants-tool.loop.js +58 -0
  61. package/dist/providers/openai/loops/assistants-tool.loop.js.map +1 -0
  62. package/dist/providers/openai/loops/responses-tool.loop.d.ts +14 -0
  63. package/dist/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
  64. package/dist/providers/openai/loops/responses-tool.loop.js +87 -0
  65. package/dist/providers/openai/loops/responses-tool.loop.js.map +1 -0
  66. package/dist/providers/openai/openai-assistants.provider.d.ts +27 -0
  67. package/dist/providers/openai/openai-assistants.provider.d.ts.map +1 -0
  68. package/dist/providers/openai/openai-assistants.provider.js +40 -0
  69. package/dist/providers/openai/openai-assistants.provider.js.map +1 -0
  70. package/dist/providers/openai/openai-responses.provider.d.ts +25 -0
  71. package/dist/providers/openai/openai-responses.provider.d.ts.map +1 -0
  72. package/dist/providers/openai/openai-responses.provider.js +35 -0
  73. package/dist/providers/openai/openai-responses.provider.js.map +1 -0
  74. package/dist/providers/openai/operations/create-conversation.operation.d.ts +7 -0
  75. package/dist/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
  76. package/dist/providers/openai/operations/create-conversation.operation.js +22 -0
  77. package/dist/providers/openai/operations/create-conversation.operation.js.map +1 -0
  78. package/dist/providers/openai/operations/create-response.operation.d.ts +13 -0
  79. package/dist/providers/openai/operations/create-response.operation.d.ts.map +1 -0
  80. package/dist/providers/openai/operations/create-response.operation.js +27 -0
  81. package/dist/providers/openai/operations/create-response.operation.js.map +1 -0
  82. package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
  83. package/dist/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
  84. package/dist/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
  85. package/dist/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
  86. package/dist/providers/openai/utils/error-mapper.d.ts +4 -0
  87. package/dist/providers/openai/utils/error-mapper.d.ts.map +1 -0
  88. package/dist/providers/openai/utils/error-mapper.js +45 -0
  89. package/dist/providers/openai/utils/error-mapper.js.map +1 -0
  90. package/dist/providers/openai/utils/usage-mapper.d.ts +10 -0
  91. package/dist/providers/openai/utils/usage-mapper.d.ts.map +1 -0
  92. package/dist/providers/openai/utils/usage-mapper.js +16 -0
  93. package/dist/providers/openai/utils/usage-mapper.js.map +1 -0
  94. package/dist/safe/index.d.ts +2 -0
  95. package/dist/safe/index.d.ts.map +1 -0
  96. package/dist/safe/index.js +6 -0
  97. package/dist/safe/index.js.map +1 -0
  98. package/dist/safe/safe-platform.client.d.ts +14 -0
  99. package/dist/safe/safe-platform.client.d.ts.map +1 -0
  100. package/dist/safe/safe-platform.client.js +56 -0
  101. package/dist/safe/safe-platform.client.js.map +1 -0
  102. package/dist/src/adapters/index.d.ts +2 -0
  103. package/dist/src/adapters/index.d.ts.map +1 -0
  104. package/dist/src/adapters/index.js +6 -0
  105. package/dist/src/adapters/index.js.map +1 -0
  106. package/dist/src/adapters/memory-conversation.store.d.ts +12 -0
  107. package/dist/src/adapters/memory-conversation.store.d.ts.map +1 -0
  108. package/dist/src/adapters/memory-conversation.store.js +25 -0
  109. package/dist/src/adapters/memory-conversation.store.js.map +1 -0
  110. package/dist/src/composed/platform-client.d.ts +29 -0
  111. package/dist/src/composed/platform-client.d.ts.map +1 -0
  112. package/dist/src/composed/platform-client.js +16 -0
  113. package/dist/src/composed/platform-client.js.map +1 -0
  114. package/dist/src/errors/index.d.ts +4 -0
  115. package/dist/src/errors/index.d.ts.map +1 -0
  116. package/dist/src/errors/index.js +11 -0
  117. package/dist/src/errors/index.js.map +1 -0
  118. package/dist/src/errors/provider.error.d.ts +16 -0
  119. package/dist/src/errors/provider.error.d.ts.map +1 -0
  120. package/dist/src/errors/provider.error.js +15 -0
  121. package/dist/src/errors/provider.error.js.map +1 -0
  122. package/dist/src/errors/sdk.error.d.ts +15 -0
  123. package/dist/src/errors/sdk.error.d.ts.map +1 -0
  124. package/dist/src/errors/sdk.error.js +16 -0
  125. package/dist/src/errors/sdk.error.js.map +1 -0
  126. package/dist/src/errors/tool-loop.error.d.ts +11 -0
  127. package/dist/src/errors/tool-loop.error.d.ts.map +1 -0
  128. package/dist/src/errors/tool-loop.error.js +30 -0
  129. package/dist/src/errors/tool-loop.error.js.map +1 -0
  130. package/dist/src/factory/index.d.ts +2 -0
  131. package/dist/src/factory/index.d.ts.map +1 -0
  132. package/dist/src/factory/index.js +6 -0
  133. package/dist/src/factory/index.js.map +1 -0
  134. package/dist/src/factory/provider.factory.d.ts +8 -0
  135. package/dist/src/factory/provider.factory.d.ts.map +1 -0
  136. package/dist/src/factory/provider.factory.js +49 -0
  137. package/dist/src/factory/provider.factory.js.map +1 -0
  138. package/dist/src/index.d.ts +13 -0
  139. package/dist/src/index.d.ts.map +1 -0
  140. package/dist/src/index.js +34 -0
  141. package/dist/src/index.js.map +1 -0
  142. package/dist/src/providers/anthropic/anthropic.provider.d.ts +22 -0
  143. package/dist/src/providers/anthropic/anthropic.provider.d.ts.map +1 -0
  144. package/dist/src/providers/anthropic/anthropic.provider.js +34 -0
  145. package/dist/src/providers/anthropic/anthropic.provider.js.map +1 -0
  146. package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts +11 -0
  147. package/dist/src/providers/anthropic/loops/claude-tool.loop.d.ts.map +1 -0
  148. package/dist/src/providers/anthropic/loops/claude-tool.loop.js +58 -0
  149. package/dist/src/providers/anthropic/loops/claude-tool.loop.js.map +1 -0
  150. package/dist/src/providers/anthropic/utils/error-mapper.d.ts +4 -0
  151. package/dist/src/providers/anthropic/utils/error-mapper.d.ts.map +1 -0
  152. package/dist/src/providers/anthropic/utils/error-mapper.js +35 -0
  153. package/dist/src/providers/anthropic/utils/error-mapper.js.map +1 -0
  154. package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts +15 -0
  155. package/dist/src/providers/openai/builders/conversation-or-create.builder.d.ts.map +1 -0
  156. package/dist/src/providers/openai/builders/conversation-or-create.builder.js +18 -0
  157. package/dist/src/providers/openai/builders/conversation-or-create.builder.js.map +1 -0
  158. package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts +19 -0
  159. package/dist/src/providers/openai/loops/assistants-tool.loop.d.ts.map +1 -0
  160. package/dist/src/providers/openai/loops/assistants-tool.loop.js +58 -0
  161. package/dist/src/providers/openai/loops/assistants-tool.loop.js.map +1 -0
  162. package/dist/src/providers/openai/loops/responses-tool.loop.d.ts +14 -0
  163. package/dist/src/providers/openai/loops/responses-tool.loop.d.ts.map +1 -0
  164. package/dist/src/providers/openai/loops/responses-tool.loop.js +87 -0
  165. package/dist/src/providers/openai/loops/responses-tool.loop.js.map +1 -0
  166. package/dist/src/providers/openai/openai-assistants.provider.d.ts +27 -0
  167. package/dist/src/providers/openai/openai-assistants.provider.d.ts.map +1 -0
  168. package/dist/src/providers/openai/openai-assistants.provider.js +40 -0
  169. package/dist/src/providers/openai/openai-assistants.provider.js.map +1 -0
  170. package/dist/src/providers/openai/openai-responses.provider.d.ts +25 -0
  171. package/dist/src/providers/openai/openai-responses.provider.d.ts.map +1 -0
  172. package/dist/src/providers/openai/openai-responses.provider.js +35 -0
  173. package/dist/src/providers/openai/openai-responses.provider.js.map +1 -0
  174. package/dist/src/providers/openai/operations/create-conversation.operation.d.ts +7 -0
  175. package/dist/src/providers/openai/operations/create-conversation.operation.d.ts.map +1 -0
  176. package/dist/src/providers/openai/operations/create-conversation.operation.js +22 -0
  177. package/dist/src/providers/openai/operations/create-conversation.operation.js.map +1 -0
  178. package/dist/src/providers/openai/operations/create-response.operation.d.ts +13 -0
  179. package/dist/src/providers/openai/operations/create-response.operation.d.ts.map +1 -0
  180. package/dist/src/providers/openai/operations/create-response.operation.js +27 -0
  181. package/dist/src/providers/openai/operations/create-response.operation.js.map +1 -0
  182. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts +17 -0
  183. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.d.ts.map +1 -0
  184. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js +33 -0
  185. package/dist/src/providers/openai/operations/submit-tool-outputs.operation.js.map +1 -0
  186. package/dist/src/providers/openai/utils/error-mapper.d.ts +4 -0
  187. package/dist/src/providers/openai/utils/error-mapper.d.ts.map +1 -0
  188. package/dist/src/providers/openai/utils/error-mapper.js +45 -0
  189. package/dist/src/providers/openai/utils/error-mapper.js.map +1 -0
  190. package/dist/src/providers/openai/utils/usage-mapper.d.ts +10 -0
  191. package/dist/src/providers/openai/utils/usage-mapper.d.ts.map +1 -0
  192. package/dist/src/providers/openai/utils/usage-mapper.js +16 -0
  193. package/dist/src/providers/openai/utils/usage-mapper.js.map +1 -0
  194. package/dist/src/safe/index.d.ts +2 -0
  195. package/dist/src/safe/index.d.ts.map +1 -0
  196. package/dist/src/safe/index.js +6 -0
  197. package/dist/src/safe/index.js.map +1 -0
  198. package/dist/src/safe/safe-platform.client.d.ts +14 -0
  199. package/dist/src/safe/safe-platform.client.d.ts.map +1 -0
  200. package/dist/src/safe/safe-platform.client.js +56 -0
  201. package/dist/src/safe/safe-platform.client.js.map +1 -0
  202. package/dist/src/types/ask-with-tools.types.d.ts +48 -0
  203. package/dist/src/types/ask-with-tools.types.d.ts.map +1 -0
  204. package/dist/src/types/ask-with-tools.types.js +3 -0
  205. package/dist/src/types/ask-with-tools.types.js.map +1 -0
  206. package/dist/src/types/client-config.interface.d.ts +33 -0
  207. package/dist/src/types/client-config.interface.d.ts.map +1 -0
  208. package/dist/src/types/client-config.interface.js +3 -0
  209. package/dist/src/types/client-config.interface.js.map +1 -0
  210. package/dist/src/types/conversation-store.interface.d.ts +24 -0
  211. package/dist/src/types/conversation-store.interface.d.ts.map +1 -0
  212. package/dist/src/types/conversation-store.interface.js +3 -0
  213. package/dist/src/types/conversation-store.interface.js.map +1 -0
  214. package/dist/src/types/index.d.ts +8 -0
  215. package/dist/src/types/index.d.ts.map +1 -0
  216. package/dist/src/types/index.js +7 -0
  217. package/dist/src/types/index.js.map +1 -0
  218. package/dist/src/types/provider.interface.d.ts +13 -0
  219. package/dist/src/types/provider.interface.d.ts.map +1 -0
  220. package/dist/src/types/provider.interface.js +3 -0
  221. package/dist/src/types/provider.interface.js.map +1 -0
  222. package/dist/src/types/sdk-result.interface.d.ts +30 -0
  223. package/dist/src/types/sdk-result.interface.d.ts.map +1 -0
  224. package/dist/src/types/sdk-result.interface.js +11 -0
  225. package/dist/src/types/sdk-result.interface.js.map +1 -0
  226. package/dist/src/types/tool-handler.interface.d.ts +45 -0
  227. package/dist/src/types/tool-handler.interface.d.ts.map +1 -0
  228. package/dist/src/types/tool-handler.interface.js +3 -0
  229. package/dist/src/types/tool-handler.interface.js.map +1 -0
  230. package/dist/tests/safe-client.test.d.ts +2 -0
  231. package/dist/tests/safe-client.test.d.ts.map +1 -0
  232. package/dist/tests/safe-client.test.js +66 -0
  233. package/dist/tests/safe-client.test.js.map +1 -0
  234. package/dist/types/ask-with-tools.types.d.ts +48 -0
  235. package/dist/types/ask-with-tools.types.d.ts.map +1 -0
  236. package/dist/types/ask-with-tools.types.js +3 -0
  237. package/dist/types/ask-with-tools.types.js.map +1 -0
  238. package/dist/types/client-config.interface.d.ts +33 -0
  239. package/dist/types/client-config.interface.d.ts.map +1 -0
  240. package/dist/types/client-config.interface.js +3 -0
  241. package/dist/types/client-config.interface.js.map +1 -0
  242. package/dist/types/conversation-store.interface.d.ts +24 -0
  243. package/dist/types/conversation-store.interface.d.ts.map +1 -0
  244. package/dist/types/conversation-store.interface.js +3 -0
  245. package/dist/types/conversation-store.interface.js.map +1 -0
  246. package/dist/types/index.d.ts +8 -0
  247. package/dist/types/index.d.ts.map +1 -0
  248. package/dist/types/index.js +7 -0
  249. package/dist/types/index.js.map +1 -0
  250. package/dist/types/provider.interface.d.ts +13 -0
  251. package/dist/types/provider.interface.d.ts.map +1 -0
  252. package/dist/types/provider.interface.js +3 -0
  253. package/dist/types/provider.interface.js.map +1 -0
  254. package/dist/types/sdk-result.interface.d.ts +30 -0
  255. package/dist/types/sdk-result.interface.d.ts.map +1 -0
  256. package/dist/types/sdk-result.interface.js +11 -0
  257. package/dist/types/sdk-result.interface.js.map +1 -0
  258. package/dist/types/tool-handler.interface.d.ts +45 -0
  259. package/dist/types/tool-handler.interface.d.ts.map +1 -0
  260. package/dist/types/tool-handler.interface.js +3 -0
  261. package/dist/types/tool-handler.interface.js.map +1 -0
  262. package/package.json +38 -0
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AnthropicProvider = void 0;
4
+ const claude_tool_loop_1 = require("./loops/claude-tool.loop");
5
+ const error_mapper_1 = require("./utils/error-mapper");
6
+ /**
7
+ * Anthropic Claude provider.
8
+ * Implements the same AIProvider interface as the OpenAI providers
9
+ * so telbany can swap providers by changing a single config field.
10
+ */
11
+ class AnthropicProvider {
12
+ constructor(config) {
13
+ try {
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ const Anthropic = require('@anthropic-ai/sdk');
16
+ this.anthropic = new Anthropic({ apiKey: config.apiKey, maxRetries: config.maxRetries ?? 2 });
17
+ }
18
+ catch {
19
+ throw new Error('@anthropic-ai/sdk is required when using AnthropicProvider. Run: npm install @anthropic-ai/sdk');
20
+ }
21
+ this.model = config.model;
22
+ this.handler = config.toolHandler;
23
+ }
24
+ async askWithTools(params) {
25
+ try {
26
+ return await (0, claude_tool_loop_1.runClaudeToolLoop)({ anthropic: this.anthropic, model: this.model, handler: this.handler }, params);
27
+ }
28
+ catch (err) {
29
+ throw (0, error_mapper_1.mapAnthropicError)(err);
30
+ }
31
+ }
32
+ }
33
+ exports.AnthropicProvider = AnthropicProvider;
34
+ //# sourceMappingURL=anthropic.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.provider.js","sourceRoot":"","sources":["../../../src/providers/anthropic/anthropic.provider.ts"],"names":[],"mappings":";;;AAGA,+DAA6D;AAC7D,uDAAyD;AASzD;;;;GAIG;AACH,MAAa,iBAAiB;IAK5B,YAAY,MAA+B;QACzC,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC,CAAC;QACpH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,oCAAiB,EAC5B,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACvE,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAA,gCAAiB,EAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AA3BD,8CA2BC"}
@@ -0,0 +1,11 @@
1
+ import type { AskWithToolsParams, AskWithToolsResult } from '../../../types/ask-with-tools.types';
2
+ import type { ToolHandler } from '../../../types/tool-handler.interface';
3
+ interface ClaudeLoopContext {
4
+ anthropic: unknown;
5
+ model: string;
6
+ handler?: ToolHandler;
7
+ }
8
+ /** Run the Anthropic tool loop for one user turn. */
9
+ export declare function runClaudeToolLoop(ctx: ClaudeLoopContext, params: AskWithToolsParams): Promise<AskWithToolsResult>;
10
+ export {};
11
+ //# sourceMappingURL=claude-tool.loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/anthropic/loops/claude-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,uCAAuC,CAAC;AAKlG,UAAU,iBAAiB;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAID,qDAAqD;AACrD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA+C7B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runClaudeToolLoop = runClaudeToolLoop;
4
+ const errors_1 = require("../../../errors");
5
+ const MAX_TURNS = 10;
6
+ /** Run the Anthropic tool loop for one user turn. */
7
+ async function runClaudeToolLoop(ctx, params) {
8
+ const { anthropic, model, handler } = ctx;
9
+ const messages = [{ role: 'user', content: params.userQuestion }];
10
+ for (let turn = 0; turn < MAX_TURNS; turn++) {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const sdk = anthropic;
13
+ const response = await sdk.messages.create({
14
+ model: params.model ?? model,
15
+ max_tokens: 4096,
16
+ system: params.instructions,
17
+ tools: params.tools ?? [],
18
+ messages,
19
+ });
20
+ const responseId = response.id;
21
+ const stopReason = response.stop_reason;
22
+ if (stopReason === 'end_turn') {
23
+ const text = response.content
24
+ .filter((b) => b.type === 'text')
25
+ .map((b) => b.text ?? '')
26
+ .join('');
27
+ return { kind: 'text', outputText: text, responseId, usage: mapClaudeUsage(response.usage), model: params.model ?? model };
28
+ }
29
+ if (stopReason === 'tool_use') {
30
+ if (!handler)
31
+ throw new errors_1.NoToolHandlerError();
32
+ messages.push({ role: 'assistant', content: response.content });
33
+ const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
34
+ const calls = toolUseBlocks.map((b) => ({ id: b.id, name: b.name, arguments: JSON.stringify(b.input) }));
35
+ const toolContext = { threadKey: params.threadKey, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion };
36
+ const outputs = [];
37
+ for (const call of calls) {
38
+ const out = await handler.buildOutput(call, toolContext);
39
+ if (out)
40
+ outputs.push(out);
41
+ }
42
+ const appResult = await handler.extractResult(calls, outputs, toolContext);
43
+ if (appResult !== null) {
44
+ return { kind: 'toolResult', toolCallResult: appResult, responseId, usage: null, model: params.model ?? model };
45
+ }
46
+ const toolResultContent = outputs.map((o) => ({ type: 'tool_result', tool_use_id: o.call_id, content: o.output }));
47
+ messages.push({ role: 'user', content: toolResultContent });
48
+ }
49
+ }
50
+ throw new errors_1.ToolLoopError(MAX_TURNS);
51
+ }
52
+ function mapClaudeUsage(usage) {
53
+ if (!usage || typeof usage !== 'object')
54
+ return null;
55
+ const u = usage;
56
+ return { inputTokens: u['input_tokens'] ?? 0, outputTokens: u['output_tokens'] ?? 0, totalTokens: (u['input_tokens'] ?? 0) + (u['output_tokens'] ?? 0) };
57
+ }
58
+ //# sourceMappingURL=claude-tool.loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/anthropic/loops/claude-tool.loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ProviderError } from '../../../errors/provider.error';
2
+ /** Map an Anthropic SDK error to a typed ProviderError. */
3
+ export declare function mapAnthropicError(err: unknown): ProviderError;
4
+ //# sourceMappingURL=error-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../../../../src/providers/anthropic/utils/error-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAS/D,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAmB7D"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapAnthropicError = mapAnthropicError;
4
+ const provider_error_1 = require("../../../errors/provider.error");
5
+ /** Map an Anthropic SDK error to a typed ProviderError. */
6
+ function mapAnthropicError(err) {
7
+ const apiErr = err;
8
+ if (apiErr?.status !== undefined) {
9
+ const retryable = apiErr.status === 429 || (apiErr.status >= 500 && apiErr.status < 600);
10
+ const retryAfterMs = retryable ? parseRetryAfter(apiErr.headers) : undefined;
11
+ return new provider_error_1.ProviderError({
12
+ provider: 'anthropic',
13
+ code: `ANTHROPIC_${apiErr.status}`,
14
+ message: apiErr.error?.message ?? apiErr.message ?? 'Anthropic API error',
15
+ statusCode: apiErr.status,
16
+ retryable,
17
+ retryAfterMs,
18
+ });
19
+ }
20
+ return new provider_error_1.ProviderError({
21
+ provider: 'anthropic',
22
+ code: 'ANTHROPIC_UNEXPECTED',
23
+ message: err instanceof Error ? err.message : 'Unexpected Anthropic error',
24
+ });
25
+ }
26
+ function parseRetryAfter(headers) {
27
+ if (!headers)
28
+ return undefined;
29
+ const v = headers['retry-after'] ?? headers['Retry-After'];
30
+ if (!v)
31
+ return undefined;
32
+ const s = parseInt(v, 10);
33
+ return isNaN(s) ? undefined : s * 1000;
34
+ }
35
+ //# sourceMappingURL=error-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-mapper.js","sourceRoot":"","sources":["../../../../src/providers/anthropic/utils/error-mapper.ts"],"names":[],"mappings":";;AAUA,8CAmBC;AA7BD,mEAA+D;AAS/D,2DAA2D;AAC3D,SAAgB,iBAAiB,CAAC,GAAY;IAC5C,MAAM,MAAM,GAAG,GAAwB,CAAC;IACxC,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACzF,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,OAAO,IAAI,8BAAa,CAAC;YACvB,QAAQ,EAAE,WAAW;YACrB,IAAI,EAAE,aAAa,MAAM,CAAC,MAAM,EAAE;YAClC,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,qBAAqB;YACzE,UAAU,EAAE,MAAM,CAAC,MAAM;YACzB,SAAS;YACT,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,8BAAa,CAAC;QACvB,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;KAC3E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,OAAgC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACzC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type OpenAI from 'openai';
2
+ import type { ConversationStore } from '../../../types/conversation-store.interface';
3
+ /**
4
+ * Resolve the conversationId for a thread.
5
+ * Creates a new OpenAI conversation when none exists yet (lazy creation).
6
+ */
7
+ export declare function resolveConversationId({ openai, store, threadKey, }: {
8
+ openai: OpenAI;
9
+ store: ConversationStore;
10
+ threadKey: string;
11
+ }): Promise<{
12
+ conversationId: string;
13
+ lastResponseId: string | undefined;
14
+ }>;
15
+ //# sourceMappingURL=conversation-or-create.builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-or-create.builder.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/builders/conversation-or-create.builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAGrF;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,EAC1C,MAAM,EACN,KAAK,EACL,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC,CAU1E"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveConversationId = resolveConversationId;
4
+ const create_conversation_operation_1 = require("../operations/create-conversation.operation");
5
+ /**
6
+ * Resolve the conversationId for a thread.
7
+ * Creates a new OpenAI conversation when none exists yet (lazy creation).
8
+ */
9
+ async function resolveConversationId({ openai, store, threadKey, }) {
10
+ const existing = await store.load(threadKey);
11
+ if (existing) {
12
+ return { conversationId: existing.conversationId, lastResponseId: existing.lastResponseId };
13
+ }
14
+ const conversationId = await (0, create_conversation_operation_1.createConversation)(openai);
15
+ await store.create(threadKey, conversationId);
16
+ return { conversationId, lastResponseId: undefined };
17
+ }
18
+ //# sourceMappingURL=conversation-or-create.builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-or-create.builder.js","sourceRoot":"","sources":["../../../../src/providers/openai/builders/conversation-or-create.builder.ts"],"names":[],"mappings":";;AAQA,sDAkBC;AAxBD,+FAAiF;AAEjF;;;GAGG;AACI,KAAK,UAAU,qBAAqB,CAAC,EAC1C,MAAM,EACN,KAAK,EACL,SAAS,GAKV;IACC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC9F,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,IAAA,kDAAkB,EAAC,MAAM,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type OpenAI from 'openai';
2
+ import type { AskWithToolsResult } from '../../../types/ask-with-tools.types';
3
+ import type { ToolHandler } from '../../../types/tool-handler.interface';
4
+ interface AssistantsLoopCtx {
5
+ openai: OpenAI;
6
+ handler?: ToolHandler;
7
+ }
8
+ export interface AssistantsLoopParams {
9
+ threadId: string;
10
+ runId: string;
11
+ chatbotId: string;
12
+ organizationId?: string;
13
+ userQuestion: string;
14
+ model: string;
15
+ }
16
+ /** Poll a beta.threads run until completion, executing tool calls via the ToolHandler. */
17
+ export declare function runAssistantsToolLoop(ctx: AssistantsLoopCtx, params: AssistantsLoopParams): Promise<AskWithToolsResult>;
18
+ export {};
19
+ //# sourceMappingURL=assistants-tool.loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistants-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/loops/assistants-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,uCAAuC,CAAC;AAOtF,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0FAA0F;AAC1F,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA+C7B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAssistantsToolLoop = runAssistantsToolLoop;
4
+ const errors_1 = require("../../../errors");
5
+ const usage_mapper_1 = require("../utils/usage-mapper");
6
+ const MAX_POLLS = 60;
7
+ const POLL_INTERVAL_MS = 1000;
8
+ /** Poll a beta.threads run until completion, executing tool calls via the ToolHandler. */
9
+ async function runAssistantsToolLoop(ctx, params) {
10
+ const { openai, handler } = ctx;
11
+ for (let poll = 0; poll < MAX_POLLS; poll++) {
12
+ await sleep(POLL_INTERVAL_MS);
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ const run = await openai.beta.threads.runs.retrieve(params.threadId, params.runId);
15
+ if (run.status === 'completed') {
16
+ const messages = await openai.beta.threads.messages.list(params.threadId, { limit: 1 });
17
+ const first = messages.data[0];
18
+ const text = first?.content
19
+ .filter((c) => c.type === 'text')
20
+ .map((c) => c.text.value)
21
+ .join('') ?? '';
22
+ return { kind: 'text', outputText: text, responseId: run.id, usage: (0, usage_mapper_1.mapUsage)(run.usage), model: params.model };
23
+ }
24
+ if (run.status === 'requires_action') {
25
+ if (!handler)
26
+ throw new errors_1.NoToolHandlerError();
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ const rawToolCalls = (run.required_action?.submit_tool_outputs?.tool_calls ?? []);
29
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
+ const toolCalls = rawToolCalls.map((tc) => ({
31
+ id: tc.id, name: tc.function.name, arguments: tc.function.arguments,
32
+ }));
33
+ const toolContext = { threadKey: params.threadId, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion };
34
+ const outputs = [];
35
+ for (const call of toolCalls) {
36
+ const out = await handler.buildOutput(call, toolContext);
37
+ if (out)
38
+ outputs.push(out);
39
+ }
40
+ const appResult = await handler.extractResult(toolCalls, outputs, toolContext);
41
+ if (appResult !== null) {
42
+ return { kind: 'toolResult', toolCallResult: appResult, responseId: run.id, usage: null, model: params.model };
43
+ }
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ await openai.beta.threads.runs.submitToolOutputs(params.threadId, params.runId, {
46
+ tool_outputs: outputs.map((o) => ({ tool_call_id: o.call_id, output: o.output })),
47
+ });
48
+ }
49
+ if (['failed', 'cancelled', 'expired'].includes(run.status)) {
50
+ throw new Error(`Assistants run ended with status: ${run.status}`);
51
+ }
52
+ }
53
+ throw new errors_1.ToolLoopError(MAX_POLLS);
54
+ }
55
+ function sleep(ms) {
56
+ return new Promise((r) => setTimeout(r, ms));
57
+ }
58
+ //# sourceMappingURL=assistants-tool.loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistants-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/openai/loops/assistants-tool.loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type OpenAI from 'openai';
2
+ import type { AskWithToolsParams, AskWithToolsResult } from '../../../types/ask-with-tools.types';
3
+ import type { ToolHandler } from '../../../types/tool-handler.interface';
4
+ import type { ConversationStore } from '../../../types/conversation-store.interface';
5
+ interface LoopContext {
6
+ openai: OpenAI;
7
+ store: ConversationStore;
8
+ handler?: ToolHandler;
9
+ model: string;
10
+ }
11
+ /** Run the full Responses API tool loop for one user turn. */
12
+ export declare function runResponsesToolLoop(ctx: LoopContext, params: AskWithToolsParams, conversationId: string, previousResponseId: string | undefined): Promise<AskWithToolsResult>;
13
+ export {};
14
+ //# sourceMappingURL=responses-tool.loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses-tool.loop.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/loops/responses-tool.loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAA2B,MAAM,uCAAuC,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,8DAA8D;AAC9D,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,kBAAkB,EAC1B,cAAc,EAAE,MAAM,EACtB,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC,OAAO,CAAC,kBAAkB,CAAC,CAyD7B"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runResponsesToolLoop = runResponsesToolLoop;
4
+ const create_response_operation_1 = require("../operations/create-response.operation");
5
+ const submit_tool_outputs_operation_1 = require("../operations/submit-tool-outputs.operation");
6
+ const usage_mapper_1 = require("../utils/usage-mapper");
7
+ const errors_1 = require("../../../errors");
8
+ const MAX_TURNS = 10;
9
+ /** Run the full Responses API tool loop for one user turn. */
10
+ async function runResponsesToolLoop(ctx, params, conversationId, previousResponseId) {
11
+ const { openai, store, handler, model } = ctx;
12
+ let lastResponseId = previousResponseId;
13
+ for (let turn = 0; turn < MAX_TURNS; turn++) {
14
+ const response = (await (turn === 0
15
+ ? (0, create_response_operation_1.createResponse)(openai, {
16
+ conversationId,
17
+ previousResponseId: lastResponseId,
18
+ model,
19
+ instructions: params.instructions,
20
+ userQuestion: params.userQuestion,
21
+ tools: params.tools,
22
+ vectorStoreIds: params.vectorStoreIds,
23
+ })
24
+ : Promise.resolve(null)));
25
+ // On re-entry submit tool outputs instead
26
+ if (turn > 0 || !response)
27
+ break;
28
+ const raw = response;
29
+ const responseId = raw['id'];
30
+ lastResponseId = responseId;
31
+ await store.save(params.threadKey, { conversationId, lastResponseId: responseId });
32
+ const status = raw['status'];
33
+ if (status === 'completed') {
34
+ const outputText = extractOutputText(raw);
35
+ return { kind: 'text', outputText, responseId, usage: (0, usage_mapper_1.mapUsage)(raw['usage']), model };
36
+ }
37
+ if (status === 'requires_action' || status === 'failed_with_tool_calls') {
38
+ if (!handler)
39
+ throw new errors_1.NoToolHandlerError();
40
+ const calls = extractToolCalls(raw);
41
+ const toolContext = { threadKey: params.threadKey, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion, mediaUrl: params.mediaUrl };
42
+ const outputs = [];
43
+ for (const call of calls) {
44
+ const out = await handler.buildOutput(call, toolContext);
45
+ if (out)
46
+ outputs.push(out);
47
+ }
48
+ const appResult = await handler.extractResult(calls, outputs, toolContext);
49
+ if (appResult !== null) {
50
+ return { kind: 'toolResult', toolCallResult: appResult, responseId, usage: (0, usage_mapper_1.mapUsage)(raw['usage']), model };
51
+ }
52
+ const nextResponse = await (0, submit_tool_outputs_operation_1.submitToolOutputs)(openai, { previousResponseId: responseId, conversationId, model, instructions: params.instructions, toolOutputs: outputs, tools: params.tools });
53
+ const nextId = nextResponse['id'];
54
+ await store.save(params.threadKey, { conversationId, lastResponseId: nextId });
55
+ lastResponseId = nextId;
56
+ const nextStatus = nextResponse['status'];
57
+ if (nextStatus === 'completed') {
58
+ return { kind: 'text', outputText: extractOutputText(nextResponse), responseId: nextId, usage: (0, usage_mapper_1.mapUsage)(nextResponse['usage']), model };
59
+ }
60
+ }
61
+ }
62
+ throw new errors_1.ToolLoopError(MAX_TURNS);
63
+ }
64
+ function extractOutputText(response) {
65
+ const output = response['output'];
66
+ if (!Array.isArray(output))
67
+ return '';
68
+ const textBlock = output.find((b) => b['type'] === 'message');
69
+ if (!textBlock)
70
+ return '';
71
+ const content = textBlock['content'];
72
+ if (!Array.isArray(content))
73
+ return '';
74
+ return content.map((c) => c['text'] ?? '').join('');
75
+ }
76
+ function extractToolCalls(response) {
77
+ const output = response['output'];
78
+ if (!Array.isArray(output))
79
+ return [];
80
+ return output
81
+ .filter((b) => b['type'] === 'function_call')
82
+ .map((b) => {
83
+ const block = b;
84
+ return { id: block['call_id'], name: block['name'], arguments: block['arguments'] };
85
+ });
86
+ }
87
+ //# sourceMappingURL=responses-tool.loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responses-tool.loop.js","sourceRoot":"","sources":["../../../../src/providers/openai/loops/responses-tool.loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { AIProvider } from '../../types/provider.interface';
2
+ import type { AskWithToolsParams, AskWithToolsResult } from '../../types/ask-with-tools.types';
3
+ import type { ToolHandler } from '../../types/tool-handler.interface';
4
+ export interface OpenAIAssistantsProviderConfig {
5
+ apiKey: string;
6
+ assistantId: string;
7
+ model: string;
8
+ toolHandler?: ToolHandler;
9
+ maxRetries?: number;
10
+ timeoutMs?: number;
11
+ }
12
+ /**
13
+ * Legacy OpenAI Assistants API provider.
14
+ * Use this during the dual-run migration period until all threads are moved
15
+ * to the Responses + Conversations API, then remove.
16
+ *
17
+ * @deprecated Prefer OpenAIResponsesProvider for new chatbots.
18
+ */
19
+ export declare class OpenAIAssistantsProvider implements AIProvider {
20
+ private readonly openai;
21
+ private readonly assistantId;
22
+ private readonly model;
23
+ private readonly handler?;
24
+ constructor(config: OpenAIAssistantsProviderConfig);
25
+ askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
26
+ }
27
+ //# sourceMappingURL=openai-assistants.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-assistants.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/openai-assistants.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAGtE,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,YAAW,UAAU;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE3B,MAAM,EAAE,8BAA8B;IAW5C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAgB5E"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIAssistantsProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const assistants_tool_loop_1 = require("./loops/assistants-tool.loop");
9
+ /**
10
+ * Legacy OpenAI Assistants API provider.
11
+ * Use this during the dual-run migration period until all threads are moved
12
+ * to the Responses + Conversations API, then remove.
13
+ *
14
+ * @deprecated Prefer OpenAIResponsesProvider for new chatbots.
15
+ */
16
+ class OpenAIAssistantsProvider {
17
+ constructor(config) {
18
+ this.openai = new openai_1.default({
19
+ apiKey: config.apiKey,
20
+ maxRetries: config.maxRetries ?? 2,
21
+ timeout: config.timeoutMs ?? 60000,
22
+ });
23
+ this.assistantId = config.assistantId;
24
+ this.model = config.model;
25
+ this.handler = config.toolHandler;
26
+ }
27
+ async askWithTools(params) {
28
+ await this.openai.beta.threads.messages.create(params.threadKey, {
29
+ role: 'user',
30
+ content: params.userQuestion,
31
+ });
32
+ const run = await this.openai.beta.threads.runs.create(params.threadKey, {
33
+ assistant_id: this.assistantId,
34
+ model: params.model ?? this.model,
35
+ });
36
+ return (0, assistants_tool_loop_1.runAssistantsToolLoop)({ openai: this.openai, handler: this.handler }, { threadId: params.threadKey, runId: run.id, chatbotId: params.chatbotId, organizationId: params.organizationId, userQuestion: params.userQuestion, model: params.model ?? this.model });
37
+ }
38
+ }
39
+ exports.OpenAIAssistantsProvider = OpenAIAssistantsProvider;
40
+ //# sourceMappingURL=openai-assistants.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-assistants.provider.js","sourceRoot":"","sources":["../../../src/providers/openai/openai-assistants.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAI5B,uEAAqE;AAWrE;;;;;;GAMG;AACH,MAAa,wBAAwB;IAMnC,YAAY,MAAsC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,SAAS,IAAI,KAAM;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YAC/D,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAM,CAAC,YAAY;SAC7B,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YACvE,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;SAClC,CAAC,CAAC;QAEH,OAAO,IAAA,4CAAqB,EAC1B,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAC9C,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CACxL,CAAC;IACJ,CAAC;CACF;AAjCD,4DAiCC"}
@@ -0,0 +1,25 @@
1
+ import type { AIProvider } from '../../types/provider.interface';
2
+ import type { AskWithToolsParams, AskWithToolsResult } from '../../types/ask-with-tools.types';
3
+ import type { ConversationStore } from '../../types/conversation-store.interface';
4
+ import type { ToolHandler } from '../../types/tool-handler.interface';
5
+ export interface OpenAIResponsesProviderConfig {
6
+ apiKey: string;
7
+ model: string;
8
+ conversationStore: ConversationStore;
9
+ toolHandler?: ToolHandler;
10
+ maxRetries?: number;
11
+ timeoutMs?: number;
12
+ }
13
+ /**
14
+ * OpenAI Responses + Conversations API provider.
15
+ * Manages conversation state via the injected ConversationStore.
16
+ */
17
+ export declare class OpenAIResponsesProvider implements AIProvider {
18
+ private readonly openai;
19
+ private readonly model;
20
+ private readonly store;
21
+ private readonly handler?;
22
+ constructor(config: OpenAIResponsesProviderConfig);
23
+ askWithTools(params: AskWithToolsParams): Promise<AskWithToolsResult>;
24
+ }
25
+ //# sourceMappingURL=openai-responses.provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses.provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/openai-responses.provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC/F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAItE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE3B,MAAM,EAAE,6BAA6B;IAW3C,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAc5E"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIResponsesProvider = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const conversation_or_create_builder_1 = require("./builders/conversation-or-create.builder");
9
+ const responses_tool_loop_1 = require("./loops/responses-tool.loop");
10
+ /**
11
+ * OpenAI Responses + Conversations API provider.
12
+ * Manages conversation state via the injected ConversationStore.
13
+ */
14
+ class OpenAIResponsesProvider {
15
+ constructor(config) {
16
+ this.openai = new openai_1.default({
17
+ apiKey: config.apiKey,
18
+ maxRetries: config.maxRetries ?? 2,
19
+ timeout: config.timeoutMs ?? 60000,
20
+ });
21
+ this.model = config.model;
22
+ this.store = config.conversationStore;
23
+ this.handler = config.toolHandler;
24
+ }
25
+ async askWithTools(params) {
26
+ const { conversationId, lastResponseId } = await (0, conversation_or_create_builder_1.resolveConversationId)({
27
+ openai: this.openai,
28
+ store: this.store,
29
+ threadKey: params.threadKey,
30
+ });
31
+ return (0, responses_tool_loop_1.runResponsesToolLoop)({ openai: this.openai, store: this.store, handler: this.handler, model: params.model ?? this.model }, params, conversationId, lastResponseId);
32
+ }
33
+ }
34
+ exports.OpenAIResponsesProvider = OpenAIResponsesProvider;
35
+ //# sourceMappingURL=openai-responses.provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses.provider.js","sourceRoot":"","sources":["../../../src/providers/openai/openai-responses.provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAK5B,8FAAkF;AAClF,qEAAmE;AAWnE;;;GAGG;AACH,MAAa,uBAAuB;IAMlC,YAAY,MAAqC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,SAAS,IAAI,KAAM;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA0B;QAC3C,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,IAAA,sDAAqB,EAAC;YACrE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,OAAO,IAAA,0CAAoB,EACzB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EACpG,MAAM,EACN,cAAc,EACd,cAAc,CACf,CAAC;IACJ,CAAC;CACF;AA/BD,0DA+BC"}
@@ -0,0 +1,7 @@
1
+ import type OpenAI from 'openai';
2
+ /**
3
+ * Creates an OpenAI Conversation via the Responses + Conversations API.
4
+ * Wraps the raw SDK call in a typed error boundary.
5
+ */
6
+ export declare function createConversation(openai: OpenAI): Promise<string>;
7
+ //# sourceMappingURL=create-conversation.operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-conversation.operation.d.ts","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-conversation.operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAGjC;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWxE"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createConversation = createConversation;
4
+ const error_mapper_1 = require("../utils/error-mapper");
5
+ /**
6
+ * Creates an OpenAI Conversation via the Responses + Conversations API.
7
+ * Wraps the raw SDK call in a typed error boundary.
8
+ */
9
+ async function createConversation(openai) {
10
+ try {
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const conversation = await openai.beta.conversations.create({});
13
+ if (!conversation?.id) {
14
+ throw new Error('createConversation returned no id');
15
+ }
16
+ return conversation.id;
17
+ }
18
+ catch (err) {
19
+ throw (0, error_mapper_1.mapOpenAIError)(err);
20
+ }
21
+ }
22
+ //# sourceMappingURL=create-conversation.operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-conversation.operation.js","sourceRoot":"","sources":["../../../../src/providers/openai/operations/create-conversation.operation.ts"],"names":[],"mappings":";;AAOA,gDAWC;AAjBD,wDAAuD;AAEvD;;;GAGG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,YAAY,GAAG,MAAO,MAAc,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,YAAY,CAAC,EAAY,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAA,6BAAc,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}