@calliopelabs/cli 0.8.20 → 2.0.2

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 (402) hide show
  1. package/dist/agents/agent-config-loader.d.ts +60 -0
  2. package/dist/agents/agent-config-loader.d.ts.map +1 -0
  3. package/dist/agents/agent-config-loader.js +402 -0
  4. package/dist/agents/agent-config-loader.js.map +1 -0
  5. package/dist/agents/agent-config-presets.d.ts +10 -0
  6. package/dist/agents/agent-config-presets.d.ts.map +1 -0
  7. package/dist/agents/agent-config-presets.js +940 -0
  8. package/dist/agents/agent-config-presets.js.map +1 -0
  9. package/dist/agents/agent-config-types.d.ts +145 -0
  10. package/dist/agents/agent-config-types.d.ts.map +1 -0
  11. package/dist/agents/agent-config-types.js +12 -0
  12. package/dist/agents/agent-config-types.js.map +1 -0
  13. package/dist/{agterm → agents}/agent-detection.d.ts +1 -1
  14. package/dist/{agterm → agents}/agent-detection.d.ts.map +1 -1
  15. package/dist/{agterm → agents}/agent-detection.js +21 -5
  16. package/dist/agents/agent-detection.js.map +1 -0
  17. package/dist/agents/aggregator.d.ts +19 -0
  18. package/dist/agents/aggregator.d.ts.map +1 -0
  19. package/dist/agents/aggregator.js +141 -0
  20. package/dist/agents/aggregator.js.map +1 -0
  21. package/dist/{agterm → agents}/cli-backend.d.ts +1 -1
  22. package/dist/{agterm → agents}/cli-backend.d.ts.map +1 -1
  23. package/dist/{agterm → agents}/cli-backend.js +90 -12
  24. package/dist/agents/cli-backend.js.map +1 -0
  25. package/dist/agents/council-types.d.ts +113 -0
  26. package/dist/agents/council-types.d.ts.map +1 -0
  27. package/dist/agents/council-types.js +81 -0
  28. package/dist/agents/council-types.js.map +1 -0
  29. package/dist/agents/council.d.ts +107 -0
  30. package/dist/agents/council.d.ts.map +1 -0
  31. package/dist/agents/council.js +586 -0
  32. package/dist/agents/council.js.map +1 -0
  33. package/dist/agents/decomposer.d.ts +33 -0
  34. package/dist/agents/decomposer.d.ts.map +1 -0
  35. package/dist/agents/decomposer.js +138 -0
  36. package/dist/agents/decomposer.js.map +1 -0
  37. package/dist/agents/dynamic-tools.d.ts +52 -0
  38. package/dist/agents/dynamic-tools.d.ts.map +1 -0
  39. package/dist/agents/dynamic-tools.js +395 -0
  40. package/dist/agents/dynamic-tools.js.map +1 -0
  41. package/dist/agents/index.d.ts +29 -0
  42. package/dist/agents/index.d.ts.map +1 -0
  43. package/dist/agents/index.js +29 -0
  44. package/dist/agents/index.js.map +1 -0
  45. package/dist/agents/installer.d.ts +39 -0
  46. package/dist/agents/installer.d.ts.map +1 -0
  47. package/dist/agents/installer.js +205 -0
  48. package/dist/agents/installer.js.map +1 -0
  49. package/dist/{agterm → agents}/orchestrator.d.ts +7 -2
  50. package/dist/agents/orchestrator.d.ts.map +1 -0
  51. package/dist/{agterm → agents}/orchestrator.js +22 -2
  52. package/dist/agents/orchestrator.js.map +1 -0
  53. package/dist/agents/sdk-backend.d.ts +63 -0
  54. package/dist/agents/sdk-backend.d.ts.map +1 -0
  55. package/dist/agents/sdk-backend.js +489 -0
  56. package/dist/agents/sdk-backend.js.map +1 -0
  57. package/dist/agents/swarm-types.d.ts +83 -0
  58. package/dist/agents/swarm-types.d.ts.map +1 -0
  59. package/dist/agents/swarm-types.js +20 -0
  60. package/dist/agents/swarm-types.js.map +1 -0
  61. package/dist/agents/swarm.d.ts +74 -0
  62. package/dist/agents/swarm.d.ts.map +1 -0
  63. package/dist/agents/swarm.js +307 -0
  64. package/dist/agents/swarm.js.map +1 -0
  65. package/dist/{agterm → agents}/tools.d.ts +7 -5
  66. package/dist/agents/tools.d.ts.map +1 -0
  67. package/dist/agents/tools.js +776 -0
  68. package/dist/agents/tools.js.map +1 -0
  69. package/dist/{agterm → agents}/types.d.ts +14 -2
  70. package/dist/agents/types.d.ts.map +1 -0
  71. package/dist/{agterm → agents}/types.js +2 -2
  72. package/dist/agents/types.js.map +1 -0
  73. package/dist/api-server.d.ts +26 -0
  74. package/dist/api-server.d.ts.map +1 -0
  75. package/dist/api-server.js +230 -0
  76. package/dist/api-server.js.map +1 -0
  77. package/dist/auto-checkpoint.d.ts +35 -0
  78. package/dist/auto-checkpoint.d.ts.map +1 -0
  79. package/dist/auto-checkpoint.js +143 -0
  80. package/dist/auto-checkpoint.js.map +1 -0
  81. package/dist/auto-compressor.d.ts +44 -0
  82. package/dist/auto-compressor.d.ts.map +1 -0
  83. package/dist/auto-compressor.js +145 -0
  84. package/dist/auto-compressor.js.map +1 -0
  85. package/dist/background-jobs.d.ts +45 -0
  86. package/dist/background-jobs.d.ts.map +1 -0
  87. package/dist/background-jobs.js +122 -0
  88. package/dist/background-jobs.js.map +1 -0
  89. package/dist/bin.d.ts +6 -2
  90. package/dist/bin.d.ts.map +1 -1
  91. package/dist/bin.js +127 -24
  92. package/dist/bin.js.map +1 -1
  93. package/dist/checkpoint.d.ts +49 -0
  94. package/dist/checkpoint.d.ts.map +1 -0
  95. package/dist/checkpoint.js +219 -0
  96. package/dist/checkpoint.js.map +1 -0
  97. package/dist/circuit-breaker/breaker.d.ts +80 -0
  98. package/dist/circuit-breaker/breaker.d.ts.map +1 -0
  99. package/dist/circuit-breaker/breaker.js +408 -0
  100. package/dist/circuit-breaker/breaker.js.map +1 -0
  101. package/dist/circuit-breaker/defaults.d.ts +8 -0
  102. package/dist/circuit-breaker/defaults.d.ts.map +1 -0
  103. package/dist/circuit-breaker/defaults.js +35 -0
  104. package/dist/circuit-breaker/defaults.js.map +1 -0
  105. package/dist/circuit-breaker/index.d.ts +9 -0
  106. package/dist/circuit-breaker/index.d.ts.map +1 -0
  107. package/dist/circuit-breaker/index.js +8 -0
  108. package/dist/circuit-breaker/index.js.map +1 -0
  109. package/dist/circuit-breaker/types.d.ts +77 -0
  110. package/dist/circuit-breaker/types.d.ts.map +1 -0
  111. package/dist/circuit-breaker/types.js +8 -0
  112. package/dist/circuit-breaker/types.js.map +1 -0
  113. package/dist/circuit-breaker.d.ts +8 -0
  114. package/dist/circuit-breaker.d.ts.map +1 -0
  115. package/dist/circuit-breaker.js +7 -0
  116. package/dist/circuit-breaker.js.map +1 -0
  117. package/dist/cli/agent.d.ts +9 -0
  118. package/dist/cli/agent.d.ts.map +1 -0
  119. package/dist/cli/agent.js +262 -0
  120. package/dist/cli/agent.js.map +1 -0
  121. package/dist/cli/commands.d.ts +12 -0
  122. package/dist/cli/commands.d.ts.map +1 -0
  123. package/dist/{cli.js → cli/commands.js} +285 -422
  124. package/dist/cli/commands.js.map +1 -0
  125. package/dist/cli/index.d.ts +8 -0
  126. package/dist/cli/index.d.ts.map +1 -0
  127. package/dist/cli/index.js +222 -0
  128. package/dist/cli/index.js.map +1 -0
  129. package/dist/cli/types.d.ts +30 -0
  130. package/dist/cli/types.d.ts.map +1 -0
  131. package/dist/cli/types.js +20 -0
  132. package/dist/cli/types.js.map +1 -0
  133. package/dist/companions.d.ts +54 -0
  134. package/dist/companions.d.ts.map +1 -0
  135. package/dist/companions.js +440 -0
  136. package/dist/companions.js.map +1 -0
  137. package/dist/config.d.ts +23 -1
  138. package/dist/config.d.ts.map +1 -1
  139. package/dist/config.js +95 -22
  140. package/dist/config.js.map +1 -1
  141. package/dist/diff.d.ts +27 -0
  142. package/dist/diff.d.ts.map +1 -1
  143. package/dist/diff.js +415 -10
  144. package/dist/diff.js.map +1 -1
  145. package/dist/errors.d.ts.map +1 -1
  146. package/dist/errors.js +20 -11
  147. package/dist/errors.js.map +1 -1
  148. package/dist/git-status.d.ts +23 -0
  149. package/dist/git-status.d.ts.map +1 -0
  150. package/dist/git-status.js +92 -0
  151. package/dist/git-status.js.map +1 -0
  152. package/dist/headless.d.ts +25 -0
  153. package/dist/headless.d.ts.map +1 -0
  154. package/dist/headless.js +182 -0
  155. package/dist/headless.js.map +1 -0
  156. package/dist/hud/api.d.ts +35 -0
  157. package/dist/hud/api.d.ts.map +1 -0
  158. package/dist/hud/api.js +448 -0
  159. package/dist/hud/api.js.map +1 -0
  160. package/dist/hud/palettes.d.ts +9 -0
  161. package/dist/hud/palettes.d.ts.map +1 -0
  162. package/dist/hud/palettes.js +280 -0
  163. package/dist/hud/palettes.js.map +1 -0
  164. package/dist/hud/skins.d.ts +12 -0
  165. package/dist/hud/skins.d.ts.map +1 -0
  166. package/dist/hud/skins.js +365 -0
  167. package/dist/hud/skins.js.map +1 -0
  168. package/dist/hud/theme-packs/api.d.ts +51 -0
  169. package/dist/hud/theme-packs/api.d.ts.map +1 -0
  170. package/dist/hud/theme-packs/api.js +145 -0
  171. package/dist/hud/theme-packs/api.js.map +1 -0
  172. package/dist/hud/theme-packs/index.d.ts +18 -0
  173. package/dist/hud/theme-packs/index.d.ts.map +1 -0
  174. package/dist/hud/theme-packs/index.js +38 -0
  175. package/dist/hud/theme-packs/index.js.map +1 -0
  176. package/dist/hud/theme-packs/types.d.ts +29 -0
  177. package/dist/hud/theme-packs/types.d.ts.map +1 -0
  178. package/dist/hud/theme-packs/types.js +9 -0
  179. package/dist/hud/theme-packs/types.js.map +1 -0
  180. package/dist/hud/types.d.ts +182 -0
  181. package/dist/hud/types.d.ts.map +1 -0
  182. package/dist/hud/types.js +7 -0
  183. package/dist/hud/types.js.map +1 -0
  184. package/dist/idle-eviction.d.ts +34 -0
  185. package/dist/idle-eviction.d.ts.map +1 -0
  186. package/dist/idle-eviction.js +78 -0
  187. package/dist/idle-eviction.js.map +1 -0
  188. package/dist/index.d.ts +9 -3
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +9 -3
  191. package/dist/index.js.map +1 -1
  192. package/dist/iteration-ledger.d.ts +105 -0
  193. package/dist/iteration-ledger.d.ts.map +1 -0
  194. package/dist/iteration-ledger.js +237 -0
  195. package/dist/iteration-ledger.js.map +1 -0
  196. package/dist/markdown.d.ts.map +1 -1
  197. package/dist/markdown.js +1 -27
  198. package/dist/markdown.js.map +1 -1
  199. package/dist/mcp.d.ts +35 -0
  200. package/dist/mcp.d.ts.map +1 -1
  201. package/dist/mcp.js +291 -7
  202. package/dist/mcp.js.map +1 -1
  203. package/dist/memory.d.ts.map +1 -1
  204. package/dist/memory.js +12 -2
  205. package/dist/memory.js.map +1 -1
  206. package/dist/model-detection.d.ts +5 -0
  207. package/dist/model-detection.d.ts.map +1 -1
  208. package/dist/model-detection.js +278 -10
  209. package/dist/model-detection.js.map +1 -1
  210. package/dist/model-router.d.ts.map +1 -1
  211. package/dist/model-router.js +33 -11
  212. package/dist/model-router.js.map +1 -1
  213. package/dist/plugins.d.ts +8 -0
  214. package/dist/plugins.d.ts.map +1 -1
  215. package/dist/plugins.js +97 -6
  216. package/dist/plugins.js.map +1 -1
  217. package/dist/providers/anthropic.d.ts +10 -0
  218. package/dist/providers/anthropic.d.ts.map +1 -0
  219. package/dist/providers/anthropic.js +221 -0
  220. package/dist/providers/anthropic.js.map +1 -0
  221. package/dist/providers/bedrock.d.ts +17 -0
  222. package/dist/providers/bedrock.d.ts.map +1 -0
  223. package/dist/providers/bedrock.js +574 -0
  224. package/dist/providers/bedrock.js.map +1 -0
  225. package/dist/providers/compat.d.ts +13 -0
  226. package/dist/providers/compat.d.ts.map +1 -0
  227. package/dist/providers/compat.js +202 -0
  228. package/dist/providers/compat.js.map +1 -0
  229. package/dist/providers/google.d.ts +10 -0
  230. package/dist/providers/google.d.ts.map +1 -0
  231. package/dist/providers/google.js +203 -0
  232. package/dist/providers/google.js.map +1 -0
  233. package/dist/providers/index.d.ts +23 -0
  234. package/dist/providers/index.d.ts.map +1 -0
  235. package/dist/providers/index.js +145 -0
  236. package/dist/providers/index.js.map +1 -0
  237. package/dist/providers/ollama.d.ts +17 -0
  238. package/dist/providers/ollama.d.ts.map +1 -0
  239. package/dist/providers/ollama.js +289 -0
  240. package/dist/providers/ollama.js.map +1 -0
  241. package/dist/providers/openai.d.ts +121 -0
  242. package/dist/providers/openai.d.ts.map +1 -0
  243. package/dist/providers/openai.js +485 -0
  244. package/dist/providers/openai.js.map +1 -0
  245. package/dist/providers/types.d.ts +63 -0
  246. package/dist/providers/types.d.ts.map +1 -0
  247. package/dist/providers/types.js +164 -0
  248. package/dist/providers/types.js.map +1 -0
  249. package/dist/sandbox-native.d.ts +59 -0
  250. package/dist/sandbox-native.d.ts.map +1 -0
  251. package/dist/sandbox-native.js +292 -0
  252. package/dist/sandbox-native.js.map +1 -0
  253. package/dist/sandbox.d.ts +2 -2
  254. package/dist/sandbox.d.ts.map +1 -1
  255. package/dist/sandbox.js +59 -13
  256. package/dist/sandbox.js.map +1 -1
  257. package/dist/scope.d.ts +3 -1
  258. package/dist/scope.d.ts.map +1 -1
  259. package/dist/scope.js +13 -1
  260. package/dist/scope.js.map +1 -1
  261. package/dist/session-timeout.d.ts +31 -0
  262. package/dist/session-timeout.d.ts.map +1 -0
  263. package/dist/session-timeout.js +100 -0
  264. package/dist/session-timeout.js.map +1 -0
  265. package/dist/setup.d.ts.map +1 -1
  266. package/dist/setup.js +29 -17
  267. package/dist/setup.js.map +1 -1
  268. package/dist/smart-router.d.ts +73 -0
  269. package/dist/smart-router.d.ts.map +1 -0
  270. package/dist/smart-router.js +332 -0
  271. package/dist/smart-router.js.map +1 -0
  272. package/dist/storage.d.ts +19 -0
  273. package/dist/storage.d.ts.map +1 -1
  274. package/dist/storage.js +164 -1
  275. package/dist/storage.js.map +1 -1
  276. package/dist/streaming.d.ts +4 -0
  277. package/dist/streaming.d.ts.map +1 -1
  278. package/dist/streaming.js +12 -0
  279. package/dist/streaming.js.map +1 -1
  280. package/dist/styles.d.ts +32 -0
  281. package/dist/styles.d.ts.map +1 -1
  282. package/dist/styles.js +91 -0
  283. package/dist/styles.js.map +1 -1
  284. package/dist/summarization.d.ts +1 -1
  285. package/dist/summarization.js +4 -4
  286. package/dist/summarization.js.map +1 -1
  287. package/dist/terminal-image.d.ts +115 -0
  288. package/dist/terminal-image.d.ts.map +1 -0
  289. package/dist/terminal-image.js +766 -0
  290. package/dist/terminal-image.js.map +1 -0
  291. package/dist/terminal-recording.d.ts +55 -0
  292. package/dist/terminal-recording.d.ts.map +1 -0
  293. package/dist/terminal-recording.js +182 -0
  294. package/dist/terminal-recording.js.map +1 -0
  295. package/dist/themes.d.ts +19 -35
  296. package/dist/themes.d.ts.map +1 -1
  297. package/dist/themes.js +101 -210
  298. package/dist/themes.js.map +1 -1
  299. package/dist/tmux.d.ts +35 -0
  300. package/dist/tmux.d.ts.map +1 -0
  301. package/dist/tmux.js +106 -0
  302. package/dist/tmux.js.map +1 -0
  303. package/dist/tools.d.ts +3 -3
  304. package/dist/tools.d.ts.map +1 -1
  305. package/dist/tools.js +587 -45
  306. package/dist/tools.js.map +1 -1
  307. package/dist/trust.d.ts +53 -0
  308. package/dist/trust.d.ts.map +1 -0
  309. package/dist/trust.js +154 -0
  310. package/dist/trust.js.map +1 -0
  311. package/dist/types.d.ts +7 -3
  312. package/dist/types.d.ts.map +1 -1
  313. package/dist/types.js +70 -32
  314. package/dist/types.js.map +1 -1
  315. package/dist/ui/agent.d.ts +61 -0
  316. package/dist/ui/agent.d.ts.map +1 -0
  317. package/dist/ui/agent.js +768 -0
  318. package/dist/ui/agent.js.map +1 -0
  319. package/dist/ui/chat-input.d.ts +32 -0
  320. package/dist/ui/chat-input.d.ts.map +1 -0
  321. package/dist/ui/chat-input.js +355 -0
  322. package/dist/ui/chat-input.js.map +1 -0
  323. package/dist/ui/commands.d.ts +92 -0
  324. package/dist/ui/commands.d.ts.map +1 -0
  325. package/dist/ui/commands.js +3006 -0
  326. package/dist/ui/commands.js.map +1 -0
  327. package/dist/ui/completions.d.ts +22 -0
  328. package/dist/ui/completions.d.ts.map +1 -0
  329. package/dist/ui/completions.js +215 -0
  330. package/dist/ui/completions.js.map +1 -0
  331. package/dist/ui/components.d.ts +38 -0
  332. package/dist/ui/components.d.ts.map +1 -0
  333. package/dist/ui/components.js +422 -0
  334. package/dist/ui/components.js.map +1 -0
  335. package/dist/ui/context.d.ts +12 -0
  336. package/dist/ui/context.d.ts.map +1 -0
  337. package/dist/ui/context.js +102 -0
  338. package/dist/ui/context.js.map +1 -0
  339. package/dist/ui/error-boundary.d.ts +33 -0
  340. package/dist/ui/error-boundary.d.ts.map +1 -0
  341. package/dist/ui/error-boundary.js +94 -0
  342. package/dist/ui/error-boundary.js.map +1 -0
  343. package/dist/ui/frame.d.ts +13 -0
  344. package/dist/ui/frame.d.ts.map +1 -0
  345. package/dist/ui/frame.js +89 -0
  346. package/dist/ui/frame.js.map +1 -0
  347. package/dist/ui/index.d.ts +12 -0
  348. package/dist/ui/index.d.ts.map +1 -0
  349. package/dist/ui/index.js +928 -0
  350. package/dist/ui/index.js.map +1 -0
  351. package/dist/ui/messages.d.ts +19 -0
  352. package/dist/ui/messages.d.ts.map +1 -0
  353. package/dist/ui/messages.js +181 -0
  354. package/dist/ui/messages.js.map +1 -0
  355. package/dist/ui/modals.d.ts +52 -0
  356. package/dist/ui/modals.d.ts.map +1 -0
  357. package/dist/ui/modals.js +204 -0
  358. package/dist/ui/modals.js.map +1 -0
  359. package/dist/ui/pack-picker.d.ts +12 -0
  360. package/dist/ui/pack-picker.d.ts.map +1 -0
  361. package/dist/ui/pack-picker.js +101 -0
  362. package/dist/ui/pack-picker.js.map +1 -0
  363. package/dist/ui/status-bar.d.ts +20 -0
  364. package/dist/ui/status-bar.d.ts.map +1 -0
  365. package/dist/ui/status-bar.js +41 -0
  366. package/dist/ui/status-bar.js.map +1 -0
  367. package/dist/ui/theme-picker.d.ts +24 -0
  368. package/dist/ui/theme-picker.d.ts.map +1 -0
  369. package/dist/ui/theme-picker.js +190 -0
  370. package/dist/ui/theme-picker.js.map +1 -0
  371. package/dist/ui/types.d.ts +62 -0
  372. package/dist/ui/types.d.ts.map +1 -0
  373. package/dist/ui/types.js +7 -0
  374. package/dist/ui/types.js.map +1 -0
  375. package/dist/version-check.d.ts.map +1 -1
  376. package/dist/version-check.js +1 -9
  377. package/dist/version-check.js.map +1 -1
  378. package/package.json +8 -3
  379. package/dist/agterm/agent-detection.js.map +0 -1
  380. package/dist/agterm/cli-backend.js.map +0 -1
  381. package/dist/agterm/index.d.ts +0 -12
  382. package/dist/agterm/index.d.ts.map +0 -1
  383. package/dist/agterm/index.js +0 -15
  384. package/dist/agterm/index.js.map +0 -1
  385. package/dist/agterm/orchestrator.d.ts.map +0 -1
  386. package/dist/agterm/orchestrator.js.map +0 -1
  387. package/dist/agterm/tools.d.ts.map +0 -1
  388. package/dist/agterm/tools.js +0 -278
  389. package/dist/agterm/tools.js.map +0 -1
  390. package/dist/agterm/types.d.ts.map +0 -1
  391. package/dist/agterm/types.js.map +0 -1
  392. package/dist/cli.d.ts +0 -14
  393. package/dist/cli.d.ts.map +0 -1
  394. package/dist/cli.js.map +0 -1
  395. package/dist/providers.d.ts +0 -51
  396. package/dist/providers.d.ts.map +0 -1
  397. package/dist/providers.js +0 -1146
  398. package/dist/providers.js.map +0 -1
  399. package/dist/ui-cli.d.ts +0 -17
  400. package/dist/ui-cli.d.ts.map +0 -1
  401. package/dist/ui-cli.js +0 -3730
  402. package/dist/ui-cli.js.map +0 -1
