@jini-ai/agent-runtime 0.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 (399) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -0
  3. package/dist/acp-model-probe.d.ts +48 -0
  4. package/dist/acp-model-probe.d.ts.map +1 -0
  5. package/dist/acp-model-probe.js +15 -0
  6. package/dist/acp-model-probe.js.map +1 -0
  7. package/dist/agent-protocol/acp/account-failure.d.ts +54 -0
  8. package/dist/agent-protocol/acp/account-failure.d.ts.map +1 -0
  9. package/dist/agent-protocol/acp/account-failure.js +37 -0
  10. package/dist/agent-protocol/acp/account-failure.js.map +1 -0
  11. package/dist/agent-protocol/acp/constants.d.ts +26 -0
  12. package/dist/agent-protocol/acp/constants.d.ts.map +1 -0
  13. package/dist/agent-protocol/acp/constants.js +39 -0
  14. package/dist/agent-protocol/acp/constants.js.map +1 -0
  15. package/dist/agent-protocol/acp/index.d.ts +14 -0
  16. package/dist/agent-protocol/acp/index.d.ts.map +1 -0
  17. package/dist/agent-protocol/acp/index.js +14 -0
  18. package/dist/agent-protocol/acp/index.js.map +1 -0
  19. package/dist/agent-protocol/acp/json.d.ts +82 -0
  20. package/dist/agent-protocol/acp/json.d.ts.map +1 -0
  21. package/dist/agent-protocol/acp/json.js +144 -0
  22. package/dist/agent-protocol/acp/json.js.map +1 -0
  23. package/dist/agent-protocol/acp/models.d.ts +112 -0
  24. package/dist/agent-protocol/acp/models.d.ts.map +1 -0
  25. package/dist/agent-protocol/acp/models.js +293 -0
  26. package/dist/agent-protocol/acp/models.js.map +1 -0
  27. package/dist/agent-protocol/acp/rpc.d.ts +107 -0
  28. package/dist/agent-protocol/acp/rpc.d.ts.map +1 -0
  29. package/dist/agent-protocol/acp/rpc.js +162 -0
  30. package/dist/agent-protocol/acp/rpc.js.map +1 -0
  31. package/dist/agent-protocol/acp/session-params.d.ts +55 -0
  32. package/dist/agent-protocol/acp/session-params.d.ts.map +1 -0
  33. package/dist/agent-protocol/acp/session-params.js +81 -0
  34. package/dist/agent-protocol/acp/session-params.js.map +1 -0
  35. package/dist/agent-protocol/acp/session.d.ts +101 -0
  36. package/dist/agent-protocol/acp/session.d.ts.map +1 -0
  37. package/dist/agent-protocol/acp/session.js +832 -0
  38. package/dist/agent-protocol/acp/session.js.map +1 -0
  39. package/dist/agent-protocol/acp/text-suppression.d.ts +73 -0
  40. package/dist/agent-protocol/acp/text-suppression.d.ts.map +1 -0
  41. package/dist/agent-protocol/acp/text-suppression.js +229 -0
  42. package/dist/agent-protocol/acp/text-suppression.js.map +1 -0
  43. package/dist/agent-protocol/acp/types.d.ts +27 -0
  44. package/dist/agent-protocol/acp/types.d.ts.map +1 -0
  45. package/dist/agent-protocol/acp/types.js +2 -0
  46. package/dist/agent-protocol/acp/types.js.map +1 -0
  47. package/dist/agent-protocol/acp/updates.d.ts +166 -0
  48. package/dist/agent-protocol/acp/updates.d.ts.map +1 -0
  49. package/dist/agent-protocol/acp/updates.js +268 -0
  50. package/dist/agent-protocol/acp/updates.js.map +1 -0
  51. package/dist/agent-protocol/core/index.d.ts +6 -0
  52. package/dist/agent-protocol/core/index.d.ts.map +1 -0
  53. package/dist/agent-protocol/core/index.js +6 -0
  54. package/dist/agent-protocol/core/index.js.map +1 -0
  55. package/dist/agent-protocol/core/json-line-stream.d.ts +42 -0
  56. package/dist/agent-protocol/core/json-line-stream.d.ts.map +1 -0
  57. package/dist/agent-protocol/core/json-line-stream.js +333 -0
  58. package/dist/agent-protocol/core/json-line-stream.js.map +1 -0
  59. package/dist/agent-protocol/index.d.ts +8 -0
  60. package/dist/agent-protocol/index.d.ts.map +1 -0
  61. package/dist/agent-protocol/index.js +8 -0
  62. package/dist/agent-protocol/index.js.map +1 -0
  63. package/dist/agent-protocol/pi-rpc/events.d.ts +26 -0
  64. package/dist/agent-protocol/pi-rpc/events.d.ts.map +1 -0
  65. package/dist/agent-protocol/pi-rpc/events.js +167 -0
  66. package/dist/agent-protocol/pi-rpc/events.js.map +1 -0
  67. package/dist/agent-protocol/pi-rpc/index.d.ts +11 -0
  68. package/dist/agent-protocol/pi-rpc/index.d.ts.map +1 -0
  69. package/dist/agent-protocol/pi-rpc/index.js +11 -0
  70. package/dist/agent-protocol/pi-rpc/index.js.map +1 -0
  71. package/dist/agent-protocol/pi-rpc/internal.d.ts +45 -0
  72. package/dist/agent-protocol/pi-rpc/internal.d.ts.map +1 -0
  73. package/dist/agent-protocol/pi-rpc/internal.js +41 -0
  74. package/dist/agent-protocol/pi-rpc/internal.js.map +1 -0
  75. package/dist/agent-protocol/pi-rpc/models.d.ts +21 -0
  76. package/dist/agent-protocol/pi-rpc/models.d.ts.map +1 -0
  77. package/dist/agent-protocol/pi-rpc/models.js +48 -0
  78. package/dist/agent-protocol/pi-rpc/models.js.map +1 -0
  79. package/dist/agent-protocol/pi-rpc/session.d.ts +106 -0
  80. package/dist/agent-protocol/pi-rpc/session.d.ts.map +1 -0
  81. package/dist/agent-protocol/pi-rpc/session.js +371 -0
  82. package/dist/agent-protocol/pi-rpc/session.js.map +1 -0
  83. package/dist/amr-model-cache.d.ts +40 -0
  84. package/dist/amr-model-cache.d.ts.map +1 -0
  85. package/dist/amr-model-cache.js +79 -0
  86. package/dist/amr-model-cache.js.map +1 -0
  87. package/dist/amr-profile-resolver.d.ts +21 -0
  88. package/dist/amr-profile-resolver.d.ts.map +1 -0
  89. package/dist/amr-profile-resolver.js +4 -0
  90. package/dist/amr-profile-resolver.js.map +1 -0
  91. package/dist/artifact-taxonomy.d.ts +27 -0
  92. package/dist/artifact-taxonomy.d.ts.map +1 -0
  93. package/dist/artifact-taxonomy.js +5 -0
  94. package/dist/artifact-taxonomy.js.map +1 -0
  95. package/dist/auth.d.ts +25 -0
  96. package/dist/auth.d.ts.map +1 -0
  97. package/dist/auth.js +332 -0
  98. package/dist/auth.js.map +1 -0
  99. package/dist/capabilities.d.ts +9 -0
  100. package/dist/capabilities.d.ts.map +1 -0
  101. package/dist/capabilities.js +2 -0
  102. package/dist/capabilities.js.map +1 -0
  103. package/dist/claude-stream.d.ts +37 -0
  104. package/dist/claude-stream.d.ts.map +1 -0
  105. package/dist/claude-stream.js +660 -0
  106. package/dist/claude-stream.js.map +1 -0
  107. package/dist/copilot-stream.d.ts +37 -0
  108. package/dist/copilot-stream.d.ts.map +1 -0
  109. package/dist/copilot-stream.js +136 -0
  110. package/dist/copilot-stream.js.map +1 -0
  111. package/dist/defs/aider.d.ts +13 -0
  112. package/dist/defs/aider.d.ts.map +1 -0
  113. package/dist/defs/aider.js +63 -0
  114. package/dist/defs/aider.js.map +1 -0
  115. package/dist/defs/amp.d.ts +12 -0
  116. package/dist/defs/amp.d.ts.map +1 -0
  117. package/dist/defs/amp.js +56 -0
  118. package/dist/defs/amp.js.map +1 -0
  119. package/dist/defs/amr.d.ts +37 -0
  120. package/dist/defs/amr.d.ts.map +1 -0
  121. package/dist/defs/amr.js +303 -0
  122. package/dist/defs/amr.js.map +1 -0
  123. package/dist/defs/antigravity.d.ts +25 -0
  124. package/dist/defs/antigravity.d.ts.map +1 -0
  125. package/dist/defs/antigravity.js +213 -0
  126. package/dist/defs/antigravity.js.map +1 -0
  127. package/dist/defs/claude.d.ts +30 -0
  128. package/dist/defs/claude.d.ts.map +1 -0
  129. package/dist/defs/claude.js +130 -0
  130. package/dist/defs/claude.js.map +1 -0
  131. package/dist/defs/codebuddy.d.ts +26 -0
  132. package/dist/defs/codebuddy.d.ts.map +1 -0
  133. package/dist/defs/codebuddy.js +124 -0
  134. package/dist/defs/codebuddy.js.map +1 -0
  135. package/dist/defs/codex.d.ts +30 -0
  136. package/dist/defs/codex.d.ts.map +1 -0
  137. package/dist/defs/codex.js +196 -0
  138. package/dist/defs/codex.js.map +1 -0
  139. package/dist/defs/copilot.d.ts +12 -0
  140. package/dist/defs/copilot.d.ts.map +1 -0
  141. package/dist/defs/copilot.js +88 -0
  142. package/dist/defs/copilot.js.map +1 -0
  143. package/dist/defs/cursor-agent.d.ts +27 -0
  144. package/dist/defs/cursor-agent.d.ts.map +1 -0
  145. package/dist/defs/cursor-agent.js +93 -0
  146. package/dist/defs/cursor-agent.js.map +1 -0
  147. package/dist/defs/deepseek.d.ts +12 -0
  148. package/dist/defs/deepseek.d.ts.map +1 -0
  149. package/dist/defs/deepseek.js +53 -0
  150. package/dist/defs/deepseek.js.map +1 -0
  151. package/dist/defs/devin.d.ts +12 -0
  152. package/dist/defs/devin.d.ts.map +1 -0
  153. package/dist/defs/devin.js +45 -0
  154. package/dist/defs/devin.js.map +1 -0
  155. package/dist/defs/grok-build.d.ts +26 -0
  156. package/dist/defs/grok-build.d.ts.map +1 -0
  157. package/dist/defs/grok-build.js +105 -0
  158. package/dist/defs/grok-build.js.map +1 -0
  159. package/dist/defs/hermes.d.ts +13 -0
  160. package/dist/defs/hermes.d.ts.map +1 -0
  161. package/dist/defs/hermes.js +51 -0
  162. package/dist/defs/hermes.js.map +1 -0
  163. package/dist/defs/index.d.ts +33 -0
  164. package/dist/defs/index.d.ts.map +1 -0
  165. package/dist/defs/index.js +33 -0
  166. package/dist/defs/index.js.map +1 -0
  167. package/dist/defs/kilo.d.ts +12 -0
  168. package/dist/defs/kilo.d.ts.map +1 -0
  169. package/dist/defs/kilo.js +20 -0
  170. package/dist/defs/kilo.js.map +1 -0
  171. package/dist/defs/kimi.d.ts +13 -0
  172. package/dist/defs/kimi.d.ts.map +1 -0
  173. package/dist/defs/kimi.js +26 -0
  174. package/dist/defs/kimi.js.map +1 -0
  175. package/dist/defs/kiro.d.ts +12 -0
  176. package/dist/defs/kiro.d.ts.map +1 -0
  177. package/dist/defs/kiro.js +20 -0
  178. package/dist/defs/kiro.js.map +1 -0
  179. package/dist/defs/mimo.d.ts +13 -0
  180. package/dist/defs/mimo.d.ts.map +1 -0
  181. package/dist/defs/mimo.js +26 -0
  182. package/dist/defs/mimo.js.map +1 -0
  183. package/dist/defs/opencode.d.ts +27 -0
  184. package/dist/defs/opencode.d.ts.map +1 -0
  185. package/dist/defs/opencode.js +89 -0
  186. package/dist/defs/opencode.js.map +1 -0
  187. package/dist/defs/pi.d.ts +18 -0
  188. package/dist/defs/pi.d.ts.map +1 -0
  189. package/dist/defs/pi.js +94 -0
  190. package/dist/defs/pi.js.map +1 -0
  191. package/dist/defs/qoder.d.ts +11 -0
  192. package/dist/defs/qoder.d.ts.map +1 -0
  193. package/dist/defs/qoder.js +50 -0
  194. package/dist/defs/qoder.js.map +1 -0
  195. package/dist/defs/qwen.d.ts +11 -0
  196. package/dist/defs/qwen.d.ts.map +1 -0
  197. package/dist/defs/qwen.js +28 -0
  198. package/dist/defs/qwen.js.map +1 -0
  199. package/dist/defs/reasonix.d.ts +20 -0
  200. package/dist/defs/reasonix.d.ts.map +1 -0
  201. package/dist/defs/reasonix.js +60 -0
  202. package/dist/defs/reasonix.js.map +1 -0
  203. package/dist/defs/shared.d.ts +23 -0
  204. package/dist/defs/shared.d.ts.map +1 -0
  205. package/dist/defs/shared.js +58 -0
  206. package/dist/defs/shared.js.map +1 -0
  207. package/dist/defs/trae-cli.d.ts +14 -0
  208. package/dist/defs/trae-cli.d.ts.map +1 -0
  209. package/dist/defs/trae-cli.js +22 -0
  210. package/dist/defs/trae-cli.js.map +1 -0
  211. package/dist/defs/vibe.d.ts +12 -0
  212. package/dist/defs/vibe.d.ts.map +1 -0
  213. package/dist/defs/vibe.js +20 -0
  214. package/dist/defs/vibe.js.map +1 -0
  215. package/dist/detection.d.ts +14 -0
  216. package/dist/detection.d.ts.map +1 -0
  217. package/dist/detection.js +266 -0
  218. package/dist/detection.js.map +1 -0
  219. package/dist/diagnostics.d.ts +8 -0
  220. package/dist/diagnostics.d.ts.map +1 -0
  221. package/dist/diagnostics.js +95 -0
  222. package/dist/diagnostics.js.map +1 -0
  223. package/dist/env.d.ts +19 -0
  224. package/dist/env.d.ts.map +1 -0
  225. package/dist/env.js +95 -0
  226. package/dist/env.js.map +1 -0
  227. package/dist/executables.d.ts +24 -0
  228. package/dist/executables.d.ts.map +1 -0
  229. package/dist/executables.js +349 -0
  230. package/dist/executables.js.map +1 -0
  231. package/dist/index.d.ts +74 -0
  232. package/dist/index.d.ts.map +1 -0
  233. package/dist/index.js +102 -0
  234. package/dist/index.js.map +1 -0
  235. package/dist/invocation.d.ts +6 -0
  236. package/dist/invocation.d.ts.map +1 -0
  237. package/dist/invocation.js +47 -0
  238. package/dist/invocation.js.map +1 -0
  239. package/dist/json-event-stream.d.ts +9 -0
  240. package/dist/json-event-stream.d.ts.map +1 -0
  241. package/dist/json-event-stream.js +856 -0
  242. package/dist/json-event-stream.js.map +1 -0
  243. package/dist/launch.d.ts +12 -0
  244. package/dist/launch.d.ts.map +1 -0
  245. package/dist/launch.js +221 -0
  246. package/dist/launch.js.map +1 -0
  247. package/dist/mcp.d.ts +44 -0
  248. package/dist/mcp.d.ts.map +1 -0
  249. package/dist/mcp.js +12 -0
  250. package/dist/mcp.js.map +1 -0
  251. package/dist/metadata.d.ts +24 -0
  252. package/dist/metadata.d.ts.map +1 -0
  253. package/dist/metadata.js +100 -0
  254. package/dist/metadata.js.map +1 -0
  255. package/dist/mmd-routes.d.ts +12 -0
  256. package/dist/mmd-routes.d.ts.map +1 -0
  257. package/dist/mmd-routes.js +146 -0
  258. package/dist/mmd-routes.js.map +1 -0
  259. package/dist/model-registry.d.ts +120 -0
  260. package/dist/model-registry.d.ts.map +1 -0
  261. package/dist/model-registry.js +77 -0
  262. package/dist/model-registry.js.map +1 -0
  263. package/dist/models.d.ts +16 -0
  264. package/dist/models.d.ts.map +1 -0
  265. package/dist/models.js +93 -0
  266. package/dist/models.js.map +1 -0
  267. package/dist/opencode-log.d.ts +16 -0
  268. package/dist/opencode-log.d.ts.map +1 -0
  269. package/dist/opencode-log.js +163 -0
  270. package/dist/opencode-log.js.map +1 -0
  271. package/dist/paths.d.ts +3 -0
  272. package/dist/paths.d.ts.map +1 -0
  273. package/dist/paths.js +29 -0
  274. package/dist/paths.js.map +1 -0
  275. package/dist/pi-models.d.ts +13 -0
  276. package/dist/pi-models.d.ts.map +1 -0
  277. package/dist/pi-models.js +36 -0
  278. package/dist/pi-models.js.map +1 -0
  279. package/dist/prompt-augmenter.d.ts +60 -0
  280. package/dist/prompt-augmenter.d.ts.map +1 -0
  281. package/dist/prompt-augmenter.js +26 -0
  282. package/dist/prompt-augmenter.js.map +1 -0
  283. package/dist/prompt-budget.d.ts +20 -0
  284. package/dist/prompt-budget.d.ts.map +1 -0
  285. package/dist/prompt-budget.js +226 -0
  286. package/dist/prompt-budget.js.map +1 -0
  287. package/dist/prompt-file.d.ts +7 -0
  288. package/dist/prompt-file.d.ts.map +1 -0
  289. package/dist/prompt-file.js +27 -0
  290. package/dist/prompt-file.js.map +1 -0
  291. package/dist/providers/aihubmix.d.ts +99 -0
  292. package/dist/providers/aihubmix.d.ts.map +1 -0
  293. package/dist/providers/aihubmix.js +239 -0
  294. package/dist/providers/aihubmix.js.map +1 -0
  295. package/dist/providers/anthropic-messages.d.ts +116 -0
  296. package/dist/providers/anthropic-messages.d.ts.map +1 -0
  297. package/dist/providers/anthropic-messages.js +313 -0
  298. package/dist/providers/anthropic-messages.js.map +1 -0
  299. package/dist/providers/azure-chat.d.ts +99 -0
  300. package/dist/providers/azure-chat.d.ts.map +1 -0
  301. package/dist/providers/azure-chat.js +164 -0
  302. package/dist/providers/azure-chat.js.map +1 -0
  303. package/dist/providers/connection-guard.d.ts +67 -0
  304. package/dist/providers/connection-guard.d.ts.map +1 -0
  305. package/dist/providers/connection-guard.js +211 -0
  306. package/dist/providers/connection-guard.js.map +1 -0
  307. package/dist/providers/elevenlabs.d.ts +28 -0
  308. package/dist/providers/elevenlabs.d.ts.map +1 -0
  309. package/dist/providers/elevenlabs.js +138 -0
  310. package/dist/providers/elevenlabs.js.map +1 -0
  311. package/dist/providers/google-messages.d.ts +108 -0
  312. package/dist/providers/google-messages.d.ts.map +1 -0
  313. package/dist/providers/google-messages.js +284 -0
  314. package/dist/providers/google-messages.js.map +1 -0
  315. package/dist/providers/google.d.ts +20 -0
  316. package/dist/providers/google.d.ts.map +1 -0
  317. package/dist/providers/google.js +42 -0
  318. package/dist/providers/google.js.map +1 -0
  319. package/dist/providers/index.d.ts +39 -0
  320. package/dist/providers/index.d.ts.map +1 -0
  321. package/dist/providers/index.js +39 -0
  322. package/dist/providers/index.js.map +1 -0
  323. package/dist/providers/model-catalog.d.ts +32 -0
  324. package/dist/providers/model-catalog.d.ts.map +1 -0
  325. package/dist/providers/model-catalog.js +394 -0
  326. package/dist/providers/model-catalog.js.map +1 -0
  327. package/dist/providers/oauth-callback-server.d.ts +35 -0
  328. package/dist/providers/oauth-callback-server.d.ts.map +1 -0
  329. package/dist/providers/oauth-callback-server.js +217 -0
  330. package/dist/providers/oauth-callback-server.js.map +1 -0
  331. package/dist/providers/oauth-credentials.d.ts +29 -0
  332. package/dist/providers/oauth-credentials.d.ts.map +1 -0
  333. package/dist/providers/oauth-credentials.js +70 -0
  334. package/dist/providers/oauth-credentials.js.map +1 -0
  335. package/dist/providers/oauth-provider.d.ts +95 -0
  336. package/dist/providers/oauth-provider.d.ts.map +1 -0
  337. package/dist/providers/oauth-provider.js +130 -0
  338. package/dist/providers/oauth-provider.js.map +1 -0
  339. package/dist/providers/oauth-tokens.d.ts +35 -0
  340. package/dist/providers/oauth-tokens.d.ts.map +1 -0
  341. package/dist/providers/oauth-tokens.js +136 -0
  342. package/dist/providers/oauth-tokens.js.map +1 -0
  343. package/dist/providers/ollama-chat.d.ts +106 -0
  344. package/dist/providers/ollama-chat.d.ts.map +1 -0
  345. package/dist/providers/ollama-chat.js +292 -0
  346. package/dist/providers/ollama-chat.js.map +1 -0
  347. package/dist/providers/openai-chat.d.ts +147 -0
  348. package/dist/providers/openai-chat.d.ts.map +1 -0
  349. package/dist/providers/openai-chat.js +302 -0
  350. package/dist/providers/openai-chat.js.map +1 -0
  351. package/dist/providers/pkce.d.ts +81 -0
  352. package/dist/providers/pkce.d.ts.map +1 -0
  353. package/dist/providers/pkce.js +176 -0
  354. package/dist/providers/pkce.js.map +1 -0
  355. package/dist/providers/sse-decode.d.ts +47 -0
  356. package/dist/providers/sse-decode.d.ts.map +1 -0
  357. package/dist/providers/sse-decode.js +109 -0
  358. package/dist/providers/sse-decode.js.map +1 -0
  359. package/dist/providers/token-params.d.ts +29 -0
  360. package/dist/providers/token-params.d.ts.map +1 -0
  361. package/dist/providers/token-params.js +41 -0
  362. package/dist/providers/token-params.js.map +1 -0
  363. package/dist/providers/turn-end-guard.d.ts +37 -0
  364. package/dist/providers/turn-end-guard.d.ts.map +1 -0
  365. package/dist/providers/turn-end-guard.js +42 -0
  366. package/dist/providers/turn-end-guard.js.map +1 -0
  367. package/dist/providers/types.d.ts +36 -0
  368. package/dist/providers/types.d.ts.map +1 -0
  369. package/dist/providers/types.js +13 -0
  370. package/dist/providers/types.js.map +1 -0
  371. package/dist/qoder-stream.d.ts +19 -0
  372. package/dist/qoder-stream.d.ts.map +1 -0
  373. package/dist/qoder-stream.js +167 -0
  374. package/dist/qoder-stream.js.map +1 -0
  375. package/dist/registry.d.ts +5 -0
  376. package/dist/registry.d.ts.map +1 -0
  377. package/dist/registry.js +58 -0
  378. package/dist/registry.js.map +1 -0
  379. package/dist/resolution.d.ts +2 -0
  380. package/dist/resolution.d.ts.map +1 -0
  381. package/dist/resolution.js +19 -0
  382. package/dist/resolution.js.map +1 -0
  383. package/dist/role-marker-guard.d.ts +53 -0
  384. package/dist/role-marker-guard.d.ts.map +1 -0
  385. package/dist/role-marker-guard.js +280 -0
  386. package/dist/role-marker-guard.js.map +1 -0
  387. package/dist/telemetry-sink.d.ts +35 -0
  388. package/dist/telemetry-sink.d.ts.map +1 -0
  389. package/dist/telemetry-sink.js +5 -0
  390. package/dist/telemetry-sink.js.map +1 -0
  391. package/dist/terminal-launch.d.ts +11 -0
  392. package/dist/terminal-launch.d.ts.map +1 -0
  393. package/dist/terminal-launch.js +123 -0
  394. package/dist/terminal-launch.js.map +1 -0
  395. package/dist/types.d.ts +185 -0
  396. package/dist/types.d.ts.map +1 -0
  397. package/dist/types.js +2 -0
  398. package/dist/types.js.map +1 -0
  399. package/package.json +47 -0
