@falai/agent 2.6.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/MemoryAdapter.d.ts +1 -1
  3. package/dist/adapters/MemoryAdapter.d.ts.map +1 -1
  4. package/dist/adapters/MemoryAdapter.js +32 -36
  5. package/dist/adapters/MemoryAdapter.js.map +1 -1
  6. package/dist/adapters/MongoAdapter.d.ts +1 -1
  7. package/dist/adapters/MongoAdapter.d.ts.map +1 -1
  8. package/dist/adapters/MongoAdapter.js +2 -2
  9. package/dist/adapters/MongoAdapter.js.map +1 -1
  10. package/dist/adapters/OpenSearchAdapter.d.ts +1 -1
  11. package/dist/adapters/OpenSearchAdapter.d.ts.map +1 -1
  12. package/dist/adapters/OpenSearchAdapter.js +3 -3
  13. package/dist/adapters/OpenSearchAdapter.js.map +1 -1
  14. package/dist/adapters/PostgreSQLAdapter.d.ts +1 -1
  15. package/dist/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  16. package/dist/adapters/PostgreSQLAdapter.js +18 -13
  17. package/dist/adapters/PostgreSQLAdapter.js.map +1 -1
  18. package/dist/adapters/PrismaAdapter.d.ts +1 -1
  19. package/dist/adapters/PrismaAdapter.d.ts.map +1 -1
  20. package/dist/adapters/PrismaAdapter.js +3 -3
  21. package/dist/adapters/PrismaAdapter.js.map +1 -1
  22. package/dist/adapters/RedisAdapter.d.ts +2 -1
  23. package/dist/adapters/RedisAdapter.d.ts.map +1 -1
  24. package/dist/adapters/RedisAdapter.js +77 -27
  25. package/dist/adapters/RedisAdapter.js.map +1 -1
  26. package/dist/adapters/SQLiteAdapter.d.ts +1 -1
  27. package/dist/adapters/SQLiteAdapter.d.ts.map +1 -1
  28. package/dist/adapters/SQLiteAdapter.js +9 -31
  29. package/dist/adapters/SQLiteAdapter.js.map +1 -1
  30. package/dist/adapters/index.d.ts +13 -13
  31. package/dist/adapters/index.d.ts.map +1 -1
  32. package/dist/adapters/index.js +7 -7
  33. package/dist/adapters/index.js.map +1 -1
  34. package/dist/adapters/sessionRow.d.ts +22 -0
  35. package/dist/adapters/sessionRow.d.ts.map +1 -0
  36. package/dist/adapters/sessionRow.js +48 -0
  37. package/dist/adapters/sessionRow.js.map +1 -0
  38. package/dist/cjs/adapters/MemoryAdapter.d.ts +1 -1
  39. package/dist/cjs/adapters/MemoryAdapter.d.ts.map +1 -1
  40. package/dist/cjs/adapters/MemoryAdapter.js +39 -43
  41. package/dist/cjs/adapters/MemoryAdapter.js.map +1 -1
  42. package/dist/cjs/adapters/MongoAdapter.d.ts +1 -1
  43. package/dist/cjs/adapters/MongoAdapter.d.ts.map +1 -1
  44. package/dist/cjs/adapters/MongoAdapter.js +4 -4
  45. package/dist/cjs/adapters/MongoAdapter.js.map +1 -1
  46. package/dist/cjs/adapters/OpenSearchAdapter.d.ts +1 -1
  47. package/dist/cjs/adapters/OpenSearchAdapter.d.ts.map +1 -1
  48. package/dist/cjs/adapters/OpenSearchAdapter.js +6 -6
  49. package/dist/cjs/adapters/OpenSearchAdapter.js.map +1 -1
  50. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts +1 -1
  51. package/dist/cjs/adapters/PostgreSQLAdapter.d.ts.map +1 -1
  52. package/dist/cjs/adapters/PostgreSQLAdapter.js +20 -15
  53. package/dist/cjs/adapters/PostgreSQLAdapter.js.map +1 -1
  54. package/dist/cjs/adapters/PrismaAdapter.d.ts +1 -1
  55. package/dist/cjs/adapters/PrismaAdapter.d.ts.map +1 -1
  56. package/dist/cjs/adapters/PrismaAdapter.js +7 -7
  57. package/dist/cjs/adapters/PrismaAdapter.js.map +1 -1
  58. package/dist/cjs/adapters/RedisAdapter.d.ts +2 -1
  59. package/dist/cjs/adapters/RedisAdapter.d.ts.map +1 -1
  60. package/dist/cjs/adapters/RedisAdapter.js +81 -31
  61. package/dist/cjs/adapters/RedisAdapter.js.map +1 -1
  62. package/dist/cjs/adapters/SQLiteAdapter.d.ts +1 -1
  63. package/dist/cjs/adapters/SQLiteAdapter.d.ts.map +1 -1
  64. package/dist/cjs/adapters/SQLiteAdapter.js +11 -33
  65. package/dist/cjs/adapters/SQLiteAdapter.js.map +1 -1
  66. package/dist/cjs/adapters/index.d.ts +13 -13
  67. package/dist/cjs/adapters/index.d.ts.map +1 -1
  68. package/dist/cjs/adapters/index.js +14 -14
  69. package/dist/cjs/adapters/index.js.map +1 -1
  70. package/dist/cjs/adapters/sessionRow.d.ts +22 -0
  71. package/dist/cjs/adapters/sessionRow.d.ts.map +1 -0
  72. package/dist/cjs/adapters/sessionRow.js +52 -0
  73. package/dist/cjs/adapters/sessionRow.js.map +1 -0
  74. package/dist/cjs/core/Agent.d.ts +19 -11
  75. package/dist/cjs/core/Agent.d.ts.map +1 -1
  76. package/dist/cjs/core/Agent.js +102 -64
  77. package/dist/cjs/core/Agent.js.map +1 -1
  78. package/dist/cjs/core/AutoChainExecutor.d.ts +12 -22
  79. package/dist/cjs/core/AutoChainExecutor.d.ts.map +1 -1
  80. package/dist/cjs/core/AutoChainExecutor.js +46 -49
  81. package/dist/cjs/core/AutoChainExecutor.js.map +1 -1
  82. package/dist/cjs/core/BranchEvaluator.d.ts +4 -4
  83. package/dist/cjs/core/BranchEvaluator.d.ts.map +1 -1
  84. package/dist/cjs/core/BranchEvaluator.js +6 -6
  85. package/dist/cjs/core/BranchEvaluator.js.map +1 -1
  86. package/dist/cjs/core/CompactionEngine.d.ts +16 -3
  87. package/dist/cjs/core/CompactionEngine.d.ts.map +1 -1
  88. package/dist/cjs/core/CompactionEngine.js +30 -6
  89. package/dist/cjs/core/CompactionEngine.js.map +1 -1
  90. package/dist/cjs/core/DirectiveChainTracker.d.ts +1 -1
  91. package/dist/cjs/core/DirectiveChainTracker.d.ts.map +1 -1
  92. package/dist/cjs/core/DirectiveChainTracker.js +5 -5
  93. package/dist/cjs/core/DirectiveChainTracker.js.map +1 -1
  94. package/dist/cjs/core/Events.d.ts +1 -1
  95. package/dist/cjs/core/Events.d.ts.map +1 -1
  96. package/dist/cjs/core/Events.js +15 -15
  97. package/dist/cjs/core/Events.js.map +1 -1
  98. package/dist/cjs/core/Flow.d.ts +4 -4
  99. package/dist/cjs/core/Flow.d.ts.map +1 -1
  100. package/dist/cjs/core/Flow.js +15 -15
  101. package/dist/cjs/core/Flow.js.map +1 -1
  102. package/dist/cjs/core/FlowRouter.d.ts +4 -4
  103. package/dist/cjs/core/FlowRouter.d.ts.map +1 -1
  104. package/dist/cjs/core/FlowRouter.js +92 -70
  105. package/dist/cjs/core/FlowRouter.js.map +1 -1
  106. package/dist/cjs/core/PersistenceManager.d.ts +1 -1
  107. package/dist/cjs/core/PersistenceManager.d.ts.map +1 -1
  108. package/dist/cjs/core/PersistenceManager.js +10 -10
  109. package/dist/cjs/core/PersistenceManager.js.map +1 -1
  110. package/dist/cjs/core/PromptComposer.d.ts +4 -4
  111. package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
  112. package/dist/cjs/core/PromptComposer.js +13 -13
  113. package/dist/cjs/core/PromptComposer.js.map +1 -1
  114. package/dist/cjs/core/PromptSectionCache.d.ts +2 -2
  115. package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -1
  116. package/dist/cjs/core/ResponseEngine.d.ts +4 -4
  117. package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
  118. package/dist/cjs/core/ResponseEngine.js +7 -7
  119. package/dist/cjs/core/ResponseEngine.js.map +1 -1
  120. package/dist/cjs/core/ResponseGenerationError.d.ts.map +1 -1
  121. package/dist/cjs/core/ResponseGenerationError.js +3 -5
  122. package/dist/cjs/core/ResponseGenerationError.js.map +1 -1
  123. package/dist/cjs/core/ResponseModal.d.ts +39 -10
  124. package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
  125. package/dist/cjs/core/ResponseModal.js +195 -72
  126. package/dist/cjs/core/ResponseModal.js.map +1 -1
  127. package/dist/cjs/core/ResponsePipeline.d.ts +50 -12
  128. package/dist/cjs/core/ResponsePipeline.d.ts.map +1 -1
  129. package/dist/cjs/core/ResponsePipeline.js +301 -158
  130. package/dist/cjs/core/ResponsePipeline.js.map +1 -1
  131. package/dist/cjs/core/SessionFinalizer.d.ts +4 -4
  132. package/dist/cjs/core/SessionFinalizer.d.ts.map +1 -1
  133. package/dist/cjs/core/SessionFinalizer.js +36 -9
  134. package/dist/cjs/core/SessionFinalizer.js.map +1 -1
  135. package/dist/cjs/core/SessionManager.d.ts +15 -6
  136. package/dist/cjs/core/SessionManager.d.ts.map +1 -1
  137. package/dist/cjs/core/SessionManager.js +49 -22
  138. package/dist/cjs/core/SessionManager.js.map +1 -1
  139. package/dist/cjs/core/SignalCoordinator.d.ts +5 -5
  140. package/dist/cjs/core/SignalCoordinator.d.ts.map +1 -1
  141. package/dist/cjs/core/SignalCoordinator.js +12 -12
  142. package/dist/cjs/core/SignalCoordinator.js.map +1 -1
  143. package/dist/cjs/core/SignalEvaluator.d.ts +4 -4
  144. package/dist/cjs/core/SignalEvaluator.d.ts.map +1 -1
  145. package/dist/cjs/core/SignalEvaluator.js +6 -6
  146. package/dist/cjs/core/SignalEvaluator.js.map +1 -1
  147. package/dist/cjs/core/SignalProcessor.d.ts +6 -6
  148. package/dist/cjs/core/SignalProcessor.d.ts.map +1 -1
  149. package/dist/cjs/core/SignalProcessor.js +17 -89
  150. package/dist/cjs/core/SignalProcessor.js.map +1 -1
  151. package/dist/cjs/core/Step.d.ts +5 -5
  152. package/dist/cjs/core/Step.d.ts.map +1 -1
  153. package/dist/cjs/core/Step.js +65 -17
  154. package/dist/cjs/core/Step.js.map +1 -1
  155. package/dist/cjs/core/StepLifecycle.d.ts +18 -8
  156. package/dist/cjs/core/StepLifecycle.d.ts.map +1 -1
  157. package/dist/cjs/core/StepLifecycle.js +103 -20
  158. package/dist/cjs/core/StepLifecycle.js.map +1 -1
  159. package/dist/cjs/core/StreamingToolExecutor.d.ts +1 -1
  160. package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -1
  161. package/dist/cjs/core/StreamingToolExecutor.js +30 -6
  162. package/dist/cjs/core/StreamingToolExecutor.js.map +1 -1
  163. package/dist/cjs/core/ToolLoopExecutor.d.ts +8 -4
  164. package/dist/cjs/core/ToolLoopExecutor.d.ts.map +1 -1
  165. package/dist/cjs/core/ToolLoopExecutor.js +189 -97
  166. package/dist/cjs/core/ToolLoopExecutor.js.map +1 -1
  167. package/dist/cjs/core/ToolManager.d.ts +6 -6
  168. package/dist/cjs/core/ToolManager.d.ts.map +1 -1
  169. package/dist/cjs/core/ToolManager.js +102 -79
  170. package/dist/cjs/core/ToolManager.js.map +1 -1
  171. package/dist/cjs/core/createAgent.d.ts +2 -2
  172. package/dist/cjs/core/createAgent.d.ts.map +1 -1
  173. package/dist/cjs/core/createAgent.js +2 -2
  174. package/dist/cjs/core/createAgent.js.map +1 -1
  175. package/dist/cjs/core/flow-namespace.d.ts +16 -1
  176. package/dist/cjs/core/flow-namespace.d.ts.map +1 -1
  177. package/dist/cjs/core/flow-namespace.js +26 -4
  178. package/dist/cjs/core/flow-namespace.js.map +1 -1
  179. package/dist/cjs/core/toolGates.d.ts +1 -1
  180. package/dist/cjs/core/toolGates.d.ts.map +1 -1
  181. package/dist/cjs/core/toolGates.js +3 -3
  182. package/dist/cjs/core/toolGates.js.map +1 -1
  183. package/dist/cjs/index.d.ts +50 -45
  184. package/dist/cjs/index.d.ts.map +1 -1
  185. package/dist/cjs/index.js +96 -88
  186. package/dist/cjs/index.js.map +1 -1
  187. package/dist/cjs/providers/AnthropicProvider.d.ts +25 -35
  188. package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
  189. package/dist/cjs/providers/AnthropicProvider.js +30 -426
  190. package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
  191. package/dist/cjs/providers/DeepSeekProvider.d.ts +13 -34
  192. package/dist/cjs/providers/DeepSeekProvider.d.ts.map +1 -1
  193. package/dist/cjs/providers/DeepSeekProvider.js +17 -51
  194. package/dist/cjs/providers/DeepSeekProvider.js.map +1 -1
  195. package/dist/cjs/providers/GeminiProvider.d.ts +22 -75
  196. package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
  197. package/dist/cjs/providers/GeminiProvider.js +32 -558
  198. package/dist/cjs/providers/GeminiProvider.js.map +1 -1
  199. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  200. package/dist/cjs/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  201. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js +14 -20
  202. package/dist/cjs/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  203. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts +26 -135
  204. package/dist/cjs/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  205. package/dist/cjs/providers/OpenAICompatibleProvider.js +40 -496
  206. package/dist/cjs/providers/OpenAICompatibleProvider.js.map +1 -1
  207. package/dist/cjs/providers/OpenAIProvider.d.ts +14 -20
  208. package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
  209. package/dist/cjs/providers/OpenAIProvider.js +21 -28
  210. package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
  211. package/dist/cjs/providers/OpenRouterProvider.d.ts +20 -24
  212. package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
  213. package/dist/cjs/providers/OpenRouterProvider.js +22 -38
  214. package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
  215. package/dist/cjs/providers/ProviderAdapter.d.ts +94 -0
  216. package/dist/cjs/providers/ProviderAdapter.d.ts.map +1 -0
  217. package/dist/cjs/providers/ProviderAdapter.js +257 -0
  218. package/dist/cjs/providers/ProviderAdapter.js.map +1 -0
  219. package/dist/cjs/providers/index.d.ts +21 -18
  220. package/dist/cjs/providers/index.d.ts.map +1 -1
  221. package/dist/cjs/providers/index.js +23 -21
  222. package/dist/cjs/providers/index.js.map +1 -1
  223. package/dist/cjs/types/agent.d.ts +37 -11
  224. package/dist/cjs/types/agent.d.ts.map +1 -1
  225. package/dist/cjs/types/ai.d.ts +11 -21
  226. package/dist/cjs/types/ai.d.ts.map +1 -1
  227. package/dist/cjs/types/compaction.d.ts +2 -2
  228. package/dist/cjs/types/compaction.d.ts.map +1 -1
  229. package/dist/cjs/types/errors.d.ts +16 -20
  230. package/dist/cjs/types/errors.d.ts.map +1 -1
  231. package/dist/cjs/types/errors.js +17 -18
  232. package/dist/cjs/types/errors.js.map +1 -1
  233. package/dist/cjs/types/flow.d.ts +56 -39
  234. package/dist/cjs/types/flow.d.ts.map +1 -1
  235. package/dist/cjs/types/history.d.ts +1 -1
  236. package/dist/cjs/types/history.d.ts.map +1 -1
  237. package/dist/cjs/types/index.d.ts +17 -17
  238. package/dist/cjs/types/index.d.ts.map +1 -1
  239. package/dist/cjs/types/index.js +14 -14
  240. package/dist/cjs/types/index.js.map +1 -1
  241. package/dist/cjs/types/persistence.d.ts +2 -2
  242. package/dist/cjs/types/persistence.d.ts.map +1 -1
  243. package/dist/cjs/types/session.d.ts +4 -4
  244. package/dist/cjs/types/session.d.ts.map +1 -1
  245. package/dist/cjs/types/signals.d.ts +3 -3
  246. package/dist/cjs/types/signals.d.ts.map +1 -1
  247. package/dist/cjs/types/template.d.ts +2 -2
  248. package/dist/cjs/types/template.d.ts.map +1 -1
  249. package/dist/cjs/types/tool.d.ts +4 -2
  250. package/dist/cjs/types/tool.d.ts.map +1 -1
  251. package/dist/cjs/types/tool.js.map +1 -1
  252. package/dist/cjs/utils/condition.d.ts +1 -1
  253. package/dist/cjs/utils/condition.d.ts.map +1 -1
  254. package/dist/cjs/utils/condition.js +6 -6
  255. package/dist/cjs/utils/condition.js.map +1 -1
  256. package/dist/cjs/utils/event.d.ts +1 -1
  257. package/dist/cjs/utils/event.d.ts.map +1 -1
  258. package/dist/cjs/utils/event.js +2 -2
  259. package/dist/cjs/utils/event.js.map +1 -1
  260. package/dist/cjs/utils/history.d.ts +2 -2
  261. package/dist/cjs/utils/history.d.ts.map +1 -1
  262. package/dist/cjs/utils/history.js +15 -15
  263. package/dist/cjs/utils/history.js.map +1 -1
  264. package/dist/cjs/utils/index.d.ts +11 -13
  265. package/dist/cjs/utils/index.d.ts.map +1 -1
  266. package/dist/cjs/utils/index.js +57 -58
  267. package/dist/cjs/utils/index.js.map +1 -1
  268. package/dist/cjs/utils/serialize.d.ts +17 -0
  269. package/dist/cjs/utils/serialize.d.ts.map +1 -1
  270. package/dist/cjs/utils/serialize.js +33 -0
  271. package/dist/cjs/utils/serialize.js.map +1 -1
  272. package/dist/cjs/utils/session.d.ts +23 -3
  273. package/dist/cjs/utils/session.d.ts.map +1 -1
  274. package/dist/cjs/utils/session.js +40 -8
  275. package/dist/cjs/utils/session.js.map +1 -1
  276. package/dist/cjs/utils/template.d.ts +3 -3
  277. package/dist/cjs/utils/template.d.ts.map +1 -1
  278. package/dist/cjs/utils/template.js +5 -5
  279. package/dist/cjs/utils/template.js.map +1 -1
  280. package/dist/constants/index.d.ts +1 -0
  281. package/dist/constants/index.js +1 -1
  282. package/dist/core/Agent.d.ts +19 -11
  283. package/dist/core/Agent.d.ts.map +1 -1
  284. package/dist/core/Agent.js +53 -15
  285. package/dist/core/Agent.js.map +1 -1
  286. package/dist/core/AutoChainExecutor.d.ts +12 -22
  287. package/dist/core/AutoChainExecutor.d.ts.map +1 -1
  288. package/dist/core/AutoChainExecutor.js +27 -30
  289. package/dist/core/AutoChainExecutor.js.map +1 -1
  290. package/dist/core/BranchEvaluator.d.ts +4 -4
  291. package/dist/core/BranchEvaluator.d.ts.map +1 -1
  292. package/dist/core/BranchEvaluator.js +2 -2
  293. package/dist/core/BranchEvaluator.js.map +1 -1
  294. package/dist/core/CompactionEngine.d.ts +16 -3
  295. package/dist/core/CompactionEngine.d.ts.map +1 -1
  296. package/dist/core/CompactionEngine.js +30 -6
  297. package/dist/core/CompactionEngine.js.map +1 -1
  298. package/dist/core/DirectiveChainTracker.d.ts +1 -1
  299. package/dist/core/DirectiveChainTracker.d.ts.map +1 -1
  300. package/dist/core/DirectiveChainTracker.js +2 -2
  301. package/dist/core/DirectiveChainTracker.js.map +1 -1
  302. package/dist/core/Events.d.ts +1 -1
  303. package/dist/core/Events.d.ts.map +1 -1
  304. package/dist/core/Events.js +1 -1
  305. package/dist/core/Events.js.map +1 -1
  306. package/dist/core/Flow.d.ts +4 -4
  307. package/dist/core/Flow.d.ts.map +1 -1
  308. package/dist/core/Flow.js +3 -3
  309. package/dist/core/Flow.js.map +1 -1
  310. package/dist/core/FlowRouter.d.ts +4 -4
  311. package/dist/core/FlowRouter.d.ts.map +1 -1
  312. package/dist/core/FlowRouter.js +36 -14
  313. package/dist/core/FlowRouter.js.map +1 -1
  314. package/dist/core/PersistenceManager.d.ts +1 -1
  315. package/dist/core/PersistenceManager.d.ts.map +1 -1
  316. package/dist/core/PersistenceManager.js +3 -3
  317. package/dist/core/PersistenceManager.js.map +1 -1
  318. package/dist/core/PromptComposer.d.ts +4 -4
  319. package/dist/core/PromptComposer.d.ts.map +1 -1
  320. package/dist/core/PromptComposer.js +3 -3
  321. package/dist/core/PromptComposer.js.map +1 -1
  322. package/dist/core/PromptSectionCache.d.ts +2 -2
  323. package/dist/core/PromptSectionCache.d.ts.map +1 -1
  324. package/dist/core/ResponseEngine.d.ts +4 -4
  325. package/dist/core/ResponseEngine.d.ts.map +1 -1
  326. package/dist/core/ResponseEngine.js +2 -2
  327. package/dist/core/ResponseEngine.js.map +1 -1
  328. package/dist/core/ResponseGenerationError.d.ts.map +1 -1
  329. package/dist/core/ResponseGenerationError.js +3 -5
  330. package/dist/core/ResponseGenerationError.js.map +1 -1
  331. package/dist/core/ResponseModal.d.ts +39 -10
  332. package/dist/core/ResponseModal.d.ts.map +1 -1
  333. package/dist/core/ResponseModal.js +152 -29
  334. package/dist/core/ResponseModal.js.map +1 -1
  335. package/dist/core/ResponsePipeline.d.ts +50 -12
  336. package/dist/core/ResponsePipeline.d.ts.map +1 -1
  337. package/dist/core/ResponsePipeline.js +232 -89
  338. package/dist/core/ResponsePipeline.js.map +1 -1
  339. package/dist/core/SessionFinalizer.d.ts +4 -4
  340. package/dist/core/SessionFinalizer.d.ts.map +1 -1
  341. package/dist/core/SessionFinalizer.js +32 -5
  342. package/dist/core/SessionFinalizer.js.map +1 -1
  343. package/dist/core/SessionManager.d.ts +15 -6
  344. package/dist/core/SessionManager.d.ts.map +1 -1
  345. package/dist/core/SessionManager.js +46 -19
  346. package/dist/core/SessionManager.js.map +1 -1
  347. package/dist/core/SignalCoordinator.d.ts +5 -5
  348. package/dist/core/SignalCoordinator.d.ts.map +1 -1
  349. package/dist/core/SignalCoordinator.js +2 -2
  350. package/dist/core/SignalCoordinator.js.map +1 -1
  351. package/dist/core/SignalEvaluator.d.ts +4 -4
  352. package/dist/core/SignalEvaluator.d.ts.map +1 -1
  353. package/dist/core/SignalEvaluator.js +2 -2
  354. package/dist/core/SignalEvaluator.js.map +1 -1
  355. package/dist/core/SignalProcessor.d.ts +6 -6
  356. package/dist/core/SignalProcessor.d.ts.map +1 -1
  357. package/dist/core/SignalProcessor.js +7 -79
  358. package/dist/core/SignalProcessor.js.map +1 -1
  359. package/dist/core/Step.d.ts +5 -5
  360. package/dist/core/Step.d.ts.map +1 -1
  361. package/dist/core/Step.js +53 -5
  362. package/dist/core/Step.js.map +1 -1
  363. package/dist/core/StepLifecycle.d.ts +18 -8
  364. package/dist/core/StepLifecycle.d.ts.map +1 -1
  365. package/dist/core/StepLifecycle.js +98 -15
  366. package/dist/core/StepLifecycle.js.map +1 -1
  367. package/dist/core/StreamingToolExecutor.d.ts +1 -1
  368. package/dist/core/StreamingToolExecutor.d.ts.map +1 -1
  369. package/dist/core/StreamingToolExecutor.js +29 -5
  370. package/dist/core/StreamingToolExecutor.js.map +1 -1
  371. package/dist/core/ToolLoopExecutor.d.ts +8 -4
  372. package/dist/core/ToolLoopExecutor.d.ts.map +1 -1
  373. package/dist/core/ToolLoopExecutor.js +157 -65
  374. package/dist/core/ToolLoopExecutor.js.map +1 -1
  375. package/dist/core/ToolManager.d.ts +6 -6
  376. package/dist/core/ToolManager.d.ts.map +1 -1
  377. package/dist/core/ToolManager.js +44 -21
  378. package/dist/core/ToolManager.js.map +1 -1
  379. package/dist/core/createAgent.d.ts +2 -2
  380. package/dist/core/createAgent.d.ts.map +1 -1
  381. package/dist/core/createAgent.js +1 -1
  382. package/dist/core/createAgent.js.map +1 -1
  383. package/dist/core/flow-namespace.d.ts +16 -1
  384. package/dist/core/flow-namespace.d.ts.map +1 -1
  385. package/dist/core/flow-namespace.js +23 -1
  386. package/dist/core/flow-namespace.js.map +1 -1
  387. package/dist/core/toolGates.d.ts +1 -1
  388. package/dist/core/toolGates.d.ts.map +1 -1
  389. package/dist/core/toolGates.js +1 -1
  390. package/dist/core/toolGates.js.map +1 -1
  391. package/dist/index.d.ts +50 -45
  392. package/dist/index.d.ts.map +1 -1
  393. package/dist/index.js +34 -30
  394. package/dist/index.js.map +1 -1
  395. package/dist/providers/AnthropicProvider.d.ts +25 -35
  396. package/dist/providers/AnthropicProvider.d.ts.map +1 -1
  397. package/dist/providers/AnthropicProvider.js +30 -423
  398. package/dist/providers/AnthropicProvider.js.map +1 -1
  399. package/dist/providers/DeepSeekProvider.d.ts +13 -34
  400. package/dist/providers/DeepSeekProvider.d.ts.map +1 -1
  401. package/dist/providers/DeepSeekProvider.js +16 -47
  402. package/dist/providers/DeepSeekProvider.js.map +1 -1
  403. package/dist/providers/GeminiProvider.d.ts +22 -75
  404. package/dist/providers/GeminiProvider.d.ts.map +1 -1
  405. package/dist/providers/GeminiProvider.js +32 -558
  406. package/dist/providers/GeminiProvider.js.map +1 -1
  407. package/dist/providers/GenericOpenAICompatibleProvider.d.ts +9 -10
  408. package/dist/providers/GenericOpenAICompatibleProvider.d.ts.map +1 -1
  409. package/dist/providers/GenericOpenAICompatibleProvider.js +13 -16
  410. package/dist/providers/GenericOpenAICompatibleProvider.js.map +1 -1
  411. package/dist/providers/OpenAICompatibleProvider.d.ts +26 -135
  412. package/dist/providers/OpenAICompatibleProvider.d.ts.map +1 -1
  413. package/dist/providers/OpenAICompatibleProvider.js +39 -495
  414. package/dist/providers/OpenAICompatibleProvider.js.map +1 -1
  415. package/dist/providers/OpenAIProvider.d.ts +14 -20
  416. package/dist/providers/OpenAIProvider.d.ts.map +1 -1
  417. package/dist/providers/OpenAIProvider.js +20 -24
  418. package/dist/providers/OpenAIProvider.js.map +1 -1
  419. package/dist/providers/OpenRouterProvider.d.ts +20 -24
  420. package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
  421. package/dist/providers/OpenRouterProvider.js +21 -34
  422. package/dist/providers/OpenRouterProvider.js.map +1 -1
  423. package/dist/providers/ProviderAdapter.d.ts +94 -0
  424. package/dist/providers/ProviderAdapter.d.ts.map +1 -0
  425. package/dist/providers/ProviderAdapter.js +251 -0
  426. package/dist/providers/ProviderAdapter.js.map +1 -0
  427. package/dist/providers/index.d.ts +21 -18
  428. package/dist/providers/index.d.ts.map +1 -1
  429. package/dist/providers/index.js +13 -10
  430. package/dist/providers/index.js.map +1 -1
  431. package/dist/types/agent.d.ts +37 -11
  432. package/dist/types/agent.d.ts.map +1 -1
  433. package/dist/types/ai.d.ts +11 -21
  434. package/dist/types/ai.d.ts.map +1 -1
  435. package/dist/types/compaction.d.ts +2 -2
  436. package/dist/types/compaction.d.ts.map +1 -1
  437. package/dist/types/errors.d.ts +16 -20
  438. package/dist/types/errors.d.ts.map +1 -1
  439. package/dist/types/errors.js +15 -16
  440. package/dist/types/errors.js.map +1 -1
  441. package/dist/types/flow.d.ts +56 -39
  442. package/dist/types/flow.d.ts.map +1 -1
  443. package/dist/types/history.d.ts +1 -1
  444. package/dist/types/history.d.ts.map +1 -1
  445. package/dist/types/index.d.ts +17 -17
  446. package/dist/types/index.d.ts.map +1 -1
  447. package/dist/types/index.js +4 -4
  448. package/dist/types/index.js.map +1 -1
  449. package/dist/types/persistence.d.ts +2 -2
  450. package/dist/types/persistence.d.ts.map +1 -1
  451. package/dist/types/session.d.ts +4 -4
  452. package/dist/types/session.d.ts.map +1 -1
  453. package/dist/types/signals.d.ts +3 -3
  454. package/dist/types/signals.d.ts.map +1 -1
  455. package/dist/types/template.d.ts +2 -2
  456. package/dist/types/template.d.ts.map +1 -1
  457. package/dist/types/tool.d.ts +4 -2
  458. package/dist/types/tool.d.ts.map +1 -1
  459. package/dist/types/tool.js.map +1 -1
  460. package/dist/utils/condition.d.ts +1 -1
  461. package/dist/utils/condition.d.ts.map +1 -1
  462. package/dist/utils/condition.js +2 -2
  463. package/dist/utils/condition.js.map +1 -1
  464. package/dist/utils/event.d.ts +1 -1
  465. package/dist/utils/event.d.ts.map +1 -1
  466. package/dist/utils/event.js +1 -1
  467. package/dist/utils/event.js.map +1 -1
  468. package/dist/utils/history.d.ts +2 -2
  469. package/dist/utils/history.d.ts.map +1 -1
  470. package/dist/utils/history.js +1 -1
  471. package/dist/utils/history.js.map +1 -1
  472. package/dist/utils/index.d.ts +11 -13
  473. package/dist/utils/index.d.ts.map +1 -1
  474. package/dist/utils/index.js +11 -12
  475. package/dist/utils/index.js.map +1 -1
  476. package/dist/utils/serialize.d.ts +17 -0
  477. package/dist/utils/serialize.d.ts.map +1 -1
  478. package/dist/utils/serialize.js +31 -0
  479. package/dist/utils/serialize.js.map +1 -1
  480. package/dist/utils/session.d.ts +23 -3
  481. package/dist/utils/session.d.ts.map +1 -1
  482. package/dist/utils/session.js +35 -6
  483. package/dist/utils/session.js.map +1 -1
  484. package/dist/utils/template.d.ts +3 -3
  485. package/dist/utils/template.d.ts.map +1 -1
  486. package/dist/utils/template.js +1 -1
  487. package/dist/utils/template.js.map +1 -1
  488. package/docs/concepts/architecture.md +3 -3
  489. package/docs/concepts/directives.md +1 -1
  490. package/docs/guides/error-handling.md +46 -45
  491. package/docs/guides/flow-control.md +8 -1
  492. package/docs/guides/instructions.md +15 -6
  493. package/docs/guides/persistence.md +12 -5
  494. package/docs/guides/streaming.md +10 -0
  495. package/docs/migration/README.md +4 -0
  496. package/docs/migration/v2-3-to-v2-4.md +4 -0
  497. package/docs/migration/v2-6-to-v2-7.md +246 -0
  498. package/docs/reference/adapters.md +15 -1
  499. package/docs/reference/branches.md +2 -0
  500. package/docs/reference/create-agent.md +28 -0
  501. package/docs/reference/directive.md +1 -1
  502. package/docs/reference/errors.md +30 -32
  503. package/docs/reference/providers.md +63 -60
  504. package/docs/reference/step.md +28 -21
  505. package/docs/reference/tool.md +14 -5
  506. package/docs/start/02-first-agent.md +8 -4
  507. package/docs/start/03-collect-data.md +19 -10
  508. package/examples/01-quickstart.ts +2 -2
  509. package/examples/02-data-extraction.ts +1 -1
  510. package/examples/03-tools.ts +1 -1
  511. package/examples/04-instructions.ts +2 -2
  512. package/examples/05-branching.ts +3 -3
  513. package/examples/06-flow-control.ts +3 -3
  514. package/examples/07-streaming.ts +1 -1
  515. package/examples/08-persistence.ts +2 -2
  516. package/examples/09-signals.ts +1 -1
  517. package/examples/tsconfig.json +6 -3
  518. package/package.json +9 -7
  519. package/src/adapters/MemoryAdapter.ts +33 -37
  520. package/src/adapters/MongoAdapter.ts +3 -3
  521. package/src/adapters/OpenSearchAdapter.ts +4 -4
  522. package/src/adapters/PostgreSQLAdapter.ts +26 -21
  523. package/src/adapters/PrismaAdapter.ts +4 -4
  524. package/src/adapters/RedisAdapter.ts +84 -37
  525. package/src/adapters/SQLiteAdapter.ts +13 -34
  526. package/src/adapters/index.ts +13 -13
  527. package/src/adapters/sessionRow.ts +57 -0
  528. package/src/core/Agent.ts +64 -18
  529. package/src/core/AutoChainExecutor.ts +44 -57
  530. package/src/core/BranchEvaluator.ts +5 -5
  531. package/src/core/CompactionEngine.ts +42 -8
  532. package/src/core/DirectiveChainTracker.ts +3 -3
  533. package/src/core/Events.ts +2 -2
  534. package/src/core/Flow.ts +9 -9
  535. package/src/core/FlowRouter.ts +46 -20
  536. package/src/core/PersistenceManager.ts +4 -4
  537. package/src/core/PromptComposer.ts +8 -8
  538. package/src/core/PromptSectionCache.ts +2 -2
  539. package/src/core/ResponseEngine.ts +6 -6
  540. package/src/core/ResponseGenerationError.ts +3 -6
  541. package/src/core/ResponseModal.ts +205 -39
  542. package/src/core/ResponsePipeline.ts +301 -107
  543. package/src/core/SessionFinalizer.ts +40 -10
  544. package/src/core/SessionManager.ts +61 -27
  545. package/src/core/SignalCoordinator.ts +7 -7
  546. package/src/core/SignalEvaluator.ts +6 -6
  547. package/src/core/SignalProcessor.ts +13 -93
  548. package/src/core/Step.ts +87 -10
  549. package/src/core/StepLifecycle.ts +129 -26
  550. package/src/core/StreamingToolExecutor.ts +33 -8
  551. package/src/core/ToolLoopExecutor.ts +206 -80
  552. package/src/core/ToolManager.ts +53 -26
  553. package/src/core/createAgent.ts +2 -2
  554. package/src/core/flow-namespace.ts +31 -2
  555. package/src/core/toolGates.ts +2 -2
  556. package/src/index.ts +59 -45
  557. package/src/providers/AnthropicProvider.ts +44 -595
  558. package/src/providers/DeepSeekProvider.ts +27 -92
  559. package/src/providers/GeminiProvider.ts +41 -752
  560. package/src/providers/GenericOpenAICompatibleProvider.ts +19 -27
  561. package/src/providers/OpenAICompatibleProvider.ts +58 -764
  562. package/src/providers/OpenAIProvider.ts +31 -55
  563. package/src/providers/OpenRouterProvider.ts +40 -70
  564. package/src/providers/ProviderAdapter.ts +368 -0
  565. package/src/providers/index.ts +21 -23
  566. package/src/types/agent.ts +36 -11
  567. package/src/types/ai.ts +11 -21
  568. package/src/types/compaction.ts +2 -2
  569. package/src/types/errors.ts +17 -35
  570. package/src/types/flow.ts +44 -46
  571. package/src/types/history.ts +1 -1
  572. package/src/types/index.ts +18 -17
  573. package/src/types/persistence.ts +2 -2
  574. package/src/types/session.ts +4 -4
  575. package/src/types/signals.ts +3 -3
  576. package/src/types/template.ts +2 -2
  577. package/src/types/tool.ts +4 -2
  578. package/src/utils/condition.ts +3 -3
  579. package/src/utils/event.ts +1 -1
  580. package/src/utils/history.ts +3 -3
  581. package/src/utils/index.ts +14 -15
  582. package/src/utils/serialize.ts +38 -0
  583. package/src/utils/session.ts +46 -9
  584. package/src/utils/template.ts +3 -3
  585. package/dist/cjs/core/DirectiveBus.d.ts +0 -88
  586. package/dist/cjs/core/DirectiveBus.d.ts.map +0 -1
  587. package/dist/cjs/core/DirectiveBus.js +0 -196
  588. package/dist/cjs/core/DirectiveBus.js.map +0 -1
  589. package/dist/cjs/providers/errorClassification.d.ts +0 -61
  590. package/dist/cjs/providers/errorClassification.d.ts.map +0 -1
  591. package/dist/cjs/providers/errorClassification.js +0 -123
  592. package/dist/cjs/providers/errorClassification.js.map +0 -1
  593. package/dist/cjs/utils/retry.d.ts +0 -67
  594. package/dist/cjs/utils/retry.d.ts.map +0 -1
  595. package/dist/cjs/utils/retry.js +0 -201
  596. package/dist/cjs/utils/retry.js.map +0 -1
  597. package/dist/core/DirectiveBus.d.ts +0 -88
  598. package/dist/core/DirectiveBus.d.ts.map +0 -1
  599. package/dist/core/DirectiveBus.js +0 -192
  600. package/dist/core/DirectiveBus.js.map +0 -1
  601. package/dist/providers/errorClassification.d.ts +0 -61
  602. package/dist/providers/errorClassification.d.ts.map +0 -1
  603. package/dist/providers/errorClassification.js +0 -116
  604. package/dist/providers/errorClassification.js.map +0 -1
  605. package/dist/utils/retry.d.ts +0 -67
  606. package/dist/utils/retry.d.ts.map +0 -1
  607. package/dist/utils/retry.js +0 -193
  608. package/dist/utils/retry.js.map +0 -1
  609. package/src/core/DirectiveBus.ts +0 -248
  610. package/src/providers/errorClassification.ts +0 -172
  611. package/src/utils/retry.ts +0 -274