@@ -0,0 +1,202 @@
1
+ /**
2
+ * OpenAI-Compatible Provider
3
+ *
4
+ * Handles OpenRouter, Together, Groq, Fireworks, Mistral, AI21,
5
+ * HuggingFace, Ollama, and LiteLLM via the OpenAI SDK.
6
+ */
7
+ import OpenAI from 'openai';
8
+ import * as config from '../config.js';
9
+ import { calculateMaxTokens, debugLog } from './types.js';
10
+ import { toOpenAIMessages, toOpenAITools, parseOpenAIToolCalls } from './openai.js';
11
+ import { getOllamaFallbackModel } from '../model-detection.js';
12
+ // API base URLs for OpenAI-compatible providers
13
+ const PROVIDER_BASE_URLS = {
14
+ openrouter: 'https://openrouter.ai/api/v1',
15
+ together: 'https://api.together.xyz/v1',
16
+ groq: 'https://api.groq.com/openai/v1',
17
+ fireworks: 'https://api.fireworks.ai/inference/v1',
18
+ mistral: 'https://api.mistral.ai/v1',
19
+ ai21: 'https://api.ai21.com/studio/v1',
20
+ huggingface: 'https://api-inference.huggingface.co/v1',
21
+ };
22
+ /**
23
+ * Chat with OpenAI-compatible APIs (OpenRouter, Together, Groq, Mistral, etc.)
24
+ */
25
+ export async function chatOpenAICompatible(provider, messages, tools, model, onToken) {
26
+ // Ollama and LiteLLM use base URL, others use API key
27
+ let apiKey;
28
+ let baseURL;
29
+ if (provider === 'ollama') {
30
+ const ollamaBase = config.getBaseUrl('ollama') || 'http://localhost:11434';
31
+ // Append /v1 for OpenAI-compatible endpoint, unless already present
32
+ baseURL = ollamaBase.endsWith('/v1') ? ollamaBase : `${ollamaBase}/v1`;
33
+ apiKey = 'ollama'; // Ollama doesn't require a real API key
34
+ }
35
+ else if (provider === 'litellm') {
36
+ const litellmBase = config.getBaseUrl('litellm') || 'http://localhost:4000';
37
+ // Append /v1 for OpenAI-compatible endpoint, unless already present
38
+ baseURL = litellmBase.endsWith('/v1') ? litellmBase : `${litellmBase}/v1`;
39
+ apiKey = config.getApiKey('litellm') || 'litellm'; // LiteLLM may or may not require key
40
+ }
41
+ else if (provider === 'bedrock') {
42
+ const bedrockBase = config.getBaseUrl('bedrock');
43
+ if (!bedrockBase)
44
+ throw new Error('Bedrock base URL not configured. Set BEDROCK_BASE_URL to your Bedrock gateway/proxy endpoint.');
45
+ // Append /v1 for OpenAI-compatible endpoint, unless already present
46
+ baseURL = bedrockBase.endsWith('/v1') ? bedrockBase : `${bedrockBase}/v1`;
47
+ apiKey = config.getApiKey('bedrock') || 'bedrock'; // Key depends on gateway setup
48
+ }
49
+ else {
50
+ apiKey = config.getApiKey(provider);
51
+ if (!apiKey)
52
+ throw new Error(`${provider} API key not configured`);
53
+ baseURL = PROVIDER_BASE_URLS[provider];
54
+ if (!baseURL)
55
+ throw new Error(`Unknown provider: ${provider}`);
56
+ }
57
+ const client = new OpenAI({ apiKey, baseURL });
58
+ const openaiMessages = toOpenAIMessages(messages);
59
+ const openaiTools = toOpenAITools(tools);
60
+ // Calculate dynamic max_tokens based on available context space
61
+ const dynamicMaxTokens = calculateMaxTokens(provider, model, messages, tools);
62
+ debugLog(`${provider} request: model=${model}, max_tokens=${dynamicMaxTokens}`);
63
+ // Use streaming if callback provided
64
+ // Stream text content while collecting tool calls
65
+ if (onToken) {
66
+ let content = '';
67
+ let toolCallDeltas = {};
68
+ let finishReason = 'stop';
69
+ try {
70
+ const stream = await client.chat.completions.create({
71
+ model,
72
+ messages: openaiMessages,
73
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
74
+ max_tokens: dynamicMaxTokens,
75
+ stream: true,
76
+ });
77
+ for await (const chunk of stream) {
78
+ const choice = chunk.choices[0];
79
+ if (!choice)
80
+ continue;
81
+ // Handle text content
82
+ const textDelta = choice.delta?.content;
83
+ if (textDelta) {
84
+ content += textDelta;
85
+ onToken(textDelta);
86
+ }
87
+ // Handle tool calls (collect deltas)
88
+ const toolCallDelta = choice.delta?.tool_calls;
89
+ if (toolCallDelta) {
90
+ for (const tc of toolCallDelta) {
91
+ if (!toolCallDeltas[tc.index]) {
92
+ toolCallDeltas[tc.index] = { id: '', name: '', arguments: '' };
93
+ }
94
+ if (tc.id)
95
+ toolCallDeltas[tc.index].id = tc.id;
96
+ if (tc.function?.name)
97
+ toolCallDeltas[tc.index].name = tc.function.name;
98
+ if (tc.function?.arguments)
99
+ toolCallDeltas[tc.index].arguments += tc.function.arguments;
100
+ }
101
+ }
102
+ // Track finish reason
103
+ if (choice.finish_reason === 'tool_calls') {
104
+ finishReason = 'tool_use';
105
+ }
106
+ else if (choice.finish_reason === 'length') {
107
+ finishReason = 'length';
108
+ }
109
+ }
110
+ // Convert tool call deltas to tool calls
111
+ const toolCalls = Object.values(toolCallDeltas)
112
+ .filter(tc => tc.id && tc.name)
113
+ .map(tc => {
114
+ let parsedArgs = {};
115
+ try {
116
+ parsedArgs = JSON.parse(tc.arguments || '{}');
117
+ }
118
+ catch {
119
+ debugLog(`Failed to parse streaming tool call arguments for ${tc.name}: ${tc.arguments?.substring(0, 200)}`);
120
+ }
121
+ return {
122
+ id: tc.id,
123
+ name: tc.name,
124
+ arguments: parsedArgs,
125
+ };
126
+ });
127
+ if (toolCalls.length > 0) {
128
+ finishReason = 'tool_use';
129
+ }
130
+ return {
131
+ content,
132
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
133
+ finishReason,
134
+ };
135
+ }
136
+ catch (streamError) {
137
+ // Surface the streaming failure and re-throw so withRetry handles it
138
+ const errMsg = streamError instanceof Error ? streamError.message : String(streamError);
139
+ debugLog(`${provider} streaming failed:`, errMsg);
140
+ onToken(`\n[Streaming error: ${errMsg}]\n`);
141
+ throw streamError;
142
+ }
143
+ }
144
+ // Non-streaming request with Ollama fallback (#41)
145
+ let actualModel = model;
146
+ let response;
147
+ try {
148
+ response = await client.chat.completions.create({
149
+ model: actualModel,
150
+ messages: openaiMessages,
151
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
152
+ max_tokens: dynamicMaxTokens,
153
+ });
154
+ }
155
+ catch (error) {
156
+ // Ollama model not found - try fallback discovery
157
+ const status = error?.status;
158
+ if (provider === 'ollama' && (status === 404 || String(error).includes('not found'))) {
159
+ const fallback = await getOllamaFallbackModel();
160
+ if (fallback && fallback !== model) {
161
+ debugLog(`Ollama model "${model}" not found, falling back to "${fallback}"`);
162
+ actualModel = fallback;
163
+ response = await client.chat.completions.create({
164
+ model: actualModel,
165
+ messages: openaiMessages,
166
+ tools: openaiTools.length > 0 ? openaiTools : undefined,
167
+ max_tokens: dynamicMaxTokens,
168
+ });
169
+ }
170
+ else {
171
+ throw new Error(`Ollama model "${model}" not found. Pull it with: ollama pull ${model}`);
172
+ }
173
+ }
174
+ else {
175
+ throw error;
176
+ }
177
+ }
178
+ if (!response.choices || response.choices.length === 0) {
179
+ throw new Error(`Empty response from ${provider} API`);
180
+ }
181
+ const choice = response.choices[0];
182
+ const message = choice.message;
183
+ const toolCalls = parseOpenAIToolCalls(message.tool_calls);
184
+ // Map finish reasons
185
+ let finishReason = 'stop';
186
+ if (choice.finish_reason === 'tool_calls') {
187
+ finishReason = 'tool_use';
188
+ }
189
+ else if (choice.finish_reason === 'length') {
190
+ finishReason = 'length';
191
+ }
192
+ return {
193
+ content: message.content || '',
194
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
195
+ finishReason,
196
+ usage: response.usage ? {
197
+ inputTokens: response.usage.prompt_tokens,
198
+ outputTokens: response.usage.completion_tokens,
199
+ } : undefined,
200
+ };
201
+ }
202
+ //# sourceMappingURL=compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.js","sourceRoot":"","sources":["../../src/providers/compat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Google Gemini Provider
3
+ */
4
+ import type { Message, Tool, LLMResponse } from '../types.js';
5
+ import { type StreamCallback } from './types.js';
6
+ /**
7
+ * Chat with Google Gemini
8
+ */
9
+ export declare function chatGoogle(messages: Message[], tools: Tool[], model: string, onToken?: StreamCallback): Promise<LLMResponse>;
10
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AACxE,OAAO,EAA4B,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E;;GAEG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAuMtB"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Google Gemini Provider
3
+ */
4
+ import { GoogleGenerativeAI } from '@google/generative-ai';
5
+ import * as config from '../config.js';
6
+ import { getTextContent, debugLog } from './types.js';
7
+ /**
8
+ * Chat with Google Gemini
9
+ */
10
+ export async function chatGoogle(messages, tools, model, onToken) {
11
+ const apiKey = config.getApiKey('google');
12
+ if (!apiKey)
13
+ throw new Error('Google API key not configured');
14
+ const genAI = new GoogleGenerativeAI(apiKey);
15
+ // Convert a tool property type to Gemini schema type
16
+ function convertPropertyType(prop) {
17
+ const result = {
18
+ type: (prop.type || 'string').toUpperCase(),
19
+ description: prop.description,
20
+ };
21
+ if (prop.enum)
22
+ result.enum = prop.enum;
23
+ // Handle nested objects
24
+ if (prop.type === 'object' && prop.properties) {
25
+ result.properties = Object.fromEntries(Object.entries(prop.properties).map(([k, v]) => [k, convertPropertyType(v)]));
26
+ if (prop.required)
27
+ result.required = prop.required;
28
+ }
29
+ // Handle arrays
30
+ if (prop.type === 'array' && prop.items) {
31
+ result.items = convertPropertyType(prop.items);
32
+ }
33
+ return result;
34
+ }
35
+ // Convert tools to Gemini function declarations
36
+ const geminiTools = tools.length > 0 ? [{
37
+ functionDeclarations: tools.map(t => ({
38
+ name: t.name,
39
+ description: t.description,
40
+ parameters: {
41
+ type: 'OBJECT',
42
+ properties: Object.fromEntries(Object.entries(t.parameters.properties).map(([key, prop]) => [key, convertPropertyType(prop)])),
43
+ required: t.parameters.required || [],
44
+ },
45
+ })),
46
+ }] : undefined;
47
+ const genModel = genAI.getGenerativeModel({ model, tools: geminiTools });
48
+ // Build history (exclude last message)
49
+ // Handle tool result messages as functionResponse parts for Gemini
50
+ const history = [];
51
+ for (const m of messages.slice(0, -1)) {
52
+ if (m.role === 'system')
53
+ continue; // system handled via systemInstruction
54
+ if (m.role === 'tool') {
55
+ // Gemini expects functionResponse in a 'function' role
56
+ // Find the corresponding tool call to get the function name
57
+ const toolCallId = m.toolCallId;
58
+ let funcName = 'unknown';
59
+ // Look back for the assistant message with this tool call
60
+ for (const prev of messages) {
61
+ if (prev.toolCalls) {
62
+ const match = prev.toolCalls.find(tc => tc.id === toolCallId);
63
+ if (match) {
64
+ funcName = match.name;
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ history.push({
70
+ role: 'function',
71
+ parts: [{ functionResponse: { name: funcName, response: { result: getTextContent(m.content) } } }],
72
+ });
73
+ }
74
+ else if (m.role === 'assistant' && m.toolCalls && m.toolCalls.length > 0) {
75
+ // Assistant message with function calls
76
+ const parts = [];
77
+ const text = getTextContent(m.content);
78
+ if (text)
79
+ parts.push({ text });
80
+ for (const tc of m.toolCalls) {
81
+ parts.push({ functionCall: { name: tc.name, args: tc.arguments } });
82
+ }
83
+ history.push({ role: 'model', parts });
84
+ }
85
+ else {
86
+ history.push({
87
+ role: m.role === 'assistant' ? 'model' : 'user',
88
+ parts: [{ text: getTextContent(m.content) }],
89
+ });
90
+ }
91
+ }
92
+ if (messages.length === 0) {
93
+ throw new Error('No messages provided');
94
+ }
95
+ const lastMessage = messages[messages.length - 1];
96
+ const systemMessage = messages.find(m => m.role === 'system');
97
+ const chat = genModel.startChat({
98
+ history,
99
+ systemInstruction: systemMessage ? getTextContent(systemMessage.content) : undefined,
100
+ });
101
+ // Convert last message to Gemini format (with image support)
102
+ const lastMessageParts = [];
103
+ if (typeof lastMessage.content === 'string') {
104
+ lastMessageParts.push({ text: lastMessage.content });
105
+ }
106
+ else {
107
+ for (const block of lastMessage.content) {
108
+ if (block.type === 'text') {
109
+ lastMessageParts.push({ text: block.text });
110
+ }
111
+ else if (block.type === 'image') {
112
+ lastMessageParts.push({
113
+ inlineData: {
114
+ mimeType: block.mediaType,
115
+ data: block.data,
116
+ },
117
+ });
118
+ }
119
+ }
120
+ }
121
+ // Use streaming if callback provided
122
+ if (onToken) {
123
+ let content = '';
124
+ const toolCalls = [];
125
+ let inputTokens = 0;
126
+ let outputTokens = 0;
127
+ try {
128
+ const streamResult = await chat.sendMessageStream(lastMessageParts);
129
+ for await (const chunk of streamResult.stream) {
130
+ // Extract text from streamed chunks
131
+ const candidates = chunk.candidates || [];
132
+ for (const candidate of candidates) {
133
+ for (const part of candidate.content?.parts || []) {
134
+ if ('text' in part && part.text) {
135
+ content += part.text;
136
+ onToken(part.text);
137
+ }
138
+ if ('functionCall' in part && part.functionCall) {
139
+ toolCalls.push({
140
+ id: `gemini_${Date.now()}_${Math.random().toString(36).slice(2)}`,
141
+ name: part.functionCall.name,
142
+ arguments: (part.functionCall.args || {}),
143
+ });
144
+ }
145
+ }
146
+ }
147
+ // Capture usage metadata from chunks
148
+ if (chunk.usageMetadata) {
149
+ inputTokens = chunk.usageMetadata.promptTokenCount || 0;
150
+ outputTokens = chunk.usageMetadata.candidatesTokenCount || 0;
151
+ }
152
+ }
153
+ return {
154
+ content,
155
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
156
+ finishReason: toolCalls.length > 0 ? 'tool_use' : 'stop',
157
+ usage: (inputTokens || outputTokens) ? { inputTokens, outputTokens } : undefined,
158
+ };
159
+ }
160
+ catch (streamError) {
161
+ // Surface the streaming failure and re-throw so withRetry handles it
162
+ const errMsg = streamError instanceof Error ? streamError.message : String(streamError);
163
+ debugLog('Google streaming failed:', errMsg);
164
+ onToken(`\n[Streaming error: ${errMsg}]\n`);
165
+ throw streamError;
166
+ }
167
+ }
168
+ // Non-streaming request
169
+ const result = await chat.sendMessage(lastMessageParts);
170
+ const response = result.response;
171
+ // Check for function calls first (text() throws when only function calls are present)
172
+ const toolCalls = [];
173
+ const candidates = response.candidates || [];
174
+ for (const candidate of candidates) {
175
+ for (const part of candidate.content?.parts || []) {
176
+ if ('functionCall' in part && part.functionCall) {
177
+ toolCalls.push({
178
+ id: `gemini_${Date.now()}_${Math.random().toString(36).slice(2)}`,
179
+ name: part.functionCall.name,
180
+ arguments: (part.functionCall.args || {}),
181
+ });
182
+ }
183
+ }
184
+ }
185
+ // Safely extract text (may throw if response only has function calls)
186
+ let text = '';
187
+ try {
188
+ text = response.text();
189
+ }
190
+ catch {
191
+ // No text content - this is expected when only function calls are returned
192
+ }
193
+ return {
194
+ content: text,
195
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
196
+ finishReason: toolCalls.length > 0 ? 'tool_use' : 'stop',
197
+ usage: response.usageMetadata ? {
198
+ inputTokens: response.usageMetadata.promptTokenCount || 0,
199
+ outputTokens: response.usageMetadata.candidatesTokenCount || 0,
200
+ } : undefined,
201
+ };
202
+ }
203
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Provider Module - Entry Point
3
+ *
4
+ * Provider selection, routing, and re-exports.
5
+ */
6
+ import type { Message, Tool, LLMResponse, LLMProvider } from '../types.js';
7
+ import { type StreamCallback, type RetryCallback } from './types.js';
8
+ /**
9
+ * Get available providers based on configured API keys
10
+ */
11
+ export declare function getAvailableProviders(): LLMProvider[];
12
+ /**
13
+ * Select the best available provider
14
+ */
15
+ export declare function selectProvider(preferred: LLMProvider): LLMProvider;
16
+ /**
17
+ * Chat with the selected provider (with automatic retry)
18
+ */
19
+ export declare function chat(provider: LLMProvider, messages: Message[], tools: Tool[], model?: string, onToken?: StreamCallback, onRetry?: RetryCallback): Promise<LLMResponse>;
20
+ export { needsSummarization, getContextHealth, estimateContextUsage } from './types.js';
21
+ export type { StreamCallback, RetryCallback } from './types.js';
22
+ export { requiresResponsesAPI, toResponsesInput, toResponsesTools } from './openai.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAuB,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAQ1F;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,WAAW,EAAE,CAkBrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,WAAW,GAAG,WAAW,CA2BlE;AAED;;GAEG;AACH,wBAAsB,IAAI,CACxB,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,WAAW,CAAC,CAqDtB;AAGD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACxF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Provider Module - Entry Point
3
+ *
4
+ * Provider selection, routing, and re-exports.
5
+ */
6
+ import * as config from '../config.js';
7
+ import { withRetry } from '../errors.js';
8
+ import { DEFAULT_MODELS } from '../types.js';
9
+ import { validateLLMResponse } from './types.js';
10
+ import { chatAnthropic } from './anthropic.js';
11
+ import { chatGoogle } from './google.js';
12
+ import { chatOpenAI } from './openai.js';
13
+ import { chatOpenAICompatible } from './compat.js';
14
+ import { chatOllama } from './ollama.js';
15
+ import { chatBedrock } from './bedrock.js';
16
+ /**
17
+ * Get available providers based on configured API keys
18
+ */
19
+ export function getAvailableProviders() {
20
+ const providers = [];
21
+ if (config.getApiKey('anthropic'))
22
+ providers.push('anthropic');
23
+ if (config.getApiKey('google'))
24
+ providers.push('google');
25
+ if (config.getApiKey('openai'))
26
+ providers.push('openai');
27
+ if (config.getApiKey('openrouter'))
28
+ providers.push('openrouter');
29
+ if (config.getApiKey('together'))
30
+ providers.push('together');
31
+ if (config.getApiKey('groq'))
32
+ providers.push('groq');
33
+ if (config.getApiKey('fireworks'))
34
+ providers.push('fireworks');
35
+ if (config.getApiKey('mistral'))
36
+ providers.push('mistral');
37
+ if (config.getBaseUrl('ollama'))
38
+ providers.push('ollama');
39
+ if (config.getApiKey('ai21'))
40
+ providers.push('ai21');
41
+ if (config.getApiKey('huggingface'))
42
+ providers.push('huggingface');
43
+ if (config.getBaseUrl('litellm'))
44
+ providers.push('litellm');
45
+ if (config.getApiKey('bedrock') || config.getBaseUrl('bedrock') || process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE)
46
+ providers.push('bedrock');
47
+ return providers;
48
+ }
49
+ /**
50
+ * Select the best available provider
51
+ */
52
+ export function selectProvider(preferred) {
53
+ if (preferred !== 'auto') {
54
+ // For Ollama/LiteLLM, check base URL instead of API key
55
+ if (preferred === 'ollama' || preferred === 'litellm') {
56
+ if (config.getBaseUrl(preferred))
57
+ return preferred;
58
+ }
59
+ else if (preferred === 'bedrock') {
60
+ if (config.getApiKey('bedrock') || config.getBaseUrl('bedrock') || process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE)
61
+ return preferred;
62
+ }
63
+ else {
64
+ const key = config.getApiKey(preferred);
65
+ if (key)
66
+ return preferred;
67
+ }
68
+ }
69
+ // Auto-select: prefer Anthropic > OpenAI > Google > others
70
+ const priority = ['anthropic', 'openai', 'google', 'mistral', 'openrouter', 'together', 'groq', 'fireworks', 'ai21', 'huggingface', 'bedrock', 'ollama', 'litellm'];
71
+ for (const p of priority) {
72
+ if (p === 'ollama' || p === 'litellm') {
73
+ if (config.getBaseUrl(p))
74
+ return p;
75
+ }
76
+ else if (p === 'bedrock') {
77
+ if (config.getApiKey('bedrock') || config.getBaseUrl('bedrock') || process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE)
78
+ return p;
79
+ }
80
+ else if (config.getApiKey(p)) {
81
+ return p;
82
+ }
83
+ }
84
+ throw new Error('No API keys configured. Run `calliope --setup` to configure.');
85
+ }
86
+ /**
87
+ * Chat with the selected provider (with automatic retry)
88
+ */
89
+ export async function chat(provider, messages, tools, model, onToken, onRetry) {
90
+ const actualProvider = selectProvider(provider);
91
+ const actualModel = model || DEFAULT_MODELS[actualProvider];
92
+ const doChat = async () => {
93
+ let response;
94
+ switch (actualProvider) {
95
+ case 'anthropic':
96
+ response = await chatAnthropic(messages, tools, actualModel, onToken);
97
+ break;
98
+ case 'google':
99
+ response = await chatGoogle(messages, tools, actualModel, onToken);
100
+ break;
101
+ case 'openai':
102
+ response = await chatOpenAI(messages, tools, actualModel, onToken);
103
+ break;
104
+ case 'openrouter':
105
+ case 'together':
106
+ case 'groq':
107
+ case 'fireworks':
108
+ case 'mistral':
109
+ case 'ai21':
110
+ case 'huggingface':
111
+ case 'ollama':
112
+ response = await chatOllama(messages, tools, actualModel, onToken);
113
+ break;
114
+ case 'litellm':
115
+ response = await chatOpenAICompatible(actualProvider, messages, tools, actualModel, onToken);
116
+ break;
117
+ case 'bedrock': {
118
+ const bedrockBase = config.getBaseUrl('bedrock');
119
+ if (bedrockBase) {
120
+ // Gateway/proxy mode (existing)
121
+ response = await chatOpenAICompatible(actualProvider, messages, tools, actualModel, onToken);
122
+ }
123
+ else {
124
+ // Native AWS mode
125
+ response = await chatBedrock(messages, tools, actualModel, onToken);
126
+ }
127
+ break;
128
+ }
129
+ default:
130
+ throw new Error(`Provider ${actualProvider} not implemented`);
131
+ }
132
+ // Validate and sanitize response before returning
133
+ return validateLLMResponse(response);
134
+ };
135
+ // Wrap with retry logic
136
+ return withRetry(doChat, {
137
+ maxRetries: 2,
138
+ initialDelayMs: 1000,
139
+ onRetry: onRetry,
140
+ });
141
+ }
142
+ // Re-export everything from sub-modules for public API
143
+ export { needsSummarization, getContextHealth, estimateContextUsage } from './types.js';
144
+ export { requiresResponsesAPI, toResponsesInput, toResponsesTools } from './openai.js';
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Native Ollama Provider
3
+ *
4
+ * Uses Ollama's native /api/chat endpoint instead of the OpenAI-compatible
5
+ * /v1/chat/completions. Many Ollama models (e.g. devstral) only support
6
+ * tool calling through the native API.
7
+ *
8
+ * Features:
9
+ * - Native /api/chat for reliable tool calling
10
+ * - Auto-detection of tool support (retries without tools on 400)
11
+ * - Model fallback discovery when configured model isn't available
12
+ * - Streaming support with proper tool call collection
13
+ */
14
+ import type { Message, Tool, LLMResponse } from '../types.js';
15
+ import { type StreamCallback } from './types.js';
16
+ export declare function chatOllama(messages: Message[], tools: Tool[], model: string, onToken?: StreamCallback): Promise<LLMResponse>;
17
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AACxE,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AA+M3D,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,IAAI,EAAE,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAqCtB"}