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