@linxiraos/pi-ai 1.0.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 (639) hide show
  1. package/CHANGELOG.md +5066 -0
  2. package/README.md +1195 -0
  3. package/dist/types/api-registry.d.ts +30 -0
  4. package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
  5. package/dist/types/auth-broker/client.d.ts +93 -0
  6. package/dist/types/auth-broker/discover.d.ts +39 -0
  7. package/dist/types/auth-broker/index.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 +136 -0
  10. package/dist/types/auth-broker/server.d.ts +48 -0
  11. package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
  12. package/dist/types/auth-broker/types.d.ts +152 -0
  13. package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
  14. package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
  15. package/dist/types/auth-gateway/http.d.ts +56 -0
  16. package/dist/types/auth-gateway/index.d.ts +3 -0
  17. package/dist/types/auth-gateway/server.d.ts +36 -0
  18. package/dist/types/auth-gateway/types.d.ts +127 -0
  19. package/dist/types/auth-retry.d.ts +150 -0
  20. package/dist/types/auth-storage.d.ts +1258 -0
  21. package/dist/types/dialect/anthropic.d.ts +15 -0
  22. package/dist/types/dialect/catalog.d.ts +3 -0
  23. package/dist/types/dialect/coercion.d.ts +23 -0
  24. package/dist/types/dialect/deepseek.d.ts +14 -0
  25. package/dist/types/dialect/demotion.d.ts +30 -0
  26. package/dist/types/dialect/examples.d.ts +18 -0
  27. package/dist/types/dialect/factory.d.ts +3 -0
  28. package/dist/types/dialect/fenced-thinking.d.ts +53 -0
  29. package/dist/types/dialect/gemini.d.ts +17 -0
  30. package/dist/types/dialect/gemma.d.ts +15 -0
  31. package/dist/types/dialect/glm.d.ts +9 -0
  32. package/dist/types/dialect/harmony.d.ts +8 -0
  33. package/dist/types/dialect/hermes.d.ts +9 -0
  34. package/dist/types/dialect/history.d.ts +3 -0
  35. package/dist/types/dialect/index.d.ts +11 -0
  36. package/dist/types/dialect/inventory.d.ts +9 -0
  37. package/dist/types/dialect/kimi.d.ts +14 -0
  38. package/dist/types/dialect/minimax.d.ts +3 -0
  39. package/dist/types/dialect/owned-stream.d.ts +4 -0
  40. package/dist/types/dialect/qwen3.d.ts +9 -0
  41. package/dist/types/dialect/rendering.d.ts +54 -0
  42. package/dist/types/dialect/thinking.d.ts +6 -0
  43. package/dist/types/dialect/types.d.ts +68 -0
  44. package/dist/types/dialect/xml.d.ts +9 -0
  45. package/dist/types/error/abort.d.ts +14 -0
  46. package/dist/types/error/auth-classify.d.ts +20 -0
  47. package/dist/types/error/auth.d.ts +27 -0
  48. package/dist/types/error/aws.d.ts +27 -0
  49. package/dist/types/error/classes.d.ts +106 -0
  50. package/dist/types/error/finalize.d.ts +39 -0
  51. package/dist/types/error/flags.d.ts +94 -0
  52. package/dist/types/error/format.d.ts +20 -0
  53. package/dist/types/error/gateway.d.ts +20 -0
  54. package/dist/types/error/index.d.ts +14 -0
  55. package/dist/types/error/oauth.d.ts +43 -0
  56. package/dist/types/error/provider.d.ts +42 -0
  57. package/dist/types/error/rate-limit.d.ts +80 -0
  58. package/dist/types/error/retryable.d.ts +27 -0
  59. package/dist/types/error/validation.d.ts +32 -0
  60. package/dist/types/index.d.ts +51 -0
  61. package/dist/types/provider-details.d.ts +24 -0
  62. package/dist/types/providers/amazon-bedrock.d.ts +39 -0
  63. package/dist/types/providers/anthropic-client.d.ts +106 -0
  64. package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
  65. package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
  66. package/dist/types/providers/anthropic-wire.d.ts +345 -0
  67. package/dist/types/providers/anthropic.d.ts +261 -0
  68. package/dist/types/providers/aws-credentials.d.ts +48 -0
  69. package/dist/types/providers/aws-eventstream.d.ts +39 -0
  70. package/dist/types/providers/aws-sigv4.d.ts +55 -0
  71. package/dist/types/providers/azure-openai-responses.d.ts +16 -0
  72. package/dist/types/providers/bedrock-mantle.d.ts +13 -0
  73. package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
  74. package/dist/types/providers/cowork-fetch.d.ts +3 -0
  75. package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
  76. package/dist/types/providers/cursor-pi-args.d.ts +105 -0
  77. package/dist/types/providers/cursor.d.ts +221 -0
  78. package/dist/types/providers/devin.d.ts +12 -0
  79. package/dist/types/providers/error-message.d.ts +25 -0
  80. package/dist/types/providers/github-copilot-headers.d.ts +40 -0
  81. package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
  82. package/dist/types/providers/gitlab-duo.d.ts +27 -0
  83. package/dist/types/providers/google-auth.d.ts +24 -0
  84. package/dist/types/providers/google-gemini-cli.d.ts +120 -0
  85. package/dist/types/providers/google-shared.d.ts +203 -0
  86. package/dist/types/providers/google-types.d.ts +155 -0
  87. package/dist/types/providers/google-vertex.d.ts +7 -0
  88. package/dist/types/providers/google.d.ts +4 -0
  89. package/dist/types/providers/grammar.d.ts +1 -0
  90. package/dist/types/providers/kimi.d.ts +27 -0
  91. package/dist/types/providers/mock.d.ts +179 -0
  92. package/dist/types/providers/ollama.d.ts +8 -0
  93. package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
  94. package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
  95. package/dist/types/providers/openai-chat-server.d.ts +16 -0
  96. package/dist/types/providers/openai-chat-wire.d.ts +669 -0
  97. package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
  98. package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
  99. package/dist/types/providers/openai-codex-responses.d.ts +238 -0
  100. package/dist/types/providers/openai-completions.d.ts +48 -0
  101. package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
  102. package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
  103. package/dist/types/providers/openai-responses-server.d.ts +17 -0
  104. package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
  105. package/dist/types/providers/openai-responses.d.ts +131 -0
  106. package/dist/types/providers/openai-shared.d.ts +624 -0
  107. package/dist/types/providers/pi-native-client.d.ts +13 -0
  108. package/dist/types/providers/pi-native-server.d.ts +69 -0
  109. package/dist/types/providers/register-builtins.d.ts +37 -0
  110. package/dist/types/providers/synthetic.d.ts +26 -0
  111. package/dist/types/providers/transform-messages.d.ts +32 -0
  112. package/dist/types/providers/vision-guard.d.ts +20 -0
  113. package/dist/types/registry/aiand.d.ts +7 -0
  114. package/dist/types/registry/aimlapi.d.ts +4 -0
  115. package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
  116. package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
  117. package/dist/types/registry/amazon-bedrock.d.ts +5 -0
  118. package/dist/types/registry/anthropic.d.ts +10 -0
  119. package/dist/types/registry/api-key-login.d.ts +42 -0
  120. package/dist/types/registry/api-key-validation.d.ts +43 -0
  121. package/dist/types/registry/aws.d.ts +13 -0
  122. package/dist/types/registry/azure.d.ts +4 -0
  123. package/dist/types/registry/baseten.d.ts +7 -0
  124. package/dist/types/registry/bedrock-mantle.d.ts +22 -0
  125. package/dist/types/registry/cerebras.d.ts +7 -0
  126. package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
  127. package/dist/types/registry/coreweave.d.ts +7 -0
  128. package/dist/types/registry/cursor.d.ts +7 -0
  129. package/dist/types/registry/deepseek.d.ts +8 -0
  130. package/dist/types/registry/derived.d.ts +5 -0
  131. package/dist/types/registry/devin.d.ts +8 -0
  132. package/dist/types/registry/exa.d.ts +8 -0
  133. package/dist/types/registry/firepass.d.ts +16 -0
  134. package/dist/types/registry/fireworks.d.ts +7 -0
  135. package/dist/types/registry/github-copilot.d.ts +7 -0
  136. package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
  137. package/dist/types/registry/gitlab-duo.d.ts +9 -0
  138. package/dist/types/registry/gmi-cloud.d.ts +7 -0
  139. package/dist/types/registry/google-antigravity.d.ts +9 -0
  140. package/dist/types/registry/google-gemini-cli.d.ts +9 -0
  141. package/dist/types/registry/google-vertex.d.ts +5 -0
  142. package/dist/types/registry/google.d.ts +4 -0
  143. package/dist/types/registry/groq.d.ts +4 -0
  144. package/dist/types/registry/huggingface.d.ts +7 -0
  145. package/dist/types/registry/index.d.ts +4 -0
  146. package/dist/types/registry/kagi.d.ts +14 -0
  147. package/dist/types/registry/kilo.d.ts +7 -0
  148. package/dist/types/registry/kimi-code.d.ts +7 -0
  149. package/dist/types/registry/litellm.d.ts +13 -0
  150. package/dist/types/registry/llama-cpp.d.ts +8 -0
  151. package/dist/types/registry/lm-studio.d.ts +8 -0
  152. package/dist/types/registry/meta.d.ts +7 -0
  153. package/dist/types/registry/minimax-code-cn.d.ts +6 -0
  154. package/dist/types/registry/minimax-code.d.ts +6 -0
  155. package/dist/types/registry/minimax.d.ts +4 -0
  156. package/dist/types/registry/mistral.d.ts +4 -0
  157. package/dist/types/registry/moonshot.d.ts +7 -0
  158. package/dist/types/registry/nanogpt.d.ts +7 -0
  159. package/dist/types/registry/novita.d.ts +6 -0
  160. package/dist/types/registry/nvidia.d.ts +7 -0
  161. package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
  162. package/dist/types/registry/oauth/anthropic.d.ts +24 -0
  163. package/dist/types/registry/oauth/callback-server.d.ts +74 -0
  164. package/dist/types/registry/oauth/cursor.d.ts +16 -0
  165. package/dist/types/registry/oauth/device-code.d.ts +25 -0
  166. package/dist/types/registry/oauth/devin.d.ts +5 -0
  167. package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
  168. package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
  169. package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
  170. package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
  171. package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
  172. package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
  173. package/dist/types/registry/oauth/index.d.ts +45 -0
  174. package/dist/types/registry/oauth/kimi.d.ts +21 -0
  175. package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
  176. package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
  177. package/dist/types/registry/oauth/opencode.d.ts +18 -0
  178. package/dist/types/registry/oauth/perplexity.d.ts +9 -0
  179. package/dist/types/registry/oauth/pkce.d.ts +8 -0
  180. package/dist/types/registry/oauth/types.d.ts +87 -0
  181. package/dist/types/registry/oauth/wafer.d.ts +1 -0
  182. package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
  183. package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
  184. package/dist/types/registry/oauth/zai.d.ts +25 -0
  185. package/dist/types/registry/ollama-cloud.d.ts +7 -0
  186. package/dist/types/registry/ollama.d.ts +12 -0
  187. package/dist/types/registry/openai-codex-device.d.ts +8 -0
  188. package/dist/types/registry/openai-codex.d.ts +9 -0
  189. package/dist/types/registry/openai.d.ts +4 -0
  190. package/dist/types/registry/opencode-go.d.ts +6 -0
  191. package/dist/types/registry/opencode-zen.d.ts +6 -0
  192. package/dist/types/registry/openrouter.d.ts +13 -0
  193. package/dist/types/registry/parallel.d.ts +14 -0
  194. package/dist/types/registry/perplexity.d.ts +7 -0
  195. package/dist/types/registry/qianfan.d.ts +7 -0
  196. package/dist/types/registry/qwen-portal.d.ts +7 -0
  197. package/dist/types/registry/registry.d.ts +367 -0
  198. package/dist/types/registry/sakana.d.ts +7 -0
  199. package/dist/types/registry/siliconflow-cn.d.ts +7 -0
  200. package/dist/types/registry/siliconflow.d.ts +7 -0
  201. package/dist/types/registry/synthetic.d.ts +6 -0
  202. package/dist/types/registry/tavily.d.ts +14 -0
  203. package/dist/types/registry/together.d.ts +6 -0
  204. package/dist/types/registry/types.d.ts +75 -0
  205. package/dist/types/registry/umans.d.ts +7 -0
  206. package/dist/types/registry/venice.d.ts +13 -0
  207. package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
  208. package/dist/types/registry/vllm.d.ts +7 -0
  209. package/dist/types/registry/wafer-serverless.d.ts +6 -0
  210. package/dist/types/registry/xai-oauth.d.ts +7 -0
  211. package/dist/types/registry/xai.d.ts +7 -0
  212. package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
  213. package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
  214. package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
  215. package/dist/types/registry/xiaomi.d.ts +6 -0
  216. package/dist/types/registry/zai.d.ts +15 -0
  217. package/dist/types/registry/zenmux.d.ts +7 -0
  218. package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
  219. package/dist/types/stream.d.ts +46 -0
  220. package/dist/types/types.d.ts +1064 -0
  221. package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
  222. package/dist/types/usage/claude.d.ts +4 -0
  223. package/dist/types/usage/cursor.d.ts +4 -0
  224. package/dist/types/usage/gemini.d.ts +2 -0
  225. package/dist/types/usage/github-copilot.d.ts +7 -0
  226. package/dist/types/usage/google-antigravity.d.ts +15 -0
  227. package/dist/types/usage/kimi.d.ts +2 -0
  228. package/dist/types/usage/minimax-code.d.ts +3 -0
  229. package/dist/types/usage/ollama.d.ts +5 -0
  230. package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
  231. package/dist/types/usage/openai-codex-reset.d.ts +88 -0
  232. package/dist/types/usage/openai-codex.d.ts +10 -0
  233. package/dist/types/usage/opencode-go.d.ts +2 -0
  234. package/dist/types/usage/shared.d.ts +1 -0
  235. package/dist/types/usage/synthetic.d.ts +2 -0
  236. package/dist/types/usage/umans.d.ts +2 -0
  237. package/dist/types/usage/xai-oauth.d.ts +12 -0
  238. package/dist/types/usage/zai.d.ts +3 -0
  239. package/dist/types/usage.d.ts +527 -0
  240. package/dist/types/utils/abort.d.ts +25 -0
  241. package/dist/types/utils/anthropic-auth.d.ts +35 -0
  242. package/dist/types/utils/aws-profile.d.ts +17 -0
  243. package/dist/types/utils/block-symbols.d.ts +62 -0
  244. package/dist/types/utils/deterministic-id.d.ts +16 -0
  245. package/dist/types/utils/empty-completion-retry.d.ts +21 -0
  246. package/dist/types/utils/event-stream.d.ts +39 -0
  247. package/dist/types/utils/foundry.d.ts +1 -0
  248. package/dist/types/utils/google-validation.d.ts +2 -0
  249. package/dist/types/utils/harmony-leak.d.ts +135 -0
  250. package/dist/types/utils/http-inspector.d.ts +49 -0
  251. package/dist/types/utils/idle-iterator.d.ts +149 -0
  252. package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
  253. package/dist/types/utils/openai-http.d.ts +48 -0
  254. package/dist/types/utils/openrouter-headers.d.ts +1 -0
  255. package/dist/types/utils/parse-bind.d.ts +23 -0
  256. package/dist/types/utils/provider-response.d.ts +3 -0
  257. package/dist/types/utils/proxy.d.ts +39 -0
  258. package/dist/types/utils/request-debug.d.ts +29 -0
  259. package/dist/types/utils/retry-after.d.ts +4 -0
  260. package/dist/types/utils/retry.d.ts +14 -0
  261. package/dist/types/utils/schema/adapt.d.ts +24 -0
  262. package/dist/types/utils/schema/compatibility.d.ts +30 -0
  263. package/dist/types/utils/schema/dereference.d.ts +11 -0
  264. package/dist/types/utils/schema/draft.d.ts +10 -0
  265. package/dist/types/utils/schema/equality.d.ts +4 -0
  266. package/dist/types/utils/schema/fields.d.ts +54 -0
  267. package/dist/types/utils/schema/index.d.ts +14 -0
  268. package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
  269. package/dist/types/utils/schema/meta-validator.d.ts +2 -0
  270. package/dist/types/utils/schema/normalize.d.ts +153 -0
  271. package/dist/types/utils/schema/spill.d.ts +8 -0
  272. package/dist/types/utils/schema/stamps.d.ts +17 -0
  273. package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
  274. package/dist/types/utils/schema/types.d.ts +4 -0
  275. package/dist/types/utils/schema/typescript.d.ts +24 -0
  276. package/dist/types/utils/schema/wire.d.ts +52 -0
  277. package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
  278. package/dist/types/utils/sse-debug.d.ts +5 -0
  279. package/dist/types/utils/stream-markup-healing.d.ts +87 -0
  280. package/dist/types/utils/thinking-loop.d.ts +102 -0
  281. package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
  282. package/dist/types/utils/tool-choice.d.ts +52 -0
  283. package/dist/types/utils/validation.d.ts +28 -0
  284. package/dist/types/utils.d.ts +57 -0
  285. package/package.json +138 -0
  286. package/src/api-registry.ts +109 -0
  287. package/src/auth/sqlite-credential-store.ts +2066 -0
  288. package/src/auth-broker/client.ts +471 -0
  289. package/src/auth-broker/discover.ts +310 -0
  290. package/src/auth-broker/index.ts +7 -0
  291. package/src/auth-broker/refresher.ts +117 -0
  292. package/src/auth-broker/remote-store.ts +1332 -0
  293. package/src/auth-broker/server.ts +898 -0
  294. package/src/auth-broker/snapshot-cache.ts +200 -0
  295. package/src/auth-broker/types.ts +193 -0
  296. package/src/auth-broker/wire-schema-resource.ts +487 -0
  297. package/src/auth-broker/wire-schemas.ts +43 -0
  298. package/src/auth-gateway/http.ts +227 -0
  299. package/src/auth-gateway/index.ts +3 -0
  300. package/src/auth-gateway/server.ts +836 -0
  301. package/src/auth-gateway/types.ts +153 -0
  302. package/src/auth-retry.ts +401 -0
  303. package/src/auth-storage.ts +6540 -0
  304. package/src/dialect/anthropic.md +31 -0
  305. package/src/dialect/anthropic.ts +608 -0
  306. package/src/dialect/catalog.ts +29 -0
  307. package/src/dialect/coercion.ts +136 -0
  308. package/src/dialect/deepseek.md +24 -0
  309. package/src/dialect/deepseek.ts +609 -0
  310. package/src/dialect/demotion.ts +40 -0
  311. package/src/dialect/examples.ts +71 -0
  312. package/src/dialect/factory.ts +34 -0
  313. package/src/dialect/fenced-thinking.ts +184 -0
  314. package/src/dialect/gemini.md +44 -0
  315. package/src/dialect/gemini.ts +583 -0
  316. package/src/dialect/gemma.md +33 -0
  317. package/src/dialect/gemma.ts +387 -0
  318. package/src/dialect/glm.md +32 -0
  319. package/src/dialect/glm.ts +579 -0
  320. package/src/dialect/harmony.md +31 -0
  321. package/src/dialect/harmony.ts +345 -0
  322. package/src/dialect/hermes.md +25 -0
  323. package/src/dialect/hermes.ts +206 -0
  324. package/src/dialect/history.ts +81 -0
  325. package/src/dialect/index.ts +15 -0
  326. package/src/dialect/inventory.ts +30 -0
  327. package/src/dialect/kimi.md +24 -0
  328. package/src/dialect/kimi.ts +340 -0
  329. package/src/dialect/minimax.md +31 -0
  330. package/src/dialect/minimax.ts +95 -0
  331. package/src/dialect/owned-stream.ts +481 -0
  332. package/src/dialect/prompt-template.md +12 -0
  333. package/src/dialect/qwen3.md +28 -0
  334. package/src/dialect/qwen3.ts +240 -0
  335. package/src/dialect/rendering.ts +304 -0
  336. package/src/dialect/thinking.ts +292 -0
  337. package/src/dialect/types.ts +56 -0
  338. package/src/dialect/xml.md +22 -0
  339. package/src/dialect/xml.ts +90 -0
  340. package/src/error/abort.ts +18 -0
  341. package/src/error/auth-classify.ts +47 -0
  342. package/src/error/auth.ts +48 -0
  343. package/src/error/aws.ts +35 -0
  344. package/src/error/classes.ts +281 -0
  345. package/src/error/finalize.ts +69 -0
  346. package/src/error/flags.ts +602 -0
  347. package/src/error/format.ts +45 -0
  348. package/src/error/gateway.ts +96 -0
  349. package/src/error/index.ts +14 -0
  350. package/src/error/oauth.ts +58 -0
  351. package/src/error/provider.ts +63 -0
  352. package/src/error/rate-limit.ts +303 -0
  353. package/src/error/retryable.ts +70 -0
  354. package/src/error/validation.ts +44 -0
  355. package/src/index.ts +51 -0
  356. package/src/provider-details.ts +90 -0
  357. package/src/providers/amazon-bedrock.ts +1064 -0
  358. package/src/providers/anthropic-client.ts +317 -0
  359. package/src/providers/anthropic-messages-server-schema.ts +252 -0
  360. package/src/providers/anthropic-messages-server.ts +818 -0
  361. package/src/providers/anthropic-wire.ts +359 -0
  362. package/src/providers/anthropic.ts +4539 -0
  363. package/src/providers/aws-credentials.ts +772 -0
  364. package/src/providers/aws-eventstream.ts +181 -0
  365. package/src/providers/aws-sigv4.ts +218 -0
  366. package/src/providers/azure-openai-responses.ts +438 -0
  367. package/src/providers/bedrock-mantle.ts +110 -0
  368. package/src/providers/claude-code-fingerprint.ts +20 -0
  369. package/src/providers/cowork-fetch.ts +201 -0
  370. package/src/providers/cursor/exec-modern.ts +496 -0
  371. package/src/providers/cursor/proto/agent.proto +4533 -0
  372. package/src/providers/cursor/proto/buf.gen.yaml +6 -0
  373. package/src/providers/cursor/proto/buf.yaml +17 -0
  374. package/src/providers/cursor-pi-args.ts +165 -0
  375. package/src/providers/cursor.ts +4689 -0
  376. package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
  377. package/src/providers/devin/proto/buf.gen.yaml +33 -0
  378. package/src/providers/devin/proto/buf.yaml +17 -0
  379. package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
  380. package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
  381. package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
  382. package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
  383. package/src/providers/devin/proto/cel/expr/value.proto +41 -0
  384. package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
  385. package/src/providers/devin/proto/errorspb/errors.proto +56 -0
  386. package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
  387. package/src/providers/devin/proto/errorspb/markers.proto +10 -0
  388. package/src/providers/devin/proto/errorspb/tags.proto +12 -0
  389. package/src/providers/devin/proto/errorspb/testing.proto +6 -0
  390. package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
  391. package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
  392. package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
  393. package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
  394. package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
  395. package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
  396. package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
  397. package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
  398. package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
  399. package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
  400. package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
  401. package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
  402. package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
  403. package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
  404. package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
  405. package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
  406. package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
  407. package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
  408. package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
  409. package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
  410. package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
  411. package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
  412. package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
  413. package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
  414. package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
  415. package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
  416. package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
  417. package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
  418. package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
  419. package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
  420. package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
  421. package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
  422. package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
  423. package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
  424. package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
  425. package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
  426. package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
  427. package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
  428. package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
  429. package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
  430. package/src/providers/devin.ts +679 -0
  431. package/src/providers/error-message.ts +23 -0
  432. package/src/providers/github-copilot-headers.ts +141 -0
  433. package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
  434. package/src/providers/gitlab-duo-workflow.ts +3135 -0
  435. package/src/providers/gitlab-duo.ts +399 -0
  436. package/src/providers/google-auth.ts +330 -0
  437. package/src/providers/google-gemini-cli.ts +1370 -0
  438. package/src/providers/google-shared.ts +1122 -0
  439. package/src/providers/google-types.ts +180 -0
  440. package/src/providers/google-vertex.ts +135 -0
  441. package/src/providers/google.ts +47 -0
  442. package/src/providers/grammar.ts +70 -0
  443. package/src/providers/kimi.ts +51 -0
  444. package/src/providers/mock.ts +514 -0
  445. package/src/providers/ollama.ts +776 -0
  446. package/src/providers/openai-anthropic-shim.ts +166 -0
  447. package/src/providers/openai-chat-server-schema.ts +243 -0
  448. package/src/providers/openai-chat-server.ts +752 -0
  449. package/src/providers/openai-chat-wire.ts +859 -0
  450. package/src/providers/openai-codex/request-transformer.ts +491 -0
  451. package/src/providers/openai-codex/response-handler.ts +102 -0
  452. package/src/providers/openai-codex-responses.ts +4716 -0
  453. package/src/providers/openai-completions.ts +2389 -0
  454. package/src/providers/openai-reasoning-fallback.ts +269 -0
  455. package/src/providers/openai-responses-server-schema.ts +397 -0
  456. package/src/providers/openai-responses-server.ts +1466 -0
  457. package/src/providers/openai-responses-wire.ts +6416 -0
  458. package/src/providers/openai-responses.ts +1393 -0
  459. package/src/providers/openai-shared.ts +3500 -0
  460. package/src/providers/pi-native-client.ts +275 -0
  461. package/src/providers/pi-native-server.ts +245 -0
  462. package/src/providers/register-builtins.ts +503 -0
  463. package/src/providers/synthetic.ts +50 -0
  464. package/src/providers/transform-messages.ts +1083 -0
  465. package/src/providers/vision-guard.ts +54 -0
  466. package/src/registry/aiand.ts +22 -0
  467. package/src/registry/aimlapi.ts +6 -0
  468. package/src/registry/alibaba-coding-plan.ts +104 -0
  469. package/src/registry/alibaba-token-plan.ts +125 -0
  470. package/src/registry/amazon-bedrock.ts +22 -0
  471. package/src/registry/anthropic.ts +26 -0
  472. package/src/registry/api-key-login.ts +115 -0
  473. package/src/registry/api-key-validation.ts +145 -0
  474. package/src/registry/aws.ts +57 -0
  475. package/src/registry/azure.ts +6 -0
  476. package/src/registry/baseten.ts +22 -0
  477. package/src/registry/bedrock-mantle.ts +34 -0
  478. package/src/registry/cerebras.ts +23 -0
  479. package/src/registry/cloudflare-ai-gateway.ts +45 -0
  480. package/src/registry/coreweave.ts +40 -0
  481. package/src/registry/cursor.ts +20 -0
  482. package/src/registry/deepseek.ts +46 -0
  483. package/src/registry/derived.ts +9 -0
  484. package/src/registry/devin.ts +15 -0
  485. package/src/registry/exa.ts +19 -0
  486. package/src/registry/firepass.ts +32 -0
  487. package/src/registry/fireworks.ts +28 -0
  488. package/src/registry/github-copilot.ts +22 -0
  489. package/src/registry/gitlab-duo-workflow.ts +20 -0
  490. package/src/registry/gitlab-duo.ts +19 -0
  491. package/src/registry/gmi-cloud.ts +22 -0
  492. package/src/registry/google-antigravity.ts +22 -0
  493. package/src/registry/google-gemini-cli.ts +22 -0
  494. package/src/registry/google-vertex.ts +38 -0
  495. package/src/registry/google.ts +6 -0
  496. package/src/registry/groq.ts +6 -0
  497. package/src/registry/huggingface.ts +29 -0
  498. package/src/registry/index.ts +4 -0
  499. package/src/registry/kagi.ts +46 -0
  500. package/src/registry/kilo.ts +114 -0
  501. package/src/registry/kimi-code.ts +17 -0
  502. package/src/registry/litellm.ts +45 -0
  503. package/src/registry/llama-cpp.ts +35 -0
  504. package/src/registry/lm-studio.ts +31 -0
  505. package/src/registry/meta.ts +22 -0
  506. package/src/registry/minimax-code-cn.ts +12 -0
  507. package/src/registry/minimax-code.ts +12 -0
  508. package/src/registry/minimax.ts +6 -0
  509. package/src/registry/mistral.ts +6 -0
  510. package/src/registry/moonshot.ts +28 -0
  511. package/src/registry/nanogpt.ts +22 -0
  512. package/src/registry/novita.ts +25 -0
  513. package/src/registry/nvidia.ts +61 -0
  514. package/src/registry/oauth/anthropic-constants.ts +12 -0
  515. package/src/registry/oauth/anthropic.ts +346 -0
  516. package/src/registry/oauth/callback-server.ts +438 -0
  517. package/src/registry/oauth/cursor.ts +187 -0
  518. package/src/registry/oauth/device-code.ts +92 -0
  519. package/src/registry/oauth/devin.ts +124 -0
  520. package/src/registry/oauth/github-copilot.ts +369 -0
  521. package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
  522. package/src/registry/oauth/gitlab-duo.ts +222 -0
  523. package/src/registry/oauth/google-antigravity.ts +225 -0
  524. package/src/registry/oauth/google-gemini-cli.ts +297 -0
  525. package/src/registry/oauth/google-oauth-shared.ts +211 -0
  526. package/src/registry/oauth/index.ts +187 -0
  527. package/src/registry/oauth/kimi.ts +297 -0
  528. package/src/registry/oauth/minimax-code.ts +53 -0
  529. package/src/registry/oauth/oauth.html +317 -0
  530. package/src/registry/oauth/openai-codex.ts +384 -0
  531. package/src/registry/oauth/opencode.ts +50 -0
  532. package/src/registry/oauth/perplexity.ts +228 -0
  533. package/src/registry/oauth/pkce.ts +18 -0
  534. package/src/registry/oauth/types.ts +96 -0
  535. package/src/registry/oauth/wafer.ts +24 -0
  536. package/src/registry/oauth/xai-oauth.ts +559 -0
  537. package/src/registry/oauth/xiaomi.ts +211 -0
  538. package/src/registry/oauth/zai.ts +285 -0
  539. package/src/registry/ollama-cloud.ts +36 -0
  540. package/src/registry/ollama.ts +43 -0
  541. package/src/registry/openai-codex-device.ts +18 -0
  542. package/src/registry/openai-codex.ts +19 -0
  543. package/src/registry/openai.ts +6 -0
  544. package/src/registry/opencode-go.ts +12 -0
  545. package/src/registry/opencode-zen.ts +12 -0
  546. package/src/registry/openrouter.ts +28 -0
  547. package/src/registry/parallel.ts +45 -0
  548. package/src/registry/perplexity.ts +13 -0
  549. package/src/registry/qianfan.ts +27 -0
  550. package/src/registry/qwen-portal.ts +50 -0
  551. package/src/registry/registry.ts +182 -0
  552. package/src/registry/sakana.ts +22 -0
  553. package/src/registry/siliconflow-cn.ts +22 -0
  554. package/src/registry/siliconflow.ts +22 -0
  555. package/src/registry/synthetic.ts +21 -0
  556. package/src/registry/tavily.ts +45 -0
  557. package/src/registry/together.ts +22 -0
  558. package/src/registry/types.ts +86 -0
  559. package/src/registry/umans.ts +23 -0
  560. package/src/registry/venice.ts +33 -0
  561. package/src/registry/vercel-ai-gateway.ts +38 -0
  562. package/src/registry/vllm.ts +34 -0
  563. package/src/registry/wafer-serverless.ts +12 -0
  564. package/src/registry/xai-oauth.ts +17 -0
  565. package/src/registry/xai.ts +22 -0
  566. package/src/registry/xiaomi-token-plan-ams.ts +12 -0
  567. package/src/registry/xiaomi-token-plan-cn.ts +12 -0
  568. package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
  569. package/src/registry/xiaomi.ts +12 -0
  570. package/src/registry/zai.ts +41 -0
  571. package/src/registry/zenmux.ts +22 -0
  572. package/src/registry/zhipu-coding-plan.ts +27 -0
  573. package/src/stream.ts +1944 -0
  574. package/src/types.ts +1243 -0
  575. package/src/usage/alibaba-token-plan.ts +230 -0
  576. package/src/usage/claude.ts +830 -0
  577. package/src/usage/cursor.ts +335 -0
  578. package/src/usage/gemini.ts +258 -0
  579. package/src/usage/github-copilot.ts +424 -0
  580. package/src/usage/google-antigravity.ts +497 -0
  581. package/src/usage/kimi.ts +277 -0
  582. package/src/usage/minimax-code.ts +291 -0
  583. package/src/usage/ollama.ts +41 -0
  584. package/src/usage/openai-codex-base-url.ts +35 -0
  585. package/src/usage/openai-codex-reset.ts +205 -0
  586. package/src/usage/openai-codex.ts +627 -0
  587. package/src/usage/opencode-go.ts +89 -0
  588. package/src/usage/shared.ts +10 -0
  589. package/src/usage/synthetic.ts +180 -0
  590. package/src/usage/umans.ts +192 -0
  591. package/src/usage/xai-oauth.ts +414 -0
  592. package/src/usage/zai.ts +370 -0
  593. package/src/usage.ts +411 -0
  594. package/src/utils/abort.ts +67 -0
  595. package/src/utils/anthropic-auth.ts +93 -0
  596. package/src/utils/aws-profile.ts +88 -0
  597. package/src/utils/block-symbols.ts +78 -0
  598. package/src/utils/deterministic-id.ts +20 -0
  599. package/src/utils/empty-completion-retry.ts +161 -0
  600. package/src/utils/event-stream.ts +202 -0
  601. package/src/utils/foundry.ts +8 -0
  602. package/src/utils/google-validation.ts +25 -0
  603. package/src/utils/harmony-leak.ts +500 -0
  604. package/src/utils/http-inspector.ts +196 -0
  605. package/src/utils/idle-iterator.ts +531 -0
  606. package/src/utils/leaked-thinking-stream.ts +483 -0
  607. package/src/utils/openai-http.ts +119 -0
  608. package/src/utils/openrouter-headers.ts +12 -0
  609. package/src/utils/parse-bind.ts +56 -0
  610. package/src/utils/provider-response.ts +30 -0
  611. package/src/utils/proxy.ts +314 -0
  612. package/src/utils/request-debug.ts +351 -0
  613. package/src/utils/retry-after.ts +121 -0
  614. package/src/utils/retry.ts +77 -0
  615. package/src/utils/schema/CONSTRAINTS.md +168 -0
  616. package/src/utils/schema/adapt.ts +36 -0
  617. package/src/utils/schema/compatibility.ts +435 -0
  618. package/src/utils/schema/dereference.ts +98 -0
  619. package/src/utils/schema/draft.ts +341 -0
  620. package/src/utils/schema/equality.ts +97 -0
  621. package/src/utils/schema/fields.ts +210 -0
  622. package/src/utils/schema/index.ts +14 -0
  623. package/src/utils/schema/json-schema-validator.ts +595 -0
  624. package/src/utils/schema/meta-validator.ts +167 -0
  625. package/src/utils/schema/normalize.ts +2314 -0
  626. package/src/utils/schema/spill.ts +43 -0
  627. package/src/utils/schema/stamps.ts +109 -0
  628. package/src/utils/schema/strict-tool-validation.ts +117 -0
  629. package/src/utils/schema/types.ts +10 -0
  630. package/src/utils/schema/typescript.ts +212 -0
  631. package/src/utils/schema/wire.ts +662 -0
  632. package/src/utils/sdk-stream-timeout.ts +43 -0
  633. package/src/utils/sse-debug.ts +18 -0
  634. package/src/utils/stream-markup-healing.ts +247 -0
  635. package/src/utils/thinking-loop.ts +552 -0
  636. package/src/utils/tool-call-loop-guard.ts +107 -0
  637. package/src/utils/tool-choice.ts +101 -0
  638. package/src/utils/validation.ts +1932 -0
  639. package/src/utils.ts +492 -0