@@ -1,778 +1,67 @@
1
1
  /**
2
- * Google Gemini AI provider implementation with retry and backup models
2
+ * Google Gemini.
3
+ *
4
+ * Thought signatures, the `functionResponse`-by-name pairing, implicit cache
5
+ * hits and the thinking levels are all in `@providerkit/core`, written against
6
+ * the REST API rather than the SDK.
7
+ *
8
+ * v3 sends a response schema alongside tools when a caller asks for both. v2
9
+ * dropped the schema in that case, from a 2024-era constraint that no longer
10
+ * holds — a sibling codebase runs the combination in production today.
3
11
  */
4
12
 
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
+ import { createGeminiProvider } from "@providerkit/core";
13
14
 
14
- import type {
15
- AiProvider,
16
- GenerateMessageInput,
17
- GenerateMessageOutput,
18
- GenerateMessageStreamChunk,
19
- AgentStructuredResponse,
20
- StructuredSchema,
21
- } from "../types";
22
- import type { ProviderCapabilities } from "../types/ai";
23
- import type { HistoryItem } from "../types/history";
24
- import { withTimeoutAndRetry, withStreamRetry, resolveRetryConfig, combineAbortSignals } from "../utils/retry";
25
- import { assertUsableCompletion } from "../utils/completion";
26
- import { tryParseJSONResponse } from "../utils/json";
27
- import { logger } from "../utils/logger";
28
- import {
29
- classifyProviderError,
30
- getErrorMessage,
31
- isBackupEligible,
32
- toProviderError,
33
- type ErrorClassificationOptions,
34
- } from "./errorClassification";
15
+ import type { ProviderCapabilities } from "../types/ai.js";
16
+ import { ProviderAdapter, type RequestConfig } from "./ProviderAdapter.js";
35
17
 
