@falai/agent 0.1.0-alpha2

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 (499) hide show
  1. package/README.md +797 -0
  2. package/dist/cjs/package.json +1 -0
  3. package/dist/cjs/src/adapters/MemoryAdapter.d.ts +47 -0
  4. package/dist/cjs/src/adapters/MemoryAdapter.d.ts.map +1 -0
  5. package/dist/cjs/src/adapters/MemoryAdapter.js +202 -0
  6. package/dist/cjs/src/adapters/MemoryAdapter.js.map +1 -0
  7. package/dist/cjs/src/adapters/MongoAdapter.d.ts +97 -0
  8. package/dist/cjs/src/adapters/MongoAdapter.d.ts.map +1 -0
  9. package/dist/cjs/src/adapters/MongoAdapter.js +168 -0
  10. package/dist/cjs/src/adapters/MongoAdapter.js.map +1 -0
  11. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts +169 -0
  12. package/dist/cjs/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  13. package/dist/cjs/src/adapters/OpenSearchAdapter.js +458 -0
  14. package/dist/cjs/src/adapters/OpenSearchAdapter.js.map +1 -0
  15. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  16. package/dist/cjs/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  17. package/dist/cjs/src/adapters/PostgreSQLAdapter.js +260 -0
  18. package/dist/cjs/src/adapters/PostgreSQLAdapter.js.map +1 -0
  19. package/dist/cjs/src/adapters/PrismaAdapter.d.ts +115 -0
  20. package/dist/cjs/src/adapters/PrismaAdapter.d.ts.map +1 -0
  21. package/dist/cjs/src/adapters/PrismaAdapter.js +366 -0
  22. package/dist/cjs/src/adapters/PrismaAdapter.js.map +1 -0
  23. package/dist/cjs/src/adapters/RedisAdapter.d.ts +71 -0
  24. package/dist/cjs/src/adapters/RedisAdapter.d.ts.map +1 -0
  25. package/dist/cjs/src/adapters/RedisAdapter.js +231 -0
  26. package/dist/cjs/src/adapters/RedisAdapter.js.map +1 -0
  27. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts +69 -0
  28. package/dist/cjs/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  29. package/dist/cjs/src/adapters/SQLiteAdapter.js +312 -0
  30. package/dist/cjs/src/adapters/SQLiteAdapter.js.map +1 -0
  31. package/dist/cjs/src/adapters/index.d.ts +17 -0
  32. package/dist/cjs/src/adapters/index.d.ts.map +1 -0
  33. package/dist/cjs/src/adapters/index.js +21 -0
  34. package/dist/cjs/src/adapters/index.js.map +1 -0
  35. package/dist/cjs/src/constants/index.d.ts +10 -0
  36. package/dist/cjs/src/constants/index.d.ts.map +1 -0
  37. package/dist/cjs/src/constants/index.js +13 -0
  38. package/dist/cjs/src/constants/index.js.map +1 -0
  39. package/dist/cjs/src/core/Agent.d.ts +232 -0
  40. package/dist/cjs/src/core/Agent.d.ts.map +1 -0
  41. package/dist/cjs/src/core/Agent.js +741 -0
  42. package/dist/cjs/src/core/Agent.js.map +1 -0
  43. package/dist/cjs/src/core/Events.d.ts +26 -0
  44. package/dist/cjs/src/core/Events.d.ts.map +1 -0
  45. package/dist/cjs/src/core/Events.js +144 -0
  46. package/dist/cjs/src/core/Events.js.map +1 -0
  47. package/dist/cjs/src/core/PersistenceManager.d.ts +98 -0
  48. package/dist/cjs/src/core/PersistenceManager.d.ts.map +1 -0
  49. package/dist/cjs/src/core/PersistenceManager.js +261 -0
  50. package/dist/cjs/src/core/PersistenceManager.js.map +1 -0
  51. package/dist/cjs/src/core/PromptComposer.d.ts +27 -0
  52. package/dist/cjs/src/core/PromptComposer.d.ts.map +1 -0
  53. package/dist/cjs/src/core/PromptComposer.js +194 -0
  54. package/dist/cjs/src/core/PromptComposer.js.map +1 -0
  55. package/dist/cjs/src/core/ResponseEngine.d.ts +32 -0
  56. package/dist/cjs/src/core/ResponseEngine.d.ts.map +1 -0
  57. package/dist/cjs/src/core/ResponseEngine.js +202 -0
  58. package/dist/cjs/src/core/ResponseEngine.js.map +1 -0
  59. package/dist/cjs/src/core/ResponseModal.d.ts +222 -0
  60. package/dist/cjs/src/core/ResponseModal.d.ts.map +1 -0
  61. package/dist/cjs/src/core/ResponseModal.js +1588 -0
  62. package/dist/cjs/src/core/ResponseModal.js.map +1 -0
  63. package/dist/cjs/src/core/ResponsePipeline.d.ts +175 -0
  64. package/dist/cjs/src/core/ResponsePipeline.d.ts.map +1 -0
  65. package/dist/cjs/src/core/ResponsePipeline.js +549 -0
  66. package/dist/cjs/src/core/ResponsePipeline.js.map +1 -0
  67. package/dist/cjs/src/core/Route.d.ts +181 -0
  68. package/dist/cjs/src/core/Route.d.ts.map +1 -0
  69. package/dist/cjs/src/core/Route.js +541 -0
  70. package/dist/cjs/src/core/Route.js.map +1 -0
  71. package/dist/cjs/src/core/RoutingEngine.d.ts +159 -0
  72. package/dist/cjs/src/core/RoutingEngine.d.ts.map +1 -0
  73. package/dist/cjs/src/core/RoutingEngine.js +961 -0
  74. package/dist/cjs/src/core/RoutingEngine.js.map +1 -0
  75. package/dist/cjs/src/core/SessionManager.d.ts +94 -0
  76. package/dist/cjs/src/core/SessionManager.d.ts.map +1 -0
  77. package/dist/cjs/src/core/SessionManager.js +239 -0
  78. package/dist/cjs/src/core/SessionManager.js.map +1 -0
  79. package/dist/cjs/src/core/Step.d.ts +170 -0
  80. package/dist/cjs/src/core/Step.d.ts.map +1 -0
  81. package/dist/cjs/src/core/Step.js +448 -0
  82. package/dist/cjs/src/core/Step.js.map +1 -0
  83. package/dist/cjs/src/core/ToolManager.d.ts +234 -0
  84. package/dist/cjs/src/core/ToolManager.d.ts.map +1 -0
  85. package/dist/cjs/src/core/ToolManager.js +1117 -0
  86. package/dist/cjs/src/core/ToolManager.js.map +1 -0
  87. package/dist/cjs/src/index.d.ts +44 -0
  88. package/dist/cjs/src/index.d.ts.map +1 -0
  89. package/dist/cjs/src/index.js +88 -0
  90. package/dist/cjs/src/index.js.map +1 -0
  91. package/dist/cjs/src/providers/AnthropicProvider.d.ts +43 -0
  92. package/dist/cjs/src/providers/AnthropicProvider.d.ts.map +1 -0
  93. package/dist/cjs/src/providers/AnthropicProvider.js +377 -0
  94. package/dist/cjs/src/providers/AnthropicProvider.js.map +1 -0
  95. package/dist/cjs/src/providers/GeminiProvider.d.ts +58 -0
  96. package/dist/cjs/src/providers/GeminiProvider.d.ts.map +1 -0
  97. package/dist/cjs/src/providers/GeminiProvider.js +489 -0
  98. package/dist/cjs/src/providers/GeminiProvider.js.map +1 -0
  99. package/dist/cjs/src/providers/OpenAIProvider.d.ts +52 -0
  100. package/dist/cjs/src/providers/OpenAIProvider.d.ts.map +1 -0
  101. package/dist/cjs/src/providers/OpenAIProvider.js +395 -0
  102. package/dist/cjs/src/providers/OpenAIProvider.js.map +1 -0
  103. package/dist/cjs/src/providers/OpenRouterProvider.d.ts +56 -0
  104. package/dist/cjs/src/providers/OpenRouterProvider.d.ts.map +1 -0
  105. package/dist/cjs/src/providers/OpenRouterProvider.js +409 -0
  106. package/dist/cjs/src/providers/OpenRouterProvider.js.map +1 -0
  107. package/dist/cjs/src/providers/index.d.ts +13 -0
  108. package/dist/cjs/src/providers/index.d.ts.map +1 -0
  109. package/dist/cjs/src/providers/index.js +16 -0
  110. package/dist/cjs/src/providers/index.js.map +1 -0
  111. package/dist/cjs/src/types/agent.d.ts +181 -0
  112. package/dist/cjs/src/types/agent.d.ts.map +1 -0
  113. package/dist/cjs/src/types/agent.js +21 -0
  114. package/dist/cjs/src/types/agent.js.map +1 -0
  115. package/dist/cjs/src/types/ai.d.ts +143 -0
  116. package/dist/cjs/src/types/ai.d.ts.map +1 -0
  117. package/dist/cjs/src/types/ai.js +6 -0
  118. package/dist/cjs/src/types/ai.js.map +1 -0
  119. package/dist/cjs/src/types/history.d.ts +178 -0
  120. package/dist/cjs/src/types/history.d.ts.map +1 -0
  121. package/dist/cjs/src/types/history.js +33 -0
  122. package/dist/cjs/src/types/history.js.map +1 -0
  123. package/dist/cjs/src/types/index.d.ts +22 -0
  124. package/dist/cjs/src/types/index.d.ts.map +1 -0
  125. package/dist/cjs/src/types/index.js +37 -0
  126. package/dist/cjs/src/types/index.js.map +1 -0
  127. package/dist/cjs/src/types/persistence.d.ts +209 -0
  128. package/dist/cjs/src/types/persistence.d.ts.map +1 -0
  129. package/dist/cjs/src/types/persistence.js +7 -0
  130. package/dist/cjs/src/types/persistence.js.map +1 -0
  131. package/dist/cjs/src/types/route.d.ts +238 -0
  132. package/dist/cjs/src/types/route.d.ts.map +1 -0
  133. package/dist/cjs/src/types/route.js +6 -0
  134. package/dist/cjs/src/types/route.js.map +1 -0
  135. package/dist/cjs/src/types/routing.d.ts +16 -0
  136. package/dist/cjs/src/types/routing.d.ts.map +1 -0
  137. package/dist/cjs/src/types/routing.js +3 -0
  138. package/dist/cjs/src/types/routing.js.map +1 -0
  139. package/dist/cjs/src/types/schema.d.ts +22 -0
  140. package/dist/cjs/src/types/schema.d.ts.map +1 -0
  141. package/dist/cjs/src/types/schema.js +3 -0
  142. package/dist/cjs/src/types/schema.js.map +1 -0
  143. package/dist/cjs/src/types/session.d.ts +65 -0
  144. package/dist/cjs/src/types/session.d.ts.map +1 -0
  145. package/dist/cjs/src/types/session.js +6 -0
  146. package/dist/cjs/src/types/session.js.map +1 -0
  147. package/dist/cjs/src/types/template.d.ts +88 -0
  148. package/dist/cjs/src/types/template.d.ts.map +1 -0
  149. package/dist/cjs/src/types/template.js +3 -0
  150. package/dist/cjs/src/types/template.js.map +1 -0
  151. package/dist/cjs/src/types/tool.d.ts +130 -0
  152. package/dist/cjs/src/types/tool.d.ts.map +1 -0
  153. package/dist/cjs/src/types/tool.js +19 -0
  154. package/dist/cjs/src/types/tool.js.map +1 -0
  155. package/dist/cjs/src/utils/clone.d.ts +8 -0
  156. package/dist/cjs/src/utils/clone.d.ts.map +1 -0
  157. package/dist/cjs/src/utils/clone.js +32 -0
  158. package/dist/cjs/src/utils/clone.js.map +1 -0
  159. package/dist/cjs/src/utils/condition.d.ts +38 -0
  160. package/dist/cjs/src/utils/condition.d.ts.map +1 -0
  161. package/dist/cjs/src/utils/condition.js +168 -0
  162. package/dist/cjs/src/utils/condition.js.map +1 -0
  163. package/dist/cjs/src/utils/event.d.ts +6 -0
  164. package/dist/cjs/src/utils/event.d.ts.map +1 -0
  165. package/dist/cjs/src/utils/event.js +20 -0
  166. package/dist/cjs/src/utils/event.js.map +1 -0
  167. package/dist/cjs/src/utils/history.d.ts +60 -0
  168. package/dist/cjs/src/utils/history.d.ts.map +1 -0
  169. package/dist/cjs/src/utils/history.js +274 -0
  170. package/dist/cjs/src/utils/history.js.map +1 -0
  171. package/dist/cjs/src/utils/id.d.ts +25 -0
  172. package/dist/cjs/src/utils/id.d.ts.map +1 -0
  173. package/dist/cjs/src/utils/id.js +70 -0
  174. package/dist/cjs/src/utils/id.js.map +1 -0
  175. package/dist/cjs/src/utils/index.d.ts +15 -0
  176. package/dist/cjs/src/utils/index.d.ts.map +1 -0
  177. package/dist/cjs/src/utils/index.js +64 -0
  178. package/dist/cjs/src/utils/index.js.map +1 -0
  179. package/dist/cjs/src/utils/json.d.ts +16 -0
  180. package/dist/cjs/src/utils/json.d.ts.map +1 -0
  181. package/dist/cjs/src/utils/json.js +47 -0
  182. package/dist/cjs/src/utils/json.js.map +1 -0
  183. package/dist/cjs/src/utils/logger.d.ts +10 -0
  184. package/dist/cjs/src/utils/logger.d.ts.map +1 -0
  185. package/dist/cjs/src/utils/logger.js +23 -0
  186. package/dist/cjs/src/utils/logger.js.map +1 -0
  187. package/dist/cjs/src/utils/retry.d.ts +10 -0
  188. package/dist/cjs/src/utils/retry.d.ts.map +1 -0
  189. package/dist/cjs/src/utils/retry.js +76 -0
  190. package/dist/cjs/src/utils/retry.js.map +1 -0
  191. package/dist/cjs/src/utils/session.d.ts +51 -0
  192. package/dist/cjs/src/utils/session.d.ts.map +1 -0
  193. package/dist/cjs/src/utils/session.js +170 -0
  194. package/dist/cjs/src/utils/session.js.map +1 -0
  195. package/dist/cjs/src/utils/template.d.ts +155 -0
  196. package/dist/cjs/src/utils/template.d.ts.map +1 -0
  197. package/dist/cjs/src/utils/template.js +383 -0
  198. package/dist/cjs/src/utils/template.js.map +1 -0
  199. package/dist/src/adapters/MemoryAdapter.d.ts +47 -0
  200. package/dist/src/adapters/MemoryAdapter.d.ts.map +1 -0
  201. package/dist/src/adapters/MemoryAdapter.js +198 -0
  202. package/dist/src/adapters/MemoryAdapter.js.map +1 -0
  203. package/dist/src/adapters/MongoAdapter.d.ts +97 -0
  204. package/dist/src/adapters/MongoAdapter.d.ts.map +1 -0
  205. package/dist/src/adapters/MongoAdapter.js +164 -0
  206. package/dist/src/adapters/MongoAdapter.js.map +1 -0
  207. package/dist/src/adapters/OpenSearchAdapter.d.ts +169 -0
  208. package/dist/src/adapters/OpenSearchAdapter.d.ts.map +1 -0
  209. package/dist/src/adapters/OpenSearchAdapter.js +454 -0
  210. package/dist/src/adapters/OpenSearchAdapter.js.map +1 -0
  211. package/dist/src/adapters/PostgreSQLAdapter.d.ts +71 -0
  212. package/dist/src/adapters/PostgreSQLAdapter.d.ts.map +1 -0
  213. package/dist/src/adapters/PostgreSQLAdapter.js +256 -0
  214. package/dist/src/adapters/PostgreSQLAdapter.js.map +1 -0
  215. package/dist/src/adapters/PrismaAdapter.d.ts +115 -0
  216. package/dist/src/adapters/PrismaAdapter.d.ts.map +1 -0
  217. package/dist/src/adapters/PrismaAdapter.js +362 -0
  218. package/dist/src/adapters/PrismaAdapter.js.map +1 -0
  219. package/dist/src/adapters/RedisAdapter.d.ts +71 -0
  220. package/dist/src/adapters/RedisAdapter.d.ts.map +1 -0
  221. package/dist/src/adapters/RedisAdapter.js +227 -0
  222. package/dist/src/adapters/RedisAdapter.js.map +1 -0
  223. package/dist/src/adapters/SQLiteAdapter.d.ts +69 -0
  224. package/dist/src/adapters/SQLiteAdapter.d.ts.map +1 -0
  225. package/dist/src/adapters/SQLiteAdapter.js +308 -0
  226. package/dist/src/adapters/SQLiteAdapter.js.map +1 -0
  227. package/dist/src/adapters/index.d.ts +17 -0
  228. package/dist/src/adapters/index.d.ts.map +1 -0
  229. package/dist/src/adapters/index.js +11 -0
  230. package/dist/src/adapters/index.js.map +1 -0
  231. package/dist/src/constants/index.d.ts +10 -0
  232. package/dist/src/constants/index.d.ts.map +1 -0
  233. package/dist/src/constants/index.js +10 -0
  234. package/dist/src/constants/index.js.map +1 -0
  235. package/dist/src/core/Agent.d.ts +232 -0
  236. package/dist/src/core/Agent.d.ts.map +1 -0
  237. package/dist/src/core/Agent.js +737 -0
  238. package/dist/src/core/Agent.js.map +1 -0
  239. package/dist/src/core/Events.d.ts +26 -0
  240. package/dist/src/core/Events.d.ts.map +1 -0
  241. package/dist/src/core/Events.js +137 -0
  242. package/dist/src/core/Events.js.map +1 -0
  243. package/dist/src/core/PersistenceManager.d.ts +98 -0
  244. package/dist/src/core/PersistenceManager.d.ts.map +1 -0
  245. package/dist/src/core/PersistenceManager.js +257 -0
  246. package/dist/src/core/PersistenceManager.js.map +1 -0
  247. package/dist/src/core/PromptComposer.d.ts +27 -0
  248. package/dist/src/core/PromptComposer.d.ts.map +1 -0
  249. package/dist/src/core/PromptComposer.js +190 -0
  250. package/dist/src/core/PromptComposer.js.map +1 -0
  251. package/dist/src/core/ResponseEngine.d.ts +32 -0
  252. package/dist/src/core/ResponseEngine.d.ts.map +1 -0
  253. package/dist/src/core/ResponseEngine.js +198 -0
  254. package/dist/src/core/ResponseEngine.js.map +1 -0
  255. package/dist/src/core/ResponseModal.d.ts +222 -0
  256. package/dist/src/core/ResponseModal.d.ts.map +1 -0
  257. package/dist/src/core/ResponseModal.js +1583 -0
  258. package/dist/src/core/ResponseModal.js.map +1 -0
  259. package/dist/src/core/ResponsePipeline.d.ts +175 -0
  260. package/dist/src/core/ResponsePipeline.d.ts.map +1 -0
  261. package/dist/src/core/ResponsePipeline.js +545 -0
  262. package/dist/src/core/ResponsePipeline.js.map +1 -0
  263. package/dist/src/core/Route.d.ts +181 -0
  264. package/dist/src/core/Route.d.ts.map +1 -0
  265. package/dist/src/core/Route.js +537 -0
  266. package/dist/src/core/Route.js.map +1 -0
  267. package/dist/src/core/RoutingEngine.d.ts +159 -0
  268. package/dist/src/core/RoutingEngine.d.ts.map +1 -0
  269. package/dist/src/core/RoutingEngine.js +957 -0
  270. package/dist/src/core/RoutingEngine.js.map +1 -0
  271. package/dist/src/core/SessionManager.d.ts +94 -0
  272. package/dist/src/core/SessionManager.d.ts.map +1 -0
  273. package/dist/src/core/SessionManager.js +235 -0
  274. package/dist/src/core/SessionManager.js.map +1 -0
  275. package/dist/src/core/Step.d.ts +170 -0
  276. package/dist/src/core/Step.d.ts.map +1 -0
  277. package/dist/src/core/Step.js +444 -0
  278. package/dist/src/core/Step.js.map +1 -0
  279. package/dist/src/core/ToolManager.d.ts +234 -0
  280. package/dist/src/core/ToolManager.d.ts.map +1 -0
  281. package/dist/src/core/ToolManager.js +1111 -0
  282. package/dist/src/core/ToolManager.js.map +1 -0
  283. package/dist/src/index.d.ts +44 -0
  284. package/dist/src/index.d.ts.map +1 -0
  285. package/dist/src/index.js +37 -0
  286. package/dist/src/index.js.map +1 -0
  287. package/dist/src/providers/AnthropicProvider.d.ts +43 -0
  288. package/dist/src/providers/AnthropicProvider.d.ts.map +1 -0
  289. package/dist/src/providers/AnthropicProvider.js +370 -0
  290. package/dist/src/providers/AnthropicProvider.js.map +1 -0
  291. package/dist/src/providers/GeminiProvider.d.ts +58 -0
  292. package/dist/src/providers/GeminiProvider.d.ts.map +1 -0
  293. package/dist/src/providers/GeminiProvider.js +485 -0
  294. package/dist/src/providers/GeminiProvider.js.map +1 -0
  295. package/dist/src/providers/OpenAIProvider.d.ts +52 -0
  296. package/dist/src/providers/OpenAIProvider.d.ts.map +1 -0
  297. package/dist/src/providers/OpenAIProvider.js +388 -0
  298. package/dist/src/providers/OpenAIProvider.js.map +1 -0
  299. package/dist/src/providers/OpenRouterProvider.d.ts +56 -0
  300. package/dist/src/providers/OpenRouterProvider.d.ts.map +1 -0
  301. package/dist/src/providers/OpenRouterProvider.js +402 -0
  302. package/dist/src/providers/OpenRouterProvider.js.map +1 -0
  303. package/dist/src/providers/index.d.ts +13 -0
  304. package/dist/src/providers/index.d.ts.map +1 -0
  305. package/dist/src/providers/index.js +9 -0
  306. package/dist/src/providers/index.js.map +1 -0
  307. package/dist/src/types/agent.d.ts +181 -0
  308. package/dist/src/types/agent.d.ts.map +1 -0
  309. package/dist/src/types/agent.js +18 -0
  310. package/dist/src/types/agent.js.map +1 -0
  311. package/dist/src/types/ai.d.ts +143 -0
  312. package/dist/src/types/ai.d.ts.map +1 -0
  313. package/dist/src/types/ai.js +5 -0
  314. package/dist/src/types/ai.js.map +1 -0
  315. package/dist/src/types/history.d.ts +178 -0
  316. package/dist/src/types/history.d.ts.map +1 -0
  317. package/dist/src/types/history.js +30 -0
  318. package/dist/src/types/history.js.map +1 -0
  319. package/dist/src/types/index.d.ts +22 -0
  320. package/dist/src/types/index.d.ts.map +1 -0
  321. package/dist/src/types/index.js +12 -0
  322. package/dist/src/types/index.js.map +1 -0
  323. package/dist/src/types/persistence.d.ts +209 -0
  324. package/dist/src/types/persistence.d.ts.map +1 -0
  325. package/dist/src/types/persistence.js +6 -0
  326. package/dist/src/types/persistence.js.map +1 -0
  327. package/dist/src/types/route.d.ts +238 -0
  328. package/dist/src/types/route.d.ts.map +1 -0
  329. package/dist/src/types/route.js +5 -0
  330. package/dist/src/types/route.js.map +1 -0
  331. package/dist/src/types/routing.d.ts +16 -0
  332. package/dist/src/types/routing.d.ts.map +1 -0
  333. package/dist/src/types/routing.js +2 -0
  334. package/dist/src/types/routing.js.map +1 -0
  335. package/dist/src/types/schema.d.ts +22 -0
  336. package/dist/src/types/schema.d.ts.map +1 -0
  337. package/dist/src/types/schema.js +2 -0
  338. package/dist/src/types/schema.js.map +1 -0
  339. package/dist/src/types/session.d.ts +65 -0
  340. package/dist/src/types/session.d.ts.map +1 -0
  341. package/dist/src/types/session.js +5 -0
  342. package/dist/src/types/session.js.map +1 -0
  343. package/dist/src/types/template.d.ts +88 -0
  344. package/dist/src/types/template.d.ts.map +1 -0
  345. package/dist/src/types/template.js +2 -0
  346. package/dist/src/types/template.js.map +1 -0
  347. package/dist/src/types/tool.d.ts +130 -0
  348. package/dist/src/types/tool.d.ts.map +1 -0
  349. package/dist/src/types/tool.js +16 -0
  350. package/dist/src/types/tool.js.map +1 -0
  351. package/dist/src/utils/clone.d.ts +8 -0
  352. package/dist/src/utils/clone.d.ts.map +1 -0
  353. package/dist/src/utils/clone.js +29 -0
  354. package/dist/src/utils/clone.js.map +1 -0
  355. package/dist/src/utils/condition.d.ts +38 -0
  356. package/dist/src/utils/condition.d.ts.map +1 -0
  357. package/dist/src/utils/condition.js +161 -0
  358. package/dist/src/utils/condition.js.map +1 -0
  359. package/dist/src/utils/event.d.ts +6 -0
  360. package/dist/src/utils/event.d.ts.map +1 -0
  361. package/dist/src/utils/event.js +17 -0
  362. package/dist/src/utils/event.js.map +1 -0
  363. package/dist/src/utils/history.d.ts +60 -0
  364. package/dist/src/utils/history.d.ts.map +1 -0
  365. package/dist/src/utils/history.js +263 -0
  366. package/dist/src/utils/history.js.map +1 -0
  367. package/dist/src/utils/id.d.ts +25 -0
  368. package/dist/src/utils/id.d.ts.map +1 -0
  369. package/dist/src/utils/id.js +64 -0
  370. package/dist/src/utils/id.js.map +1 -0
  371. package/dist/src/utils/index.d.ts +15 -0
  372. package/dist/src/utils/index.d.ts.map +1 -0
  373. package/dist/src/utils/index.js +23 -0
  374. package/dist/src/utils/index.js.map +1 -0
  375. package/dist/src/utils/json.d.ts +16 -0
  376. package/dist/src/utils/json.d.ts.map +1 -0
  377. package/dist/src/utils/json.js +43 -0
  378. package/dist/src/utils/json.js.map +1 -0
  379. package/dist/src/utils/logger.d.ts +10 -0
  380. package/dist/src/utils/logger.d.ts.map +1 -0
  381. package/dist/src/utils/logger.js +17 -0
  382. package/dist/src/utils/logger.js.map +1 -0
  383. package/dist/src/utils/retry.d.ts +10 -0
  384. package/dist/src/utils/retry.d.ts.map +1 -0
  385. package/dist/src/utils/retry.js +71 -0
  386. package/dist/src/utils/retry.js.map +1 -0
  387. package/dist/src/utils/session.d.ts +51 -0
  388. package/dist/src/utils/session.d.ts.map +1 -0
  389. package/dist/src/utils/session.js +160 -0
  390. package/dist/src/utils/session.js.map +1 -0
  391. package/dist/src/utils/template.d.ts +155 -0
  392. package/dist/src/utils/template.d.ts.map +1 -0
  393. package/dist/src/utils/template.js +374 -0
  394. package/dist/src/utils/template.js.map +1 -0
  395. package/docs/CONTRIBUTING.md +521 -0
  396. package/docs/README.md +228 -0
  397. package/docs/api/README.md +3258 -0
  398. package/docs/api/overview.md +1134 -0
  399. package/docs/architecture/data-extraction-flow.md +363 -0
  400. package/docs/core/agent/README.md +902 -0
  401. package/docs/core/agent/context-management.md +796 -0
  402. package/docs/core/agent/session-management.md +641 -0
  403. package/docs/core/ai-integration/prompt-composition.md +220 -0
  404. package/docs/core/ai-integration/providers.md +515 -0
  405. package/docs/core/ai-integration/response-processing.md +287 -0
  406. package/docs/core/conversation-flows/data-collection.md +623 -0
  407. package/docs/core/conversation-flows/route-dsl.md +502 -0
  408. package/docs/core/conversation-flows/routes.md +247 -0
  409. package/docs/core/conversation-flows/step-transitions.md +595 -0
  410. package/docs/core/conversation-flows/steps.md +154 -0
  411. package/docs/core/error-handling.md +638 -0
  412. package/docs/core/persistence/adapters.md +255 -0
  413. package/docs/core/persistence/session-storage.md +644 -0
  414. package/docs/core/routing/intelligent-routing.md +466 -0
  415. package/docs/core/tools/tool-definition.md +970 -0
  416. package/docs/core/tools/tool-scoping.md +819 -0
  417. package/docs/guides/advanced-patterns/publishing.md +186 -0
  418. package/docs/guides/error-handling-patterns.md +578 -0
  419. package/docs/guides/getting-started/README.md +696 -0
  420. package/docs/guides/migration/README.md +72 -0
  421. package/docs/guides/migration/flexible-routing-conditions.md +375 -0
  422. package/docs/guides/migration/response-modal-refactor.md +518 -0
  423. package/examples/advanced-patterns/knowledge-based-agent.ts +735 -0
  424. package/examples/advanced-patterns/persistent-onboarding.ts +728 -0
  425. package/examples/advanced-patterns/route-lifecycle-hooks.ts +556 -0
  426. package/examples/advanced-patterns/streaming-responses.ts +578 -0
  427. package/examples/ai-providers/anthropic-integration.ts +388 -0
  428. package/examples/ai-providers/openai-integration.ts +228 -0
  429. package/examples/condition-patterns/function-only-conditions.ts +365 -0
  430. package/examples/condition-patterns/mixed-array-conditions.ts +477 -0
  431. package/examples/condition-patterns/route-skipif-patterns.ts +468 -0
  432. package/examples/condition-patterns/step-skipif-patterns.ts +0 -0
  433. package/examples/condition-patterns/string-only-conditions.ts +296 -0
  434. package/examples/conversation-flows/completion-transitions.ts +318 -0
  435. package/examples/core-concepts/basic-agent.ts +503 -0
  436. package/examples/core-concepts/modern-streaming-api.ts +309 -0
  437. package/examples/core-concepts/schema-driven-extraction.ts +332 -0
  438. package/examples/core-concepts/session-management.ts +494 -0
  439. package/examples/integrations/database-integration.ts +630 -0
  440. package/examples/integrations/healthcare-integration.ts +595 -0
  441. package/examples/integrations/search-integration.ts +530 -0
  442. package/examples/integrations/server-session-management.ts +307 -0
  443. package/examples/persistence/custom-adapter.ts +529 -0
  444. package/examples/persistence/database-persistence.ts +583 -0
  445. package/examples/persistence/memory-sessions.ts +495 -0
  446. package/examples/persistence/prisma-schema.example.prisma +74 -0
  447. package/examples/persistence/redis-persistence.ts +488 -0
  448. package/examples/tools/basic-tools.ts +765 -0
  449. package/examples/tools/data-enrichment-tools.ts +593 -0
  450. package/package.json +125 -0
  451. package/src/adapters/MemoryAdapter.ts +273 -0
  452. package/src/adapters/MongoAdapter.ts +304 -0
  453. package/src/adapters/OpenSearchAdapter.ts +670 -0
  454. package/src/adapters/PostgreSQLAdapter.ts +428 -0
  455. package/src/adapters/PrismaAdapter.ts +553 -0
  456. package/src/adapters/RedisAdapter.ts +377 -0
  457. package/src/adapters/SQLiteAdapter.ts +459 -0
  458. package/src/adapters/index.ts +43 -0
  459. package/src/constants/index.ts +10 -0
  460. package/src/core/Agent.ts +970 -0
  461. package/src/core/Events.ts +164 -0
  462. package/src/core/PersistenceManager.ts +353 -0
  463. package/src/core/PromptComposer.ts +253 -0
  464. package/src/core/ResponseEngine.ts +306 -0
  465. package/src/core/ResponseModal.ts +2050 -0
  466. package/src/core/ResponsePipeline.ts +864 -0
  467. package/src/core/Route.ts +677 -0
  468. package/src/core/RoutingEngine.ts +1396 -0
  469. package/src/core/SessionManager.ts +297 -0
  470. package/src/core/Step.ts +593 -0
  471. package/src/core/ToolManager.ts +1394 -0
  472. package/src/index.ts +155 -0
  473. package/src/providers/AnthropicProvider.ts +560 -0
  474. package/src/providers/GeminiProvider.ts +683 -0
  475. package/src/providers/OpenAIProvider.ts +602 -0
  476. package/src/providers/OpenRouterProvider.ts +613 -0
  477. package/src/providers/index.ts +16 -0
  478. package/src/types/agent.ts +196 -0
  479. package/src/types/ai.ts +158 -0
  480. package/src/types/history.ts +206 -0
  481. package/src/types/index.ts +119 -0
  482. package/src/types/persistence.ts +251 -0
  483. package/src/types/route.ts +272 -0
  484. package/src/types/routing.ts +18 -0
  485. package/src/types/schema.ts +23 -0
  486. package/src/types/session.ts +74 -0
  487. package/src/types/template.ts +104 -0
  488. package/src/types/tool.ts +174 -0
  489. package/src/utils/clone.ts +34 -0
  490. package/src/utils/condition.ts +190 -0
  491. package/src/utils/event.ts +16 -0
  492. package/src/utils/history.ts +306 -0
  493. package/src/utils/id.ts +73 -0
  494. package/src/utils/index.ts +69 -0
  495. package/src/utils/json.ts +46 -0
  496. package/src/utils/logger.ts +19 -0
  497. package/src/utils/retry.ts +97 -0
  498. package/src/utils/session.ts +204 -0
  499. package/src/utils/template.ts +444 -0
