@aryee337/aery-ai 0.2.28 → 0.2.29

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