@prometheus-ai/ai 0.5.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 (369) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1184 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth-broker/client.d.ts +66 -0
  5. package/dist/types/auth-broker/index.d.ts +6 -0
  6. package/dist/types/auth-broker/refresher.d.ts +25 -0
  7. package/dist/types/auth-broker/remote-store.d.ts +101 -0
  8. package/dist/types/auth-broker/server.d.ts +32 -0
  9. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  10. package/dist/types/auth-broker/types.d.ts +107 -0
  11. package/dist/types/auth-broker/wire-schemas.d.ts +412 -0
  12. package/dist/types/auth-gateway/http.d.ts +39 -0
  13. package/dist/types/auth-gateway/index.d.ts +3 -0
  14. package/dist/types/auth-gateway/server.d.ts +36 -0
  15. package/dist/types/auth-gateway/types.d.ts +117 -0
  16. package/dist/types/auth-storage.d.ts +762 -0
  17. package/dist/types/index.d.ts +49 -0
  18. package/dist/types/model-cache.d.ts +17 -0
  19. package/dist/types/model-manager.d.ts +64 -0
  20. package/dist/types/model-thinking.d.ts +100 -0
  21. package/dist/types/models.d.ts +12 -0
  22. package/dist/types/provider-details.d.ts +24 -0
  23. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  24. package/dist/types/provider-models/descriptors.d.ts +50 -0
  25. package/dist/types/provider-models/google.d.ts +24 -0
  26. package/dist/types/provider-models/index.d.ts +5 -0
  27. package/dist/types/provider-models/ollama.d.ts +7 -0
  28. package/dist/types/provider-models/openai-compat.d.ts +323 -0
  29. package/dist/types/provider-models/special.d.ts +16 -0
  30. package/dist/types/providers/amazon-bedrock.d.ts +38 -0
  31. package/dist/types/providers/anthropic-client.d.ts +99 -0
  32. package/dist/types/providers/anthropic-messages-server-schema.d.ts +465 -0
  33. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  34. package/dist/types/providers/anthropic-wire.d.ts +262 -0
  35. package/dist/types/providers/anthropic.d.ts +206 -0
  36. package/dist/types/providers/aws-credentials.d.ts +43 -0
  37. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  38. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  39. package/dist/types/providers/azure-openai-responses.d.ts +15 -0
  40. package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
  41. package/dist/types/providers/cursor.d.ts +43 -0
  42. package/dist/types/providers/error-message.d.ts +27 -0
  43. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  44. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  45. package/dist/types/providers/google-auth.d.ts +24 -0
  46. package/dist/types/providers/google-gemini-cli.d.ts +81 -0
  47. package/dist/types/providers/google-gemini-headers.d.ts +18 -0
  48. package/dist/types/providers/google-shared.d.ts +171 -0
  49. package/dist/types/providers/google-types.d.ts +138 -0
  50. package/dist/types/providers/google-vertex.d.ts +7 -0
  51. package/dist/types/providers/google.d.ts +4 -0
  52. package/dist/types/providers/grammar.d.ts +1 -0
  53. package/dist/types/providers/kimi.d.ts +27 -0
  54. package/dist/types/providers/mock.d.ts +173 -0
  55. package/dist/types/providers/ollama.d.ts +6 -0
  56. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  57. package/dist/types/providers/openai-chat-server-schema.d.ts +817 -0
  58. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  59. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  60. package/dist/types/providers/openai-codex/request-transformer.d.ts +49 -0
  61. package/dist/types/providers/openai-codex/response-handler.d.ts +17 -0
  62. package/dist/types/providers/openai-codex-responses.d.ts +67 -0
  63. package/dist/types/providers/openai-completions-compat.d.ts +27 -0
  64. package/dist/types/providers/openai-completions.d.ts +54 -0
  65. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  66. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  67. package/dist/types/providers/openai-responses-shared.d.ts +105 -0
  68. package/dist/types/providers/openai-responses.d.ts +66 -0
  69. package/dist/types/providers/prometheus-native-client.d.ts +13 -0
  70. package/dist/types/providers/prometheus-native-server.d.ts +68 -0
  71. package/dist/types/providers/register-builtins.d.ts +31 -0
  72. package/dist/types/providers/synthetic.d.ts +26 -0
  73. package/dist/types/providers/transform-messages.d.ts +12 -0
  74. package/dist/types/providers/vision-guard.d.ts +20 -0
  75. package/dist/types/providers/xai-responses.d.ts +23 -0
  76. package/dist/types/rate-limit-utils.d.ts +19 -0
  77. package/dist/types/stream.d.ts +28 -0
  78. package/dist/types/types.d.ts +819 -0
  79. package/dist/types/usage/claude.d.ts +4 -0
  80. package/dist/types/usage/gemini.d.ts +2 -0
  81. package/dist/types/usage/github-copilot.d.ts +7 -0
  82. package/dist/types/usage/google-antigravity.d.ts +2 -0
  83. package/dist/types/usage/kimi.d.ts +2 -0
  84. package/dist/types/usage/minimax-code.d.ts +2 -0
  85. package/dist/types/usage/openai-codex.d.ts +3 -0
  86. package/dist/types/usage/shared.d.ts +1 -0
  87. package/dist/types/usage/zai.d.ts +2 -0
  88. package/dist/types/usage.d.ts +260 -0
  89. package/dist/types/utils/abort.d.ts +19 -0
  90. package/dist/types/utils/abortable-iterator.d.ts +4 -0
  91. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  92. package/dist/types/utils/discovery/antigravity.d.ts +61 -0
  93. package/dist/types/utils/discovery/codex.d.ts +38 -0
  94. package/dist/types/utils/discovery/cursor.d.ts +23 -0
  95. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  96. package/dist/types/utils/discovery/index.d.ts +4 -0
  97. package/dist/types/utils/discovery/openai-compatible.d.ts +72 -0
  98. package/dist/types/utils/event-stream.d.ts +28 -0
  99. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  100. package/dist/types/utils/foundry.d.ts +1 -0
  101. package/dist/types/utils/http-inspector.d.ts +31 -0
  102. package/dist/types/utils/idle-iterator.d.ts +78 -0
  103. package/dist/types/utils/json-parse.d.ts +37 -0
  104. package/dist/types/utils/oauth/__tests__/xai-oauth.test.d.ts +1 -0
  105. package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
  106. package/dist/types/utils/oauth/anthropic.d.ts +22 -0
  107. package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
  108. package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
  109. package/dist/types/utils/oauth/callback-server.d.ts +57 -0
  110. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  111. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  112. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  113. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  114. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  115. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  116. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  117. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  118. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  119. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  120. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  121. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  122. package/dist/types/utils/oauth/index.d.ts +38 -0
  123. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  124. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  125. package/dist/types/utils/oauth/kimi.d.ts +21 -0
  126. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  127. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  128. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  129. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  130. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  131. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  132. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  133. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  134. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  135. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  136. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  137. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  138. package/dist/types/utils/oauth/perplexity.d.ts +9 -0
  139. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  140. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  141. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  142. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  143. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  144. package/dist/types/utils/oauth/together.d.ts +1 -0
  145. package/dist/types/utils/oauth/types.d.ts +44 -0
  146. package/dist/types/utils/oauth/venice.d.ts +18 -0
  147. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  148. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  149. package/dist/types/utils/oauth/wafer.d.ts +2 -0
  150. package/dist/types/utils/oauth/xai-oauth.d.ts +60 -0
  151. package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
  152. package/dist/types/utils/oauth/zai.d.ts +18 -0
  153. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  154. package/dist/types/utils/oauth/zhipu.d.ts +18 -0
  155. package/dist/types/utils/overflow.d.ts +54 -0
  156. package/dist/types/utils/parse-bind.d.ts +23 -0
  157. package/dist/types/utils/provider-response.d.ts +3 -0
  158. package/dist/types/utils/request-debug.d.ts +29 -0
  159. package/dist/types/utils/retry-after.d.ts +3 -0
  160. package/dist/types/utils/retry.d.ts +26 -0
  161. package/dist/types/utils/schema/adapt.d.ts +24 -0
  162. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  163. package/dist/types/utils/schema/dereference.d.ts +11 -0
  164. package/dist/types/utils/schema/draft.d.ts +10 -0
  165. package/dist/types/utils/schema/equality.d.ts +4 -0
  166. package/dist/types/utils/schema/fields.d.ts +49 -0
  167. package/dist/types/utils/schema/index.d.ts +13 -0
  168. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  169. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  170. package/dist/types/utils/schema/normalize.d.ts +93 -0
  171. package/dist/types/utils/schema/spill.d.ts +8 -0
  172. package/dist/types/utils/schema/stamps.d.ts +25 -0
  173. package/dist/types/utils/schema/types.d.ts +4 -0
  174. package/dist/types/utils/schema/wire.d.ts +53 -0
  175. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  176. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  177. package/dist/types/utils/sse-debug.d.ts +10 -0
  178. package/dist/types/utils/stream-markup-healing.d.ts +80 -0
  179. package/dist/types/utils/tool-choice.d.ts +50 -0
  180. package/dist/types/utils/validation.d.ts +17 -0
  181. package/dist/types/utils.d.ts +28 -0
  182. package/package.json +142 -0
  183. package/src/api-registry.ts +96 -0
  184. package/src/auth-broker/client.ts +358 -0
  185. package/src/auth-broker/index.ts +6 -0
  186. package/src/auth-broker/refresher.ts +117 -0
  187. package/src/auth-broker/remote-store.ts +637 -0
  188. package/src/auth-broker/server.ts +644 -0
  189. package/src/auth-broker/snapshot-cache.ts +174 -0
  190. package/src/auth-broker/types.ts +130 -0
  191. package/src/auth-broker/wire-schemas.ts +200 -0
  192. package/src/auth-gateway/http.ts +194 -0
  193. package/src/auth-gateway/index.ts +3 -0
  194. package/src/auth-gateway/server.ts +822 -0
  195. package/src/auth-gateway/types.ts +143 -0
  196. package/src/auth-storage.ts +4608 -0
  197. package/src/index.ts +54 -0
  198. package/src/model-cache.ts +129 -0
  199. package/src/model-manager.ts +469 -0
  200. package/src/model-thinking.ts +756 -0
  201. package/src/models.json +60287 -0
  202. package/src/models.json.d.ts +9 -0
  203. package/src/models.ts +56 -0
  204. package/src/prompts/turn-aborted-guidance.md +4 -0
  205. package/src/provider-details.ts +90 -0
  206. package/src/provider-models/bundled-references.ts +38 -0
  207. package/src/provider-models/descriptors.ts +364 -0
  208. package/src/provider-models/google.ts +88 -0
  209. package/src/provider-models/index.ts +5 -0
  210. package/src/provider-models/ollama.ts +153 -0
  211. package/src/provider-models/openai-compat.ts +2904 -0
  212. package/src/provider-models/special.ts +67 -0
  213. package/src/providers/amazon-bedrock.ts +873 -0
  214. package/src/providers/anthropic-client.ts +318 -0
  215. package/src/providers/anthropic-messages-server-schema.ts +243 -0
  216. package/src/providers/anthropic-messages-server.ts +681 -0
  217. package/src/providers/anthropic-wire.ts +268 -0
  218. package/src/providers/anthropic.ts +3106 -0
  219. package/src/providers/aws-credentials.ts +501 -0
  220. package/src/providers/aws-eventstream.ts +185 -0
  221. package/src/providers/aws-sigv4.ts +218 -0
  222. package/src/providers/azure-openai-responses.ts +361 -0
  223. package/src/providers/cursor/gen/agent_pb.ts +15274 -0
  224. package/src/providers/cursor/proto/agent.proto +3526 -0
  225. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  226. package/src/providers/cursor/proto/buf.yaml +17 -0
  227. package/src/providers/cursor.ts +2621 -0
  228. package/src/providers/error-message.ts +21 -0
  229. package/src/providers/github-copilot-headers.ts +140 -0
  230. package/src/providers/gitlab-duo.ts +372 -0
  231. package/src/providers/google-auth.ts +252 -0
  232. package/src/providers/google-gemini-cli.ts +809 -0
  233. package/src/providers/google-gemini-headers.ts +41 -0
  234. package/src/providers/google-shared.ts +917 -0
  235. package/src/providers/google-types.ts +167 -0
  236. package/src/providers/google-vertex.ts +91 -0
  237. package/src/providers/google.ts +41 -0
  238. package/src/providers/grammar.ts +70 -0
  239. package/src/providers/kimi.ts +52 -0
  240. package/src/providers/mock.ts +496 -0
  241. package/src/providers/ollama.ts +644 -0
  242. package/src/providers/openai-anthropic-shim.ts +138 -0
  243. package/src/providers/openai-chat-server-schema.ts +252 -0
  244. package/src/providers/openai-chat-server.ts +647 -0
  245. package/src/providers/openai-codex/constants.ts +43 -0
  246. package/src/providers/openai-codex/request-transformer.ts +161 -0
  247. package/src/providers/openai-codex/response-handler.ts +81 -0
  248. package/src/providers/openai-codex-responses.ts +3027 -0
  249. package/src/providers/openai-completions-compat.ts +320 -0
  250. package/src/providers/openai-completions.ts +2002 -0
  251. package/src/providers/openai-responses-server-schema.ts +290 -0
  252. package/src/providers/openai-responses-server.ts +1183 -0
  253. package/src/providers/openai-responses-shared.ts +956 -0
  254. package/src/providers/openai-responses.ts +679 -0
  255. package/src/providers/prometheus-native-client.ts +228 -0
  256. package/src/providers/prometheus-native-server.ts +212 -0
  257. package/src/providers/register-builtins.ts +457 -0
  258. package/src/providers/synthetic.ts +50 -0
  259. package/src/providers/transform-messages.ts +382 -0
  260. package/src/providers/vision-guard.ts +52 -0
  261. package/src/providers/xai-responses.ts +82 -0
  262. package/src/rate-limit-utils.ts +91 -0
  263. package/src/stream.ts +1068 -0
  264. package/src/types.ts +965 -0
  265. package/src/usage/claude.ts +482 -0
  266. package/src/usage/gemini.ts +250 -0
  267. package/src/usage/github-copilot.ts +421 -0
  268. package/src/usage/google-antigravity.ts +201 -0
  269. package/src/usage/kimi.ts +271 -0
  270. package/src/usage/minimax-code.ts +31 -0
  271. package/src/usage/openai-codex.ts +503 -0
  272. package/src/usage/shared.ts +10 -0
  273. package/src/usage/zai.ts +247 -0
  274. package/src/usage.ts +185 -0
  275. package/src/utils/abort.ts +51 -0
  276. package/src/utils/abortable-iterator.ts +69 -0
  277. package/src/utils/anthropic-auth.ts +93 -0
  278. package/src/utils/discovery/antigravity.ts +261 -0
  279. package/src/utils/discovery/codex.ts +371 -0
  280. package/src/utils/discovery/cursor.ts +306 -0
  281. package/src/utils/discovery/gemini.ts +248 -0
  282. package/src/utils/discovery/index.ts +4 -0
  283. package/src/utils/discovery/openai-compatible.ts +224 -0
  284. package/src/utils/event-stream.ts +142 -0
  285. package/src/utils/fireworks-model-id.ts +30 -0
  286. package/src/utils/foundry.ts +8 -0
  287. package/src/utils/http-inspector.ts +176 -0
  288. package/src/utils/idle-iterator.ts +273 -0
  289. package/src/utils/json-parse.ts +182 -0
  290. package/src/utils/oauth/__tests__/xai-oauth.test.ts +107 -0
  291. package/src/utils/oauth/alibaba-coding-plan.ts +59 -0
  292. package/src/utils/oauth/anthropic.ts +273 -0
  293. package/src/utils/oauth/api-key-login.ts +87 -0
  294. package/src/utils/oauth/api-key-validation.ts +92 -0
  295. package/src/utils/oauth/callback-server.ts +276 -0
  296. package/src/utils/oauth/cerebras.ts +16 -0
  297. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  298. package/src/utils/oauth/cursor.ts +157 -0
  299. package/src/utils/oauth/deepseek.ts +53 -0
  300. package/src/utils/oauth/firepass.ts +24 -0
  301. package/src/utils/oauth/fireworks.ts +15 -0
  302. package/src/utils/oauth/github-copilot.ts +362 -0
  303. package/src/utils/oauth/gitlab-duo.ts +123 -0
  304. package/src/utils/oauth/google-antigravity.ts +200 -0
  305. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  306. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  307. package/src/utils/oauth/huggingface.ts +62 -0
  308. package/src/utils/oauth/index.ts +502 -0
  309. package/src/utils/oauth/kagi.ts +47 -0
  310. package/src/utils/oauth/kilo.ts +87 -0
  311. package/src/utils/oauth/kimi.ts +254 -0
  312. package/src/utils/oauth/litellm.ts +47 -0
  313. package/src/utils/oauth/lm-studio.ts +38 -0
  314. package/src/utils/oauth/minimax-code.ts +80 -0
  315. package/src/utils/oauth/moonshot.ts +23 -0
  316. package/src/utils/oauth/nanogpt.ts +15 -0
  317. package/src/utils/oauth/nvidia.ts +70 -0
  318. package/src/utils/oauth/oauth.html +199 -0
  319. package/src/utils/oauth/ollama-cloud.ts +28 -0
  320. package/src/utils/oauth/ollama.ts +47 -0
  321. package/src/utils/oauth/openai-codex.ts +299 -0
  322. package/src/utils/oauth/opencode.ts +49 -0
  323. package/src/utils/oauth/openrouter.ts +20 -0
  324. package/src/utils/oauth/parallel.ts +46 -0
  325. package/src/utils/oauth/perplexity.ts +206 -0
  326. package/src/utils/oauth/pkce.ts +18 -0
  327. package/src/utils/oauth/qianfan.ts +58 -0
  328. package/src/utils/oauth/qwen-portal.ts +60 -0
  329. package/src/utils/oauth/synthetic.ts +15 -0
  330. package/src/utils/oauth/tavily.ts +46 -0
  331. package/src/utils/oauth/together.ts +16 -0
  332. package/src/utils/oauth/types.ts +102 -0
  333. package/src/utils/oauth/venice.ts +59 -0
  334. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  335. package/src/utils/oauth/vllm.ts +40 -0
  336. package/src/utils/oauth/wafer.ts +50 -0
  337. package/src/utils/oauth/xai-oauth.ts +342 -0
  338. package/src/utils/oauth/xiaomi.ts +194 -0
  339. package/src/utils/oauth/zai.ts +60 -0
  340. package/src/utils/oauth/zenmux.ts +15 -0
  341. package/src/utils/oauth/zhipu.ts +60 -0
  342. package/src/utils/overflow.ts +137 -0
  343. package/src/utils/parse-bind.ts +54 -0
  344. package/src/utils/provider-response.ts +30 -0
  345. package/src/utils/request-debug.ts +336 -0
  346. package/src/utils/retry-after.ts +110 -0
  347. package/src/utils/retry.ts +54 -0
  348. package/src/utils/schema/CONSTRAINTS.md +164 -0
  349. package/src/utils/schema/adapt.ts +36 -0
  350. package/src/utils/schema/compatibility.ts +435 -0
  351. package/src/utils/schema/dereference.ts +98 -0
  352. package/src/utils/schema/draft.ts +341 -0
  353. package/src/utils/schema/equality.ts +97 -0
  354. package/src/utils/schema/fields.ts +191 -0
  355. package/src/utils/schema/index.ts +13 -0
  356. package/src/utils/schema/json-schema-validator.ts +577 -0
  357. package/src/utils/schema/meta-validator.ts +167 -0
  358. package/src/utils/schema/normalize.ts +1588 -0
  359. package/src/utils/schema/spill.ts +43 -0
  360. package/src/utils/schema/stamps.ts +97 -0
  361. package/src/utils/schema/types.ts +10 -0
  362. package/src/utils/schema/wire.ts +293 -0
  363. package/src/utils/schema/zod-decontaminate.ts +331 -0
  364. package/src/utils/sdk-stream-timeout.ts +43 -0
  365. package/src/utils/sse-debug.ts +289 -0
  366. package/src/utils/stream-markup-healing.ts +612 -0
  367. package/src/utils/tool-choice.ts +99 -0
  368. package/src/utils/validation.ts +1024 -0
  369. package/src/utils.ts +166 -0