@@ -0,0 +1,602 @@
1
+ /**
2
+ * OpenAI provider implementation with retry and backup models
3
+ */
4
+
5
+ import OpenAI from "openai";
6
+ import type { ChatCompletionCreateParamsNonStreaming } from "openai/resources/chat/completions";
7
+
8
+ import type {
9
+ AiProvider,
10
+ GenerateMessageInput,
11
+ GenerateMessageOutput,
12
+ GenerateMessageStreamChunk,
13
+ AgentStructuredResponse,
14
+ StructuredSchema,
15
+ } from "../types";
16
+ import { withTimeoutAndRetry, logger } from "../utils";
17
+ import { FunctionParameters } from "openai/resources/shared.mjs";
18
+
19
+ const DEFAULT_RETRY_CONFIG = {
20
+ timeout: 60000,
21
+ retries: 3,
22
+ };
23
+
24
+ /**
25
+ * Configuration options for OpenAI provider
26
+ * Uses types from openai package
27
+ */
28
+ export interface OpenAIProviderOptions {
29
+ /** OpenAI API key */
30
+ apiKey: string;
31
+ /** Organization ID (optional) */
32
+ organization?: string;
33
+ /** Model to use (required) - e.g., "gpt-5", "gpt-5-mini" */
34
+ model: string;
35
+ /** Backup models to try if primary fails (default: []) */
36
+ backupModels?: string[];
37
+ /** Default parameters - uses ChatCompletionCreateParamsNonStreaming from openai package */
38
+ config?: Partial<
39
+ Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
40
+ >;
41
+ /** Retry configuration */
42
+ retryConfig?: {
43
+ timeout?: number;
44
+ retries?: number;
45
+ };
46
+ }
47
+
48
+ /**
49
+ * Type guard for errors with status/code properties
50
+ */
51
+ interface ErrorWithStatus {
52
+ status?: number;
53
+ code?: string;
54
+ message?: string;
55
+ type?: string;
56
+ }
57
+
58
+ /**
59
+ * Type guard to check if error is ErrorWithStatus
60
+ */
61
+ function isErrorWithStatus(error: unknown): error is ErrorWithStatus {
62
+ return (
63
+ typeof error === "object" &&
64
+ error !== null &&
65
+ ("status" in error || "code" in error || "message" in error)
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Safely extract error message
71
+ */
72
+ function getErrorMessage(error: unknown): string {
73
+ if (error instanceof Error) {
74
+ return error.message;
75
+ }
76
+ if (isErrorWithStatus(error) && error.message) {
77
+ return error.message;
78
+ }
79
+ return String(error);
80
+ }
81
+
82
+ /**
83
+ * Determines if an error should trigger backup model usage
84
+ */
85
+ const shouldUseBackupModel = (error: unknown): boolean => {
86
+ if (!isErrorWithStatus(error)) {
87
+ return false;
88
+ }
89
+
90
+ // Server errors
91
+ if (error.status === 500 || error.status === 503) {
92
+ return true;
93
+ }
94
+
95
+ // Rate limiting
96
+ if (error.status === 429) {
97
+ return true;
98
+ }
99
+
100
+ // Model overloaded or unavailable
101
+ if (error.code === "model_not_found" || error.code === "model_overloaded") {
102
+ return true;
103
+ }
104
+
105
+ const message = getErrorMessage(error);
106
+ if (
107
+ message.includes("overloaded") ||
108
+ message.includes("unavailable") ||
109
+ message.includes("internal error") ||
110
+ message.includes("Internal error")
111
+ ) {
112
+ return true;
113
+ }
114
+
115
+ return false;
116
+ };
117
+
118
+ /**
119
+ * OpenAI provider implementation with backup models and retry logic
120
+ */
121
+ export class OpenAIProvider implements AiProvider {
122
+ public readonly name = "openai";
123
+ private client: OpenAI;
124
+ private primaryModel: string;
125
+ private backupModels: string[];
126
+ private config?: Partial<
127
+ Omit<ChatCompletionCreateParamsNonStreaming, "model" | "messages">
128
+ >;
129
+ private retryConfig: { timeout: number; retries: number };
130
+
131
+ constructor(options: OpenAIProviderOptions) {
132
+ const {
133
+ apiKey,
134
+ organization,
135
+ model,
136
+ backupModels = [],
137
+ config,
138
+ retryConfig,
139
+ } = options;
140
+
141
+ if (!apiKey) {
142
+ throw new Error("OpenAI API key is required");
143
+ }
144
+
145
+ if (!model) {
146
+ throw new Error("Model is required. Example: 'gpt-5' or 'gpt-5-mini'");
147
+ }
148
+
149
+ // Dynamic import to avoid bundling issues
150
+
151
+ this.client = new OpenAI({
152
+ apiKey,
153
+ organization,
154
+ });
155
+ this.primaryModel = model;
156
+ this.backupModels = backupModels;
157
+ this.config = config;
158
+ this.retryConfig = {
159
+ timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
160
+ retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Adapt common schema format to OpenAI's format.
166
+ * OpenAI uses standard JSON Schema, so this is mostly a passthrough.
167
+ *
168
+ * @private
169
+ */
170
+ private adaptSchemaForOpenAI(
171
+ schema: StructuredSchema
172
+ ): Record<string, unknown> {
173
+ // OpenAI's responses.parse API uses standard JSON Schema
174
+ // Our StructuredSchema is already JSON Schema compatible
175
+ return schema as Record<string, unknown>;
176
+ }
177
+
178
+ async generateMessage<
179
+ TContext = unknown,
180
+ TStructured = AgentStructuredResponse
181
+ >(
182
+ input: GenerateMessageInput<TContext>
183
+ ): Promise<GenerateMessageOutput<TStructured>> {
184
+ return this.generateWithBackup<TContext, TStructured>(input);
185
+ }
186
+
187
+ async *generateMessageStream<
188
+ TContext = unknown,
189
+ TStructured = AgentStructuredResponse
190
+ >(
191
+ input: GenerateMessageInput<TContext>
192
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
193
+ yield* this.generateStreamWithBackup<TContext, TStructured>(input);
194
+ }
195
+
196
+ private async generateWithBackup<
197
+ TContext = unknown,
198
+ TStructured = AgentStructuredResponse
199
+ >(
200
+ input: GenerateMessageInput<TContext>
201
+ ): Promise<GenerateMessageOutput<TStructured>> {
202
+ // Try primary model first
203
+ try {
204
+ return await this.generateWithModel<TContext, TStructured>(
205
+ this.primaryModel,
206
+ input
207
+ );
208
+ } catch (primaryError: unknown) {
209
+ const primaryErrMsg = getErrorMessage(primaryError);
210
+ logger.warn(
211
+ `[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
212
+ );
213
+
214
+ if (!shouldUseBackupModel(primaryError)) {
215
+ throw primaryError;
216
+ }
217
+
218
+ logger.debug(`[OPENAI] Trying backup models`);
219
+
220
+ let lastBackupError: unknown = primaryError;
221
+
222
+ for (let i = 0; i < this.backupModels.length; i++) {
223
+ const backupModel = this.backupModels[i];
224
+ logger.debug(
225
+ `[OPENAI] Trying backup model ${i + 1}/${
226
+ this.backupModels.length
227
+ }: ${backupModel}`
228
+ );
229
+
230
+ try {
231
+ const result = await this.generateWithModel(backupModel, input);
232
+ logger.debug(`[OPENAI] Backup model ${backupModel} succeeded`);
233
+ return result as GenerateMessageOutput<TStructured>;
234
+ } catch (backupError: unknown) {
235
+ const backupErrMsg = getErrorMessage(backupError);
236
+ logger.warn(
237
+ `[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`
238
+ );
239
+ lastBackupError = backupError;
240
+
241
+ if (
242
+ !shouldUseBackupModel(backupError) &&
243
+ i < this.backupModels.length - 1
244
+ ) {
245
+ logger.debug(
246
+ `[OPENAI] Backup model error doesn't qualify for further attempts`
247
+ );
248
+ break;
249
+ }
250
+ }
251
+ }
252
+
253
+ const lastBackupErrMsg = getErrorMessage(lastBackupError);
254
+ logger.error(
255
+ `[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
256
+ );
257
+ throw lastBackupError;
258
+ }
259
+ }
260
+
261
+ private async generateWithModel<
262
+ TContext = unknown,
263
+ TStructured = AgentStructuredResponse
264
+ >(
265
+ model: string,
266
+ input: GenerateMessageInput<TContext>
267
+ ): Promise<GenerateMessageOutput<TStructured>> {
268
+ const operation = async (): Promise<GenerateMessageOutput> => {
269
+ const params: ChatCompletionCreateParamsNonStreaming = {
270
+ model,
271
+ messages: [
272
+ {
273
+ role: "user",
274
+ content: input.prompt,
275
+ },
276
+ ],
277
+ ...this.config,
278
+ };
279
+
280
+ // Override with input parameters if provided
281
+ if (input.parameters?.maxOutputTokens !== undefined) {
282
+ params.max_tokens = input.parameters.maxOutputTokens;
283
+ }
284
+
285
+ // Add tools if provided
286
+ if (input.tools && input.tools.length > 0) {
287
+ params.tools = input.tools.map((tool) => ({
288
+ type: "function" as const,
289
+ function: {
290
+ name: tool.name || tool.id,
291
+ description: tool.description,
292
+ parameters: tool.parameters as FunctionParameters, // JSON schema
293
+ },
294
+ }));
295
+ params.tool_choice = "auto";
296
+ }
297
+
298
+ // Use structured output API if JSON schema is provided
299
+ if (input.parameters?.jsonSchema) {
300
+ const response = await this.client.responses.parse({
301
+ model,
302
+ instructions: input.prompt,
303
+ input: "",
304
+ reasoning: {
305
+ effort: input.parameters?.reasoning?.effort || "low",
306
+ },
307
+ text: {
308
+ format: {
309
+ type: "json_schema",
310
+ name: input.parameters?.schemaName || "structured_output",
311
+ // Adapt common schema format to OpenAI's format
312
+ schema: this.adaptSchemaForOpenAI(input.parameters.jsonSchema),
313
+ },
314
+ },
315
+ });
316
+
317
+ if (!response.output_parsed) {
318
+ throw new Error("No parsed output returned from OpenAI");
319
+ }
320
+
321
+ const structured = response.output_parsed as AgentStructuredResponse;
322
+ const message = structured.message;
323
+
324
+ return {
325
+ message,
326
+ metadata: {
327
+ model: response.model,
328
+ tokensUsed: response.usage?.total_tokens,
329
+ promptTokens: response.usage?.input_tokens,
330
+ completionTokens: response.usage?.output_tokens,
331
+ },
332
+ structured,
333
+ };
334
+ }
335
+
336
+ // Fall back to regular chat completions API if no schema provided
337
+ const response = await this.client.chat.completions.create(params);
338
+
339
+ const message = response.choices[0]?.message?.content;
340
+ if (!message) {
341
+ throw new Error("No response from OpenAI");
342
+ }
343
+
344
+ let toolCalls: Array<{
345
+ toolName: string;
346
+ arguments: Record<string, unknown>;
347
+ }> = [];
348
+ if (response.choices?.[0]?.message?.tool_calls) {
349
+ toolCalls = response.choices[0].message.tool_calls
350
+ .filter((toolCall) => toolCall.type === "function")
351
+ .map((toolCall) => {
352
+ let toolCallArguments: Record<string, unknown> = {};
353
+ try {
354
+ toolCallArguments = JSON.parse(
355
+ toolCall.function.arguments
356
+ ) as Record<string, unknown>;
357
+ } catch (error) {
358
+ logger.warn(
359
+ `[OPENAI] Failed to parse tool call arguments: ${getErrorMessage(
360
+ error
361
+ )}`
362
+ );
363
+ toolCallArguments = {};
364
+ }
365
+ return {
366
+ toolName: toolCall.function.name,
367
+ arguments: toolCallArguments,
368
+ };
369
+ });
370
+ }
371
+ // Extract tool calls from response
372
+
373
+ return {
374
+ message,
375
+ metadata: {
376
+ model: response.model,
377
+ finishReason: response.choices[0]?.finish_reason,
378
+ tokensUsed: response.usage?.total_tokens,
379
+ promptTokens: response.usage?.prompt_tokens,
380
+ completionTokens: response.usage?.completion_tokens,
381
+ },
382
+ structured:
383
+ toolCalls.length > 0
384
+ ? ({ message, toolCalls } as AgentStructuredResponse)
385
+ : undefined,
386
+ };
387
+ };
388
+
389
+ return withTimeoutAndRetry(
390
+ operation,
391
+ this.retryConfig.timeout,
392
+ this.retryConfig.retries,
393
+ `OpenAI ${model}`
394
+ ) as Promise<GenerateMessageOutput<TStructured>>;
395
+ }
396
+
397
+ private async *generateStreamWithBackup<
398
+ TContext = unknown,
399
+ TStructured = AgentStructuredResponse
400
+ >(
401
+ input: GenerateMessageInput<TContext>
402
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
403
+ // Try primary model first
404
+ try {
405
+ yield* this.generateStreamWithModel<TContext, TStructured>(
406
+ this.primaryModel,
407
+ input
408
+ );
409
+ } catch (primaryError: unknown) {
410
+ const primaryErrMsg = getErrorMessage(primaryError);
411
+ logger.warn(
412
+ `[OPENAI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
413
+ );
414
+
415
+ if (!shouldUseBackupModel(primaryError)) {
416
+ throw primaryError;
417
+ }
418
+
419
+ logger.debug(`[OPENAI] Trying backup models for streaming`);
420
+
421
+ let lastBackupError: unknown = primaryError;
422
+
423
+ for (let i = 0; i < this.backupModels.length; i++) {
424
+ const backupModel = this.backupModels[i];
425
+ logger.debug(
426
+ `[OPENAI] Trying backup model ${i + 1}/${
427
+ this.backupModels.length
428
+ }: ${backupModel}`
429
+ );
430
+
431
+ try {
432
+ yield* this.generateStreamWithModel<TContext, TStructured>(
433
+ backupModel,
434
+ input
435
+ );
436
+ logger.debug(`[OPENAI] Backup model ${backupModel} succeeded`);
437
+ return;
438
+ } catch (backupError: unknown) {
439
+ const backupErrMsg = getErrorMessage(backupError);
440
+ logger.warn(
441
+ `[OPENAI] Backup model ${backupModel} failed: ${backupErrMsg}`
442
+ );
443
+ lastBackupError = backupError;
444
+
445
+ if (
446
+ !shouldUseBackupModel(backupError) &&
447
+ i < this.backupModels.length - 1
448
+ ) {
449
+ logger.debug(
450
+ `[OPENAI] Backup model error doesn't qualify for further attempts`
451
+ );
452
+ break;
453
+ }
454
+ }
455
+ }
456
+
457
+ const lastBackupErrMsg = getErrorMessage(lastBackupError);
458
+ logger.error(
459
+ `[OPENAI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
460
+ );
461
+ throw lastBackupError;
462
+ }
463
+ }
464
+
465
+ private async *generateStreamWithModel<
466
+ TContext = unknown,
467
+ TStructured = AgentStructuredResponse
468
+ >(
469
+ model: string,
470
+ input: GenerateMessageInput<TContext>
471
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
472
+ const params = {
473
+ ...this.config,
474
+ model,
475
+ messages: [
476
+ {
477
+ role: "user" as const,
478
+ content: input.prompt,
479
+ },
480
+ ],
481
+ stream: true as const,
482
+ };
483
+
484
+ // Override with input parameters if provided
485
+ if (input.parameters?.maxOutputTokens !== undefined) {
486
+ params.max_tokens = input.parameters.maxOutputTokens;
487
+ }
488
+
489
+ // Add tools if provided
490
+ if (input.tools && input.tools.length > 0) {
491
+ params.tools = input.tools.map((tool) => ({
492
+ type: "function" as const,
493
+ function: {
494
+ name: tool.name || tool.id,
495
+ description: tool.description,
496
+ parameters: tool.parameters as FunctionParameters, // JSON schema
497
+ },
498
+ }));
499
+ params.tool_choice = "auto";
500
+ }
501
+
502
+ // Streaming path does not support responses.parse; if schema present,
503
+ // request JSON object and parse at the end.
504
+ if (input.parameters?.jsonSchema) {
505
+ params.response_format = { type: "json_object" };
506
+ }
507
+
508
+ const stream = await this.client.chat.completions.create(params);
509
+
510
+ let accumulated = "";
511
+ let currentModel = model;
512
+ let finishReason: string | undefined;
513
+ let promptTokens: number | undefined;
514
+ let completionTokens: number | undefined;
515
+ let totalTokens: number | undefined;
516
+ const toolCalls: Array<{
517
+ toolName: string;
518
+ arguments: Record<string, unknown>;
519
+ }> = [];
520
+
521
+ for await (const chunk of stream) {
522
+ currentModel = chunk.model;
523
+ const delta = chunk.choices[0]?.delta?.content || "";
524
+
525
+ // Extract tool calls from delta
526
+ if (chunk.choices[0]?.delta?.tool_calls) {
527
+ for (const toolCall of chunk.choices[0].delta.tool_calls) {
528
+ if (toolCall.function) {
529
+ let toolCallArguments: Record<string, unknown> = {};
530
+ try {
531
+ toolCallArguments = toolCall.function.arguments
532
+ ? (JSON.parse(toolCall.function.arguments) as Record<
533
+ string,
534
+ unknown
535
+ >)
536
+ : {};
537
+ } catch (error) {
538
+ logger.warn(
539
+ `[OPENAI] Failed to parse tool call arguments in stream: ${getErrorMessage(
540
+ error
541
+ )}`
542
+ );
543
+ toolCallArguments = {};
544
+ }
545
+ toolCalls.push({
546
+ toolName: toolCall.function.name || "",
547
+ arguments: toolCallArguments,
548
+ });
549
+ }
550
+ }
551
+ }
552
+
553
+ if (delta) {
554
+ accumulated += delta;
555
+ yield {
556
+ delta,
557
+ accumulated,
558
+ done: false,
559
+ };
560
+ }
561
+
562
+ if (chunk.choices[0]?.finish_reason) {
563
+ finishReason = chunk.choices[0].finish_reason;
564
+ }
565
+
566
+ // OpenAI includes usage in the final chunk for some models
567
+ if (chunk.usage) {
568
+ promptTokens = chunk.usage.prompt_tokens;
569
+ completionTokens = chunk.usage.completion_tokens;
570
+ totalTokens = chunk.usage.total_tokens;
571
+ }
572
+ }
573
+
574
+ // Parse JSON response if schema was provided
575
+ let structured: TStructured | undefined;
576
+ if (input.parameters?.jsonSchema && accumulated) {
577
+ try {
578
+ structured = JSON.parse(accumulated) as TStructured;
579
+ } catch (error) {
580
+ logger.warn(
581
+ "[OPENAI] Failed to parse JSON response in stream:",
582
+ error
583
+ );
584
+ }
585
+ }
586
+
587
+ // Yield final chunk
588
+ yield {
589
+ delta: "",
590
+ accumulated,
591
+ done: true,
592
+ metadata: {
593
+ model: currentModel,
594
+ finishReason,
595
+ tokensUsed: totalTokens,
596
+ promptTokens,
597
+ completionTokens,
598
+ },
599
+ structured: structured ? { ...structured, toolCalls } : undefined,
600
+ };
601
+ }
602
+ }