@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,156 @@
1
+ /**
2
+ * Shared implementation for providers that expose BOTH an OpenAI-compatible
3
+ * and an Anthropic-compatible API surface against the same model catalog
4
+ * (currently Kimi Code and Synthetic).
5
+ *
6
+ * Each call site supplies the provider-specific bits (base URLs, default
7
+ * format, optional extra headers); the streaming/forwarding plumbing lives
8
+ * here once.
9
+ */
10
+
11
+ import { copyProviderSafetyStopAdapterInvocation } from "../adapter-internals/provider-safety-stop";
12
+ import { ANTHROPIC_THINKING } from "../stream";
13
+ import type { Context, Model, SimpleStreamOptions } from "../types";
14
+ import { AssistantMessageEventStream } from "../utils/event-stream";
15
+ import { createProviderErrorMessage } from "./error-message";
16
+ import { streamAnthropic, streamOpenAICompletions } from "./register-builtins";
17
+
18
+ export type OpenAIAnthropicApiFormat = "openai" | "anthropic";
19
+
20
+ export interface OpenAIAnthropicShimOptions extends SimpleStreamOptions {
21
+ /** API format: "openai" or "anthropic". */
22
+ format?: OpenAIAnthropicApiFormat;
23
+ }
24
+
25
+ export interface OpenAIAnthropicShimConfig {
26
+ /** Base URL for the Anthropic-compatible endpoint (without trailing /v1/messages). */
27
+ anthropicBaseUrl: string;
28
+ /** Optional override for the OpenAI-compatible base URL. If omitted, `model.baseUrl` is used as-is. */
29
+ openaiBaseUrl?: string;
30
+ /** Default API format when caller does not specify one. */
31
+ defaultFormat: OpenAIAnthropicApiFormat;
32
+ /** Provider-specific headers (e.g. auth/session) merged ahead of user-supplied headers. */
33
+ extraHeaders?: () => Record<string, string>;
34
+ }
35
+
36
+ /**
37
+ * Stream from an OpenAI-or-Anthropic compatible provider. Returns synchronously;
38
+ * async header fetching and stream piping happen internally.
39
+ */
40
+ export function streamOpenAIAnthropicShim(
41
+ model: Model<"openai-completions">,
42
+ context: Context,
43
+ options: OpenAIAnthropicShimOptions | undefined,
44
+ config: OpenAIAnthropicShimConfig,
45
+ ): AssistantMessageEventStream {
46
+ const stream = new AssistantMessageEventStream();
47
+ const format = options?.format ?? config.defaultFormat;
48
+
49
+ (async () => {
50
+ try {
51
+ const mergedHeaders = {
52
+ ...(config.extraHeaders?.() ?? {}),
53
+ ...options?.headers,
54
+ };
55
+
56
+ if (format === "anthropic") {
57
+ const anthropicModel: Model<"anthropic-messages"> = {
58
+ id: model.id,
59
+ name: model.name,
60
+ api: "anthropic-messages",
61
+ provider: model.provider,
62
+ baseUrl: config.anthropicBaseUrl,
63
+ headers: mergedHeaders,
64
+ contextWindow: model.contextWindow,
65
+ maxTokens: model.maxTokens,
66
+ reasoning: model.reasoning,
67
+ thinking: model.thinking,
68
+ input: model.input,
69
+ cost: model.cost,
70
+ };
71
+
72
+ const reasoningEffort = options?.reasoning;
73
+ const thinkingEnabled = !!reasoningEffort && model.reasoning;
74
+ const thinkingBudget = reasoningEffort
75
+ ? (options?.thinkingBudgets?.[reasoningEffort] ?? ANTHROPIC_THINKING[reasoningEffort])
76
+ : undefined;
77
+
78
+ const innerStream = streamAnthropic(
79
+ anthropicModel,
80
+ context,
81
+ copyProviderSafetyStopAdapterInvocation(options, {
82
+ ...options,
83
+ apiKey: options?.apiKey,
84
+ temperature: options?.temperature,
85
+ topP: options?.topP,
86
+ topK: options?.topK,
87
+ minP: options?.minP,
88
+ presencePenalty: options?.presencePenalty,
89
+ repetitionPenalty: options?.repetitionPenalty,
90
+ maxTokens: options?.maxTokens ?? Math.min(model.maxTokens, 32000),
91
+ signal: options?.signal,
92
+ headers: mergedHeaders,
93
+ sessionId: options?.sessionId,
94
+ onPayload: options?.onPayload,
95
+ attemptScope: options?.attemptScope,
96
+ onResponse: options?.onResponse,
97
+ onSseEvent: options?.onSseEvent,
98
+ fetch: options?.fetch,
99
+ streamIdleTimeoutMs: options?.streamIdleTimeoutMs,
100
+ streamFirstEventTimeoutMs: options?.streamFirstEventTimeoutMs,
101
+ thinkingEnabled,
102
+ thinkingBudgetTokens: thinkingBudget,
103
+ }),
104
+ );
105
+
106
+ for await (const event of innerStream) {
107
+ stream.push(event);
108
+ }
109
+ } else {
110
+ const openaiModel: Model<"openai-completions"> = config.openaiBaseUrl
111
+ ? { ...model, baseUrl: config.openaiBaseUrl, headers: mergedHeaders }
112
+ : model;
113
+
114
+ const reasoningEffort = options?.reasoning;
115
+ const innerStream = streamOpenAICompletions(
116
+ openaiModel,
117
+ context,
118
+ copyProviderSafetyStopAdapterInvocation(options, {
119
+ ...options,
120
+ apiKey: options?.apiKey,
121
+ temperature: options?.temperature,
122
+ topP: options?.topP,
123
+ topK: options?.topK,
124
+ minP: options?.minP,
125
+ presencePenalty: options?.presencePenalty,
126
+ repetitionPenalty: options?.repetitionPenalty,
127
+ maxTokens: options?.maxTokens ?? model.maxTokens,
128
+ signal: options?.signal,
129
+ headers: mergedHeaders,
130
+ sessionId: options?.sessionId,
131
+ onPayload: options?.onPayload,
132
+ attemptScope: options?.attemptScope,
133
+ onResponse: options?.onResponse,
134
+ onSseEvent: options?.onSseEvent,
135
+ fetch: options?.fetch,
136
+ streamIdleTimeoutMs: options?.streamIdleTimeoutMs,
137
+ streamFirstEventTimeoutMs: options?.streamFirstEventTimeoutMs,
138
+ reasoning: reasoningEffort,
139
+ }),
140
+ );
141
+
142
+ for await (const event of innerStream) {
143
+ stream.push(event);
144
+ }
145
+ }
146
+ } catch (err) {
147
+ stream.push({
148
+ type: "error",
149
+ reason: "error",
150
+ error: createProviderErrorMessage(model, err),
151
+ });
152
+ }
153
+ })();
154
+
155
+ return stream;
156
+ }
@@ -0,0 +1,3 @@
1
+ import type { FetchImpl } from "../types";
2
+ export declare function isOpenAIUsageExhaustionResponse(bodyText: string, retryAfterMs: number | undefined, retryDelayCapMs: number): boolean;
3
+ export declare function wrapOpenAIFetchForBoundedRateLimits(baseFetch: FetchImpl, maxRetryDelayMs: number | undefined): FetchImpl;
@@ -0,0 +1,57 @@
1
+ import type { FetchImpl } from "../types";
2
+ import { getRetryAfterMsFromHeaders } from "../utils/retry-after";
3
+
4
+ const OPENAI_RETRY_DELAY_CAP_MS = 60_000;
5
+
6
+ // Mirror of `wrapAnthropicFetchForBoundedRateLimits`: OpenAI-compatible providers
7
+ // (e.g. opencode-go) return HTTP 429 for *permanent* usage/quota exhaustion — a
8
+ // monthly-cap reset that can be days away. The OpenAI SDK treats 429 as transient
9
+ // and retries up to `maxRetries`, honoring an out-of-range `Retry-After`; the
10
+ // `create()` call then hangs before the error can surface to the agent loop, so
11
+ // no assistant error is produced and the session-level retry/fallback never runs.
12
+ // Detect exhaustion and set `x-should-retry: false` so the SDK gives up at once
13
+ // and the session retry layer applies its own fail-fast (retry-after > maxDelayMs).
14
+ //
15
+ // Shared by every adapter that drives a raw OpenAI SDK client — openai-completions,
16
+ // openai-responses, and azure-openai-responses. Adapters that route through
17
+ // `fetchWithRetry` (codex, bedrock, ollama, gemini-cli) already bound 429 retries
18
+ // themselves and do not need this wrapper.
19
+ export function isOpenAIUsageExhaustionResponse(
20
+ bodyText: string,
21
+ retryAfterMs: number | undefined,
22
+ retryDelayCapMs: number,
23
+ ): boolean {
24
+ if (retryAfterMs !== undefined && retryAfterMs > retryDelayCapMs) return true;
25
+ return /monthly usage limit|usage limit reached|usage_limit_reached|out_of_credits|insufficient_quota|quota[ _]?exceeded/i.test(
26
+ bodyText,
27
+ );
28
+ }
29
+
30
+ export function wrapOpenAIFetchForBoundedRateLimits(
31
+ baseFetch: FetchImpl,
32
+ maxRetryDelayMs: number | undefined,
33
+ ): FetchImpl {
34
+ const retryDelayCapMs = maxRetryDelayMs ?? OPENAI_RETRY_DELAY_CAP_MS;
35
+ return Object.assign(
36
+ async (input: string | URL | Request, init?: RequestInit): Promise<Response> => {
37
+ const response = await baseFetch(input, init);
38
+ if (response.status !== 429 || retryDelayCapMs === 0) return response;
39
+
40
+ const headers = new Headers(response.headers);
41
+ const retryAfterMs = getRetryAfterMsFromHeaders(headers);
42
+ const bodyText = await response
43
+ .clone()
44
+ .text()
45
+ .catch(() => "");
46
+ if (!isOpenAIUsageExhaustionResponse(bodyText, retryAfterMs, retryDelayCapMs)) return response;
47
+
48
+ headers.set("x-should-retry", "false");
49
+ return new Response(bodyText, {
50
+ status: response.status,
51
+ statusText: response.statusText,
52
+ headers,
53
+ });
54
+ },
55
+ baseFetch.preconnect ? { preconnect: baseFetch.preconnect } : {},
56
+ );
57
+ }
@@ -0,0 +1,254 @@
1
+ /**
2
+ * Zod schemas for the OpenAI chat-completions request shape we accept on the
3
+ * gateway. Mirrors https://platform.openai.com/docs/api-reference/chat — only
4
+ * the shapes the gateway translation layer understands. Unknown fields on
5
+ * permissive objects are accepted-and-stripped (via `z.unknown()` passthroughs
6
+ * or `.loose()`) so the official OpenAI SDK — which sends a growing pile of
7
+ * non-strict defaults (e.g. `stream_options.include_obfuscation`) — does not
8
+ * trip 400s on shapes we simply ignore.
9
+ */
10
+ import type {
11
+ ChatCompletionContentPart,
12
+ ChatCompletionCreateParams,
13
+ ChatCompletionMessageParam,
14
+ ChatCompletionMessageToolCall,
15
+ ChatCompletionTool,
16
+ ChatCompletionToolChoiceOption,
17
+ } from "openai/resources/chat/completions";
18
+ import * as z from "zod/v4";
19
+
20
+ // ─── User-message content parts ─────────────────────────────────────────────
21
+
22
+ export const textPartSchema = z.object({
23
+ type: z.literal("text"),
24
+ text: z.string(),
25
+ });
26
+
27
+ /**
28
+ * OpenAI documents `image_url` as either `{ url: string, detail?: ... }` or —
29
+ * older clients — a bare string. Accept both shapes; downstream we extract a
30
+ * URL. `detail` is accepted for forward-compat but currently dropped (pi-ai's
31
+ * `ImageContent` has no detail field — TODO: plumb through if/when added).
32
+ */
33
+ export const imagePartSchema = z.object({
34
+ type: z.literal("image_url"),
35
+ image_url: z.union([
36
+ z.string(),
37
+ z.object({
38
+ url: z.string(),
39
+ detail: z.enum(["auto", "low", "high"]).optional(),
40
+ }),
41
+ ]),
42
+ });
43
+
44
+ /** OpenAI audio input block (gpt-4o-audio). Accepted; currently dropped downstream. */
45
+ export const inputAudioPartSchema = z.object({
46
+ type: z.literal("input_audio"),
47
+ input_audio: z.object({
48
+ data: z.string(),
49
+ format: z.enum(["wav", "mp3"]),
50
+ }),
51
+ });
52
+
53
+ /** OpenAI file input block (file_search / vision-document). Accepted; currently dropped downstream. */
54
+ export const filePartSchema = z.object({
55
+ type: z.literal("file"),
56
+ file: z.object({
57
+ file_id: z.string().optional(),
58
+ filename: z.string().optional(),
59
+ file_data: z.string().optional(),
60
+ }),
61
+ });
62
+
63
+ /** Replayed assistant refusal block. Accepted; currently dropped downstream. */
64
+ export const refusalPartSchema = z.object({
65
+ type: z.literal("refusal"),
66
+ refusal: z.string(),
67
+ });
68
+
69
+ /**
70
+ * Forward-compat catch-all for unknown content-part types. Matches every other
71
+ * `{ type: string, ... }` object so a new OpenAI block kind does not 400 the
72
+ * whole request; the walker ignores parts whose `type` it does not know.
73
+ */
74
+ export const unknownPartSchema = z.object({ type: z.string() }).loose();
75
+
76
+ export const userContentPartSchema = z.union([
77
+ textPartSchema,
78
+ imagePartSchema,
79
+ inputAudioPartSchema,
80
+ filePartSchema,
81
+ refusalPartSchema,
82
+ unknownPartSchema,
83
+ ]);
84
+
85
+ // ─── Tool calls / tools ─────────────────────────────────────────────────────
86
+
87
+ export const toolCallSchema = z.object({
88
+ id: z.string(),
89
+ type: z.literal("function").optional(),
90
+ function: z.object({
91
+ name: z.string(),
92
+ arguments: z.string(),
93
+ }),
94
+ });
95
+
96
+ export const toolSchema = z.object({
97
+ type: z.literal("function"),
98
+ function: z.object({
99
+ name: z.string().min(1),
100
+ description: z.string().optional(),
101
+ parameters: z.record(z.string(), z.unknown()).optional(),
102
+ /** OpenAI structured-output strict mode. Accepted, not enforced upstream. */
103
+ strict: z.boolean().optional(),
104
+ }),
105
+ });
106
+
107
+ // ─── Tool choice ────────────────────────────────────────────────────────────
108
+
109
+ export const toolChoiceSchema = z.union([
110
+ z.literal("auto"),
111
+ z.literal("none"),
112
+ z.literal("required"),
113
+ z.object({
114
+ type: z.literal("function"),
115
+ function: z.object({ name: z.string().min(1) }),
116
+ }),
117
+ // Anthropic-style `{ type: 'tool', name }` — translated to the OpenAI
118
+ // function shape in the walker.
119
+ z.object({
120
+ type: z.literal("tool"),
121
+ name: z.string().min(1),
122
+ }),
123
+ ]);
124
+
125
+ // ─── Messages ───────────────────────────────────────────────────────────────
126
+
127
+ const baseContent = z.union([z.string(), z.array(userContentPartSchema)]);
128
+
129
+ /**
130
+ * Clients (Aside, LangChain, LiteLLM, the Vercel AI SDK, …) routinely
131
+ * serialize an unset optional field as explicit `null` instead of omitting
132
+ * it, and OpenAI itself accepts that. Collapse `null` back to `undefined` so
133
+ * every downstream consumer keeps working against the `T | undefined` shape.
134
+ */
135
+ const nullableOptional = <T extends z.ZodType>(schema: T) => schema.nullish().transform(value => value ?? undefined);
136
+
137
+ /** Present-but-`null` content is empty text, not a 400. */
138
+ const requiredContent = baseContent.nullable().transform(value => value ?? "");
139
+
140
+ export const systemMessageSchema = z.object({
141
+ role: z.literal("system"),
142
+ content: requiredContent,
143
+ });
144
+
145
+ export const developerMessageSchema = z.object({
146
+ role: z.literal("developer"),
147
+ content: requiredContent,
148
+ });
149
+
150
+ export const userMessageSchema = z.object({
151
+ role: z.literal("user"),
152
+ content: requiredContent,
153
+ });
154
+
155
+ export const assistantMessageSchema = z.object({
156
+ role: z.literal("assistant"),
157
+ content: nullableOptional(baseContent),
158
+ tool_calls: nullableOptional(z.array(toolCallSchema)),
159
+ });
160
+
161
+ export const toolMessageSchema = z.object({
162
+ role: z.literal("tool"),
163
+ content: nullableOptional(baseContent),
164
+ tool_call_id: nullableOptional(z.string()),
165
+ });
166
+
167
+ /**
168
+ * Legacy `function` role (pre-tools API). Translated to a `tool` role
169
+ * canonical message in the walker so downstream providers see one shape.
170
+ */
171
+ export const functionMessageSchema = z.object({
172
+ role: z.literal("function"),
173
+ name: z.string(),
174
+ content: z.string().nullable(),
175
+ });
176
+
177
+ export const messageSchema = z.discriminatedUnion("role", [
178
+ systemMessageSchema,
179
+ developerMessageSchema,
180
+ userMessageSchema,
181
+ assistantMessageSchema,
182
+ toolMessageSchema,
183
+ functionMessageSchema,
184
+ ]);
185
+
186
+ // ─── Stream options ─────────────────────────────────────────────────────────
187
+
188
+ /**
189
+ * Permissive: the official OpenAI SDK sets `include_obfuscation: false` by
190
+ * default. We only consume `include_usage`, so unknown keys are silently
191
+ * stripped rather than 400'd.
192
+ */
193
+ export const streamOptionsSchema = z.object({
194
+ include_usage: z.boolean().optional(),
195
+ });
196
+
197
+ // ─── Stop sequences ─────────────────────────────────────────────────────────
198
+
199
+ // OpenAI rejects > 4 stop strings; mirror that at the gateway.
200
+ export const stopSchema = z.union([z.string(), z.array(z.string()).max(4)]);
201
+
202
+ // ─── Top-level request ──────────────────────────────────────────────────────
203
+
204
+ export const openaiChatRequestSchema = z.object({
205
+ model: z.string().min(1),
206
+ messages: z.array(messageSchema),
207
+ tools: nullableOptional(z.array(toolSchema)),
208
+ tool_choice: nullableOptional(toolChoiceSchema),
209
+ max_tokens: nullableOptional(z.number()),
210
+ max_completion_tokens: nullableOptional(z.number()),
211
+ temperature: nullableOptional(z.number()),
212
+ top_p: nullableOptional(z.number()),
213
+ stop: nullableOptional(stopSchema),
214
+ stream: nullableOptional(z.boolean()),
215
+ stream_options: nullableOptional(streamOptionsSchema),
216
+
217
+ // ── Typed first-class passthroughs (now consumed by the walker) ────────
218
+ response_format: z.unknown().optional(),
219
+ seed: nullableOptional(z.number()),
220
+ presence_penalty: nullableOptional(z.number()),
221
+ frequency_penalty: nullableOptional(z.number()),
222
+ logit_bias: nullableOptional(z.record(z.string(), z.number())),
223
+ user: nullableOptional(z.string()),
224
+ reasoning_effort: nullableOptional(z.enum(["minimal", "low", "medium", "high", "xhigh", "max"])),
225
+ parallel_tool_calls: nullableOptional(z.boolean()),
226
+ service_tier: nullableOptional(z.enum(["auto", "default", "flex", "scale", "priority"])),
227
+ metadata: nullableOptional(z.record(z.string(), z.unknown())),
228
+
229
+ // ── Accept-and-ignore passthroughs ─────────────────────────────────────
230
+ // Forward acceptance only: validating these would 400 on shapes the
231
+ // gateway has no opinion on. The downstream provider does the real check.
232
+ logprobs: z.unknown().optional(),
233
+ top_logprobs: z.unknown().optional(),
234
+ prediction: z.unknown().optional(),
235
+ modalities: z.unknown().optional(),
236
+ audio: z.unknown().optional(),
237
+ store: z.unknown().optional(),
238
+ prompt_cache_key: z.unknown().optional(),
239
+ safety_identifier: z.unknown().optional(),
240
+ n: z.unknown().optional(),
241
+ web_search_options: z.unknown().optional(),
242
+ });
243
+
244
+ /**
245
+ * Public types are sourced from the OpenAI SDK so the gateway stays in
246
+ * lock-step with the canonical API surface; the schemas above are runtime
247
+ * validators for the subset we actually accept.
248
+ */
249
+ export type OpenAIChatRequest = ChatCompletionCreateParams;
250
+ export type OpenAIChatMessage = ChatCompletionMessageParam;
251
+ export type OpenAIChatToolCall = ChatCompletionMessageToolCall;
252
+ export type OpenAIChatTool = ChatCompletionTool;
253
+ export type OpenAIChatToolChoice = ChatCompletionToolChoiceOption;
254
+ export type OpenAIChatContentPart = ChatCompletionContentPart;