@@ -0,0 +1,320 @@
1
+ import type { Model, OpenAICompat } from "../types";
2
+
3
+ type OpenAIReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh";
4
+ type ResolvedToolStrictMode = NonNullable<OpenAICompat["toolStrictMode"]> | "mixed";
5
+
6
+ export type ResolvedOpenAICompat = Required<
7
+ Omit<
8
+ OpenAICompat,
9
+ | "openRouterRouting"
10
+ | "vercelGatewayRouting"
11
+ | "extraBody"
12
+ | "toolStrictMode"
13
+ | "cacheControlFormat"
14
+ | "thinkingKeep"
15
+ >
16
+ > & {
17
+ openRouterRouting?: OpenAICompat["openRouterRouting"];
18
+ vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
19
+ extraBody?: OpenAICompat["extraBody"];
20
+ cacheControlFormat?: OpenAICompat["cacheControlFormat"];
21
+ thinkingKeep?: OpenAICompat["thinkingKeep"];
22
+ toolStrictMode: ResolvedToolStrictMode;
23
+ };
24
+
25
+ function detectStrictModeSupport(provider: string, baseUrl: string): boolean {
26
+ if (
27
+ provider === "openai" ||
28
+ provider === "openrouter" ||
29
+ provider === "cerebras" ||
30
+ provider === "together" ||
31
+ provider === "github-copilot" ||
32
+ provider === "zenmux"
33
+ ) {
34
+ return true;
35
+ }
36
+
37
+ const normalizedBaseUrl = baseUrl.toLowerCase();
38
+ return (
39
+ normalizedBaseUrl.includes("api.openai.com") ||
40
+ normalizedBaseUrl.includes(".openai.azure.com") ||
41
+ normalizedBaseUrl.includes("models.inference.ai.azure.com") ||
42
+ normalizedBaseUrl.includes("api.cerebras.ai") ||
43
+ normalizedBaseUrl.includes("api.together.xyz") ||
44
+ normalizedBaseUrl.includes("openrouter.ai") ||
45
+ normalizedBaseUrl.includes("api.deepseek.com") ||
46
+ normalizedBaseUrl.includes("deepseek.com")
47
+ );
48
+ }
49
+
50
+ /**
51
+ * Detect compatibility settings from provider and baseUrl for known providers.
52
+ * Provider takes precedence over URL-based detection since it's explicitly configured.
53
+ * @param model - The model configuration
54
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
55
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
56
+ */
57
+ export function detectOpenAICompat(model: Model<"openai-completions">, resolvedBaseUrl?: string): ResolvedOpenAICompat {
58
+ const provider = model.provider;
59
+ // Use resolvedBaseUrl if provided (e.g., after GitHub Copilot proxy-ep resolution)
60
+ const baseUrl = resolvedBaseUrl ?? model.baseUrl;
61
+
62
+ const isCerebras = provider === "cerebras" || baseUrl.includes("cerebras.ai");
63
+ const isZai = provider === "zai" || baseUrl.includes("api.z.ai");
64
+ const isZhipu = provider === "zhipu-coding-plan" || baseUrl.includes("open.bigmodel.cn");
65
+ const isKilo = provider === "kilo" || baseUrl.includes("api.kilo.ai");
66
+ const isKimiModel = model.id.includes("moonshotai/kimi") || /(^|\/)kimi[-.]/i.test(model.id);
67
+ const isMoonshotNativeHost =
68
+ provider === "moonshot" || provider === "kimi-code" || /api\.moonshot\.ai|api\.kimi\.com/i.test(baseUrl);
69
+ const isMoonshotKimi = isKimiModel && isMoonshotNativeHost;
70
+ const usesMoonshotKimiPreservedThinking = isMoonshotKimi && /(^|\/)kimi-k2\.6(?:[-:]|$)/i.test(model.id);
71
+ const isAnthropicModel =
72
+ provider === "anthropic" ||
73
+ baseUrl.includes("api.anthropic.com") ||
74
+ /(^|\/)claude[-.]/i.test(model.id) ||
75
+ /(^|\/)anthropic\//i.test(model.id);
76
+ const isAlibaba = provider === "alibaba-coding-plan" || baseUrl.includes("dashscope");
77
+ const isQwen = model.id.toLowerCase().includes("qwen");
78
+ // DeepSeek V4 (and other reasoning-capable DeepSeek models) reject follow-up requests in
79
+ // thinking mode unless prior assistant tool-call turns include `reasoning_content`. The
80
+ // upstream model is reachable through many OpenAI-compat hosts (api.deepseek.com, Deepinfra,
81
+ // Kilo, NVIDIA NIM, Zenmux, OpenRouter, …), so we match by model id/name as well as by
82
+ // provider/baseUrl. The flag is gated by `model.reasoning` because the invariant only
83
+ // applies when thinking mode is actually engaged.
84
+ const lowerId = model.id.toLowerCase();
85
+ const lowerName = (model.name ?? "").toLowerCase();
86
+ const isXiaomiHost =
87
+ provider === "xiaomi" || provider.startsWith("xiaomi-token-plan-") || baseUrl.includes("xiaomimimo.com");
88
+ const isMimoModel = lowerId.includes("mimo") || lowerName.includes("mimo");
89
+ const isXiaomiMimo = isXiaomiHost && isMimoModel;
90
+ // OpenCode Zen's `big-pickle` is a DeepSeek reasoning alias; the upstream
91
+ // 400s come from DeepSeek and require exact reasoning_content replay.
92
+ const isOpenCodeDeepseekAlias =
93
+ provider === "opencode-zen" && (lowerId === "big-pickle" || lowerName === "big pickle");
94
+ const isDeepseekFamily =
95
+ provider === "deepseek" ||
96
+ baseUrl.includes("deepseek.com") ||
97
+ lowerId.includes("deepseek") ||
98
+ lowerName.includes("deepseek") ||
99
+ isOpenCodeDeepseekAlias;
100
+ const isDirectDeepseekApi = provider === "deepseek" || baseUrl.includes("api.deepseek.com");
101
+ const isDirectDeepseekReasoning = isDirectDeepseekApi && isDeepseekFamily && Boolean(model.reasoning);
102
+ const isNonStandard =
103
+ isCerebras ||
104
+ provider === "xai" ||
105
+ baseUrl.includes("api.x.ai") ||
106
+ provider === "mistral" ||
107
+ baseUrl.includes("mistral.ai") ||
108
+ baseUrl.includes("chutes.ai") ||
109
+ baseUrl.includes("deepseek.com") ||
110
+ baseUrl.includes("fireworks.ai") ||
111
+ isAlibaba ||
112
+ isZai ||
113
+ isZhipu ||
114
+ isKilo ||
115
+ isQwen ||
116
+ isXiaomiHost ||
117
+ provider === "opencode-zen" ||
118
+ provider === "opencode-go" ||
119
+ baseUrl.includes("opencode.ai");
120
+ const isOpenCodeProvider = provider === "opencode-go" || provider === "opencode-zen";
121
+
122
+ const useMaxTokens =
123
+ provider === "mistral" ||
124
+ baseUrl.includes("mistral.ai") ||
125
+ baseUrl.includes("chutes.ai") ||
126
+ baseUrl.includes("fireworks.ai") ||
127
+ isDirectDeepseekApi;
128
+ const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
129
+ const isMistral = provider === "mistral" || baseUrl.includes("mistral.ai");
130
+
131
+ // Hosts whose chat-completions endpoints are known to accept multiple
132
+ // leading `system`/`developer` messages (preferred for KV-cache reuse).
133
+ // Anything outside this allowlist defaults to coalescing because
134
+ // strict chat templates (Qwen 3.5+ via vLLM, MiniMax, etc.) reject
135
+ // follow-up system messages with a 400.
136
+ const isOpenAIHost = provider === "openai" || baseUrl.includes("api.openai.com");
137
+ const isAzureHost =
138
+ provider === "azure" ||
139
+ baseUrl.includes(".openai.azure.com") ||
140
+ baseUrl.includes("models.inference.ai.azure.com") ||
141
+ baseUrl.includes("azure.com/openai");
142
+ const isOpenRouter = provider === "openrouter" || baseUrl.includes("openrouter.ai");
143
+ const isTogether = provider === "together" || baseUrl.includes("api.together.xyz");
144
+ const isFireworks = baseUrl.includes("fireworks.ai");
145
+ const isGroqHost = provider === "groq" || baseUrl.includes("api.groq.com");
146
+ const isCopilotHost = provider === "github-copilot";
147
+ const isZenmuxHost = provider === "zenmux";
148
+ // Endpoints that MUST receive a single system block. MiniMax's OpenAI
149
+ // endpoint returns error 2013 on multiple system messages; Alibaba's
150
+ // Dashscope and Qwen Portal serve Qwen models whose chat template
151
+ // raises "System message must be at the beginning" if any system
152
+ // message appears past index 0.
153
+ const isMiniMaxHost =
154
+ provider === "minimax-code" ||
155
+ provider === "minimax-code-cn" ||
156
+ baseUrl.includes("api.minimax.io") ||
157
+ baseUrl.includes("api.minimaxi.com");
158
+ const isQwenPortal = provider === "qwen-portal" || baseUrl.includes("portal.qwen.ai");
159
+ const supportsMultipleSystemMessagesDefault =
160
+ !isMiniMaxHost &&
161
+ !isAlibaba &&
162
+ !isQwenPortal &&
163
+ (isOpenAIHost ||
164
+ isAzureHost ||
165
+ isOpenRouter ||
166
+ isCerebras ||
167
+ isTogether ||
168
+ isFireworks ||
169
+ isGroqHost ||
170
+ isDeepseekFamily ||
171
+ isMistral ||
172
+ isGrok ||
173
+ isZai ||
174
+ isZhipu ||
175
+ isCopilotHost ||
176
+ isZenmuxHost);
177
+
178
+ const reasoningEffortMap: NonNullable<OpenAICompat["reasoningEffortMap"]> =
179
+ provider === "groq" && model.id === "qwen/qwen3-32b"
180
+ ? ({
181
+ minimal: "default",
182
+ low: "default",
183
+ medium: "default",
184
+ high: "default",
185
+ xhigh: "default",
186
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
187
+ : isDeepseekFamily && model.reasoning
188
+ ? ({
189
+ minimal: "high",
190
+ low: "high",
191
+ medium: "high",
192
+ high: "high",
193
+ xhigh: "max",
194
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
195
+ : isFireworks
196
+ ? ({
197
+ // Fireworks' OpenAI-compatible endpoint rejects OpenAI's
198
+ // `minimal` literal but accepts `none` for the lowest setting.
199
+ minimal: "none",
200
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
201
+ : {};
202
+
203
+ return {
204
+ supportsStore: !isNonStandard,
205
+ // `developer` is an OpenAI-Responses-era extension to the chat-completions schema. Almost
206
+ // every OpenAI-compatible host other than OpenAI itself (and Azure OpenAI, which mirrors
207
+ // the schema exactly) treats it as an unknown role: Moonshot returns a 400 "tokenization
208
+ // failed", Groq/Cerebras/etc. error or silently misroute. Default to `system` and require
209
+ // callers to opt in via `compat.supportsDeveloperRole: true` for hosts known to mirror
210
+ // OpenAI's reasoning-API surface.
211
+ supportsDeveloperRole: isOpenAIHost || isAzureHost,
212
+ supportsMultipleSystemMessages: supportsMultipleSystemMessagesDefault,
213
+ supportsReasoningEffort: !isGrok && !isZai && !isZhipu && !isXiaomiMimo,
214
+ reasoningEffortMap,
215
+ supportsUsageInStreaming: !isCerebras,
216
+ disableReasoningOnForcedToolChoice: isKimiModel || isAnthropicModel,
217
+ disableReasoningOnToolChoice: isDeepseekFamily && Boolean(model.reasoning) && !isOpenRouter,
218
+ supportsToolChoice: !isDirectDeepseekReasoning,
219
+ maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
220
+ requiresToolResultName: isMistral,
221
+ requiresAssistantAfterToolResult: false,
222
+ requiresThinkingAsText: isMistral,
223
+ requiresMistralToolIds: isMistral,
224
+ // Only Kimi's native hosts (Moonshot / Kimi-code, matched by `isMoonshotKimi`)
225
+ // speak the z.ai binary `thinking: { type }` field. Kimi reached through
226
+ // OpenAI-compatible proxies — Fireworks' Fire Pass router, OpenCode's gateway,
227
+ // etc. — drives reasoning via OpenAI-style `reasoning_effort`
228
+ // (low|medium|high|xhigh|max|none), so those stay on the "openai" path.
229
+ thinkingFormat:
230
+ isZai || isZhipu || isMoonshotKimi || isXiaomiMimo
231
+ ? "zai"
232
+ : provider === "openrouter" || baseUrl.includes("openrouter.ai")
233
+ ? "openrouter"
234
+ : isAlibaba || isQwen
235
+ ? "qwen"
236
+ : "openai",
237
+ thinkingKeep: usesMoonshotKimiPreservedThinking ? "all" : undefined,
238
+ reasoningContentField: "reasoning_content",
239
+ // Backends that 400 follow-up requests when prior assistant tool-call turns lack `reasoning_content`:
240
+ // - Kimi: documented invariant on its native API.
241
+ // - DeepSeek-family reasoning models, including aliased OpenCode Zen models
242
+ // like `big-pickle`, validate exact thinking-mode replay.
243
+ // - Xiaomi MiMo models require exact `reasoning_content` replay on
244
+ // thinking-mode tool-call continuations across standard and Token Plan hosts.
245
+ // - Any reasoning-capable model reached through OpenRouter can enforce this
246
+ // server-side whenever the request is in thinking mode. We can't translate
247
+ // Anthropic's redacted/encrypted reasoning into provider-native plaintext,
248
+ // so cross-provider continuations rely on a placeholder.
249
+ // OpenCode Kimi aliases handle reasoning content internally and reject
250
+ // client-sent `reasoning_content`, so exclude only that Kimi-on-OpenCode path.
251
+ requiresReasoningContentForToolCalls:
252
+ (isKimiModel && !isOpenCodeProvider) ||
253
+ (isDeepseekFamily && Boolean(model.reasoning)) ||
254
+ isXiaomiMimo ||
255
+ ((provider === "openrouter" || baseUrl.includes("openrouter.ai")) && Boolean(model.reasoning)),
256
+ // DeepSeek V4 and Xiaomi MiMo reject synthetic reasoning_content placeholders (".") on tool-call turns.
257
+ // Kimi and OpenRouter accept them when actual reasoning is unavailable.
258
+ allowsSyntheticReasoningContentForToolCalls: (!isDeepseekFamily || !model.reasoning) && !isXiaomiMimo,
259
+ requiresAssistantContentForToolCalls: isKimiModel || isDirectDeepseekReasoning,
260
+ cacheControlFormat: isOpenRouter && model.id.startsWith("anthropic/") ? "anthropic" : undefined,
261
+ openRouterRouting: undefined,
262
+ vercelGatewayRouting: undefined,
263
+ supportsStrictMode: detectStrictModeSupport(provider, baseUrl),
264
+ extraBody: isDirectDeepseekReasoning ? { thinking: { type: "enabled" } } : undefined,
265
+ toolStrictMode: isCerebras ? "all_strict" : "mixed",
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Resolve compatibility settings by layering explicit model.compat overrides onto
271
+ * the detected defaults. This is the canonical compat view for both metadata and transport.
272
+ * @param model - The model configuration
273
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
274
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
275
+ */
276
+ export function resolveOpenAICompat(
277
+ model: Model<"openai-completions">,
278
+ resolvedBaseUrl?: string,
279
+ ): ResolvedOpenAICompat {
280
+ const detected = detectOpenAICompat(model, resolvedBaseUrl);
281
+ if (!model.compat) {
282
+ return detected;
283
+ }
284
+
285
+ return {
286
+ supportsStore: model.compat.supportsStore ?? detected.supportsStore,
287
+ supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
288
+ supportsMultipleSystemMessages:
289
+ model.compat.supportsMultipleSystemMessages ?? detected.supportsMultipleSystemMessages,
290
+ supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
291
+ reasoningEffortMap: { ...detected.reasoningEffortMap, ...(model.compat.reasoningEffortMap ?? {}) },
292
+ supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
293
+ supportsToolChoice: model.compat.supportsToolChoice ?? detected.supportsToolChoice,
294
+ maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
295
+ requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
296
+ requiresAssistantAfterToolResult:
297
+ model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
298
+ requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
299
+ requiresMistralToolIds: model.compat.requiresMistralToolIds ?? detected.requiresMistralToolIds,
300
+ thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,
301
+ thinkingKeep: model.compat.thinkingKeep ?? detected.thinkingKeep,
302
+ reasoningContentField: model.compat.reasoningContentField ?? detected.reasoningContentField,
303
+ requiresReasoningContentForToolCalls:
304
+ model.compat.requiresReasoningContentForToolCalls ?? detected.requiresReasoningContentForToolCalls,
305
+ allowsSyntheticReasoningContentForToolCalls:
306
+ model.compat.allowsSyntheticReasoningContentForToolCalls ??
307
+ detected.allowsSyntheticReasoningContentForToolCalls,
308
+ requiresAssistantContentForToolCalls:
309
+ model.compat.requiresAssistantContentForToolCalls ?? detected.requiresAssistantContentForToolCalls,
310
+ cacheControlFormat: model.compat.cacheControlFormat ?? detected.cacheControlFormat,
311
+ disableReasoningOnForcedToolChoice:
312
+ model.compat.disableReasoningOnForcedToolChoice ?? detected.disableReasoningOnForcedToolChoice,
313
+ disableReasoningOnToolChoice: model.compat.disableReasoningOnToolChoice ?? detected.disableReasoningOnToolChoice,
314
+ openRouterRouting: model.compat.openRouterRouting ?? detected.openRouterRouting,
315
+ vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
316
+ supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
317
+ extraBody: model.compat.extraBody ?? detected.extraBody,
318
+ toolStrictMode: model.compat.toolStrictMode ?? detected.toolStrictMode,
319
+ };
320
+ }