@vib-rato/ai 0.16.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 (525) hide show
  1. package/CHANGELOG.md +3354 -0
  2. package/README.md +1194 -0
  3. package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
  4. package/dist/types/api-registry.d.ts +30 -0
  5. package/dist/types/auth-broker/client.d.ts +80 -0
  6. package/dist/types/auth-broker/index.d.ts +5 -0
  7. package/dist/types/auth-broker/redact.d.ts +7 -0
  8. package/dist/types/auth-broker/refresher.d.ts +25 -0
  9. package/dist/types/auth-broker/remote-store.d.ts +153 -0
  10. package/dist/types/auth-broker/server.d.ts +32 -0
  11. package/dist/types/auth-broker/types.d.ts +132 -0
  12. package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
  13. package/dist/types/auth-gateway/http.d.ts +40 -0
  14. package/dist/types/auth-gateway/index.d.ts +3 -0
  15. package/dist/types/auth-gateway/server.d.ts +70 -0
  16. package/dist/types/auth-gateway/types.d.ts +129 -0
  17. package/dist/types/auth-storage.d.ts +1074 -0
  18. package/dist/types/cli.d.ts +2 -0
  19. package/dist/types/codex-tools.d.ts +4 -0
  20. package/dist/types/context-cap-policy.d.ts +68 -0
  21. package/dist/types/core.d.ts +35 -0
  22. package/dist/types/index.d.ts +55 -0
  23. package/dist/types/model-cache.d.ts +24 -0
  24. package/dist/types/model-manager.d.ts +77 -0
  25. package/dist/types/model-pricing.d.ts +3 -0
  26. package/dist/types/model-retirements.d.ts +6 -0
  27. package/dist/types/model-thinking.d.ts +100 -0
  28. package/dist/types/models.d.ts +21 -0
  29. package/dist/types/openai-completions-compat.d.ts +34 -0
  30. package/dist/types/provider-details.d.ts +24 -0
  31. package/dist/types/provider-models/bundled-references.d.ts +4 -0
  32. package/dist/types/provider-models/descriptors.d.ts +48 -0
  33. package/dist/types/provider-models/google.d.ts +20 -0
  34. package/dist/types/provider-models/index.d.ts +5 -0
  35. package/dist/types/provider-models/ollama.d.ts +7 -0
  36. package/dist/types/provider-models/openai-compat.d.ts +293 -0
  37. package/dist/types/provider-models/special.d.ts +29 -0
  38. package/dist/types/providers/amazon-bedrock.d.ts +60 -0
  39. package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
  40. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  41. package/dist/types/providers/anthropic.d.ts +280 -0
  42. package/dist/types/providers/aws-credential-config.d.ts +19 -0
  43. package/dist/types/providers/aws-credentials.d.ts +43 -0
  44. package/dist/types/providers/aws-eventstream.d.ts +38 -0
  45. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  46. package/dist/types/providers/azure-openai-responses.d.ts +22 -0
  47. package/dist/types/providers/composer-discipline.d.ts +32 -0
  48. package/dist/types/providers/cursor/client-version.d.ts +10 -0
  49. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  50. package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
  51. package/dist/types/providers/cursor-pi-args.d.ts +119 -0
  52. package/dist/types/providers/cursor.d.ts +72 -0
  53. package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
  54. package/dist/types/providers/error-message.d.ts +27 -0
  55. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  56. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  57. package/dist/types/providers/google-auth.d.ts +26 -0
  58. package/dist/types/providers/google-gemini-cli.d.ts +75 -0
  59. package/dist/types/providers/google-gemini-headers.d.ts +43 -0
  60. package/dist/types/providers/google-shared.d.ts +183 -0
  61. package/dist/types/providers/google-types.d.ts +138 -0
  62. package/dist/types/providers/google-vertex.d.ts +11 -0
  63. package/dist/types/providers/google.d.ts +4 -0
  64. package/dist/types/providers/grammar.d.ts +1 -0
  65. package/dist/types/providers/kimi.d.ts +27 -0
  66. package/dist/types/providers/kiro-api-key.d.ts +50 -0
  67. package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
  68. package/dist/types/providers/mock.d.ts +189 -0
  69. package/dist/types/providers/ollama.d.ts +41 -0
  70. package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
  71. package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
  72. package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
  73. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  74. package/dist/types/providers/openai-codex/constants.d.ts +26 -0
  75. package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
  76. package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
  77. package/dist/types/providers/openai-codex-responses.d.ts +71 -0
  78. package/dist/types/providers/openai-completions-compat.d.ts +6 -0
  79. package/dist/types/providers/openai-completions.d.ts +35 -0
  80. package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
  81. package/dist/types/providers/openai-request-transform.d.ts +4 -0
  82. package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
  83. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  84. package/dist/types/providers/openai-responses-shared.d.ts +106 -0
  85. package/dist/types/providers/openai-responses.d.ts +37 -0
  86. package/dist/types/providers/pi-native-client.d.ts +29 -0
  87. package/dist/types/providers/pi-native-server.d.ts +60 -0
  88. package/dist/types/providers/register-builtins.d.ts +59 -0
  89. package/dist/types/providers/synthetic.d.ts +26 -0
  90. package/dist/types/providers/transform-messages.d.ts +33 -0
  91. package/dist/types/providers/vision-guard.d.ts +8 -0
  92. package/dist/types/rate-limit-utils.d.ts +19 -0
  93. package/dist/types/stream.d.ts +45 -0
  94. package/dist/types/types.d.ts +1073 -0
  95. package/dist/types/usage/claude.d.ts +3 -0
  96. package/dist/types/usage/gemini.d.ts +2 -0
  97. package/dist/types/usage/github-copilot.d.ts +7 -0
  98. package/dist/types/usage/google-antigravity.d.ts +2 -0
  99. package/dist/types/usage/grok-cli.d.ts +17 -0
  100. package/dist/types/usage/kimi.d.ts +4 -0
  101. package/dist/types/usage/minimax-code.d.ts +2 -0
  102. package/dist/types/usage/openai-codex.d.ts +3 -0
  103. package/dist/types/usage/shared.d.ts +1 -0
  104. package/dist/types/usage/zai.d.ts +2 -0
  105. package/dist/types/usage.d.ts +264 -0
  106. package/dist/types/utils/abort.d.ts +19 -0
  107. package/dist/types/utils/anthropic-auth.d.ts +39 -0
  108. package/dist/types/utils/block-symbols.d.ts +6 -0
  109. package/dist/types/utils/discovery/antigravity.d.ts +67 -0
  110. package/dist/types/utils/discovery/codex.d.ts +38 -0
  111. package/dist/types/utils/discovery/cursor.d.ts +49 -0
  112. package/dist/types/utils/discovery/gemini.d.ts +25 -0
  113. package/dist/types/utils/discovery/index.d.ts +4 -0
  114. package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
  115. package/dist/types/utils/event-stream.d.ts +41 -0
  116. package/dist/types/utils/fallback-transport.d.ts +110 -0
  117. package/dist/types/utils/fireworks-model-id.d.ts +10 -0
  118. package/dist/types/utils/foundry.d.ts +11 -0
  119. package/dist/types/utils/h2-fetch.d.ts +22 -0
  120. package/dist/types/utils/http-inspector.d.ts +59 -0
  121. package/dist/types/utils/idle-iterator.d.ts +122 -0
  122. package/dist/types/utils/json-parse.d.ts +98 -0
  123. package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
  124. package/dist/types/utils/oauth/anthropic.d.ts +41 -0
  125. package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
  126. package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
  127. package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
  128. package/dist/types/utils/oauth/callback-server.d.ts +80 -0
  129. package/dist/types/utils/oauth/cerebras.d.ts +1 -0
  130. package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
  131. package/dist/types/utils/oauth/commandcode.d.ts +1 -0
  132. package/dist/types/utils/oauth/cursor.d.ts +15 -0
  133. package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
  134. package/dist/types/utils/oauth/deepseek.d.ts +10 -0
  135. package/dist/types/utils/oauth/firepass.d.ts +1 -0
  136. package/dist/types/utils/oauth/fireworks.d.ts +1 -0
  137. package/dist/types/utils/oauth/fugu.d.ts +1 -0
  138. package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
  139. package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
  140. package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
  141. package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
  142. package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
  143. package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
  144. package/dist/types/utils/oauth/huggingface.d.ts +19 -0
  145. package/dist/types/utils/oauth/index.d.ts +39 -0
  146. package/dist/types/utils/oauth/kagi.d.ts +17 -0
  147. package/dist/types/utils/oauth/kilo.d.ts +5 -0
  148. package/dist/types/utils/oauth/kimi.d.ts +17 -0
  149. package/dist/types/utils/oauth/kiro.d.ts +71 -0
  150. package/dist/types/utils/oauth/litellm.d.ts +18 -0
  151. package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
  152. package/dist/types/utils/oauth/mara.d.ts +1 -0
  153. package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
  154. package/dist/types/utils/oauth/moonshot.d.ts +1 -0
  155. package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
  156. package/dist/types/utils/oauth/nvidia.d.ts +18 -0
  157. package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
  158. package/dist/types/utils/oauth/ollama.d.ts +18 -0
  159. package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
  160. package/dist/types/utils/oauth/opencode.d.ts +18 -0
  161. package/dist/types/utils/oauth/opengateway.d.ts +1 -0
  162. package/dist/types/utils/oauth/openrouter.d.ts +1 -0
  163. package/dist/types/utils/oauth/parallel.d.ts +17 -0
  164. package/dist/types/utils/oauth/perplexity.d.ts +4 -0
  165. package/dist/types/utils/oauth/pkce.d.ts +8 -0
  166. package/dist/types/utils/oauth/qianfan.d.ts +17 -0
  167. package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
  168. package/dist/types/utils/oauth/sglang.d.ts +16 -0
  169. package/dist/types/utils/oauth/synthetic.d.ts +1 -0
  170. package/dist/types/utils/oauth/tavily.d.ts +17 -0
  171. package/dist/types/utils/oauth/together.d.ts +1 -0
  172. package/dist/types/utils/oauth/types.d.ts +56 -0
  173. package/dist/types/utils/oauth/venice.d.ts +18 -0
  174. package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
  175. package/dist/types/utils/oauth/vllm.d.ts +16 -0
  176. package/dist/types/utils/oauth/xai.d.ts +30 -0
  177. package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
  178. package/dist/types/utils/oauth/zai.d.ts +18 -0
  179. package/dist/types/utils/oauth/zenmux.d.ts +1 -0
  180. package/dist/types/utils/overflow.d.ts +14 -0
  181. package/dist/types/utils/parse-bind.d.ts +26 -0
  182. package/dist/types/utils/provider-response.d.ts +6 -0
  183. package/dist/types/utils/provider-safety-stop.d.ts +8 -0
  184. package/dist/types/utils/proxy.d.ts +7 -0
  185. package/dist/types/utils/retry-after.d.ts +3 -0
  186. package/dist/types/utils/retry-budget.d.ts +1 -0
  187. package/dist/types/utils/retry.d.ts +29 -0
  188. package/dist/types/utils/schema/adapt.d.ts +24 -0
  189. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  190. package/dist/types/utils/schema/dereference.d.ts +11 -0
  191. package/dist/types/utils/schema/draft.d.ts +10 -0
  192. package/dist/types/utils/schema/equality.d.ts +4 -0
  193. package/dist/types/utils/schema/fields.d.ts +49 -0
  194. package/dist/types/utils/schema/index.d.ts +14 -0
  195. package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
  196. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  197. package/dist/types/utils/schema/normalize.d.ts +93 -0
  198. package/dist/types/utils/schema/root-combinator.d.ts +12 -0
  199. package/dist/types/utils/schema/spill.d.ts +8 -0
  200. package/dist/types/utils/schema/stamps.d.ts +25 -0
  201. package/dist/types/utils/schema/types.d.ts +4 -0
  202. package/dist/types/utils/schema/wire.d.ts +54 -0
  203. package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
  204. package/dist/types/utils/sse-debug.d.ts +10 -0
  205. package/dist/types/utils/tool-call-healing.d.ts +80 -0
  206. package/dist/types/utils/tool-choice-capability.d.ts +57 -0
  207. package/dist/types/utils/tool-choice.d.ts +50 -0
  208. package/dist/types/utils/validation.d.ts +17 -0
  209. package/dist/types/utils.d.ts +117 -0
  210. package/package.json +152 -0
  211. package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
  212. package/src/adapter-internals/provider-safety-stop.ts +156 -0
  213. package/src/api-registry.d.ts +30 -0
  214. package/src/api-registry.ts +96 -0
  215. package/src/auth-broker/client.ts +444 -0
  216. package/src/auth-broker/index.ts +5 -0
  217. package/src/auth-broker/redact.ts +39 -0
  218. package/src/auth-broker/refresher.ts +130 -0
  219. package/src/auth-broker/remote-store.ts +1576 -0
  220. package/src/auth-broker/server.ts +764 -0
  221. package/src/auth-broker/types.ts +164 -0
  222. package/src/auth-broker/wire-schemas.ts +261 -0
  223. package/src/auth-gateway/http.ts +198 -0
  224. package/src/auth-gateway/index.ts +3 -0
  225. package/src/auth-gateway/server.ts +1315 -0
  226. package/src/auth-gateway/types.ts +160 -0
  227. package/src/auth-storage.ts +7312 -0
  228. package/src/cli.ts +269 -0
  229. package/src/codex-tools.d.ts +4 -0
  230. package/src/codex-tools.ts +24 -0
  231. package/src/context-cap-policy.d.ts +68 -0
  232. package/src/context-cap-policy.ts +123 -0
  233. package/src/core.ts +44 -0
  234. package/src/index.ts +61 -0
  235. package/src/model-cache.ts +236 -0
  236. package/src/model-manager.ts +744 -0
  237. package/src/model-pricing.d.ts +3 -0
  238. package/src/model-pricing.ts +68 -0
  239. package/src/model-retirements.d.ts +6 -0
  240. package/src/model-retirements.ts +19 -0
  241. package/src/model-thinking.d.ts +100 -0
  242. package/src/model-thinking.ts +1054 -0
  243. package/src/models.d.ts +21 -0
  244. package/src/models.json +94672 -0
  245. package/src/models.json.d.ts +9 -0
  246. package/src/models.ts +126 -0
  247. package/src/openai-completions-compat.d.ts +34 -0
  248. package/src/openai-completions-compat.ts +383 -0
  249. package/src/prompts/composer-bash-policy-recovery.md +1 -0
  250. package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
  251. package/src/prompts/cursor-composer-edit-discipline.md +7 -0
  252. package/src/prompts/turn-aborted-guidance.md +4 -0
  253. package/src/provider-details.ts +90 -0
  254. package/src/provider-models/bundled-references.ts +38 -0
  255. package/src/provider-models/descriptors.ts +392 -0
  256. package/src/provider-models/google.ts +92 -0
  257. package/src/provider-models/index.ts +5 -0
  258. package/src/provider-models/ollama.ts +159 -0
  259. package/src/provider-models/openai-compat.ts +2920 -0
  260. package/src/provider-models/special.ts +185 -0
  261. package/src/providers/amazon-bedrock.d.ts +60 -0
  262. package/src/providers/amazon-bedrock.ts +939 -0
  263. package/src/providers/anthropic-messages-server-schema.ts +229 -0
  264. package/src/providers/anthropic-messages-server.ts +839 -0
  265. package/src/providers/anthropic.d.ts +280 -0
  266. package/src/providers/anthropic.ts +4421 -0
  267. package/src/providers/aws-credential-config.d.ts +19 -0
  268. package/src/providers/aws-credential-config.ts +179 -0
  269. package/src/providers/aws-credentials.d.ts +43 -0
  270. package/src/providers/aws-credentials.ts +457 -0
  271. package/src/providers/aws-eventstream.d.ts +38 -0
  272. package/src/providers/aws-eventstream.ts +185 -0
  273. package/src/providers/aws-sigv4.d.ts +55 -0
  274. package/src/providers/aws-sigv4.ts +218 -0
  275. package/src/providers/azure-openai-responses.d.ts +22 -0
  276. package/src/providers/azure-openai-responses.ts +447 -0
  277. package/src/providers/composer-discipline.d.ts +32 -0
  278. package/src/providers/composer-discipline.ts +95 -0
  279. package/src/providers/cursor/client-version.d.ts +10 -0
  280. package/src/providers/cursor/client-version.ts +10 -0
  281. package/src/providers/cursor/exec-modern.d.ts +98 -0
  282. package/src/providers/cursor/exec-modern.ts +497 -0
  283. package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
  284. package/src/providers/cursor/gen/agent_pb.ts +19780 -0
  285. package/src/providers/cursor/proto/agent.proto +4533 -0
  286. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  287. package/src/providers/cursor/proto/buf.yaml +17 -0
  288. package/src/providers/cursor-pi-args.d.ts +119 -0
  289. package/src/providers/cursor-pi-args.ts +187 -0
  290. package/src/providers/cursor.d.ts +72 -0
  291. package/src/providers/cursor.ts +3396 -0
  292. package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
  293. package/src/providers/dashscope-token-plan-headers.ts +84 -0
  294. package/src/providers/error-message.d.ts +27 -0
  295. package/src/providers/error-message.ts +21 -0
  296. package/src/providers/github-copilot-headers.d.ts +40 -0
  297. package/src/providers/github-copilot-headers.ts +140 -0
  298. package/src/providers/gitlab-duo.d.ts +27 -0
  299. package/src/providers/gitlab-duo.ts +393 -0
  300. package/src/providers/google-auth.d.ts +26 -0
  301. package/src/providers/google-auth.ts +262 -0
  302. package/src/providers/google-gemini-cli.d.ts +75 -0
  303. package/src/providers/google-gemini-cli.ts +969 -0
  304. package/src/providers/google-gemini-headers.d.ts +43 -0
  305. package/src/providers/google-gemini-headers.ts +100 -0
  306. package/src/providers/google-shared.d.ts +183 -0
  307. package/src/providers/google-shared.ts +1105 -0
  308. package/src/providers/google-types.d.ts +138 -0
  309. package/src/providers/google-types.ts +167 -0
  310. package/src/providers/google-vertex.d.ts +11 -0
  311. package/src/providers/google-vertex.ts +124 -0
  312. package/src/providers/google.d.ts +4 -0
  313. package/src/providers/google.ts +41 -0
  314. package/src/providers/grammar.d.ts +1 -0
  315. package/src/providers/grammar.ts +70 -0
  316. package/src/providers/kimi.d.ts +27 -0
  317. package/src/providers/kimi.ts +52 -0
  318. package/src/providers/kiro-api-key.d.ts +50 -0
  319. package/src/providers/kiro-api-key.ts +786 -0
  320. package/src/providers/kiro-codewhisperer.d.ts +11 -0
  321. package/src/providers/kiro-codewhisperer.ts +600 -0
  322. package/src/providers/mock.ts +526 -0
  323. package/src/providers/ollama.d.ts +41 -0
  324. package/src/providers/ollama.ts +645 -0
  325. package/src/providers/openai-anthropic-shim.d.ts +31 -0
  326. package/src/providers/openai-anthropic-shim.ts +156 -0
  327. package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
  328. package/src/providers/openai-bounded-rate-limits.ts +57 -0
  329. package/src/providers/openai-chat-server-schema.ts +254 -0
  330. package/src/providers/openai-chat-server.ts +724 -0
  331. package/src/providers/openai-codex/constants.d.ts +26 -0
  332. package/src/providers/openai-codex/constants.ts +43 -0
  333. package/src/providers/openai-codex/request-transformer.d.ts +50 -0
  334. package/src/providers/openai-codex/request-transformer.ts +219 -0
  335. package/src/providers/openai-codex/response-handler.d.ts +18 -0
  336. package/src/providers/openai-codex/response-handler.ts +111 -0
  337. package/src/providers/openai-codex-responses.d.ts +71 -0
  338. package/src/providers/openai-codex-responses.ts +3288 -0
  339. package/src/providers/openai-completions-compat.d.ts +6 -0
  340. package/src/providers/openai-completions-compat.ts +6 -0
  341. package/src/providers/openai-completions.d.ts +35 -0
  342. package/src/providers/openai-completions.ts +2294 -0
  343. package/src/providers/openai-opencodex-responses.ts +174 -0
  344. package/src/providers/openai-request-transform.d.ts +4 -0
  345. package/src/providers/openai-request-transform.ts +136 -0
  346. package/src/providers/openai-responses-server-schema.ts +290 -0
  347. package/src/providers/openai-responses-server.ts +1268 -0
  348. package/src/providers/openai-responses-shared.d.ts +106 -0
  349. package/src/providers/openai-responses-shared.ts +1253 -0
  350. package/src/providers/openai-responses.d.ts +37 -0
  351. package/src/providers/openai-responses.ts +989 -0
  352. package/src/providers/pi-native-client.d.ts +29 -0
  353. package/src/providers/pi-native-client.ts +243 -0
  354. package/src/providers/pi-native-server.ts +488 -0
  355. package/src/providers/register-builtins.d.ts +59 -0
  356. package/src/providers/register-builtins.ts +544 -0
  357. package/src/providers/synthetic.d.ts +26 -0
  358. package/src/providers/synthetic.ts +50 -0
  359. package/src/providers/transform-messages.d.ts +33 -0
  360. package/src/providers/transform-messages.ts +408 -0
  361. package/src/providers/vision-guard.d.ts +8 -0
  362. package/src/providers/vision-guard.ts +31 -0
  363. package/src/rate-limit-utils.d.ts +19 -0
  364. package/src/rate-limit-utils.ts +102 -0
  365. package/src/stream.d.ts +45 -0
  366. package/src/stream.ts +1306 -0
  367. package/src/types.d.ts +1073 -0
  368. package/src/types.ts +1305 -0
  369. package/src/usage/claude.ts +449 -0
  370. package/src/usage/gemini.ts +250 -0
  371. package/src/usage/github-copilot.ts +421 -0
  372. package/src/usage/google-antigravity.ts +201 -0
  373. package/src/usage/grok-cli.ts +259 -0
  374. package/src/usage/kimi.ts +285 -0
  375. package/src/usage/minimax-code.ts +31 -0
  376. package/src/usage/openai-codex.ts +503 -0
  377. package/src/usage/shared.ts +10 -0
  378. package/src/usage/zai.ts +247 -0
  379. package/src/usage.ts +190 -0
  380. package/src/utils/abort.d.ts +19 -0
  381. package/src/utils/abort.ts +51 -0
  382. package/src/utils/anthropic-auth.ts +95 -0
  383. package/src/utils/block-symbols.d.ts +6 -0
  384. package/src/utils/block-symbols.ts +11 -0
  385. package/src/utils/discovery/antigravity.ts +275 -0
  386. package/src/utils/discovery/codex.ts +362 -0
  387. package/src/utils/discovery/cursor.ts +388 -0
  388. package/src/utils/discovery/gemini.ts +248 -0
  389. package/src/utils/discovery/index.ts +4 -0
  390. package/src/utils/discovery/openai-compatible.ts +379 -0
  391. package/src/utils/event-stream.d.ts +41 -0
  392. package/src/utils/event-stream.ts +269 -0
  393. package/src/utils/fallback-transport.d.ts +110 -0
  394. package/src/utils/fallback-transport.ts +411 -0
  395. package/src/utils/fireworks-model-id.d.ts +10 -0
  396. package/src/utils/fireworks-model-id.ts +30 -0
  397. package/src/utils/foundry.d.ts +11 -0
  398. package/src/utils/foundry.ts +18 -0
  399. package/src/utils/h2-fetch.ts +60 -0
  400. package/src/utils/http-inspector.d.ts +59 -0
  401. package/src/utils/http-inspector.ts +380 -0
  402. package/src/utils/idle-iterator.d.ts +122 -0
  403. package/src/utils/idle-iterator.ts +410 -0
  404. package/src/utils/json-parse.d.ts +98 -0
  405. package/src/utils/json-parse.ts +607 -0
  406. package/src/utils/oauth/alibaba-token-plan.ts +60 -0
  407. package/src/utils/oauth/anthropic.ts +233 -0
  408. package/src/utils/oauth/api-key-login.ts +98 -0
  409. package/src/utils/oauth/api-key-validation.ts +344 -0
  410. package/src/utils/oauth/bizrouter.ts +15 -0
  411. package/src/utils/oauth/callback-server.d.ts +80 -0
  412. package/src/utils/oauth/callback-server.ts +359 -0
  413. package/src/utils/oauth/cerebras.ts +16 -0
  414. package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
  415. package/src/utils/oauth/commandcode.ts +17 -0
  416. package/src/utils/oauth/cursor.ts +157 -0
  417. package/src/utils/oauth/deepinfra.ts +15 -0
  418. package/src/utils/oauth/deepseek.ts +53 -0
  419. package/src/utils/oauth/firepass.ts +24 -0
  420. package/src/utils/oauth/fireworks.ts +15 -0
  421. package/src/utils/oauth/fugu.ts +15 -0
  422. package/src/utils/oauth/github-copilot.d.ts +38 -0
  423. package/src/utils/oauth/github-copilot.ts +362 -0
  424. package/src/utils/oauth/gitlab-duo.ts +123 -0
  425. package/src/utils/oauth/glm-zcode.d.ts +71 -0
  426. package/src/utils/oauth/glm-zcode.ts +433 -0
  427. package/src/utils/oauth/google-antigravity.ts +200 -0
  428. package/src/utils/oauth/google-gemini-cli.ts +256 -0
  429. package/src/utils/oauth/google-oauth-shared.ts +110 -0
  430. package/src/utils/oauth/huggingface.ts +62 -0
  431. package/src/utils/oauth/index.ts +558 -0
  432. package/src/utils/oauth/kagi.ts +47 -0
  433. package/src/utils/oauth/kilo.ts +87 -0
  434. package/src/utils/oauth/kimi.d.ts +17 -0
  435. package/src/utils/oauth/kimi.ts +275 -0
  436. package/src/utils/oauth/kiro.ts +448 -0
  437. package/src/utils/oauth/litellm.ts +47 -0
  438. package/src/utils/oauth/lm-studio.ts +38 -0
  439. package/src/utils/oauth/mara.ts +16 -0
  440. package/src/utils/oauth/minimax-code.ts +78 -0
  441. package/src/utils/oauth/moonshot.ts +16 -0
  442. package/src/utils/oauth/nanogpt.ts +15 -0
  443. package/src/utils/oauth/nvidia.ts +70 -0
  444. package/src/utils/oauth/oauth.html +199 -0
  445. package/src/utils/oauth/ollama-cloud.ts +28 -0
  446. package/src/utils/oauth/ollama.ts +47 -0
  447. package/src/utils/oauth/openai-codex.ts +299 -0
  448. package/src/utils/oauth/opencode.ts +49 -0
  449. package/src/utils/oauth/opengateway.ts +15 -0
  450. package/src/utils/oauth/openrouter.ts +16 -0
  451. package/src/utils/oauth/parallel.ts +46 -0
  452. package/src/utils/oauth/perplexity.ts +225 -0
  453. package/src/utils/oauth/pkce.ts +18 -0
  454. package/src/utils/oauth/qianfan.ts +58 -0
  455. package/src/utils/oauth/qwen-portal.ts +60 -0
  456. package/src/utils/oauth/sglang.ts +42 -0
  457. package/src/utils/oauth/synthetic.ts +15 -0
  458. package/src/utils/oauth/tavily.ts +46 -0
  459. package/src/utils/oauth/together.ts +16 -0
  460. package/src/utils/oauth/types.d.ts +56 -0
  461. package/src/utils/oauth/types.ts +122 -0
  462. package/src/utils/oauth/venice.ts +59 -0
  463. package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
  464. package/src/utils/oauth/vllm.ts +42 -0
  465. package/src/utils/oauth/xai.ts +246 -0
  466. package/src/utils/oauth/xiaomi.ts +199 -0
  467. package/src/utils/oauth/zai.ts +60 -0
  468. package/src/utils/oauth/zenmux.ts +15 -0
  469. package/src/utils/overflow.ts +275 -0
  470. package/src/utils/parse-bind.ts +81 -0
  471. package/src/utils/provider-response.d.ts +6 -0
  472. package/src/utils/provider-response.ts +30 -0
  473. package/src/utils/provider-safety-stop.ts +8 -0
  474. package/src/utils/proxy.d.ts +7 -0
  475. package/src/utils/proxy.ts +652 -0
  476. package/src/utils/retry-after.d.ts +3 -0
  477. package/src/utils/retry-after.ts +110 -0
  478. package/src/utils/retry-budget.d.ts +1 -0
  479. package/src/utils/retry-budget.ts +4 -0
  480. package/src/utils/retry.d.ts +29 -0
  481. package/src/utils/retry.ts +67 -0
  482. package/src/utils/schema/CONSTRAINTS.md +164 -0
  483. package/src/utils/schema/adapt.d.ts +24 -0
  484. package/src/utils/schema/adapt.ts +36 -0
  485. package/src/utils/schema/compatibility.d.ts +30 -0
  486. package/src/utils/schema/compatibility.ts +435 -0
  487. package/src/utils/schema/dereference.d.ts +11 -0
  488. package/src/utils/schema/dereference.ts +98 -0
  489. package/src/utils/schema/draft.d.ts +10 -0
  490. package/src/utils/schema/draft.ts +341 -0
  491. package/src/utils/schema/equality.d.ts +4 -0
  492. package/src/utils/schema/equality.ts +97 -0
  493. package/src/utils/schema/fields.d.ts +49 -0
  494. package/src/utils/schema/fields.ts +190 -0
  495. package/src/utils/schema/index.d.ts +14 -0
  496. package/src/utils/schema/index.ts +14 -0
  497. package/src/utils/schema/json-schema-validator.d.ts +12 -0
  498. package/src/utils/schema/json-schema-validator.ts +577 -0
  499. package/src/utils/schema/meta-validator.d.ts +2 -0
  500. package/src/utils/schema/meta-validator.ts +167 -0
  501. package/src/utils/schema/normalize.d.ts +93 -0
  502. package/src/utils/schema/normalize.ts +1588 -0
  503. package/src/utils/schema/root-combinator.d.ts +12 -0
  504. package/src/utils/schema/root-combinator.ts +143 -0
  505. package/src/utils/schema/spill.d.ts +8 -0
  506. package/src/utils/schema/spill.ts +43 -0
  507. package/src/utils/schema/stamps.d.ts +25 -0
  508. package/src/utils/schema/stamps.ts +97 -0
  509. package/src/utils/schema/types.d.ts +4 -0
  510. package/src/utils/schema/types.ts +11 -0
  511. package/src/utils/schema/wire.d.ts +54 -0
  512. package/src/utils/schema/wire.ts +213 -0
  513. package/src/utils/schema/zod-decontaminate.d.ts +31 -0
  514. package/src/utils/schema/zod-decontaminate.ts +331 -0
  515. package/src/utils/sse-debug.d.ts +10 -0
  516. package/src/utils/sse-debug.ts +289 -0
  517. package/src/utils/tool-call-healing.d.ts +80 -0
  518. package/src/utils/tool-call-healing.ts +298 -0
  519. package/src/utils/tool-choice-capability.d.ts +57 -0
  520. package/src/utils/tool-choice-capability.ts +633 -0
  521. package/src/utils/tool-choice.d.ts +50 -0
  522. package/src/utils/tool-choice.ts +99 -0
  523. package/src/utils/validation.ts +1080 -0
  524. package/src/utils.d.ts +117 -0
  525. package/src/utils.ts +523 -0
