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