36
- /**
37
- * Configuration options for Gemini provider
38
- * Uses types from @google/genai package
39
- */
40
18
  export interface GeminiProviderOptions {
41
19
  /** Gemini API key */
42
20
  apiKey: string;
43
- /** Model to use (required) - e.g., "gemini-3.1-pro-preview" */
21
+ /** Model to use (required) e.g. "gemini-3.1-pro-preview" */
44
22
  model: string;
45
- /** Backup models to try if primary fails (default: []) */
23
+ /** Backup models to try if the primary fails (default: []) */
46
24
  backupModels?: string[];
47
- /** Default generation config - uses GenerateContentConfig from @google/genai */
48
- config?: Partial<GenerateContentConfig>;
49
- /** Retry configuration */
50
- retryConfig?: {
51
- timeout?: number;
52
- retries?: number;
53
- };
25
+ /** Any endpoint speaking the Gemini generateContent dialect. */
26
+ baseUrl?: string;
27
+ /** Request defaults sent with every call */
28
+ config?: RequestConfig;
29
+ /** Idle-stream deadline and retry budget */
30
+ retryConfig?: { timeout?: number; retries?: number };
31
+ /** Replacement `fetch`, for tests that script the wire. Replaces v2's
32
+ * injected SDK client — see {@link AnthropicProviderOptions.fetchImpl}. */
33
+ fetchImpl?: typeof fetch;
54
34
  }