@@ -0,0 +1,9 @@
1
+ import type { Api } from "./types";
2
+
3
+ /** Typed declaration for the generated models.json — only the `api` field matters for type inference. */
4
+ declare const models: {
5
+ [provider: string]: {
6
+ [modelId: string]: { readonly api: Api; [key: string]: unknown };
7
+ };
8
+ };
9
+ export default models;
package/src/models.ts ADDED
@@ -0,0 +1,126 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { registerProviderSafetyStopModel } from "./adapter-internals/provider-safety-stop";
3
+ import { getOpenAIModelCost } from "./model-pricing";
4
+ import { isRetiredModelKey } from "./model-retirements";
5
+ import { applyGeneratedModelPolicies, enrichModelThinking } from "./model-thinking";
6
+ // `with { type: "file" }` is embedded by `bun build --compile` and resolves to
7
+ // the bunfs path inside standalone binaries (and to the on-disk path in dev).
8
+ // A plain `createRequire` of a `.json` listed as an extra compile entrypoint is
9
+ // NOT emitted into the bunfs, and its cwd-fallback masks the failure whenever
10
+ // the process runs inside a repo checkout — see PR body for the minimal repro.
11
+ import modelsJsonPath from "./models.json" with { type: "file" };
12
+ import type { Api, KnownProvider, Model, Usage } from "./types";
13
+ import { isClaudeForcedToolChoiceIncapableModelId } from "./utils/tool-choice-capability";
14
+
15
+ /**
16
+ * Static bundled model registry loaded lazily from `models.json`.
17
+ *
18
+ * This module intentionally exposes compile-time defaults only.
19
+ * It does not include runtime discovery, models.dev overlays, or on-disk cache state.
20
+ *
21
+ * For runtime-aware resolution, use `createModelManager()` / `resolveProviderModels()`.
22
+ */
23
+ type BundledCatalog = typeof import("./models.json");
24
+
25
+ let bundledCatalog: BundledCatalog | undefined;
26
+ let providerNames: KnownProvider[] | undefined;
27
+ const providerModelRegistry: Map<string, Map<string, Model<Api>>> = new Map();
28
+
29
+ function getBundledCatalog(): BundledCatalog {
30
+ // TS types a .json import as its contents; at runtime `with { type: "file" }`
31
+ // yields the file path (bunfs path in compiled binaries, disk path in dev).
32
+ if (bundledCatalog !== undefined) return bundledCatalog;
33
+ const resource = modelsJsonPath as unknown;
34
+ if (typeof resource === "string") {
35
+ bundledCatalog = JSON.parse(readFileSync(resource, "utf8")) as BundledCatalog;
36
+ } else if (resource !== null && typeof resource === "object") {
37
+ bundledCatalog = resource as BundledCatalog;
38
+ } else {
39
+ throw new Error("Bundled models catalog resource is invalid.");
40
+ }
41
+ return bundledCatalog;
42
+ }
43
+
44
+ function getProviderModels(provider: GeneratedProvider): Map<string, Model<Api>> | undefined {
45
+ const cached = providerModelRegistry.get(provider);
46
+ if (cached) return cached;
47
+ const models = getBundledCatalog()[provider];
48
+ if (!models) return undefined;
49
+ const providerModels = new Map<string, Model<Api>>();
50
+ for (const [id, model] of Object.entries(models)) {
51
+ if (isRetiredModelKey(provider, id)) {
52
+ continue;
53
+ }
54
+ const bundledModel = applyBundledCompatDefaults(enrichModelThinking(model as Model<Api>));
55
+ registerProviderSafetyStopModel(bundledModel);
56
+ providerModels.set(id, bundledModel);
57
+ }
58
+ providerModelRegistry.set(provider, providerModels);
59
+ return providerModels;
60
+ }
61
+
62
+ /**
63
+ * Bundled-catalog compat defaults applied at load time so stale committed
64
+ * models.json snapshots still receive policy-critical fields (e.g. Claude
65
+ * Mythos rejecting forced tool use) without a full regeneration.
66
+ */
67
+ function applyBundledCompatDefaults(model: Model<Api>): Model<Api> {
68
+ let normalized = model;
69
+ if (normalized.id === "minimax-m3" && normalized.name === "MiniMax M3") {
70
+ normalized = { ...normalized, name: "MiniMax-M3" };
71
+ }
72
+ if (
73
+ (normalized.api === "anthropic-messages" || normalized.api === "bedrock-converse-stream") &&
74
+ isClaudeForcedToolChoiceIncapableModelId(normalized.id) &&
75
+ (normalized.compat as { toolChoiceSupport?: string } | undefined)?.toolChoiceSupport === undefined
76
+ ) {
77
+ return {
78
+ ...normalized,
79
+ compat: { ...(normalized.compat ?? {}), toolChoiceSupport: "auto" } as Model<Api>["compat"],
80
+ };
81
+ }
82
+ const policyModels = [normalized];
83
+ applyGeneratedModelPolicies(policyModels);
84
+ return policyModels[0] ?? normalized;
85
+ }
86
+
87
+ export type GeneratedProvider = keyof BundledCatalog;
88
+
89
+ export function getBundledModel<TApi extends Api = Api>(provider: GeneratedProvider, modelId: string): Model<TApi> {
90
+ const providerModels = getProviderModels(provider);
91
+ return providerModels?.get(modelId) as Model<TApi>;
92
+ }
93
+
94
+ export function getBundledProviders(): KnownProvider[] {
95
+ // Defensive copy: the old eager path returned a fresh Array.from(...), so
96
+ // callers may freely mutate their result without corrupting enumeration.
97
+ providerNames ??= Object.keys(getBundledCatalog()) as KnownProvider[];
98
+ return providerNames.slice();
99
+ }
100
+
101
+ export function getBundledModels(provider: GeneratedProvider): Model<Api>[] {
102
+ const models = getProviderModels(provider);
103
+ return models ? (Array.from(models.values()) as Model<Api>[]) : [];
104
+ }
105
+
106
+ export function calculateCost<TApi extends Api>(model: Model<TApi>, usage: Usage): Usage["cost"] {
107
+ const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
108
+ const pricing = getOpenAIModelCost(model, inputTokens) ?? model.cost;
109
+ usage.cost.input = (pricing.input / 1000000) * usage.input;
110
+ usage.cost.output = (pricing.output / 1000000) * usage.output;
111
+ usage.cost.cacheRead = (pricing.cacheRead / 1000000) * usage.cacheRead;
112
+ usage.cost.cacheWrite = (pricing.cacheWrite / 1000000) * usage.cacheWrite;
113
+ usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
114
+ return usage.cost;
115
+ }
116
+ /**
117
+ * Check if two models are equal by comparing both their id and provider.
118
+ * Returns false if either model is null or undefined.
119
+ */
120
+ export function modelsAreEqual<TApi extends Api>(
121
+ a: Model<TApi> | null | undefined,
122
+ b: Model<TApi> | null | undefined,
123
+ ): boolean {
124
+ if (!a || !b) return false;
125
+ return a.id === b.id && a.provider === b.provider;
126
+ }
@@ -0,0 +1,34 @@
1
+ import type { Model, OpenAICompat } from "./types";
2
+ type ResolvedToolStrictMode = NonNullable<OpenAICompat["toolStrictMode"]> | "mixed";
3
+ /** Returns whether the request endpoint is an audited reasoning-control transport. */
4
+ export declare function isAuditedOpenAIReasoningTransport(model: {
5
+ provider: string;
6
+ baseUrl?: string;
7
+ }, resolvedBaseUrl?: string): boolean;
8
+ export type ResolvedOpenAICompat = Required<Omit<OpenAICompat, "openRouterRouting" | "vercelGatewayRouting" | "extraBody" | "toolStrictMode" | "toolChoiceSupport" | "supportsResponsesSessionAffinity" | "supportsServiceTier" | "reservedToolNames">> & {
9
+ openRouterRouting?: OpenAICompat["openRouterRouting"];
10
+ vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
11
+ extraBody?: OpenAICompat["extraBody"];
12
+ toolStrictMode: ResolvedToolStrictMode;
13
+ supportsResponsesSessionAffinity?: OpenAICompat["supportsResponsesSessionAffinity"];
14
+ supportsServiceTier?: OpenAICompat["supportsServiceTier"];
15
+ /** Optional explicit capability override; resolved via deriveToolChoiceSupport. */
16
+ toolChoiceSupport?: OpenAICompat["toolChoiceSupport"];
17
+ };
18
+ /**
19
+ * Detect compatibility settings from provider and baseUrl for known providers.
20
+ * Provider takes precedence over URL-based detection since it's explicitly configured.
21
+ * @param model - The model configuration
22
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
23
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
24
+ */
25
+ export declare function detectOpenAICompat(model: Model<"openai-completions">, resolvedBaseUrl?: string): ResolvedOpenAICompat;
26
+ /**
27
+ * Resolve compatibility settings by layering explicit model.compat overrides onto
28
+ * the detected defaults. This is the canonical compat view for both metadata and transport.
29
+ * @param model - The model configuration
30
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
31
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
32
+ */
33
+ export declare function resolveOpenAICompat(model: Model<"openai-completions">, resolvedBaseUrl?: string): ResolvedOpenAICompat;
34
+ export {};
@@ -0,0 +1,383 @@
1
+ import type { Model, OpenAICompat } from "./types";
2
+
3
+ type OpenAIReasoningEffort = "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
4
+ type ResolvedToolStrictMode = NonNullable<OpenAICompat["toolStrictMode"]> | "mixed";
5
+
6
+ const AUDITED_REASONING_EFFORT_HOST_SUFFIXES = [
7
+ "api.openai.com",
8
+ "chatgpt.com",
9
+ "openai.azure.com",
10
+ "models.inference.ai.azure.com",
11
+ "api.githubcopilot.com",
12
+ "openrouter.ai",
13
+ "api.cerebras.ai",
14
+ "api.together.xyz",
15
+ "fireworks.ai",
16
+ "api.groq.com",
17
+ "deepseek.com",
18
+ "deepinfra.com",
19
+ "mistral.ai",
20
+ "api.x.ai",
21
+ "api.z.ai",
22
+ "api.kilo.ai",
23
+ "opencode.ai",
24
+ "api.moonshot.ai",
25
+ "api.kimi.com",
26
+ "maas.aliyuncs.com",
27
+ "dashscope.aliyuncs.com",
28
+ "dashscope-intl.aliyuncs.com",
29
+ "bizrouter.ai",
30
+ "cloud.gitlab.com",
31
+ "huggingface.co",
32
+ "labs.jb.gg",
33
+ "mara.com",
34
+ "nano-gpt.com",
35
+ "nvidia.com",
36
+ "opengateway.ai",
37
+ "baidubce.com",
38
+ "venice.ai",
39
+ "xiaomimimo.com",
40
+ "zenmux.ai",
41
+ ] as const;
42
+
43
+ function parseHostname(baseUrl: string): string | undefined {
44
+ try {
45
+ return new URL(baseUrl).hostname.toLowerCase();
46
+ } catch {
47
+ return undefined;
48
+ }
49
+ }
50
+
51
+ function hostnameMatches(hostname: string | undefined, suffix: string): boolean {
52
+ return hostname !== undefined && (hostname === suffix || hostname.endsWith(`.${suffix}`));
53
+ }
54
+
55
+ /** Returns whether the request endpoint is an audited reasoning-control transport. */
56
+ export function isAuditedOpenAIReasoningTransport(
57
+ model: { provider: string; baseUrl?: string },
58
+ resolvedBaseUrl?: string,
59
+ ): boolean {
60
+ const baseUrl = resolvedBaseUrl ?? model.baseUrl ?? "";
61
+ if (!baseUrl && (model.provider === "openai" || model.provider === "azure-openai")) return true;
62
+ const hostname = parseHostname(baseUrl);
63
+ return AUDITED_REASONING_EFFORT_HOST_SUFFIXES.some(suffix => hostnameMatches(hostname, suffix));
64
+ }
65
+
66
+ export type ResolvedOpenAICompat = Required<
67
+ Omit<
68
+ OpenAICompat,
69
+ | "openRouterRouting"
70
+ | "vercelGatewayRouting"
71
+ | "extraBody"
72
+ | "toolStrictMode"
73
+ | "toolChoiceSupport"
74
+ | "supportsResponsesSessionAffinity"
75
+ | "supportsServiceTier"
76
+ | "reservedToolNames"
77
+ >
78
+ > & {
79
+ openRouterRouting?: OpenAICompat["openRouterRouting"];
80
+ vercelGatewayRouting?: OpenAICompat["vercelGatewayRouting"];
81
+ extraBody?: OpenAICompat["extraBody"];
82
+ toolStrictMode: ResolvedToolStrictMode;
83
+ supportsResponsesSessionAffinity?: OpenAICompat["supportsResponsesSessionAffinity"];
84
+ supportsServiceTier?: OpenAICompat["supportsServiceTier"];
85
+ /** Optional explicit capability override; resolved via deriveToolChoiceSupport. */
86
+ toolChoiceSupport?: OpenAICompat["toolChoiceSupport"];
87
+ };
88
+
89
+ function detectStrictModeSupport(provider: string, baseUrl: string): boolean {
90
+ if (
91
+ provider === "openai" ||
92
+ provider === "openrouter" ||
93
+ provider === "cerebras" ||
94
+ provider === "together" ||
95
+ provider === "github-copilot" ||
96
+ provider === "zenmux"
97
+ ) {
98
+ return true;
99
+ }
100
+
101
+ const normalizedBaseUrl = baseUrl.toLowerCase();
102
+ return (
103
+ normalizedBaseUrl.includes("api.openai.com") ||
104
+ normalizedBaseUrl.includes(".openai.azure.com") ||
105
+ normalizedBaseUrl.includes("models.inference.ai.azure.com") ||
106
+ normalizedBaseUrl.includes("api.cerebras.ai") ||
107
+ normalizedBaseUrl.includes("api.together.xyz") ||
108
+ normalizedBaseUrl.includes("openrouter.ai") ||
109
+ normalizedBaseUrl.includes("api.deepseek.com") ||
110
+ normalizedBaseUrl.includes("deepseek.com")
111
+ );
112
+ }
113
+
114
+ /**
115
+ * Detect compatibility settings from provider and baseUrl for known providers.
116
+ * Provider takes precedence over URL-based detection since it's explicitly configured.
117
+ * @param model - The model configuration
118
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
119
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
120
+ */
121
+ export function detectOpenAICompat(model: Model<"openai-completions">, resolvedBaseUrl?: string): ResolvedOpenAICompat {
122
+ const provider = model.provider;
123
+ // Use resolvedBaseUrl if provided (e.g., after GitHub Copilot proxy-ep resolution)
124
+ const baseUrl = resolvedBaseUrl ?? model.baseUrl;
125
+ const hostname = parseHostname(baseUrl);
126
+
127
+ const isCerebras = provider === "cerebras" || hostnameMatches(hostname, "cerebras.ai");
128
+ const isZai = hostnameMatches(hostname, "api.z.ai");
129
+ const isKilo = hostnameMatches(hostname, "api.kilo.ai");
130
+ const isKimiModel = model.id.includes("moonshotai/kimi") || /(^|\/)kimi[-.]/i.test(model.id);
131
+ const isMoonshotKimi =
132
+ isKimiModel && (hostnameMatches(hostname, "api.moonshot.ai") || hostnameMatches(hostname, "api.kimi.com"));
133
+ const isAnthropicModel =
134
+ provider === "anthropic" ||
135
+ baseUrl.includes("api.anthropic.com") ||
136
+ /(^|\/)claude[-.]/i.test(model.id) ||
137
+ /(^|\/)anthropic\//i.test(model.id);
138
+ const isAlibaba =
139
+ hostnameMatches(hostname, "maas.aliyuncs.com") ||
140
+ hostnameMatches(hostname, "dashscope.aliyuncs.com") ||
141
+ hostnameMatches(hostname, "dashscope-intl.aliyuncs.com");
142
+ const isQwen = model.id.toLowerCase().includes("qwen");
143
+ // DeepSeek V4 (and other reasoning-capable DeepSeek models) reject follow-up requests in
144
+ // thinking mode unless prior assistant tool-call turns include `reasoning_content`. The
145
+ // upstream model is reachable through many OpenAI-compat hosts (api.deepseek.com, Deepinfra,
146
+ // Kilo, NVIDIA NIM, Zenmux, OpenRouter, …), so we match by model id/name as well as by
147
+ // provider/baseUrl. The flag is gated by `model.reasoning` because the invariant only
148
+ // applies when thinking mode is actually engaged.
149
+ const lowerId = model.id.toLowerCase();
150
+ const lowerName = (model.name ?? "").toLowerCase();
151
+ const isDeepseekFamily =
152
+ provider === "deepseek" ||
153
+ baseUrl.includes("deepseek.com") ||
154
+ lowerId.includes("deepseek") ||
155
+ lowerName.includes("deepseek");
156
+ const isDirectDeepseekApi = provider === "deepseek" || baseUrl.includes("api.deepseek.com");
157
+ const isDirectDeepseekReasoning = isDirectDeepseekApi && isDeepseekFamily && Boolean(model.reasoning);
158
+ const isNonStandard =
159
+ isCerebras ||
160
+ provider === "xai" ||
161
+ baseUrl.includes("api.x.ai") ||
162
+ provider === "mistral" ||
163
+ baseUrl.includes("mistral.ai") ||
164
+ baseUrl.includes("chutes.ai") ||
165
+ baseUrl.includes("deepseek.com") ||
166
+ baseUrl.includes("fireworks.ai") ||
167
+ isAlibaba ||
168
+ isZai ||
169
+ isKilo ||
170
+ isQwen ||
171
+ provider === "opencode-zen" ||
172
+ provider === "opencode-go" ||
173
+ baseUrl.includes("opencode.ai");
174
+ const isOpenCodeProvider = provider === "opencode-go" || provider === "opencode-zen";
175
+ const isOpenCodeGoReasoning = provider === "opencode-go" && Boolean(model.reasoning);
176
+ const isOpenCodeGoKimiReasoning = provider === "opencode-go" && isKimiModel && Boolean(model.reasoning);
177
+ const isOpenCodeGoKimi25Reasoning = isOpenCodeGoKimiReasoning && model.id === "kimi-k2.5";
178
+ const isOpenCodeGoKimi27CodeReasoning = isOpenCodeGoKimiReasoning && model.id === "kimi-k2.7-code";
179
+ const needsOpenCodeGoKimiEffortMap = isOpenCodeGoKimi25Reasoning || isOpenCodeGoKimi27CodeReasoning;
180
+
181
+ const useMaxTokens =
182
+ provider === "mistral" ||
183
+ baseUrl.includes("mistral.ai") ||
184
+ baseUrl.includes("chutes.ai") ||
185
+ baseUrl.includes("fireworks.ai") ||
186
+ isDirectDeepseekApi;
187
+ const isGrok = provider === "xai" || baseUrl.includes("api.x.ai");
188
+ const isDirectXaiReasoningEffortModel = provider === "xai" && (model.id === "grok-4.5" || model.id === "grok-4.6");
189
+ const isMistral = provider === "mistral" || baseUrl.includes("mistral.ai");
190
+
191
+ // Hosts whose chat-completions endpoints are known to accept multiple
192
+ // leading `system`/`developer` messages (preferred for KV-cache reuse).
193
+ // Anything outside this allowlist defaults to coalescing because
194
+ // strict chat templates (Qwen 3.5+ via vLLM, MiniMax, etc.) reject
195
+ // follow-up system messages with a 400.
196
+ const isOpenAIHost = provider === "openai" || baseUrl.includes("api.openai.com");
197
+ const isAzureHost =
198
+ provider === "azure" ||
199
+ baseUrl.includes(".openai.azure.com") ||
200
+ baseUrl.includes("models.inference.ai.azure.com") ||
201
+ baseUrl.includes("azure.com/openai");
202
+ const isOpenRouter = hostnameMatches(hostname, "openrouter.ai");
203
+ const isTogether = provider === "together" || baseUrl.includes("api.together.xyz");
204
+ const isFireworks = baseUrl.includes("fireworks.ai");
205
+ const isGroqHost = provider === "groq" || baseUrl.includes("api.groq.com");
206
+ const isCopilotHost = provider === "github-copilot";
207
+ const isZenmuxHost = provider === "zenmux";
208
+ const hasAuditedReasoningEffortTransport = isAuditedOpenAIReasoningTransport(model, resolvedBaseUrl);
209
+ // Endpoints that MUST receive a single system block. MiniMax's OpenAI
210
+ // endpoint returns error 2013 on multiple system messages; Alibaba's
211
+ // Dashscope and Qwen Portal serve Qwen models whose chat template
212
+ // raises "System message must be at the beginning" if any system
213
+ // message appears past index 0.
214
+ const isMiniMaxHost =
215
+ provider === "minimax-code" ||
216
+ provider === "minimax-code-cn" ||
217
+ baseUrl.includes("api.minimax.io") ||
218
+ baseUrl.includes("api.minimaxi.com");
219
+ const isQwenPortal = provider === "qwen-portal" || baseUrl.includes("portal.qwen.ai");
220
+ const supportsMultipleSystemMessagesDefault =
221
+ !isMiniMaxHost &&
222
+ !isAlibaba &&
223
+ !isQwenPortal &&
224
+ (isOpenAIHost ||
225
+ isAzureHost ||
226
+ isOpenRouter ||
227
+ isCerebras ||
228
+ isTogether ||
229
+ isFireworks ||
230
+ isGroqHost ||
231
+ isDeepseekFamily ||
232
+ isMistral ||
233
+ isGrok ||
234
+ isZai ||
235
+ isCopilotHost ||
236
+ isZenmuxHost);
237
+
238
+ const reasoningEffortMap: NonNullable<OpenAICompat["reasoningEffortMap"]> =
239
+ provider === "groq" && model.id === "qwen/qwen3-32b"
240
+ ? ({
241
+ minimal: "default",
242
+ low: "default",
243
+ medium: "default",
244
+ high: "default",
245
+ xhigh: "default",
246
+ max: "default",
247
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
248
+ : needsOpenCodeGoKimiEffortMap
249
+ ? ({
250
+ // Live Go probes (2026-07-06) showed model-specific effort gaps:
251
+ // kimi-k2.5 rejects "minimal", while kimi-k2.7-code rejects
252
+ // OpenAI-style "xhigh" and "max"; all other Kimi efforts tested
253
+ // successfully and should pass through unchanged.
254
+ ...(isOpenCodeGoKimi25Reasoning ? { minimal: "low" } : {}),
255
+ ...(isOpenCodeGoKimi27CodeReasoning ? { xhigh: "high", max: "high" } : {}),
256
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
257
+ : isDeepseekFamily && model.reasoning
258
+ ? ({
259
+ minimal: "high",
260
+ low: "high",
261
+ medium: "high",
262
+ high: "high",
263
+ xhigh: "max",
264
+ max: "max",
265
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
266
+ : isFireworks
267
+ ? ({
268
+ // Fireworks' OpenAI-compatible endpoint rejects OpenAI's
269
+ // `minimal` literal but accepts `none` for the lowest setting.
270
+ minimal: "none",
271
+ } satisfies Partial<Record<OpenAIReasoningEffort, string>>)
272
+ : {};
273
+
274
+ return {
275
+ supportsStore: !isNonStandard,
276
+ supportsDeveloperRole: !isNonStandard,
277
+ sendSessionHeaders: false,
278
+ supportsResponsesSessionAffinity: false,
279
+ supportsMultipleSystemMessages: supportsMultipleSystemMessagesDefault,
280
+ supportsReasoningEffort:
281
+ hasAuditedReasoningEffortTransport && ((!isGrok && !isZai) || isDirectXaiReasoningEffortModel),
282
+ reasoningEffortMap,
283
+ supportsUsageInStreaming: !isCerebras,
284
+ disableReasoningOnForcedToolChoice: isKimiModel || isAnthropicModel || isOpenCodeGoReasoning,
285
+ disableReasoningOnToolChoice: isDeepseekFamily && Boolean(model.reasoning) && !isOpenRouter,
286
+ supportsToolChoice: !isDirectDeepseekReasoning,
287
+ supportsForcedToolChoice: !isOpenCodeGoKimiReasoning,
288
+ maxTokensField: useMaxTokens ? "max_tokens" : "max_completion_tokens",
289
+ requiresToolResultName: isMistral,
290
+ requiresAssistantAfterToolResult: false,
291
+ requiresThinkingAsText: isMistral,
292
+ requiresMistralToolIds: isMistral,
293
+ thinkingFormat:
294
+ hasAuditedReasoningEffortTransport && (isZai || isMoonshotKimi)
295
+ ? "zai"
296
+ : hasAuditedReasoningEffortTransport && isOpenRouter
297
+ ? "openrouter"
298
+ : hasAuditedReasoningEffortTransport && isAlibaba && isQwen
299
+ ? "qwen"
300
+ : "openai",
301
+ reasoningContentField: "reasoning_content",
302
+ // Backends that 400 follow-up requests when prior assistant tool-call turns lack `reasoning_content`:
303
+ // - Kimi: documented invariant on its native API.
304
+ // - Any reasoning-capable model reached through OpenRouter: DeepSeek V4 Pro and similar enforce
305
+ // this server-side whenever the request is in thinking mode. We can't translate Anthropic's
306
+ // redacted/encrypted reasoning into DeepSeek's plaintext form, so cross-provider continuations
307
+ // rely on a placeholder — see `convertMessages` for the placeholder injection.
308
+ // - OpenCode-Go and OpenCode-Zen handle reasoning content internally and reject
309
+ // `reasoning_content` in client-sent messages — exclude them even for Kimi models.
310
+ requiresReasoningContentForToolCalls:
311
+ (isKimiModel && !isOpenCodeProvider) ||
312
+ (isDeepseekFamily && Boolean(model.reasoning)) ||
313
+ ((provider === "openrouter" || baseUrl.includes("openrouter.ai")) && Boolean(model.reasoning)),
314
+ // DeepSeek V4 rejects synthetic reasoning_content placeholders (".") on tool-call turns.
315
+ // Kimi and OpenRouter accept them when actual reasoning is unavailable.
316
+ allowsSyntheticReasoningContentForToolCalls: !isDeepseekFamily || !model.reasoning,
317
+ requiresAssistantContentForToolCalls: isKimiModel || isDirectDeepseekReasoning,
318
+ openRouterRouting: undefined,
319
+ vercelGatewayRouting: undefined,
320
+ supportsStrictMode: detectStrictModeSupport(provider, baseUrl) && !(isDeepseekFamily && isOpenRouter),
321
+ extraBody: isDirectDeepseekReasoning ? { thinking: { type: "enabled" } } : undefined,
322
+ toolStrictMode: isCerebras ? "all_strict" : "mixed",
323
+ };
324
+ }
325
+
326
+ /**
327
+ * Resolve compatibility settings by layering explicit model.compat overrides onto
328
+ * the detected defaults. This is the canonical compat view for both metadata and transport.
329
+ * @param model - The model configuration
330
+ * @param resolvedBaseUrl - Optional resolved base URL (e.g., after GitHub Copilot proxy-ep resolution).
331
+ * If provided, this takes precedence over model.baseUrl for URL-based checks.
332
+ */
333
+ export function resolveOpenAICompat(
334
+ model: Model<"openai-completions">,
335
+ resolvedBaseUrl?: string,
336
+ ): ResolvedOpenAICompat {
337
+ const detected = detectOpenAICompat(model, resolvedBaseUrl);
338
+ if (!model.compat) {
339
+ return detected;
340
+ }
341
+
342
+ return {
343
+ supportsStore: model.compat.supportsStore ?? detected.supportsStore,
344
+ supportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,
345
+ sendSessionHeaders: model.compat.sendSessionHeaders ?? detected.sendSessionHeaders,
346
+ supportsResponsesSessionAffinity:
347
+ ("supportsResponsesSessionAffinity" in model.compat
348
+ ? model.compat.supportsResponsesSessionAffinity
349
+ : undefined) ?? detected.supportsResponsesSessionAffinity,
350
+ supportsServiceTier: model.compat.supportsServiceTier ?? detected.supportsServiceTier,
351
+ supportsMultipleSystemMessages:
352
+ model.compat.supportsMultipleSystemMessages ?? detected.supportsMultipleSystemMessages,
353
+ supportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,
354
+ reasoningEffortMap: { ...detected.reasoningEffortMap, ...(model.compat.reasoningEffortMap ?? {}) },
355
+ supportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,
356
+ supportsToolChoice: model.compat.supportsToolChoice ?? detected.supportsToolChoice,
357
+ supportsForcedToolChoice: model.compat.supportsForcedToolChoice ?? detected.supportsForcedToolChoice,
358
+ toolChoiceSupport: model.compat.toolChoiceSupport ?? detected.toolChoiceSupport,
359
+ maxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,
360
+ requiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,
361
+ requiresAssistantAfterToolResult:
362
+ model.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,
363
+ requiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,
364
+ requiresMistralToolIds: model.compat.requiresMistralToolIds ?? detected.requiresMistralToolIds,
365
+ thinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,
366
+ reasoningContentField: model.compat.reasoningContentField ?? detected.reasoningContentField,
367
+ requiresReasoningContentForToolCalls:
368
+ model.compat.requiresReasoningContentForToolCalls ?? detected.requiresReasoningContentForToolCalls,
369
+ allowsSyntheticReasoningContentForToolCalls:
370
+ model.compat.allowsSyntheticReasoningContentForToolCalls ??
371
+ detected.allowsSyntheticReasoningContentForToolCalls,
372
+ requiresAssistantContentForToolCalls:
373
+ model.compat.requiresAssistantContentForToolCalls ?? detected.requiresAssistantContentForToolCalls,
374
+ disableReasoningOnForcedToolChoice:
375
+ model.compat.disableReasoningOnForcedToolChoice ?? detected.disableReasoningOnForcedToolChoice,
376
+ disableReasoningOnToolChoice: model.compat.disableReasoningOnToolChoice ?? detected.disableReasoningOnToolChoice,
377
+ openRouterRouting: model.compat.openRouterRouting ?? detected.openRouterRouting,
378
+ vercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,
379
+ supportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,
380
+ extraBody: model.compat.extraBody ?? detected.extraBody,
381
+ toolStrictMode: model.compat.toolStrictMode ?? detected.toolStrictMode,
382
+ };
383
+ }
@@ -0,0 +1 @@
1
+ A Composer bash policy block interrupted a shell attempt. This is not a terminal condition: continue the same task now. Do not retry repository file I/O in bash. Use the dedicated find, search, read, and edit tools for repository work, then continue with the next safe step.
@@ -0,0 +1 @@
1
+ A Composer bash policy block interrupted a shell attempt. This is not a terminal condition: continue the same task now. Do not retry repository file I/O in shell. Use Cursor-native read for files or directories, grep for search or globs, write for changes, and delete only when deletion is required; then continue with the next safe step.
@@ -0,0 +1,7 @@
1
+ File-editing discipline for this Cursor Composer harness (this OVERRIDES contrary habits from your training):
2
+
3
+ - Inspect repository files ONLY with Cursor-native read and grep: use read for file bodies or directories, and grep for content search or glob discovery. NEVER inspect repository files through shell commands (ls, find, fd, cat, sed, awk, grep, rg, head, tail, less, more) or scripts.
4
+ - Modify files ONLY with Cursor-native write, or delete only when deletion is required. NEVER mutate files through shell redirection, tee, sed -i, perl -pi, inline python/node/bun scripts, or other out-of-band writes.
5
+ - Re-read a file after any write before relying on its contents again. Do not fabricate line anchors, paths, tool names, or tool-call arguments.
6
+ - Tool-call arguments must be the exact schema object requested by the native tool. Do not include Markdown, commentary, analysis text, or invented fields inside tool arguments.
7
+ - Use shell only for terminal operations such as tests, builds, package scripts, and git commands. A shell command string must contain only the command itself; NEVER interleave reasoning or commentary into command strings or heredocs.
@@ -0,0 +1,4 @@
1
+ <turn-aborted>
2
+ The previous turn was aborted. Any running tools/commands were terminated.
3
+ If tools were aborted, they may have partially executed; verify current state before retrying.
4
+ </turn-aborted>
@@ -0,0 +1,90 @@
1
+ import { getOpenAICodexTransportDetails, type OpenAICodexTransportDetails } from "./providers/openai-codex-responses";
2
+ import type { Api, Model, Provider, ProviderSessionState } from "./types";
3
+
4
+ export interface ProviderDetailField {
5
+ label: string;
6
+ value: string;
7
+ }
8
+
9
+ export interface ProviderDetails {
10
+ provider: Provider;
11
+ api: Api;
12
+ fields: ProviderDetailField[];
13
+ }
14
+
15
+ export interface ProviderDetailsContext {
16
+ model: Model<Api>;
17
+ sessionId?: string;
18
+ authMode?: string;
19
+ /**
20
+ * Human-readable description of the active credential, e.g.
21
+ * `"broker http://can.internal:8765 · oauth #5 (foo@bar.com)"`.
22
+ * Rendered as a `Source` field; omitted when undefined.
23
+ */
24
+ credentialSource?: string;
25
+ preferWebsockets?: boolean;
26
+ providerSessionState?: Map<string, ProviderSessionState>;
27
+ }
28
+
29
+ export function getProviderDetails(context: ProviderDetailsContext): ProviderDetails {
30
+ const endpoint = formatEndpoint(context.model.baseUrl);
31
+ const fields: ProviderDetailField[] = [
32
+ { label: "Model", value: context.model.id },
33
+ { label: "API", value: context.model.api },
34
+ { label: "Auth", value: context.authMode ?? "auto" },
35
+ { label: "Endpoint", value: endpoint },
36
+ ];
37
+ if (context.credentialSource) {
38
+ fields.push({ label: "Source", value: context.credentialSource });
39
+ }
40
+
41
+ if (context.model.api === "openai-codex-responses") {
42
+ const codexDetails = getOpenAICodexTransportDetails(context.model as Model<"openai-codex-responses">, {
43
+ sessionId: context.sessionId,
44
+ baseUrl: context.model.baseUrl,
45
+ preferWebsockets: context.preferWebsockets,
46
+ providerSessionState: context.providerSessionState,
47
+ });
48
+ fields.push({ label: "Transport", value: formatCodexTransport(codexDetails) });
49
+ fields.push({ label: "WebSocket", value: formatCodexWebSocket(codexDetails) });
50
+ fields.push({ label: "Reuse", value: formatCodexReuse(codexDetails, context.sessionId) });
51
+ }
52
+
53
+ return {
54
+ provider: context.model.provider,
55
+ api: context.model.api,
56
+ fields,
57
+ };
58
+ }
59
+
60
+ function formatEndpoint(baseUrl: string): string {
61
+ try {
62
+ const parsed = new URL(baseUrl);
63
+ const path = parsed.pathname.replace(/\/$/, "");
64
+ return `${parsed.origin}${path || "/"}`;
65
+ } catch {
66
+ return baseUrl;
67
+ }
68
+ }
69
+
70
+ function formatCodexTransport(details: OpenAICodexTransportDetails): string {
71
+ if (details.lastTransport === "websocket") return "websocket";
72
+ if (details.lastTransport === "sse" && (details.websocketDisabled || details.fallbackCount > 0)) {
73
+ return "sse (fallback)";
74
+ }
75
+ if (details.lastTransport === "sse") return "sse";
76
+ return details.websocketPreferred ? "websocket preferred" : "sse";
77
+ }
78
+
79
+ function formatCodexWebSocket(details: OpenAICodexTransportDetails): string {
80
+ if (!details.websocketPreferred) return "off";
81
+ if (details.websocketDisabled) return "disabled after fallback";
82
+ if (details.websocketConnected) return "connected";
83
+ if (details.prewarmed) return "prewarmed";
84
+ return details.hasSessionState ? "enabled" : "waiting for first request";
85
+ }
86
+
87
+ function formatCodexReuse(details: OpenAICodexTransportDetails, sessionId: string | undefined): string {
88
+ if (!sessionId) return "no session key";
89
+ return details.canAppend ? "append enabled" : "full request";
90
+ }