@@ -0,0 +1,313 @@
1
+ /**
2
+ * @module providers/anthropic-messages
3
+ *
4
+ * Anthropic Messages API wire adapter + tool-loop turn-runner. Built fresh
5
+ * against Anthropic's real, current public API docs (`platform.claude.com/
6
+ * docs/en/build-with-claude/streaming`, `.../api/messages-streaming`),
7
+ * following this repo's established "verify against real API docs, don't
8
+ * guess from memory" convention (see `packages/deploy/src/netlify.ts`'s
9
+ * doc comment for the precedent) — not a byte-for-byte OD port. Only the
10
+ * *shape* is modeled on OD's `apps/daemon/src/routes/chat.ts`'s
11
+ * `runAnthropicToolTurn` (per `ADS-memory/reports/proposals/
12
+ * PROP-http-route-packs-chat-model-proxy-2026-07-21.md`, which read that
13
+ * 2267-line file directly and extracted its mechanism, line numbers, and
14
+ * two confirmed bugs — this task did not have access to the OD source
15
+ * itself). Extends this package's existing `providers/` pattern
16
+ * (`model-catalog.ts`'s BYOK request/response handling,
17
+ * `connection-guard.ts`'s SSRF guard + secret redaction,
18
+ * `role-marker-guard.ts`'s contamination detector, and the
19
+ * "one file per vendor's stream-parsing shape" precedent
20
+ * `claude-stream.ts`/`copilot-stream.ts`/`qoder-stream.ts` already
21
+ * establish) rather than duplicating any of that inside `@jini-ai/http` — see
22
+ * the proposal's "real question: where does provider-specific wire-protocol
23
+ * logic belong?" section for the placement decision this file implements.
24
+ *
25
+ * **Scope for this pass:** the Anthropic Messages API only (native
26
+ * `x-api-key`/`anthropic-version` auth), text + tool-use content blocks,
27
+ * and the tool-execution loop. Extended thinking is deliberately out of
28
+ * scope — this adapter never sends a `thinking` request parameter, so
29
+ * Anthropic never emits `thinking`/`signature_delta` content blocks in the
30
+ * response (per the streaming docs: thinking blocks are opt-in), which
31
+ * means there is nothing to parse. A future pass can add it by following
32
+ * `claude-stream.ts#emitSafeText`'s precedent (thinking is passed through
33
+ * *unguarded* — the role-marker guard only polices the user-visible text
34
+ * channel, since thinking content is never re-serialized as a transcript
35
+ * turn boundary).
36
+ *
37
+ * **Two confirmed OD bugs fixed here, not carried forward** (both per the
38
+ * proposal doc above):
39
+ * 1. **Product-identity leak.** OD's OpenRouter branch hardcoded
40
+ * `'HTTP-Referer': 'https://opendesign.dev'` / `'X-Title': 'Open Design'`.
41
+ * OpenRouter itself is out of scope this pass, but the fix generalizes:
42
+ * `AnthropicTurnOptions.extraHeaders` is the *only* way any caller-
43
+ * identifying header reaches the outbound request, and it is always
44
+ * caller-supplied — nothing in this module ever hardcodes a product or
45
+ * gateway identity string.
46
+ * 2. **Duplicate `end`-event bug.** OD's `runAnthropicToolTurn` had two
47
+ * independent `sse.send('end', {})` call sites (role-marker-guard
48
+ * contamination, and normal turn completion) with no `ended`-flag guard,
49
+ * unlike its sibling non-tool-loop streamers in the same file. This
50
+ * module uses the shared `turn-end-guard.ts#createTurnEndGuard` — see
51
+ * that module's doc for why the guard is extracted into its own
52
+ * directly-tested unit rather than a local closure here — from every
53
+ * exit path (contamination, normal stop, max-tool-turns, upstream/
54
+ * network error), guaranteeing exactly one `end` event per call. See
55
+ * `__tests__/anthropic-messages.test.ts`'s "never emits end twice" case
56
+ * for the integration-level regression proof.
57
+ */
58
+ import { createRoleMarkerGuard } from '../role-marker-guard.js';
59
+ import { redactSecrets, validateBaseUrl } from './connection-guard.js';
60
+ import { decodeSseStream } from './sse-decode.js';
61
+ import { createTurnEndGuard } from './turn-end-guard.js';
62
+ const DEFAULT_ANTHROPIC_BASE_URL = 'https://api.anthropic.com';
63
+ const DEFAULT_ANTHROPIC_VERSION = '2023-06-01';
64
+ const DEFAULT_MAX_TOOL_TURNS = 8;
65
+ function isRecord(value) {
66
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
67
+ }
68
+ function anthropicRequestUrl(baseUrl) {
69
+ const base = (baseUrl ?? DEFAULT_ANTHROPIC_BASE_URL).replace(/\/+$/, '');
70
+ return `${base}/v1/messages`;
71
+ }
72
+ function anthropicHeaders(options) {
73
+ return {
74
+ 'content-type': 'application/json',
75
+ 'x-api-key': options.apiKey,
76
+ 'anthropic-version': options.apiVersion ?? DEFAULT_ANTHROPIC_VERSION,
77
+ ...(options.extraHeaders ?? {}),
78
+ };
79
+ }
80
+ function anthropicRequestBody(options, messages) {
81
+ return {
82
+ model: options.model,
83
+ max_tokens: options.maxTokens,
84
+ stream: true,
85
+ messages,
86
+ ...(options.system !== undefined ? { system: options.system } : {}),
87
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
88
+ ...(options.tools && options.tools.length > 0 ? { tools: options.tools } : {}),
89
+ };
90
+ }
91
+ function extractAnthropicErrorDetail(rawText) {
92
+ try {
93
+ const parsed = JSON.parse(rawText);
94
+ if (isRecord(parsed) && isRecord(parsed.error) && typeof parsed.error.message === 'string') {
95
+ return parsed.error.message;
96
+ }
97
+ }
98
+ catch {
99
+ // Non-JSON error body — fall through to the raw text below.
100
+ }
101
+ return rawText.trim().slice(0, 500);
102
+ }
103
+ /** Runs exactly one Anthropic Messages API streaming request and reduces its SSE events into a single outcome. Calls `emitEnd` directly (and only) on contamination or a fatal request/stream error — the caller (`runAnthropicToolTurn`) is responsible for the normal-completion `emitEnd` call once the tool loop actually concludes, so the single `ended` flag stays the sole gate for every exit path. */
104
+ async function runSingleAnthropicRequest(options, messages, emitEnd) {
105
+ const { onEvent } = options;
106
+ const baseUrlCheck = validateBaseUrl(options.baseUrl ?? DEFAULT_ANTHROPIC_BASE_URL);
107
+ if (baseUrlCheck.error) {
108
+ onEvent({ type: 'error', message: baseUrlCheck.error });
109
+ emitEnd('error');
110
+ return { stopReason: null, toolCalls: [], text: '' };
111
+ }
112
+ let response;
113
+ try {
114
+ response = (await fetch(anthropicRequestUrl(options.baseUrl), {
115
+ method: 'POST',
116
+ headers: anthropicHeaders(options),
117
+ body: JSON.stringify(anthropicRequestBody(options, messages)),
118
+ ...(options.signal ? { signal: options.signal } : {}),
119
+ }));
120
+ }
121
+ catch (error) {
122
+ const message = error instanceof Error ? error.message : String(error);
123
+ onEvent({ type: 'error', message: redactSecrets(message, [options.apiKey]) });
124
+ emitEnd('error');
125
+ return { stopReason: null, toolCalls: [], text: '' };
126
+ }
127
+ if (!response.ok) {
128
+ const rawText = await response.text();
129
+ onEvent({
130
+ type: 'error',
131
+ message: redactSecrets(extractAnthropicErrorDetail(rawText), [options.apiKey]),
132
+ code: String(response.status),
133
+ });
134
+ emitEnd('error');
135
+ return { stopReason: null, toolCalls: [], text: '' };
136
+ }
137
+ if (!response.body) {
138
+ onEvent({ type: 'error', message: 'Anthropic response had no body' });
139
+ emitEnd('error');
140
+ return { stopReason: null, toolCalls: [], text: '' };
141
+ }
142
+ onEvent({ type: 'status', label: 'requesting' });
143
+ const guard = createRoleMarkerGuard('anthropic-turn');
144
+ const blocks = new Map();
145
+ const toolCalls = [];
146
+ let fullText = '';
147
+ let stopReason = null;
148
+ let usage = null;
149
+ for await (const frame of decodeSseStream(response.body)) {
150
+ // No `isEnded()` re-check at the top of this loop: every `emitEnd(...)` call site below is
151
+ // immediately followed by `break`, so `ended` can never be true when a new iteration starts
152
+ // — traced across all six call sites in this function (the four pre-loop early returns plus
153
+ // the two in-loop contamination/error branches below). Verified, not assumed; see
154
+ // `__tests__/anthropic-messages.test.ts`'s duplicate-end-event regression case.
155
+ let data;
156
+ try {
157
+ data = JSON.parse(frame.data);
158
+ }
159
+ catch {
160
+ continue; // tolerate a malformed/empty keep-alive frame
161
+ }
162
+ if (!isRecord(data))
163
+ continue;
164
+ const kind = typeof data.type === 'string' ? data.type : frame.event;
165
+ if (kind === 'content_block_start' && isRecord(data.content_block) && typeof data.index === 'number') {
166
+ const block = data.content_block;
167
+ if (block.type === 'text') {
168
+ blocks.set(data.index, { type: 'text', text: '', inputJson: '' });
169
+ }
170
+ else if (block.type === 'tool_use' && typeof block.id === 'string' && typeof block.name === 'string') {
171
+ blocks.set(data.index, { type: 'tool_use', text: '', toolId: block.id, toolName: block.name, inputJson: '' });
172
+ }
173
+ else {
174
+ blocks.set(data.index, { type: 'other', text: '', inputJson: '' });
175
+ }
176
+ continue;
177
+ }
178
+ if (kind === 'content_block_delta' && isRecord(data.delta) && typeof data.index === 'number') {
179
+ const state = blocks.get(data.index);
180
+ const delta = data.delta;
181
+ if (delta.type === 'text_delta' && typeof delta.text === 'string') {
182
+ if (state)
183
+ state.text += delta.text;
184
+ // No `guard.contaminated` pre-check here: the only way it can become
185
+ // true is the `emitEnd('contaminated'); break;` a few lines below,
186
+ // which exits this loop immediately — a later text_delta in the same
187
+ // request can never reach this point already contaminated. (`feedText`
188
+ // itself is still safe to call unconditionally regardless — it
189
+ // early-returns `''` once contaminated, per its own doc.)
190
+ const safe = guard.feedText(delta.text);
191
+ if (safe.length > 0) {
192
+ fullText += safe;
193
+ onEvent({ type: 'text_delta', delta: safe });
194
+ }
195
+ if (guard.contaminated) {
196
+ const warn = guard.warningEvent();
197
+ if (warn)
198
+ onEvent(warn);
199
+ emitEnd('contaminated');
200
+ break;
201
+ }
202
+ }
203
+ else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string' && state) {
204
+ state.inputJson += delta.partial_json;
205
+ }
206
+ continue;
207
+ }
208
+ if (kind === 'content_block_stop' && typeof data.index === 'number') {
209
+ const state = blocks.get(data.index);
210
+ if (state?.type === 'tool_use' && state.toolId && state.toolName) {
211
+ let input = {};
212
+ if (state.inputJson.trim()) {
213
+ try {
214
+ input = JSON.parse(state.inputJson);
215
+ }
216
+ catch {
217
+ input = {};
218
+ }
219
+ }
220
+ const call = { id: state.toolId, name: state.toolName, input };
221
+ toolCalls.push(call);
222
+ onEvent({ type: 'tool_use', id: call.id, name: call.name, input: call.input });
223
+ }
224
+ blocks.delete(data.index);
225
+ continue;
226
+ }
227
+ if (kind === 'message_delta') {
228
+ if (isRecord(data.delta) && typeof data.delta.stop_reason === 'string') {
229
+ stopReason = data.delta.stop_reason;
230
+ }
231
+ if (isRecord(data.usage)) {
232
+ usage = data.usage;
233
+ onEvent({ type: 'usage', usage });
234
+ }
235
+ continue;
236
+ }
237
+ if (kind === 'error') {
238
+ const errorDetail = isRecord(data.error) && typeof data.error.message === 'string' ? data.error.message : 'upstream error';
239
+ const errorType = isRecord(data.error) && typeof data.error.type === 'string' ? data.error.type : undefined;
240
+ onEvent({ type: 'error', message: redactSecrets(errorDetail, [options.apiKey]), ...(errorType ? { code: errorType } : {}) });
241
+ emitEnd('error');
242
+ break;
243
+ }
244
+ // `message_start`, `message_stop`, `ping`, and any future event type per
245
+ // Anthropic's own versioning policy ("your code should handle unknown
246
+ // event types gracefully") — nothing to do.
247
+ }
248
+ return { stopReason, toolCalls, text: fullText };
249
+ }
250
+ /**
251
+ * Runs a full Anthropic Messages API turn, including the tool-execution
252
+ * loop when `options.executeTool` is supplied and the model requests tool
253
+ * use. Emits a generic event stream via `options.onEvent` — a caller (e.g.
254
+ * `@jini-ai/http`'s `model-proxy.ts`) adapts those events onto an outbound SSE
255
+ * channel; this module has no knowledge of HTTP/Express.
256
+ *
257
+ * Guarantees exactly one `{type: 'end'}` event per call, regardless of which
258
+ * of the four exit paths (contamination, normal stop, max-tool-turns,
259
+ * request/stream error) triggers it — the fix for OD's confirmed duplicate-
260
+ * `end`-event bug (see module doc).
261
+ */
262
+ export async function runAnthropicToolTurn(options) {
263
+ const maxToolTurns = options.maxToolTurns ?? DEFAULT_MAX_TOOL_TURNS;
264
+ const endGuard = createTurnEndGuard(options.onEvent, (reason) => ({ type: 'end', reason }));
265
+ const emitEnd = endGuard.emitEnd;
266
+ let messages = options.messages.slice();
267
+ let toolTurns = 0;
268
+ let lastStopReason = null;
269
+ while (true) {
270
+ const outcome = await runSingleAnthropicRequest(options, messages, emitEnd);
271
+ lastStopReason = outcome.stopReason;
272
+ if (endGuard.hasEnded())
273
+ break;
274
+ if (outcome.stopReason !== 'tool_use' || outcome.toolCalls.length === 0) {
275
+ emitEnd('stop');
276
+ break;
277
+ }
278
+ if (!options.executeTool) {
279
+ // Pending tool calls were already emitted as `tool_use` events above;
280
+ // with no executor to run them, the turn ends here rather than
281
+ // silently retrying forever.
282
+ emitEnd('stop');
283
+ break;
284
+ }
285
+ if (toolTurns >= maxToolTurns) {
286
+ emitEnd('max_tool_turns');
287
+ break;
288
+ }
289
+ toolTurns += 1;
290
+ const assistantContent = [
291
+ ...(outcome.text ? [{ type: 'text', text: outcome.text }] : []),
292
+ ...outcome.toolCalls.map((call) => ({ type: 'tool_use', id: call.id, name: call.name, input: call.input })),
293
+ ];
294
+ const toolResultBlocks = [];
295
+ for (const call of outcome.toolCalls) {
296
+ const result = await options.executeTool(call);
297
+ options.onEvent({ type: 'tool_result', toolUseId: call.id, content: result.content, isError: result.isError ?? false });
298
+ toolResultBlocks.push({
299
+ type: 'tool_result',
300
+ tool_use_id: call.id,
301
+ content: result.content,
302
+ ...(result.isError !== undefined ? { is_error: result.isError } : {}),
303
+ });
304
+ }
305
+ messages = [
306
+ ...messages,
307
+ { role: 'assistant', content: assistantContent },
308
+ { role: 'user', content: toolResultBlocks },
309
+ ];
310
+ }
311
+ return { stopReason: lastStopReason, toolTurns };
312
+ }
313
+ //# sourceMappingURL=anthropic-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic-messages.js","sourceRoot":"","sources":["../../src/providers/anthropic-messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { type TurnEndReason } from './turn-end-guard.js';
2
+ export interface AzureFunctionToolDef {
3
+ readonly type: 'function';
4
+ readonly function: {
5
+ readonly name: string;
6
+ readonly description?: string;
7
+ readonly parameters: Record<string, unknown>;
8
+ };
9
+ }
10
+ export interface AzureToolCallParam {
11
+ readonly id: string;
12
+ readonly type: 'function';
13
+ readonly function: {
14
+ readonly name: string;
15
+ readonly arguments: string;
16
+ };
17
+ }
18
+ export interface AzureMessageParam {
19
+ readonly role: 'system' | 'user' | 'assistant' | 'tool';
20
+ readonly content: string | null;
21
+ readonly tool_calls?: readonly AzureToolCallParam[];
22
+ readonly tool_call_id?: string;
23
+ readonly name?: string;
24
+ }
25
+ export interface AzureToolCall {
26
+ readonly id: string;
27
+ readonly name: string;
28
+ readonly input: unknown;
29
+ }
30
+ export interface AzureToolResult {
31
+ readonly content: string;
32
+ }
33
+ /** Host-owned tool execution — same "the collaborator is always supplied" convention as `anthropic-messages.ts#AnthropicToolExecutor`. */
34
+ export type AzureToolExecutor = (call: AzureToolCall) => Promise<AzureToolResult>;
35
+ export type AzureTurnEndReason = TurnEndReason;
36
+ export type AzureTurnEvent = {
37
+ readonly type: 'status';
38
+ readonly label: string;
39
+ } | {
40
+ readonly type: 'text_delta';
41
+ readonly delta: string;
42
+ } | {
43
+ readonly type: 'tool_use';
44
+ readonly id: string;
45
+ readonly name: string;
46
+ readonly input: unknown;
47
+ } | {
48
+ readonly type: 'tool_result';
49
+ readonly toolUseId: string;
50
+ readonly content: string;
51
+ readonly isError: boolean;
52
+ } | {
53
+ readonly type: 'usage';
54
+ readonly usage: Record<string, unknown> | null;
55
+ } | {
56
+ readonly type: 'fabricated_role_marker';
57
+ readonly marker: string;
58
+ readonly messageId: string;
59
+ } | {
60
+ readonly type: 'error';
61
+ readonly message: string;
62
+ readonly code?: string;
63
+ } | {
64
+ readonly type: 'end';
65
+ readonly reason: AzureTurnEndReason;
66
+ };
67
+ export interface AzureTurnOptions {
68
+ readonly apiKey: string;
69
+ /** Required — every Azure OpenAI resource has its own endpoint, so there is no sane global default (see module doc). */
70
+ readonly baseUrl: string;
71
+ /** The Azure OpenAI *deployment name* (not a raw model id). */
72
+ readonly model: string;
73
+ /** Defaults to `'2024-10-21'` — see module doc for provenance. */
74
+ readonly apiVersion?: string;
75
+ readonly messages: readonly AzureMessageParam[];
76
+ readonly tools?: readonly AzureFunctionToolDef[];
77
+ readonly temperature?: number;
78
+ /** Defaults to 8192 when omitted or not a positive number — a token limit is always sent, matching OD's real `azure` proxy handler (see module doc). */
79
+ readonly maxTokens?: number;
80
+ /** Same bound and rationale as `AnthropicTurnOptions.maxToolTurns`. Defaults to 8. */
81
+ readonly maxToolTurns?: number;
82
+ readonly executeTool?: AzureToolExecutor;
83
+ readonly onEvent: (event: AzureTurnEvent) => void;
84
+ readonly signal?: AbortSignal;
85
+ /** Caller-supplied extra headers — see `anthropic-messages.ts#AnthropicTurnOptions.extraHeaders`'s doc for why this exists and what it fixes. */
86
+ readonly extraHeaders?: Record<string, string>;
87
+ }
88
+ export interface AzureTurnResult {
89
+ readonly finishReason: string | null;
90
+ readonly toolTurns: number;
91
+ }
92
+ /**
93
+ * Runs a full Azure OpenAI Chat Completions turn, including the
94
+ * tool-execution loop when `options.executeTool` is supplied and the model
95
+ * requests a function call. See `anthropic-messages.ts#runAnthropicToolTurn`'s
96
+ * doc for the shared event-stream/`ended`-flag contract this mirrors exactly.
97
+ */
98
+ export declare function runAzureToolTurn(options: AzureTurnOptions): Promise<AzureTurnResult>;
99
+ //# sourceMappingURL=azure-chat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-chat.d.ts","sourceRoot":"","sources":["../../src/providers/azure-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * @module providers/azure-chat
3
+ *
4
+ * Azure OpenAI Chat Completions wire adapter + tool-loop turn-runner.
5
+ * Sibling of `anthropic-messages.ts`/`openai-chat.ts` — see those modules'
6
+ * headers for the shared design rationale. Azure OpenAI's chat-completions
7
+ * JSON request/response body is byte-identical to plain OpenAI's (same
8
+ * `messages`/`tools`/streaming-delta shape) — only the URL and the auth
9
+ * header differ — so this module reuses `openai-chat.ts`'s extracted
10
+ * `runOpenAiCompatibleRequest` SSE-reduction loop rather than duplicating
11
+ * it; see that function's doc for why it was pulled out.
12
+ *
13
+ * **URL**: `{baseUrl}/openai/deployments/{model}/chat/completions
14
+ * ?api-version={apiVersion}` — `model` here is the Azure *deployment name*,
15
+ * not a model id (Azure OpenAI resources map a deployment name to a
16
+ * specific model version at resource-creation time). `apiVersion` defaults
17
+ * to `'2024-10-21'`, the default this repo's real OD predecessor used for
18
+ * its own azure chat-completions proxy route (`apps/daemon/src/routes/
19
+ * chat.ts`'s `[proxy:azure]` handler, confirmed by reading that file
20
+ * directly in a sibling checkout — see `source-map.md`'s dated entry).
21
+ * That source additionally branches on whether `baseUrl` already contains
22
+ * a versioned `/openai/v1` path (a newer Azure OpenAI API preview); that
23
+ * branch is deliberately not carried forward here — this adapter targets
24
+ * the one documented, stable URL/body shape per this task's approved scope
25
+ * ("byte-identical to OpenAI, only URL/auth differ"). Its 400-retry
26
+ * behavior IS carried forward (see "Token-limit fix" below) — round-4
27
+ * external audit (`AUD-R4-001`) found the first port had dropped it,
28
+ * which fails every request against a GPT-5/o-series Azure deployment.
29
+ *
30
+ * **Auth**: `api-key: {apiKey}` header — NOT `Authorization: Bearer`,
31
+ * Azure OpenAI's own convention (also confirmed against the same OD
32
+ * source above).
33
+ *
34
+ * **No default `baseUrl`**: every Azure OpenAI resource has its own
35
+ * endpoint (`https://{resource}.openai.azure.com`), so unlike Anthropic/
36
+ * OpenAI/Google/Ollama, `baseUrl` is a required field on
37
+ * {@link AzureTurnOptions}, and `apiVersion` is validated as
38
+ * non-empty-if-supplied by the caller (`@jini-ai/http`'s
39
+ * `parseAzureProxyRequest` — see that module).
40
+ *
41
+ * **Token-limit fix**: an earlier version of this module sent no token-limit
42
+ * field at all — a live comparison against a running Open Design daemon
43
+ * found OD's real `azure` proxy handler always sends `max_tokens` (defaulting
44
+ * to 8192), unconditionally the legacy field name — never the newer
45
+ * `max_completion_tokens` `openai-chat.ts` picks for GPT-5/o-series models,
46
+ * since Azure deployment names are caller-defined strings, not necessarily
47
+ * matching OpenAI's own model-naming scheme. Wired via
48
+ * `./token-params.js#buildLegacyMaxTokensParam`. Because deployment names
49
+ * are opaque, a legacy-field request can still be rejected by a
50
+ * GPT-5/o-series deployment with a 400 — OD's real handler retries exactly
51
+ * once with `max_completion_tokens` on that specific error
52
+ * (`isUnsupportedMaxTokensError`); this module does the same via
53
+ * `runOpenAiCompatibleRequest`'s `retryableBody` hook.
54
+ */
55
+ import { defaultDnsLookup, validateBaseUrlResolved } from './connection-guard.js';
56
+ import { runOpenAiCompatibleRequest } from './openai-chat.js';
57
+ import { buildLegacyMaxTokensParam, buildMaxCompletionTokensParam, isUnsupportedMaxTokensError } from './token-params.js';
58
+ import { createTurnEndGuard } from './turn-end-guard.js';
59
+ const DEFAULT_AZURE_API_VERSION = '2024-10-21';
60
+ const DEFAULT_MAX_TOOL_TURNS = 8;
61
+ /** Matches OD's real azure handler's default when `maxTokens` isn't supplied — see module doc. */
62
+ const DEFAULT_AZURE_MAX_TOKENS = 8192;
63
+ function azureRequestUrl(baseUrl, model, apiVersion) {
64
+ const base = baseUrl.replace(/\/+$/, '');
65
+ const version = apiVersion && apiVersion.trim() ? apiVersion.trim() : DEFAULT_AZURE_API_VERSION;
66
+ return `${base}/openai/deployments/${encodeURIComponent(model)}/chat/completions?api-version=${encodeURIComponent(version)}`;
67
+ }
68
+ function azureHeaders(options) {
69
+ return {
70
+ 'content-type': 'application/json',
71
+ 'api-key': options.apiKey,
72
+ ...(options.extraHeaders ?? {}),
73
+ };
74
+ }
75
+ function effectiveAzureMaxTokens(options) {
76
+ return typeof options.maxTokens === 'number' && options.maxTokens > 0 ? options.maxTokens : DEFAULT_AZURE_MAX_TOKENS;
77
+ }
78
+ /** `tokenParam` is injected so the 400-retry path (see module doc) can rebuild an otherwise-identical body with `max_completion_tokens` instead of `max_tokens`. */
79
+ function azureRequestBody(options, messages, tokenParam) {
80
+ return {
81
+ stream: true,
82
+ stream_options: { include_usage: true },
83
+ messages,
84
+ ...tokenParam,
85
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
86
+ ...(options.tools && options.tools.length > 0 ? { tools: options.tools } : {}),
87
+ };
88
+ }
89
+ /** Validates `options.baseUrl`, then delegates to `openai-chat.ts#runOpenAiCompatibleRequest` with Azure's own URL/header/body builders. */
90
+ async function runSingleAzureRequest(options, messages, emitEnd, hasEnded) {
91
+ const baseUrlCheck = await validateBaseUrlResolved(options.baseUrl, defaultDnsLookup);
92
+ if (baseUrlCheck.error) {
93
+ options.onEvent({ type: 'error', message: baseUrlCheck.error });
94
+ emitEnd('error');
95
+ return { finishReason: null, toolCalls: [], text: '' };
96
+ }
97
+ const maxTokens = effectiveAzureMaxTokens(options);
98
+ return runOpenAiCompatibleRequest({
99
+ url: azureRequestUrl(options.baseUrl, options.model, options.apiVersion),
100
+ headers: azureHeaders(options),
101
+ body: azureRequestBody(options, messages, buildLegacyMaxTokensParam(maxTokens)),
102
+ retryableBody: (status, rawErrorText) => status === 400 && isUnsupportedMaxTokensError(rawErrorText)
103
+ ? azureRequestBody(options, messages, buildMaxCompletionTokensParam(maxTokens))
104
+ : null,
105
+ ...(options.signal ? { signal: options.signal } : {}),
106
+ redactSecretsList: [options.apiKey],
107
+ guardMessageId: 'azure-turn',
108
+ providerLabel: 'Azure OpenAI',
109
+ onEvent: options.onEvent,
110
+ emitEnd,
111
+ hasEnded,
112
+ });
113
+ }
114
+ /**
115
+ * Runs a full Azure OpenAI Chat Completions turn, including the
116
+ * tool-execution loop when `options.executeTool` is supplied and the model
117
+ * requests a function call. See `anthropic-messages.ts#runAnthropicToolTurn`'s
118
+ * doc for the shared event-stream/`ended`-flag contract this mirrors exactly.
119
+ */
120
+ export async function runAzureToolTurn(options) {
121
+ const maxToolTurns = options.maxToolTurns ?? DEFAULT_MAX_TOOL_TURNS;
122
+ const endGuard = createTurnEndGuard(options.onEvent, (reason) => ({ type: 'end', reason }));
123
+ const emitEnd = endGuard.emitEnd;
124
+ let messages = options.messages.slice();
125
+ let toolTurns = 0;
126
+ let lastFinishReason = null;
127
+ while (true) {
128
+ const outcome = await runSingleAzureRequest(options, messages, emitEnd, endGuard.hasEnded);
129
+ lastFinishReason = outcome.finishReason;
130
+ if (endGuard.hasEnded())
131
+ break;
132
+ if (outcome.finishReason !== 'tool_calls' || outcome.toolCalls.length === 0) {
133
+ emitEnd('stop');
134
+ break;
135
+ }
136
+ if (!options.executeTool) {
137
+ emitEnd('stop');
138
+ break;
139
+ }
140
+ if (toolTurns >= maxToolTurns) {
141
+ emitEnd('max_tool_turns');
142
+ break;
143
+ }
144
+ toolTurns += 1;
145
+ const assistantToolCalls = outcome.toolCalls.map((call) => ({
146
+ id: call.id,
147
+ type: 'function',
148
+ function: { name: call.name, arguments: JSON.stringify(call.input) },
149
+ }));
150
+ const toolResultMessages = [];
151
+ for (const call of outcome.toolCalls) {
152
+ const result = await options.executeTool(call);
153
+ options.onEvent({ type: 'tool_result', toolUseId: call.id, content: result.content, isError: false });
154
+ toolResultMessages.push({ role: 'tool', content: result.content, tool_call_id: call.id });
155
+ }
156
+ messages = [
157
+ ...messages,
158
+ { role: 'assistant', content: outcome.text || null, tool_calls: assistantToolCalls },
159
+ ...toolResultMessages,
160
+ ];
161
+ }
162
+ return { finishReason: lastFinishReason, toolTurns };
163
+ }
164
+ //# sourceMappingURL=azure-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure-chat.js","sourceRoot":"","sources":["../../src/providers/azure-chat.ts"],"names":[],"mappings":"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"}