@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,683 @@
1
+ /**
2
+ * Google Gemini AI provider implementation with retry and backup models
3
+ */
4
+
5
+ import type {
6
+ GoogleGenAI as GoogleGenAIType,
7
+ GenerateContentConfig,
8
+ GenerateContentResponse,
9
+ Schema,
10
+ FunctionDeclaration,
11
+ } from "@google/genai";
12
+ import { GoogleGenAI, Type } from "@google/genai";
13
+
14
+ import type {
15
+ AiProvider,
16
+ GenerateMessageInput,
17
+ GenerateMessageOutput,
18
+ GenerateMessageStreamChunk,
19
+ AgentStructuredResponse,
20
+ StructuredSchema,
21
+ } from "../types";
22
+ import { withTimeoutAndRetry } from "../utils/retry";
23
+ import { tryParseJSONResponse } from "../utils/json";
24
+ import { logger } from "../utils/logger";
25
+
26
+ const DEFAULT_RETRY_CONFIG = {
27
+ timeout: 60000,
28
+ retries: 3,
29
+ };
30
+
31
+ /**
32
+ * Configuration options for Gemini provider
33
+ * Uses types from @google/genai package
34
+ */
35
+ export interface GeminiProviderOptions {
36
+ /** Gemini API key */
37
+ apiKey: string;
38
+ /** Model to use (required) - e.g., "models/gemini-2.5-pro" */
39
+ model: string;
40
+ /** Backup models to try if primary fails (default: []) */
41
+ backupModels?: string[];
42
+ /** Default generation config - uses GenerateContentConfig from @google/genai */
43
+ config?: Partial<GenerateContentConfig>;
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 overloaded or unavailable
104
+ if (error.code === "overloaded") {
105
+ return true;
106
+ }
107
+
108
+ const message = getErrorMessage(error);
109
+ if (
110
+ message.includes("overloaded") ||
111
+ message.includes("unavailable") ||
112
+ message.includes("not available") ||
113
+ message.includes("internal error") ||
114
+ message.includes("Internal error") ||
115
+ message.includes("INTERNAL")
116
+ ) {
117
+ return true;
118
+ }
119
+
120
+ return false;
121
+ };
122
+
123
+ /**
124
+ * Gemini provider implementation with backup models and retry logic
125
+ */
126
+ export class GeminiProvider implements AiProvider {
127
+ public readonly name = "gemini";
128
+ private genAI: GoogleGenAIType;
129
+ private primaryModel: string;
130
+ private backupModels: string[];
131
+ private config?: Partial<GenerateContentConfig>;
132
+ private retryConfig: { timeout: number; retries: number };
133
+
134
+ constructor(options: GeminiProviderOptions) {
135
+ const { apiKey, model, backupModels = [], config, retryConfig } = options;
136
+
137
+ if (!apiKey) {
138
+ throw new Error("Gemini API key is required");
139
+ }
140
+
141
+ if (!model) {
142
+ throw new Error("Model is required. Example: 'models/gemini-2.5-pro'");
143
+ }
144
+
145
+ this.genAI = new GoogleGenAI({ apiKey });
146
+ this.primaryModel = model;
147
+ this.backupModels = backupModels;
148
+ this.config = config;
149
+ this.retryConfig = {
150
+ timeout: retryConfig?.timeout || DEFAULT_RETRY_CONFIG.timeout,
151
+ retries: retryConfig?.retries || DEFAULT_RETRY_CONFIG.retries,
152
+ };
153
+ }
154
+
155
+ /**
156
+ * Adapt common schema format to Gemini's specific requirements.
157
+ * Gemini has strict validation:
158
+ * - OBJECT types MUST have non-empty properties
159
+ * - Empty objects cause 400 Bad Request errors
160
+ * - Uses Gemini's Schema type with Type enums
161
+ *
162
+ * @private
163
+ */
164
+ private adaptSchemaForGemini(schema: StructuredSchema): Schema {
165
+ const geminiSchema: Schema = {};
166
+
167
+ // Convert type
168
+ if (schema.type) {
169
+ if (Array.isArray(schema.type)) {
170
+ // For now, take the first type (Gemini doesn't support union types the same way)
171
+ geminiSchema.type = this.mapToGeminiType(schema.type[0]);
172
+ } else {
173
+ geminiSchema.type = this.mapToGeminiType(schema.type);
174
+ }
175
+ }
176
+
177
+ // Handle description
178
+ if (schema.description) {
179
+ geminiSchema.description = schema.description;
180
+ }
181
+
182
+ // Handle nullable
183
+ if (schema.nullable !== undefined) {
184
+ geminiSchema.nullable = schema.nullable;
185
+ }
186
+
187
+ // Handle enum
188
+ if (schema.enum) {
189
+ geminiSchema.enum = schema.enum as string[];
190
+ }
191
+
192
+ // Handle object properties - Gemini requires non-empty properties for OBJECT type
193
+ if (
194
+ geminiSchema.type === Type.OBJECT ||
195
+ schema.type === "object" ||
196
+ (Array.isArray(schema.type) && schema.type.includes("object"))
197
+ ) {
198
+ if (!schema.properties || Object.keys(schema.properties).length === 0) {
199
+ logger.warn(
200
+ "[GeminiProvider] Gemini requires OBJECT types to have non-empty properties. Converting empty object to STRING."
201
+ );
202
+ geminiSchema.type = Type.STRING;
203
+ return geminiSchema;
204
+ }
205
+
206
+ // Recursively convert nested properties
207
+ geminiSchema.properties = {};
208
+ for (const [key, value] of Object.entries(schema.properties)) {
209
+ geminiSchema.properties[key] = this.adaptSchemaForGemini(value);
210
+ }
211
+
212
+ // Handle required fields
213
+ if (schema.required && schema.required.length > 0) {
214
+ geminiSchema.required = schema.required;
215
+ }
216
+ }
217
+
218
+ // Handle array items
219
+ if (
220
+ geminiSchema.type === Type.ARRAY ||
221
+ schema.type === "array" ||
222
+ (Array.isArray(schema.type) && schema.type.includes("array"))
223
+ ) {
224
+ if (schema.items) {
225
+ geminiSchema.items = this.adaptSchemaForGemini(schema.items);
226
+ }
227
+ }
228
+
229
+ return geminiSchema;
230
+ }
231
+
232
+ /**
233
+ * Map common JSON Schema type strings to Gemini's Type enum
234
+ * @private
235
+ */
236
+ private mapToGeminiType(type: string): Type {
237
+ switch (type.toLowerCase()) {
238
+ case "string":
239
+ return Type.STRING;
240
+ case "number":
241
+ return Type.NUMBER;
242
+ case "integer":
243
+ return Type.INTEGER;
244
+ case "boolean":
245
+ return Type.BOOLEAN;
246
+ case "array":
247
+ return Type.ARRAY;
248
+ case "object":
249
+ return Type.OBJECT;
250
+ default:
251
+ logger.warn(
252
+ `[GeminiProvider] Unknown type "${type}", defaulting to STRING`
253
+ );
254
+ return Type.STRING;
255
+ }
256
+ }
257
+
258
+ async generateMessage<
259
+ TContext = unknown,
260
+ TStructured = AgentStructuredResponse
261
+ >(
262
+ input: GenerateMessageInput<TContext>
263
+ ): Promise<GenerateMessageOutput<TStructured>> {
264
+ return this.generateWithBackup<TContext, TStructured>(input);
265
+ }
266
+
267
+ async *generateMessageStream<
268
+ TContext = unknown,
269
+ TStructured = AgentStructuredResponse
270
+ >(
271
+ input: GenerateMessageInput<TContext>
272
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
273
+ yield* this.generateStreamWithBackup<TContext, TStructured>(input);
274
+ }
275
+
276
+ private async generateWithBackup<
277
+ TContext = unknown,
278
+ TStructured = AgentStructuredResponse
279
+ >(
280
+ input: GenerateMessageInput<TContext>
281
+ ): Promise<GenerateMessageOutput<TStructured>> {
282
+ // Try primary model first
283
+ try {
284
+ return await this.generateWithModel(this.primaryModel, input);
285
+ } catch (primaryError: unknown) {
286
+ const primaryErrMsg = getErrorMessage(primaryError);
287
+ logger.warn(
288
+ `[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
289
+ );
290
+
291
+ if (!shouldUseBackupModel(primaryError)) {
292
+ throw primaryError;
293
+ }
294
+
295
+ logger.debug(`[GEMINI] Trying backup models`);
296
+
297
+ let lastBackupError: unknown = primaryError;
298
+
299
+ for (let i = 0; i < this.backupModels.length; i++) {
300
+ const backupModel = this.backupModels[i];
301
+ logger.debug(
302
+ `[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
303
+ }: ${backupModel}`
304
+ );
305
+
306
+ try {
307
+ const result = await this.generateWithModel(backupModel, input);
308
+ logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
309
+ return result as GenerateMessageOutput<TStructured>;
310
+ } catch (backupError: unknown) {
311
+ const backupErrMsg = getErrorMessage(backupError);
312
+ logger.warn(
313
+ `[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
314
+ );
315
+ lastBackupError = backupError;
316
+
317
+ if (
318
+ !shouldUseBackupModel(backupError) &&
319
+ i < this.backupModels.length - 1
320
+ ) {
321
+ logger.debug(
322
+ `[GEMINI] Backup model error doesn't qualify for further attempts`
323
+ );
324
+ break;
325
+ }
326
+ }
327
+ }
328
+
329
+ const lastBackupErrMsg = getErrorMessage(lastBackupError);
330
+ logger.error(
331
+ `[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
332
+ );
333
+ throw lastBackupError;
334
+ }
335
+ }
336
+
337
+ private async generateWithModel<
338
+ TContext = unknown,
339
+ TStructured = AgentStructuredResponse
340
+ >(
341
+ model: string,
342
+ input: GenerateMessageInput<TContext>
343
+ ): Promise<GenerateMessageOutput<TStructured>> {
344
+ const operation = async (): Promise<GenerateMessageOutput> => {
345
+ // Schema-required: configure response schema
346
+ const configOverride: Partial<GenerateContentConfig> = { ...this.config };
347
+
348
+ // Handle tools and JSON schema - Gemini doesn't support both simultaneously
349
+ const hasTools = input.tools && input.tools.length > 0;
350
+ const hasJsonSchema = input.parameters?.jsonSchema;
351
+
352
+ if (hasTools && hasJsonSchema) {
353
+ logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
354
+ }
355
+
356
+ if (hasTools) {
357
+ const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
358
+ logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for model ${model}:`, toolNames);
359
+ configOverride.tools = [
360
+ {
361
+ functionDeclarations: input.tools?.map((tool) => ({
362
+ name: tool.name || tool.id,
363
+ description: tool.description || "",
364
+ parameters: tool.parameters as FunctionDeclaration["parameters"], // JSON schema
365
+ })),
366
+ },
367
+ ];
368
+
369
+ } else if (hasJsonSchema) {
370
+ // Only set JSON schema if no tools are present
371
+ configOverride.responseMimeType = "application/json";
372
+ // Adapt common schema format to Gemini's specific requirements
373
+ configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
374
+ input.parameters.jsonSchema
375
+ ) : {};
376
+ }
377
+
378
+ let response: GenerateContentResponse;
379
+ try {
380
+ response = await this.genAI.models.generateContent({
381
+ model,
382
+ contents: input.prompt,
383
+ config: configOverride,
384
+ });
385
+ } catch (error: unknown) {
386
+ logger.error(`[GeminiProvider] API call failed:`, error);
387
+ throw error;
388
+ }
389
+
390
+ // Extract tool calls from response first
391
+ const toolCalls: Array<{
392
+ toolName: string;
393
+ arguments: Record<string, unknown>;
394
+ }> = [];
395
+
396
+ // Check for function calls in the response content
397
+ if (response.candidates && response.candidates[0]?.content?.parts) {
398
+ for (const part of response.candidates[0].content.parts) {
399
+ if (part.functionCall) {
400
+ toolCalls.push({
401
+ toolName: part.functionCall.name || "",
402
+ arguments: part.functionCall.args as Record<string, unknown>,
403
+ });
404
+ }
405
+ }
406
+ }
407
+
408
+ // Debug logging for response structure
409
+ if (!response.text && toolCalls.length === 0) {
410
+ logger.debug(`[GeminiProvider] Debug - Response structure:`, {
411
+ hasText: !!response.text,
412
+ candidatesCount: response.candidates?.length || 0,
413
+ firstCandidateContent: response.candidates?.[0]?.content,
414
+ firstCandidateParts: response.candidates?.[0]?.content?.parts?.length || 0,
415
+ });
416
+ }
417
+ // Try to get text from response, handling function calls properly
418
+ let message = "";
419
+ try {
420
+ message = response.text || "";
421
+ } catch (textError) {
422
+ // Sometimes response.text throws when there are function calls
423
+ logger.debug(`[GeminiProvider] Could not get response.text (likely due to function calls):`, textError);
424
+
425
+ // Try to extract text parts manually
426
+ if (response.candidates && response.candidates[0]?.content?.parts) {
427
+ const textParts = response.candidates[0].content.parts
428
+ .filter(part => part.text)
429
+ .map(part => part.text)
430
+ .join('');
431
+ message = textParts;
432
+ logger.debug(`[GeminiProvider] Extracted text from parts:`, message);
433
+ }
434
+ }
435
+
436
+ // Only throw error if we have no text AND no function calls
437
+ if (!message && toolCalls.length === 0) {
438
+ logger.error(`[GeminiProvider] Empty response - no text or function calls`);
439
+ logger.error(`[GeminiProvider] Response candidates:`, response.candidates);
440
+ throw new Error("No response from Gemini");
441
+ }
442
+
443
+ // Log when we have function calls but no text (this is normal)
444
+ if (toolCalls.length > 0 && !message) {
445
+ logger.debug(`[GeminiProvider] Function calls detected without text message:`, toolCalls.map(tc => tc.toolName));
446
+ } else if (toolCalls.length > 0 && message) {
447
+ logger.debug(`[GeminiProvider] Response has both text and function calls:`, {
448
+ messageLength: message.length,
449
+ toolCalls: toolCalls.map(tc => tc.toolName),
450
+ });
451
+ }
452
+
453
+
454
+
455
+ // Parse JSON response if schema was provided
456
+ let structured: AgentStructuredResponse | undefined;
457
+ if (input.parameters?.jsonSchema) {
458
+ const parsed = tryParseJSONResponse(message);
459
+ if (parsed) {
460
+ structured = parsed as AgentStructuredResponse;
461
+ } else {
462
+ logger.warn("[GeminiProvider] Failed to parse JSON response, treating as plain text");
463
+ }
464
+ }
465
+
466
+ // If tools were used, include them in structured response
467
+ if (toolCalls.length > 0) {
468
+ structured = {
469
+ message: structured?.message || message,
470
+ toolCalls,
471
+ ...structured,
472
+ } as AgentStructuredResponse;
473
+ }
474
+
475
+ return {
476
+ message,
477
+ metadata: {
478
+ model,
479
+ tokensUsed: response.usageMetadata?.totalTokenCount,
480
+ promptTokens: response.usageMetadata?.promptTokenCount,
481
+ completionTokens: response.usageMetadata?.candidatesTokenCount,
482
+ },
483
+ structured,
484
+ };
485
+ };
486
+
487
+ return withTimeoutAndRetry(
488
+ operation,
489
+ this.retryConfig.timeout,
490
+ this.retryConfig.retries,
491
+ `Gemini ${model}`
492
+ ) as Promise<GenerateMessageOutput<TStructured>>;
493
+ }
494
+
495
+ private async *generateStreamWithBackup<
496
+ TContext = unknown,
497
+ TStructured = AgentStructuredResponse
498
+ >(
499
+ input: GenerateMessageInput<TContext>
500
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
501
+ // Try primary model first
502
+ try {
503
+ yield* this.generateStreamWithModel(this.primaryModel, input);
504
+ } catch (primaryError: unknown) {
505
+ const primaryErrMsg = getErrorMessage(primaryError);
506
+ logger.warn(
507
+ `[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
508
+ );
509
+
510
+ if (!shouldUseBackupModel(primaryError)) {
511
+ throw primaryError;
512
+ }
513
+
514
+ logger.debug(`[GEMINI] Trying backup models for streaming`);
515
+
516
+ let lastBackupError: unknown = primaryError;
517
+
518
+ for (let i = 0; i < this.backupModels.length; i++) {
519
+ const backupModel = this.backupModels[i];
520
+ logger.debug(
521
+ `[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
522
+ }: ${backupModel}`
523
+ );
524
+
525
+ try {
526
+ yield* this.generateStreamWithModel(backupModel, input);
527
+ logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
528
+ return;
529
+ } catch (backupError: unknown) {
530
+ const backupErrMsg = getErrorMessage(backupError);
531
+ logger.warn(
532
+ `[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
533
+ );
534
+ lastBackupError = backupError;
535
+
536
+ if (
537
+ !shouldUseBackupModel(backupError) &&
538
+ i < this.backupModels.length - 1
539
+ ) {
540
+ logger.debug(
541
+ `[GEMINI] Backup model error doesn't qualify for further attempts`
542
+ );
543
+ break;
544
+ }
545
+ }
546
+ }
547
+
548
+ const lastBackupErrMsg = getErrorMessage(lastBackupError);
549
+ logger.error(
550
+ `[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
551
+ );
552
+ throw lastBackupError;
553
+ }
554
+ }
555
+
556
+ private async *generateStreamWithModel<
557
+ TContext = unknown,
558
+ TStructured = AgentStructuredResponse
559
+ >(
560
+ model: string,
561
+ input: GenerateMessageInput<TContext>
562
+ ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
563
+ // Streaming: request JSON if schema provided
564
+ const configOverride: Partial<GenerateContentConfig> = { ...this.config };
565
+
566
+ // Handle tools and JSON schema - Gemini doesn't support both simultaneously
567
+ const hasTools = input.tools && input.tools.length > 0;
568
+ const hasJsonSchema = input.parameters?.jsonSchema;
569
+
570
+ if (hasTools && hasJsonSchema) {
571
+ logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
572
+ }
573
+
574
+ if (hasTools) {
575
+ const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
576
+ logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for streaming:`, toolNames);
577
+ configOverride.tools = [
578
+ {
579
+ functionDeclarations: input.tools?.map((tool) => ({
580
+ name: tool.name || tool.id,
581
+ description: tool.description || "",
582
+ parameters: tool.parameters as FunctionDeclaration["parameters"],
583
+ })),
584
+ },
585
+ ];
586
+
587
+ } else if (hasJsonSchema) {
588
+ // Only set JSON schema if no tools are present
589
+ configOverride.responseMimeType = "application/json";
590
+ // Adapt common schema format to Gemini's specific requirements
591
+ configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
592
+ input.parameters.jsonSchema
593
+ ) : {};
594
+ }
595
+
596
+ let stream;
597
+ try {
598
+ stream = await this.genAI.models.generateContentStream({
599
+ model,
600
+ contents: input.prompt,
601
+ config: configOverride,
602
+ });
603
+ } catch (error: unknown) {
604
+ logger.error(`[GeminiProvider] Streaming API call failed:`, error);
605
+ throw error;
606
+ }
607
+
608
+ let accumulated = "";
609
+ let promptTokenCount = 0;
610
+ let candidatesTokenCount = 0;
611
+ let totalTokenCount = 0;
612
+ const toolCalls: Array<{
613
+ toolName: string;
614
+ arguments: Record<string, unknown>;
615
+ }> = [];
616
+
617
+ for await (const chunk of stream) {
618
+ const delta = chunk.text || "";
619
+
620
+ // Extract tool calls from chunk
621
+ if (chunk.candidates && chunk.candidates[0]?.content?.parts) {
622
+ for (const part of chunk.candidates[0].content.parts) {
623
+ if (part.functionCall) {
624
+ toolCalls.push({
625
+ toolName: part.functionCall.name || "",
626
+ arguments: part.functionCall.args as Record<string, unknown>,
627
+ });
628
+ }
629
+ }
630
+ }
631
+
632
+ if (delta) {
633
+ accumulated += delta;
634
+ yield {
635
+ delta,
636
+ accumulated,
637
+ done: false,
638
+ };
639
+ }
640
+
641
+ // Update token counts if available
642
+ if (chunk.usageMetadata) {
643
+ promptTokenCount = chunk.usageMetadata.promptTokenCount || 0;
644
+ candidatesTokenCount = chunk.usageMetadata.candidatesTokenCount || 0;
645
+ totalTokenCount = chunk.usageMetadata.totalTokenCount || 0;
646
+ }
647
+ }
648
+
649
+ // Parse JSON response if schema was provided
650
+ let structured: AgentStructuredResponse | undefined;
651
+ if (input.parameters?.jsonSchema && accumulated) {
652
+ const parsed = tryParseJSONResponse(accumulated);
653
+ if (parsed) {
654
+ structured = parsed as AgentStructuredResponse;
655
+ } else {
656
+ logger.warn("[GeminiProvider] Failed to parse JSON response in stream, treating as plain text");
657
+ }
658
+ }
659
+
660
+ // If tools were used, include them in structured response
661
+ if (toolCalls.length > 0) {
662
+ structured = {
663
+ message: structured?.message || accumulated,
664
+ toolCalls,
665
+ ...structured,
666
+ } as AgentStructuredResponse;
667
+ }
668
+
669
+ // Yield final chunk
670
+ yield {
671
+ delta: "",
672
+ accumulated,
673
+ done: true,
674
+ metadata: {
675
+ model,
676
+ tokensUsed: totalTokenCount,
677
+ promptTokens: promptTokenCount,
678
+ completionTokens: candidatesTokenCount,
679
+ },
680
+ structured: structured as TStructured | undefined,
681
+ };
682
+ }
683
+ }