@@ -0,0 +1,317 @@
1
+ /**
2
+ * Minimal HTTP client for the Anthropic Messages API.
3
+ *
4
+ * pi-ai builds every request header itself (`buildAnthropicHeaders`), serializes
5
+ * the body itself (`buildParams`), and parses SSE frames itself
6
+ * (`iterateAnthropicEvents`), so the only `@anthropic-ai/sdk` surface this
7
+ * package ever exercised was URL assembly, auth-header injection, bounded
8
+ * retries, the pre-response timeout, and HTTP-error-to-status mapping. This
9
+ * module implements exactly that surface and nothing else.
10
+ *
11
+ * Behavioral contract (kept compatible with the SDK so downstream error
12
+ * classification keeps working):
13
+ * - Non-2xx responses throw {@link AnthropicApiError} whose `status` property
14
+ * carries the HTTP status and whose message is `"<status> <body>"`.
15
+ * - Pre-response timeouts throw {@link AnthropicConnectionTimeoutError}
16
+ * ("Request timed out.").
17
+ * - Caller aborts throw an `Error` with message "Request was aborted.".
18
+ * - Retries: connection errors and 408/409/429/5xx (or `x-should-retry: true`)
19
+ * are retried up to `maxRetries` times, honoring `retry-after-ms` /
20
+ * `retry-after`, otherwise exponential backoff (0.5s * 2^n, capped at 8s,
21
+ * with up to 25% jitter).
22
+ */
23
+ import { scheduler } from "node:timers/promises";
24
+ import * as AIError from "../error";
25
+ import { AnthropicApiError, AnthropicConnectionError, AnthropicConnectionTimeoutError } from "../error";
26
+
27
+ export { AnthropicApiError, AnthropicConnectionError, AnthropicConnectionTimeoutError };
28
+
29
+ import type { FetchImpl } from "../types";
30
+ import type { MessageCreateParamsStreaming } from "./anthropic-wire";
31
+
32
+ /** Default pre-response timeout, matching the SDK's 10-minute default. */
33
+ const DEFAULT_TIMEOUT_MS = 600_000;
34
+ /** Default retry budget, matching the SDK's default. */
35
+ const DEFAULT_MAX_RETRIES = 2;
36
+ const INITIAL_RETRY_DELAY_S = 0.5;
37
+ const MAX_RETRY_DELAY_S = 8;
38
+
39
+ /** Per-request options accepted by {@link AnthropicMessages.create}. */
40
+ export interface AnthropicRequestOptions {
41
+ signal?: AbortSignal;
42
+ /** Pre-response timeout in milliseconds. */
43
+ timeout?: number;
44
+ /** Per-request retry budget override. */
45
+ maxRetries?: number;
46
+ /**
47
+ * Maximum delay in milliseconds to wait for a server-directed retry. If the
48
+ * server's `retry-after` hint exceeds this value, the retry is declined and
49
+ * the original error is surfaced. Non-positive values disable the cap. Defaults to 60000.
50
+ */
51
+ maxRetryDelayMs?: number;
52
+ /** Per-request headers merged after client defaults. */
53
+ headers?: Record<string, string>;
54
+ }
55
+
56
+ /**
57
+ * Extra `RequestInit` fields merged into every fetch call. Bun extends
58
+ * `RequestInit` with a `tls` option used for the Claude Code TLS profile and
59
+ * Foundry mTLS. Core request fields (`method`, `headers`, `body`, `signal`)
60
+ * are owned by the client and cannot be overridden from here — the timeout
61
+ * controller's signal in particular must always win.
62
+ */
63
+ export type AnthropicFetchOptions = RequestInit & {
64
+ tls?: {
65
+ rejectUnauthorized?: boolean;
66
+ serverName?: string;
67
+ ciphers?: string;
68
+ ca?: string | string[];
69
+ cert?: string;
70
+ key?: string;
71
+ };
72
+ /** Bun extension: see {@link FetchWithRetryOptions.timeout} — `false` disables Bun's native fetch TTFT timeout (issue #2422). */
73
+ timeout?: number | false;
74
+ };
75
+
76
+ export interface AnthropicClientOptions {
77
+ /** Sent as `X-Api-Key` unless the header is already present in `defaultHeaders`. */
78
+ apiKey?: string | null;
79
+ /** Sent as `Authorization: Bearer <token>` unless the header is already present in `defaultHeaders`. */
80
+ authToken?: string | null;
81
+ baseURL?: string | null;
82
+ maxRetries?: number;
83
+ /**
84
+ * Maximum delay in milliseconds to wait for a server-directed retry. If the
85
+ * server's `retry-after` hint exceeds this value, the retry is declined and
86
+ * the original error is surfaced. Non-positive values disable the cap. Defaults to 60000.
87
+ */
88
+ maxRetryDelayMs?: number;
89
+ /** Pre-response timeout in milliseconds. Defaults to 10 minutes. */
90
+ timeout?: number;
91
+ defaultHeaders?: Record<string, string>;
92
+ fetch?: FetchImpl;
93
+ fetchOptions?: AnthropicFetchOptions;
94
+ }
95
+
96
+ function createAbortError(): Error {
97
+ return new AIError.AbortError("Request was aborted.");
98
+ }
99
+
100
+ /** `x-should-retry` override, then 408/409/429/5xx. */
101
+ function shouldRetryResponse(response: Response): boolean {
102
+ const shouldRetryHeader = response.headers.get("x-should-retry");
103
+ if (shouldRetryHeader === "true") return true;
104
+ if (shouldRetryHeader === "false") return false;
105
+ const status = response.status;
106
+ // Canonical transient set (408/429/5xx) plus 409, which Anthropic's client
107
+ // also retries.
108
+ return AIError.isTransientStatus(status) || status === 409;
109
+ }
110
+
111
+ /** Server-suggested delay (`retry-after-ms`, then `retry-after` seconds or HTTP date). */
112
+ export function retryDelayFromHeaders(headers: Pick<Headers, "get"> | undefined): number | undefined {
113
+ if (!headers) return undefined;
114
+ const retryAfterMs = headers.get("retry-after-ms");
115
+ if (retryAfterMs) {
116
+ const ms = Number.parseFloat(retryAfterMs);
117
+ if (Number.isFinite(ms) && ms >= 0) return ms;
118
+ }
119
+ const retryAfter = headers.get("retry-after");
120
+ if (retryAfter) {
121
+ const seconds = Number.parseFloat(retryAfter);
122
+ if (Number.isFinite(seconds) && seconds >= 0) return seconds * 1000;
123
+ const dateMs = Date.parse(retryAfter) - Date.now();
124
+ if (Number.isFinite(dateMs) && dateMs >= 0) return dateMs;
125
+ }
126
+ return undefined;
127
+ }
128
+
129
+ export function calculateAnthropicRetryDelayMs(attempt: number): number {
130
+ const sleepSeconds = Math.min(INITIAL_RETRY_DELAY_S * 2 ** attempt, MAX_RETRY_DELAY_S);
131
+ const jitter = 1 - Math.random() * 0.25;
132
+ return sleepSeconds * jitter * 1000;
133
+ }
134
+
135
+ function hasHeaderCaseInsensitive(headers: Record<string, string>, lowerName: string): boolean {
136
+ for (const key in headers) {
137
+ if (key.toLowerCase() === lowerName) return true;
138
+ }
139
+ return false;
140
+ }
141
+
142
+ /**
143
+ * Lazy in-flight request handle. The HTTP request starts on the first
144
+ * `asResponse()` call; subsequent calls return the same promise.
145
+ *
146
+ * Shape-compatible with the SDK's `APIPromise.asResponse()` so
147
+ * `getAnthropicStreamResponse` treats internal and injected clients uniformly.
148
+ */
149
+ export class AnthropicApiRequest {
150
+ #start: () => Promise<Response>;
151
+ #response: Promise<Response> | undefined;
152
+
153
+ constructor(start: () => Promise<Response>) {
154
+ this.#start = start;
155
+ }
156
+
157
+ asResponse(): Promise<Response> {
158
+ this.#response ??= this.#start();
159
+ return this.#response;
160
+ }
161
+ }
162
+
163
+ /**
164
+ * `messages` resource. `create` lives on the prototype so tests can intercept
165
+ * every outgoing request with `vi.spyOn(AnthropicMessages.prototype, "create")`.
166
+ */
167
+ export class AnthropicMessages {
168
+ #client: AnthropicMessagesClient;
169
+ #path: string;
170
+
171
+ constructor(client: AnthropicMessagesClient, path: string) {
172
+ this.#client = client;
173
+ this.#path = path;
174
+ }
175
+
176
+ create(params: MessageCreateParamsStreaming, options?: AnthropicRequestOptions): AnthropicApiRequest {
177
+ return this.#client.request(this.#path, params, options);
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Structural interface satisfied by both {@link AnthropicMessagesClient} and
183
+ * SDK-style clients (e.g. `AnthropicVertex`), so callers can inject an
184
+ * alternative Messages-API client via `AnthropicOptions.client`.
185
+ */
186
+ export interface AnthropicMessagesClientLike {
187
+ messages: { create(params: MessageCreateParamsStreaming, options?: AnthropicRequestOptions): unknown };
188
+ beta?: { messages: { create(params: MessageCreateParamsStreaming, options?: AnthropicRequestOptions): unknown } };
189
+ }
190
+
191
+ export class AnthropicMessagesClient implements AnthropicMessagesClientLike {
192
+ readonly messages: AnthropicMessages;
193
+ readonly beta: { readonly messages: AnthropicMessages };
194
+ #options: AnthropicClientOptions;
195
+
196
+ constructor(options: AnthropicClientOptions) {
197
+ this.#options = options;
198
+ this.messages = new AnthropicMessages(this, "/v1/messages");
199
+ this.beta = { messages: new AnthropicMessages(this, "/v1/messages?beta=true") };
200
+ }
201
+
202
+ request(path: string, params: MessageCreateParamsStreaming, options?: AnthropicRequestOptions): AnthropicApiRequest {
203
+ return new AnthropicApiRequest(() => this.#send(path, params, options));
204
+ }
205
+
206
+ #buildHeaders(requestHeaders?: Record<string, string>): Record<string, string> {
207
+ const opts = this.#options;
208
+ const defaults = opts.defaultHeaders ?? {};
209
+ const headers: Record<string, string> = {};
210
+ if (opts.apiKey != null && !hasHeaderCaseInsensitive(defaults, "x-api-key")) {
211
+ headers["X-Api-Key"] = opts.apiKey;
212
+ }
213
+ if (opts.authToken != null && !hasHeaderCaseInsensitive(defaults, "authorization")) {
214
+ headers.Authorization = `Bearer ${opts.authToken}`;
215
+ }
216
+ Object.assign(headers, defaults);
217
+ Object.assign(headers, requestHeaders);
218
+ return headers;
219
+ }
220
+
221
+ async #send(
222
+ path: string,
223
+ params: MessageCreateParamsStreaming,
224
+ options?: AnthropicRequestOptions,
225
+ ): Promise<Response> {
226
+ const opts = this.#options;
227
+ const fetchFn: FetchImpl = opts.fetch ?? fetch;
228
+ const callerSignal = options?.signal;
229
+ const timeoutMs = options?.timeout ?? opts.timeout ?? DEFAULT_TIMEOUT_MS;
230
+ const maxRetries = Math.max(0, options?.maxRetries ?? opts.maxRetries ?? DEFAULT_MAX_RETRIES);
231
+ const maxRetryDelayMs = options?.maxRetryDelayMs ?? opts.maxRetryDelayMs ?? 60_000;
232
+ const url = `${opts.baseURL ?? "https://api.anthropic.com"}${path}`;
233
+ const headers = this.#buildHeaders(options?.headers);
234
+ const body = JSON.stringify(params);
235
+
236
+ for (let attempt = 0; ; attempt++) {
237
+ if (callerSignal?.aborted) throw createAbortError();
238
+
239
+ let response: Response;
240
+ try {
241
+ response = await this.#fetchOnce(fetchFn, url, headers, body, timeoutMs, callerSignal);
242
+ } catch (error) {
243
+ if (callerSignal?.aborted) throw createAbortError();
244
+ if (attempt < maxRetries) {
245
+ await this.#backoff(attempt, undefined, callerSignal);
246
+ continue;
247
+ }
248
+ if (error instanceof AIError.AnthropicConnectionTimeoutError) throw error;
249
+ throw new AIError.AnthropicConnectionError(error);
250
+ }
251
+
252
+ if (response.ok) return response;
253
+
254
+ if (attempt < maxRetries && shouldRetryResponse(response)) {
255
+ // Bound the server-directed wait: an over-cap `retry-after` declines
256
+ // the retry and surfaces the original error (status/body/headers
257
+ // intact) so higher-level recovery can run. A non-positive cap disables enforcement.
258
+ // Checked before draining the body so `fromResponse` can still read it.
259
+ const headerDelayMs = retryDelayFromHeaders(response.headers);
260
+ if (headerDelayMs !== undefined && maxRetryDelayMs > 0 && headerDelayMs > maxRetryDelayMs) {
261
+ throw await AIError.AnthropicApiError.fromResponse(response, callerSignal);
262
+ }
263
+ await response.body?.cancel().catch(() => {});
264
+ await this.#backoff(attempt, response.headers, callerSignal);
265
+ continue;
266
+ }
267
+
268
+ throw await AIError.AnthropicApiError.fromResponse(response, callerSignal);
269
+ }
270
+ }
271
+
272
+ async #fetchOnce(
273
+ fetchFn: FetchImpl,
274
+ url: string,
275
+ headers: Record<string, string>,
276
+ body: string,
277
+ timeoutMs: number,
278
+ callerSignal: AbortSignal | undefined,
279
+ ): Promise<Response> {
280
+ const controller = new AbortController();
281
+ let timedOut = false;
282
+ const timer = setTimeout(() => {
283
+ timedOut = true;
284
+ controller.abort();
285
+ }, timeoutMs);
286
+ const onAbort = () => controller.abort();
287
+ callerSignal?.addEventListener("abort", onAbort, { once: true });
288
+ try {
289
+ return await fetchFn(url, {
290
+ ...(this.#options.fetchOptions ?? {}),
291
+ method: "POST",
292
+ headers,
293
+ body,
294
+ signal: controller.signal,
295
+ });
296
+ } catch (error) {
297
+ if (timedOut && !callerSignal?.aborted) throw new AIError.AnthropicConnectionTimeoutError();
298
+ throw error;
299
+ } finally {
300
+ clearTimeout(timer);
301
+ callerSignal?.removeEventListener("abort", onAbort);
302
+ }
303
+ }
304
+
305
+ async #backoff(
306
+ attempt: number,
307
+ responseHeaders: Headers | undefined,
308
+ signal: AbortSignal | undefined,
309
+ ): Promise<void> {
310
+ const delayMs = retryDelayFromHeaders(responseHeaders) ?? calculateAnthropicRetryDelayMs(attempt);
311
+ try {
312
+ await scheduler.wait(delayMs, { signal });
313
+ } catch {
314
+ throw createAbortError();
315
+ }
316
+ }
317
+ }
@@ -0,0 +1,252 @@
1
+ /**
2
+ * ArkType schemas for the Anthropic Messages API request shape we accept on the
3
+ * gateway. Maps canonical wire variants to our internal normalized omp Context
4
+ * and options.
5
+ */
6
+
7
+ import { type } from "@linxiraos/pi-omptype";
8
+ import type {
9
+ ContentBlockParam,
10
+ ImageBlockParam,
11
+ MessageCreateParams,
12
+ MessageParam,
13
+ TextBlockParam,
14
+ Tool,
15
+ ToolChoice,
16
+ } from "./anthropic-wire";
17
+
18
+ // `cache_control` is accepted and translated to pi-ai's per-request
19
+ // `cacheRetention` (any `ttl: "1h"` marker upgrades the request to "long";
20
+ // any other ephemeral marker maps to "short"). The walker doesn't try to
21
+ // preserve per-block breakpoints — pi-ai's anthropic provider re-applies them
22
+ // against the rebuilt outbound request anyway.
23
+ export const cacheControlSchema = type({
24
+ type: "'ephemeral'",
25
+ "ttl?": "'1h' | '5m'",
26
+ });
27
+
28
+ // ─── Sources / inner shapes ─────────────────────────────────────────────────
29
+
30
+ export const base64ImageSourceSchema = type({
31
+ type: "'base64'",
32
+ data: "string >= 1",
33
+ media_type: "string >= 1",
34
+ });
35
+
36
+ export const urlImageSourceSchema = type({
37
+ type: "'url'",
38
+ url: "string.url",
39
+ });
40
+
41
+ export const fileImageSourceSchema = type({
42
+ type: "'file'",
43
+ file_id: "string >= 1",
44
+ });
45
+
46
+ export const imageSourceSchema = base64ImageSourceSchema.or(urlImageSourceSchema).or(fileImageSourceSchema);
47
+
48
+ const textBlockSchema = type({
49
+ type: "'text'",
50
+ text: "string",
51
+ "cache_control?": cacheControlSchema,
52
+ });
53
+
54
+ const imageBlockSchema = type({
55
+ type: "'image'",
56
+ source: imageSourceSchema,
57
+ "cache_control?": cacheControlSchema,
58
+ });
59
+
60
+ const thinkingBlockSchema = type({
61
+ type: "'thinking'",
62
+ thinking: "string",
63
+ "signature?": "string",
64
+ "cache_control?": cacheControlSchema,
65
+ });
66
+
67
+ const redactedThinkingBlockSchema = type({
68
+ type: "'redacted_thinking'",
69
+ data: "string",
70
+ "cache_control?": cacheControlSchema,
71
+ });
72
+
73
+ const toolUseBlockSchema = type({
74
+ type: "'tool_use'",
75
+ id: "string >= 1",
76
+ name: "string >= 1",
77
+ "input?": { "[string]": "unknown" },
78
+ "cache_control?": cacheControlSchema,
79
+ });
80
+
81
+ const toolResultContentBlockSchema = textBlockSchema.or(imageBlockSchema);
82
+
83
+ const toolResultBlockSchema = type({
84
+ type: "'tool_result'",
85
+ tool_use_id: "string >= 1",
86
+ "content?": type("string").or(toolResultContentBlockSchema.array()),
87
+ "is_error?": "boolean",
88
+ "cache_control?": cacheControlSchema,
89
+ });
90
+
91
+ // Catch-all for content block variants Anthropic ships that the gateway doesn't
92
+ // natively understand (server_tool_use, web_search_tool_result, mcp_*,
93
+ // container_upload, code_execution_*, document, …). The walker flattens these
94
+ // to a text placeholder so legitimate Anthropic clients don't get rejected.
95
+ // Known `type` values are excluded so a malformed known block (e.g.
96
+ // `{type:"text", text: 123}`) fails validation with a clean 400 instead of
97
+ // slipping past the discriminated union and throwing a TypeError downstream.
98
+ function unknownContentBlockSchema(knownTypes: readonly string[]) {
99
+ const known = new Set(knownTypes);
100
+ return type({
101
+ type: "string",
102
+ }).narrow((d, ctx) => {
103
+ if (known.has(d.type)) {
104
+ return ctx.mustBe(`an unknown block type (not ${knownTypes.join(", ")})`);
105
+ }
106
+ return true;
107
+ });
108
+ }
109
+
110
+ // ─── System ────────────────────────────────────────────────────────────────
111
+
112
+ const systemBlockSchema = type({
113
+ type: "'text'",
114
+ text: "string",
115
+ "cache_control?": cacheControlSchema,
116
+ });
117
+
118
+ export const systemSchema = type("string").or(systemBlockSchema.array()).or("undefined");
119
+
120
+ // ─── Messages ──────────────────────────────────────────────────────────────
121
+
122
+ const userContentBlockSchema = textBlockSchema
123
+ .or(imageBlockSchema)
124
+ .or(toolResultBlockSchema)
125
+ .or(unknownContentBlockSchema(["text", "image", "tool_result"]));
126
+
127
+ const assistantContentBlockSchema = textBlockSchema
128
+ .or(thinkingBlockSchema)
129
+ .or(redactedThinkingBlockSchema)
130
+ .or(toolUseBlockSchema)
131
+ .or(unknownContentBlockSchema(["text", "thinking", "redacted_thinking", "tool_use"]));
132
+
133
+ export const userMessageSchema = type({
134
+ role: "'user'",
135
+ content: type("string").or(userContentBlockSchema.array()),
136
+ });
137
+
138
+ export const systemMessageSchema = type({
139
+ role: "'system'",
140
+ content: type("string").or(systemBlockSchema.array()),
141
+ });
142
+
143
+ export const assistantMessageSchema = type({
144
+ role: "'assistant'",
145
+ content: type("string").or(assistantContentBlockSchema.array()),
146
+ });
147
+
148
+ export const messageSchema = userMessageSchema.or(assistantMessageSchema).or(systemMessageSchema);
149
+
150
+ // ─── Tools ─────────────────────────────────────────────────────────────────
151
+
152
+ export const toolSchema = type({
153
+ name: "string >= 1",
154
+ "description?": "string",
155
+ input_schema: { "[string]": "unknown" },
156
+ "cache_control?": cacheControlSchema,
157
+ });
158
+
159
+ // ─── Tool choice ───────────────────────────────────────────────────────────
160
+
161
+ // `disable_parallel_tool_use` is accepted on every variant; the walker maps it
162
+ // onto `options.parallelToolCalls = !disable_parallel_tool_use`.
163
+ export const toolChoiceSchema = type({
164
+ type: "'auto'",
165
+ "disable_parallel_tool_use?": "boolean",
166
+ })
167
+ .or({
168
+ type: "'any'",
169
+ "disable_parallel_tool_use?": "boolean",
170
+ })
171
+ .or({
172
+ type: "'none'",
173
+ "disable_parallel_tool_use?": "boolean",
174
+ })
175
+ .or({
176
+ type: "'tool'",
177
+ name: "string >= 1",
178
+ "disable_parallel_tool_use?": "boolean",
179
+ });
180
+
181
+ // ─── Thinking ──────────────────────────────────────────────────────────────
182
+
183
+ // Anthropic's three thinking shapes. `enabled` requires a budget; `disabled`
184
+ // suppresses reasoning even on models that default it on; `adaptive` lets the
185
+ // provider pick the budget on the fly. Extra hints (`display: "omitted"`, …)
186
+ // are accepted but ignored on the translate path.
187
+ export const thinkingConfigSchema = type({
188
+ type: "'enabled'",
189
+ budget_tokens: "number",
190
+ "display?": "unknown",
191
+ })
192
+ .or({
193
+ type: "'disabled'",
194
+ "display?": "unknown",
195
+ })
196
+ .or({
197
+ type: "'adaptive'",
198
+ "budget_tokens?": "number",
199
+ "display?": "unknown",
200
+ });
201
+
202
+ const taskBudgetSchema = type({
203
+ type: "'tokens'",
204
+ total: "number",
205
+ "remaining?": "number",
206
+ });
207
+
208
+ const outputConfigSchema = type({
209
+ "effort?": "'low' | 'medium' | 'high' | 'xhigh' | 'max'",
210
+ "task_budget?": taskBudgetSchema,
211
+ "format?": "unknown",
212
+ });
213
+
214
+ // ─── Top-level request ─────────────────────────────────────────────────────
215
+
216
+ export const anthropicMessagesRequestSchema = type({
217
+ model: "string >= 1",
218
+ messages: messageSchema.array(),
219
+ max_tokens: "number",
220
+ "system?": systemSchema,
221
+ "tools?": toolSchema.array(),
222
+ "tool_choice?": toolChoiceSchema,
223
+ "temperature?": "number",
224
+ "top_p?": "number",
225
+ "top_k?": "number",
226
+ "stop_sequences?": "string[]",
227
+ "stream?": "boolean",
228
+ "thinking?": thinkingConfigSchema,
229
+ "output_config?": outputConfigSchema,
230
+ // Anthropic clients commonly send `metadata: { user_id }`; the walker
231
+ // surfaces it on `options.metadata` for downstream provider forwarding.
232
+ "metadata?": { "[string]": "unknown" },
233
+ // Spec fields that the gateway tolerates but doesn't translate yet.
234
+ "container?": "unknown",
235
+ "context_management?": "unknown",
236
+ "mcp_servers?": "unknown",
237
+ "service_tier?": "unknown",
238
+ });
239
+
240
+ /**
241
+ * Public types are sourced from the upstream Anthropic SDK so the gateway
242
+ * stays in lock-step with the canonical API surface; the schemas above are
243
+ * runtime validators for the subset we actually accept.
244
+ */
245
+ export type AnthropicMessagesRequest = MessageCreateParams;
246
+ export type AnthropicSystem = MessageCreateParams["system"];
247
+ export type AnthropicMessage = MessageParam;
248
+ export type AnthropicUserContentBlock = ContentBlockParam;
249
+ export type AnthropicAssistantContentBlock = ContentBlockParam;
250
+ export type AnthropicTool = Tool;
251
+ export type AnthropicToolChoice = ToolChoice;
252
+ export type AnthropicToolResultContent = TextBlockParam | ImageBlockParam;