55
35
 
56
- /**
57
- * Gemini-specific error classification signals ("overloaded" code plus
58
- * the "not available"/"INTERNAL" message patterns Gemini emits).
59
- */
60
- const CLASSIFICATION_OPTIONS: ErrorClassificationOptions = {
61
- overloadedCodes: ["overloaded"],
62
- overloadedMessages: ["not available", "INTERNAL"],
63
- };
64
-
65
- /**
66
- * Determines if an error should trigger backup model usage.
67
- * Derived from the normalized error classification.
68
- */
69
- const shouldUseBackupModel = (error: unknown): boolean =>
70
- isBackupEligible(classifyProviderError(error, CLASSIFICATION_OPTIONS));
71
-
72
- /**
73
- * Gemini provider implementation with backup models and retry logic
74
- */
75
- export class GeminiProvider implements AiProvider {
36
+ export class GeminiProvider extends ProviderAdapter {
76
37
  public readonly name = "gemini";
77
38
  public readonly capabilities: ProviderCapabilities = {
78
39
  supportsTools: true,
79
40
  supportsNativeJsonSchema: true,
80
41
  supportsStreaming: true,
81
42
  supportsStreamingToolCalls: true,
82
- supportsPromptCaching: false,
43
+ supportsPromptCaching: true,
83
44
  };
84
- private genAI: GoogleGenAIType;
85
- private primaryModel: string;
86
- private backupModels: string[];
87
- private config?: Partial<GenerateContentConfig>;
88
- private retryConfig: { timeout: number; retries: number };
89
45
 
90
46
  constructor(options: GeminiProviderOptions) {
91
- const { apiKey, model, backupModels = [], config, retryConfig } = options;
92
-
93
- if (!apiKey) {
94
- throw new Error("Gemini API key is required");
95
- }
96
-
97
- if (!model) {
47
+ if (!options.apiKey) throw new Error("Gemini API key is required");
48
+ if (!options.model) {
98
49
  throw new Error("Model is required. Example: 'gemini-3.1-pro-preview'");
99
50
  }
100
51
 
101
- this.genAI = new GoogleGenAI({ apiKey });
102
- this.primaryModel = model;
103
- this.backupModels = backupModels;
104
- this.config = config;
105
- this.retryConfig = resolveRetryConfig(retryConfig);
106
- }
107
-
108
- /**
109
- * Build Gemini-formatted contents from HistoryItem[] array.
110
- * Gemini uses "user"/"model" roles (not "assistant").
111
- * System messages are extracted separately for systemInstruction.
112
- * Tool results map to functionResponse parts, tool calls to functionCall parts.
113
- */
114
- private buildGeminiContents(history: HistoryItem[]): {
115
- contents: Array<{ role: string; parts: Array<Record<string, unknown>> }>;
116
- systemInstructions: string[];
117
- } {
118
- const contents: Array<{ role: string; parts: Array<Record<string, unknown>> }> = [];
119
- const systemInstructions: string[] = [];
120
-
121
- for (const item of history) {
122
- switch (item.role) {
123
- case "system":
124
- systemInstructions.push(item.content);
125
- break;
126
- case "user":
127
- contents.push({ role: "user", parts: [{ text: item.content }] });
128
- break;
129
- case "assistant":
130
- if (item.tool_calls && item.tool_calls.length > 0) {
131
- const parts: Array<Record<string, unknown>> = [];
132
- if (item.content) {
133
- parts.push({ text: item.content });
134
- }
135
- for (const tc of item.tool_calls) {
136
- parts.push({
137
- functionCall: { name: tc.name, args: tc.arguments },
138
- });
139
- }
140
- contents.push({ role: "model", parts });
141
- } else {
142
- contents.push({ role: "model", parts: [{ text: item.content || "" }] });
143
- }
144
- break;
145
- case "tool":
146
- contents.push({
147
- role: "user",
148
- parts: [
149
- {
150
- functionResponse: {
151
- name: item.name,
152
- response: typeof item.content === "object" ? item.content : { result: item.content },
153
- },
154
- },
155
- ],
156
- });
157
- break;
158
- }
159
- }
160
-
161
- return { contents, systemInstructions };
162
- }
163
-
164
- /**
165
- * Convert tool parameter schemas (JSON Schema) to Gemini's Schema format.
166
- * Gemini's FunctionDeclaration.parameters expects its own Schema type,
167
- * not raw JSON Schema. This method handles the conversion, including
168
- * edge cases like empty objects that Gemini rejects.
169
- *
170
- * @private
171
- */
172
- private convertToolParameters(parameters: unknown): Schema | undefined {
173
- if (!parameters || typeof parameters !== "object") {
174
- return undefined;
175
- }
176
- try {
177
- return this.adaptSchemaForGemini(parameters as StructuredSchema);
178
- } catch (error) {
179
- logger.warn(`[GeminiProvider] Failed to convert tool parameters, passing as-is:`, error);
180
- return parameters as Schema;
181
- }
182
- }
183
-
184
- /**
185
- * Safely extract text from a Gemini response or chunk.
186
- * Bypasses the SDK's `.text` getter entirely to avoid warnings about
187
- * non-text parts (e.g., "thoughtSignature") in the response.
188
- * Manually concatenates only text parts from candidates.
189
- *
190
- * @private
191
- */
192
- private safeExtractText(responseOrChunk: { text?: string; candidates?: Array<{ content?: { parts?: Array<{ text?: string; thought?: boolean; functionCall?: unknown }> } }> }): string {
193
- // Always extract text parts manually to avoid SDK warnings about
194
- // non-text parts like "thoughtSignature" in the response.
195
- const parts = responseOrChunk.candidates?.[0]?.content?.parts;
196
- if (parts) {
197
- // Exclude reasoning parts (thought: true) — with includeThoughts enabled
198
- // they carry text but must never leak into the user-facing message.
199
- return parts
200
- .filter((p) => p.text != null && !p.thought)
201
- .map((p) => p.text)
202
- .join("");
203
- }
204
- // Fallback: try the .text getter if no candidates structure exists
205
- try {
206
- return responseOrChunk.text || "";
207
- } catch {
208
- return "";
209
- }
210
- }
211
-
212
- /**
213
- * Build Gemini function declarations from framework tool definitions.
214
- * Converts JSON Schema parameters to Gemini's Schema format.
215
- *
216
- * @private
217
- */
218
- private buildFunctionDeclarations(
219
- tools: Array<{ id: string; name?: string; description?: string; parameters?: unknown }>
220
- ): FunctionDeclaration[] {
221
- return tools.map((tool) => ({
222
- name: tool.name || tool.id,
223
- description: tool.description || "",
224
- parameters: this.convertToolParameters(tool.parameters),
225
- }));
226
- }
227
-
228
- /**
229
- * Adapt common schema format to Gemini's specific requirements.
230
- * Gemini has strict validation:
231
- * - OBJECT types MUST have non-empty properties
232
- * - Empty objects cause 400 Bad Request errors
233
- * - Uses Gemini's Schema type with Type enums
234
- *
235
- * @private
236
- */
237
- private adaptSchemaForGemini(schema: StructuredSchema): Schema {
238
- const geminiSchema: Schema = {};
239
-
240
- // Convert type
241
- if (schema.type) {
242
- if (Array.isArray(schema.type)) {
243
- // For now, take the first type (Gemini doesn't support union types the same way)
244
- geminiSchema.type = this.mapToGeminiType(schema.type[0]);
245
- } else {
246
- geminiSchema.type = this.mapToGeminiType(schema.type);
247
- }
248
- }
249
-
250
- // Handle description
251
- if (schema.description) {
252
- geminiSchema.description = schema.description;
253
- }
254
-
255
- // Handle nullable
256
- if (schema.nullable !== undefined) {
257
- geminiSchema.nullable = schema.nullable;
258
- }
259
-
260
- // Handle enum
261
- if (schema.enum) {
262
- geminiSchema.enum = schema.enum as string[];
263
- }
264
-
265
- // Handle object properties - Gemini requires non-empty properties for OBJECT type
266
- if (
267
- geminiSchema.type === Type.OBJECT ||
268
- schema.type === "object" ||
269
- (Array.isArray(schema.type) && schema.type.includes("object"))
270
- ) {
271
- if (!schema.properties || Object.keys(schema.properties).length === 0) {
272
- logger.warn(
273
- "[GeminiProvider] Gemini requires OBJECT types to have non-empty properties. Converting empty object to STRING."
274
- );
275
- geminiSchema.type = Type.STRING;
276
- return geminiSchema;
277
- }
278
-
279
- // Recursively convert nested properties
280
- geminiSchema.properties = {};
281
- for (const [key, value] of Object.entries(schema.properties)) {
282
- geminiSchema.properties[key] = this.adaptSchemaForGemini(value);
283
- }
284
-
285
- // Handle required fields
286
- if (schema.required && schema.required.length > 0) {
287
- geminiSchema.required = schema.required;
288
- }
289
- }
290
-
291
- // Handle array items
292
- if (
293
- geminiSchema.type === Type.ARRAY ||
294
- schema.type === "array" ||
295
- (Array.isArray(schema.type) && schema.type.includes("array"))
296
- ) {
297
- if (schema.items) {
298
- geminiSchema.items = this.adaptSchemaForGemini(schema.items);
299
- }
300
- }
301
-
302
- return geminiSchema;
303
- }
304
-
305
- /**
306
- * Map common JSON Schema type strings to Gemini's Type enum
307
- * @private
308
- */
309
- private mapToGeminiType(type: string): Type {
310
- switch (type.toLowerCase()) {
311
- case "string":
312
- return Type.STRING;
313
- case "number":
314
- return Type.NUMBER;
315
- case "integer":
316
- return Type.INTEGER;
317
- case "boolean":
318
- return Type.BOOLEAN;
319
- case "array":
320
- return Type.ARRAY;
321
- case "object":
322
- return Type.OBJECT;
323
- default:
324
- logger.warn(
325
- `[GeminiProvider] Unknown type "${type}", defaulting to STRING`
326
- );
327
- return Type.STRING;
328
- }
329
- }
330
-
331
- async generateMessage<
332
- TContext = unknown,
333
- TStructured = AgentStructuredResponse
334
- >(
335
- input: GenerateMessageInput<TContext>
336
- ): Promise<GenerateMessageOutput<TStructured>> {
337
- return this.generateWithBackup<TContext, TStructured>(input);
338
- }
339
-
340
- async *generateMessageStream<
341
- TContext = unknown,
342
- TStructured = AgentStructuredResponse
343
- >(
344
- input: GenerateMessageInput<TContext>
345
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
346
- yield* this.generateStreamWithBackup<TContext, TStructured>(input);
347
- }
348
-
349
- private async generateWithBackup<
350
- TContext = unknown,
351
- TStructured = AgentStructuredResponse
352
- >(
353
- input: GenerateMessageInput<TContext>
354
- ): Promise<GenerateMessageOutput<TStructured>> {
355
- // Try primary model first
356
- try {
357
- return await this.generateWithModel(this.primaryModel, input);
358
- } catch (primaryError: unknown) {
359
- const primaryErrMsg = getErrorMessage(primaryError);
360
- logger.warn(
361
- `[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
362
- );
363
-
364
- if (!shouldUseBackupModel(primaryError)) {
365
- throw toProviderError(primaryError, this.name, CLASSIFICATION_OPTIONS);
366
- }
367
-
368
- logger.debug(`[GEMINI] Trying backup models`);
369
-
370
- let lastBackupError: unknown = primaryError;
371
-
372
- for (let i = 0; i < this.backupModels.length; i++) {
373
- const backupModel = this.backupModels[i];
374
- logger.debug(
375
- `[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
376
- }: ${backupModel}`
377
- );
378
-
379
- try {
380
- const result = await this.generateWithModel(backupModel, input);
381
- logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
382
- return result as GenerateMessageOutput<TStructured>;
383
- } catch (backupError: unknown) {
384
- const backupErrMsg = getErrorMessage(backupError);
385
- logger.warn(
386
- `[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
387
- );
388
- lastBackupError = backupError;
389
-
390
- if (
391
- !shouldUseBackupModel(backupError) &&
392
- i < this.backupModels.length - 1
393
- ) {
394
- logger.debug(
395
- `[GEMINI] Backup model error doesn't qualify for further attempts`
396
- );
397
- break;
398
- }
399
- }
400
- }
401
-
402
- const lastBackupErrMsg = getErrorMessage(lastBackupError);
403
- logger.error(
404
- `[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
405
- );
406
- throw toProviderError(lastBackupError, this.name, CLASSIFICATION_OPTIONS);
407
- }
408
- }
409
-
410
- private async generateWithModel<
411
- TContext = unknown,
412
- TStructured = AgentStructuredResponse
413
- >(
414
- model: string,
415
- input: GenerateMessageInput<TContext>
416
- ): Promise<GenerateMessageOutput<TStructured>> {
417
- const operation = async (signal: AbortSignal): Promise<GenerateMessageOutput> => {
418
- // Schema-required: configure response schema
419
- const configOverride: Partial<GenerateContentConfig> = { ...this.config };
420
-
421
- // Handle tools and JSON schema - Gemini doesn't support both simultaneously
422
- const hasTools = input.tools && input.tools.length > 0;
423
- const hasJsonSchema = input.parameters?.jsonSchema;
424
-
425
- if (hasTools && hasJsonSchema) {
426
- logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
427
- }
428
-
429
- if (hasTools) {
430
- const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
431
- logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for model ${model}:`, toolNames);
432
- const functionDeclarations = this.buildFunctionDeclarations(input.tools!);
433
- configOverride.tools = [{ functionDeclarations }];
434
-
435
- } else if (hasJsonSchema) {
436
- // Only set JSON schema if no tools are present
437
- configOverride.responseMimeType = "application/json";
438
- // Adapt common schema format to Gemini's specific requirements
439
- configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
440
- input.parameters.jsonSchema
441
- ) : {};
442
- }
443
-
444
- let response: GenerateContentResponse;
445
- try {
446
- // Build contents from history
447
- const { contents: historyContents, systemInstructions } = this.buildGeminiContents(input.history);
448
-
449
- // Append the current prompt as the final user content
450
- historyContents.push({ role: "user", parts: [{ text: input.prompt }] });
451
-
452
- // Set system instruction from history if present
453
- if (systemInstructions.length > 0) {
454
- const existingSystem = configOverride.systemInstruction;
455
- if (typeof existingSystem === "string") {
456
- configOverride.systemInstruction = `${existingSystem}\n\n${systemInstructions.join("\n\n")}`;
457
- } else {
458
- configOverride.systemInstruction = systemInstructions.join("\n\n");
459
- }
460
- }
461
-
462
- const reqSignal = combineAbortSignals(input.signal, signal);
463
- response = await this.genAI.models.generateContent({
464
- model,
465
- contents: historyContents,
466
- config: {
467
- ...configOverride,
468
- ...(reqSignal ? { abortSignal: reqSignal } : {}),
469
- },
470
- });
471
- } catch (error: unknown) {
472
- logger.error(`[GeminiProvider] API call failed:`, error);
473
- throw error;
474
- }
475
-
476
- // Extract tool calls from response first
477
- const toolCalls: Array<{
478
- toolName: string;
479
- arguments: Record<string, unknown>;
480
- }> = [];
481
-
482
- // Check for function calls in the response content
483
- if (response.candidates && response.candidates[0]?.content?.parts) {
484
- for (const part of response.candidates[0].content.parts) {
485
- if (part.functionCall) {
486
- toolCalls.push({
487
- toolName: part.functionCall.name || "",
488
- arguments: (part.functionCall.args as Record<string, unknown>) || {},
489
- });
490
- }
491
- }
492
- }
493
-
494
- // Safely extract text — avoids SDK warning about non-text parts
495
- const message = this.safeExtractText(response);
496
-
497
- // Debug logging for response structure
498
- if (!message && toolCalls.length === 0) {
499
- logger.debug(`[GeminiProvider] Debug - Response structure:`, {
500
- candidatesCount: response.candidates?.length || 0,
501
- firstCandidateParts: response.candidates?.[0]?.content?.parts?.length || 0,
502
- });
503
- }
504
-
505
- // Only throw error if we have no text AND no function calls
506
- if (!message && toolCalls.length === 0) {
507
- logger.error(`[GeminiProvider] Empty response - no text or function calls`);
508
- logger.error(`[GeminiProvider] Response candidates:`, response.candidates);
509
- throw new Error("No response from Gemini");
510
- }
511
-
512
- // Log when we have function calls but no text (this is normal)
513
- if (toolCalls.length > 0 && !message) {
514
- logger.debug(`[GeminiProvider] Function calls detected without text message:`, toolCalls.map(tc => tc.toolName));
515
- }
516
-
517
- // Parse JSON response if schema was provided
518
- let structured: AgentStructuredResponse | undefined;
519
- if (input.parameters?.jsonSchema) {
520
- const parsed = tryParseJSONResponse(message);
521
- if (parsed) {
522
- structured = parsed as AgentStructuredResponse;
523
- } else {
524
- logger.warn("[GeminiProvider] Failed to parse JSON response, treating as plain text");
525
- }
526
- }
527
-
528
- // If tools were used, include them in structured response
529
- if (toolCalls.length > 0) {
530
- structured = {
531
- message: structured?.message || message,
532
- toolCalls,
533
- ...structured,
534
- } as AgentStructuredResponse;
535
- }
536
-
537
- // A parsed-but-blank message with no tool calls is as empty as no text;
538
- // the shared guard throws so withTimeoutAndRetry retries instead of
539
- // returning {"message":""}.
540
- assertUsableCompletion(structured, message, toolCalls.length, "Gemini");
541
-
542
- return {
543
- message,
544
- metadata: {
545
- model,
546
- tokensUsed: response.usageMetadata?.totalTokenCount,
547
- promptTokens: response.usageMetadata?.promptTokenCount,
548
- completionTokens: response.usageMetadata?.candidatesTokenCount,
549
- },
550
- structured,
551
- };
552
- };
553
-
554
- return withTimeoutAndRetry(
555
- operation,
556
- this.retryConfig.timeout,
557
- this.retryConfig.retries,
558
- `Gemini ${model}`
559
- ) as Promise<GenerateMessageOutput<TStructured>>;
560
- }
561
-
562
- private async *generateStreamWithBackup<
563
- TContext = unknown,
564
- TStructured = AgentStructuredResponse
565
- >(
566
- input: GenerateMessageInput<TContext>
567
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
568
- // Try primary model first
569
- try {
570
- yield* withStreamRetry(
571
- (signal) => this.generateStreamWithModel(this.primaryModel, input, signal),
572
- { maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `Gemini ${this.primaryModel} stream` }
573
- );
574
- } catch (primaryError: unknown) {
575
- const primaryErrMsg = getErrorMessage(primaryError);
576
- logger.warn(
577
- `[GEMINI] Primary model ${this.primaryModel} failed: ${primaryErrMsg}`
578
- );
579
-
580
- if (!shouldUseBackupModel(primaryError)) {
581
- throw toProviderError(primaryError, this.name, CLASSIFICATION_OPTIONS);
582
- }
583
-
584
- logger.debug(`[GEMINI] Trying backup models for streaming`);
585
-
586
- let lastBackupError: unknown = primaryError;
587
-
588
- for (let i = 0; i < this.backupModels.length; i++) {
589
- const backupModel = this.backupModels[i];
590
- logger.debug(
591
- `[GEMINI] Trying backup model ${i + 1}/${this.backupModels.length
592
- }: ${backupModel}`
593
- );
594
-
595
- try {
596
- yield* withStreamRetry(
597
- (signal) => this.generateStreamWithModel(backupModel, input, signal),
598
- { maxRetries: this.retryConfig.retries, firstChunkTimeoutMs: this.retryConfig.timeout, operationName: `Gemini ${backupModel} stream` }
599
- );
600
- logger.debug(`[GEMINI] Backup model ${backupModel} succeeded`);
601
- return;
602
- } catch (backupError: unknown) {
603
- const backupErrMsg = getErrorMessage(backupError);
604
- logger.warn(
605
- `[GEMINI] Backup model ${backupModel} failed: ${backupErrMsg}`
606
- );
607
- lastBackupError = backupError;
608
-
609
- if (
610
- !shouldUseBackupModel(backupError) &&
611
- i < this.backupModels.length - 1
612
- ) {
613
- logger.debug(
614
- `[GEMINI] Backup model error doesn't qualify for further attempts`
615
- );
616
- break;
617
- }
618
- }
619
- }
620
-
621
- const lastBackupErrMsg = getErrorMessage(lastBackupError);
622
- logger.error(
623
- `[GEMINI] All models failed. Primary: ${primaryErrMsg}, Last backup: ${lastBackupErrMsg}`
624
- );
625
- throw toProviderError(lastBackupError, this.name, CLASSIFICATION_OPTIONS);
626
- }
627
- }
628
-
629
- private async *generateStreamWithModel<
630
- TContext = unknown,
631
- TStructured = AgentStructuredResponse
632
- >(
633
- model: string,
634
- input: GenerateMessageInput<TContext>,
635
- attemptSignal?: AbortSignal
636
- ): AsyncGenerator<GenerateMessageStreamChunk<TStructured>> {
637
- // Caller cancellation + the retry helper's per-attempt deadline, as one.
638
- const reqSignal = combineAbortSignals(input.signal, attemptSignal);
639
- // Streaming: request JSON if schema provided
640
- const configOverride: Partial<GenerateContentConfig> = { ...this.config };
641
-
642
- // Handle tools and JSON schema - Gemini doesn't support both simultaneously
643
- const hasTools = input.tools && input.tools.length > 0;
644
- const hasJsonSchema = input.parameters?.jsonSchema;
645
-
646
- if (hasTools && hasJsonSchema) {
647
- logger.debug(`[GeminiProvider] Both tools and JSON schema provided. Prioritizing function calling - JSON schema will be ignored.`);
648
- }
649
-
650
- if (hasTools) {
651
- const toolNames = input.tools?.map((tool) => tool.name || tool.id) || [];
652
- logger.debug(`[GeminiProvider] Configuring ${toolNames.length} tools for streaming:`, toolNames);
653
- const functionDeclarations = this.buildFunctionDeclarations(input.tools!);
654
- configOverride.tools = [{ functionDeclarations }];
655
-
656
- } else if (hasJsonSchema) {
657
- // Only set JSON schema if no tools are present
658
- configOverride.responseMimeType = "application/json";
659
- // Adapt common schema format to Gemini's specific requirements
660
- configOverride.responseSchema = input.parameters ? this.adaptSchemaForGemini(
661
- input.parameters.jsonSchema
662
- ) : {};
663
- }
664
-
665
- let stream;
666
- try {
667
- // Build contents from history
668
- const { contents: historyContents, systemInstructions } = this.buildGeminiContents(input.history);
669
-
670
- // Append the current prompt as the final user content
671
- historyContents.push({ role: "user", parts: [{ text: input.prompt }] });
672
-
673
- // Set system instruction from history if present
674
- if (systemInstructions.length > 0) {
675
- const existingSystem = configOverride.systemInstruction;
676
- if (typeof existingSystem === "string") {
677
- configOverride.systemInstruction = `${existingSystem}\n\n${systemInstructions.join("\n\n")}`;
678
- } else {
679
- configOverride.systemInstruction = systemInstructions.join("\n\n");
680
- }
681
- }
682
-
683
- stream = await this.genAI.models.generateContentStream({
684
- model,
685
- contents: historyContents,
686
- config: {
687
- ...configOverride,
688
- ...(reqSignal ? { abortSignal: reqSignal } : {}),
689
- },
690
- });
691
- } catch (error: unknown) {
692
- logger.error(`[GeminiProvider] Streaming API call failed:`, error);
693
- throw error;
694
- }
695
-
696
- let accumulated = "";
697
- let promptTokenCount = 0;
698
- let candidatesTokenCount = 0;
699
- let totalTokenCount = 0;
700
- const toolCalls: Array<{
701
- toolName: string;
702
- arguments: Record<string, unknown>;
703
- }> = [];
704
-
705
- for await (const chunk of stream) {
706
- if (reqSignal?.aborted) break;
707
-
708
- // Safely extract text — chunk.text can throw when chunk has only function calls
709
- const delta = this.safeExtractText(chunk);
710
-
711
- // Extract tool calls from chunk
712
- if (chunk.candidates && chunk.candidates[0]?.content?.parts) {
713
- for (const part of chunk.candidates[0].content.parts) {
714
- if (part.functionCall) {
715
- toolCalls.push({
716
- toolName: part.functionCall.name || "",
717
- arguments: (part.functionCall.args as Record<string, unknown>) || {},
718
- });
719
- }
720
- }
721
- }
722
-
723
- if (delta) {
724
- accumulated += delta;
725
- yield {
726
- delta,
727
- accumulated,
728
- done: false,
729
- };
730
- }
731
-
732
- // Update token counts if available
733
- if (chunk.usageMetadata) {
734
- promptTokenCount = chunk.usageMetadata.promptTokenCount || 0;
735
- candidatesTokenCount = chunk.usageMetadata.candidatesTokenCount || 0;
736
- totalTokenCount = chunk.usageMetadata.totalTokenCount || 0;
737
- }
738
- }
739
-
740
- // Parse JSON response if schema was provided
741
- let structured: AgentStructuredResponse | undefined;
742
- if (input.parameters?.jsonSchema && accumulated) {
743
- const parsed = tryParseJSONResponse(accumulated);
744
- if (parsed) {
745
- structured = parsed as AgentStructuredResponse;
746
- } else {
747
- logger.warn("[GeminiProvider] Failed to parse JSON response in stream, treating as plain text");
748
- }
749
- }
750
-
751
- // Include tool calls in structured response (even without JSON schema)
752
- if (toolCalls.length > 0) {
753
- structured = {
754
- message: structured?.message || accumulated,
755
- ...structured,
756
- toolCalls,
757
- } as AgentStructuredResponse;
758
- }
759
-
760
- // Empty-completion guard — same definition as the non-streaming path, so the
761
- // stream retries / falls back to backup instead of emitting an empty message.
762
- assertUsableCompletion(structured, accumulated, toolCalls.length, "Gemini");
763
-
764
- // Yield final chunk
765
- yield {
766
- delta: "",
767
- accumulated,
768
- done: true,
769
- metadata: {
770
- model,
771
- tokensUsed: totalTokenCount,
772
- promptTokens: promptTokenCount,
773
- completionTokens: candidatesTokenCount,
774
- },
775
- structured: structured as TStructured | undefined,
776
- };
52
+ super({
53
+ provider: createGeminiProvider({
54
+ apiKey: options.apiKey,
55
+ model: options.model,
56
+ id: "gemini",
57
+ ...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
58
+ ...(options.config?.maxTokens ? { maxTokens: options.config.maxTokens } : {}),
59
+ ...(options.fetchImpl ? { fetchImpl: options.fetchImpl } : {}),
60
+ }),
61
+ model: options.model,
62
+ ...(options.config ? { defaults: options.config } : {}),
63
+ ...(options.backupModels ? { backupModels: options.backupModels } : {}),
64
+ ...(options.retryConfig ? { retryConfig: options.retryConfig } : {}),
65
+ });
777
66
  }
778
67
  }