@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,54 @@
1
+ import { isDashscopeCompatibleModeUrl } from "@linxiraos/pi-catalog/hosts";
2
+ import { isQwenModelId } from "@linxiraos/pi-catalog/identity";
3
+
4
+ import type { ImageContent, Model, TextContent } from "../types";
5
+
6
+ export const NON_VISION_IMAGE_PLACEHOLDER = "[image omitted: model does not support vision]";
7
+
8
+ export function partitionVisionContent(
9
+ content: ReadonlyArray<TextContent | ImageContent>,
10
+ supportsImages: boolean,
11
+ ): {
12
+ textBlocks: TextContent[];
13
+ imageBlocks: ImageContent[];
14
+ omittedImages: boolean;
15
+ } {
16
+ const textBlocks = content.filter((block): block is TextContent => block.type === "text");
17
+ const imageBlocks = content.filter((block): block is ImageContent => block.type === "image");
18
+ return {
19
+ textBlocks,
20
+ imageBlocks: supportsImages ? imageBlocks : [],
21
+ omittedImages: !supportsImages && imageBlocks.length > 0,
22
+ };
23
+ }
24
+
25
+ export function joinTextWithImagePlaceholder(text: string, omittedImages: boolean): string {
26
+ const parts: string[] = [];
27
+ if (text.length > 0) {
28
+ parts.push(text);
29
+ }
30
+ if (omittedImages) {
31
+ parts.push(NON_VISION_IMAGE_PLACEHOLDER);
32
+ }
33
+ return parts.join("\n");
34
+ }
35
+
36
+ /**
37
+ * Detect known text-only Qwen models served via Alibaba DashScope's consumer
38
+ * `compatible-mode` endpoint that the upstream chat-completions API rejects
39
+ * multimodal content arrays for. The compatible-mode endpoint also serves
40
+ * multimodal Qwen SKUs without `vl` in the id (e.g. `qwen3.7-plus`), so this
41
+ * guard only covers families verified to be text-only for issue #1859:
42
+ * `qwen*-max` and `qwen*-coder*`.
43
+ *
44
+ * Used as a defensive override in `convertMessages` so a misconfigured custom
45
+ * provider (issue #1859) can't drive the request into an unrecoverable 400.
46
+ */
47
+ export function isDashscopeCompatibleModeTextOnlyQwen(model: Model<"openai-completions">): boolean {
48
+ if (!isDashscopeCompatibleModeUrl(model.baseUrl)) {
49
+ return false;
50
+ }
51
+ const id = model.id.toLowerCase();
52
+ if (!isQwenModelId(model.id)) return false;
53
+ return /\bqwen(?:[\d.]+)?-max\b/.test(id) || /\bqwen(?:[\d.]+)?-coder\b/.test(id);
54
+ }
@@ -0,0 +1,22 @@
1
+ import { createApiKeyLogin } from "./api-key-login";
2
+ import type { OAuthLoginCallbacks } from "./oauth/types";
3
+ import type { ProviderDefinition } from "./types";
4
+
5
+ export const loginAiand = createApiKeyLogin({
6
+ providerLabel: "ai&",
7
+ authUrl: "https://console.aiand.com/api-keys",
8
+ instructions: "Copy your API key from the ai& console",
9
+ promptMessage: "Paste your ai& API key",
10
+ placeholder: "sk-...",
11
+ validation: {
12
+ kind: "models-endpoint",
13
+ provider: "ai&",
14
+ modelsUrl: "https://api.aiand.com/v1/models",
15
+ },
16
+ });
17
+
18
+ export const aiandProvider = {
19
+ id: "aiand",
20
+ name: "ai&",
21
+ login: (cb: OAuthLoginCallbacks) => loginAiand(cb),
22
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,6 @@
1
+ import type { ProviderDefinition } from "./types";
2
+
3
+ export const aimlApiProvider = {
4
+ id: "aimlapi",
5
+ name: "AIML API",
6
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,104 @@
1
+ import * as AIError from "../error";
2
+ import * as apiKeyValidation from "./api-key-validation";
3
+ import type { OAuthController, OAuthCredentials, OAuthLoginCallbacks } from "./oauth/types";
4
+ import type { ProviderDefinition } from "./types";
5
+
6
+ const DEFAULT_AUTH_URL = "https://modelstudio.console.alibabacloud.com/";
7
+ const CHINA_AUTH_URL = "https://dashscope.console.aliyun.com/";
8
+ const DEFAULT_API_BASE_URL = "https://coding-intl.dashscope.aliyuncs.com/v1";
9
+ const CHINA_API_BASE_URL = "https://coding.dashscope.aliyuncs.com/v1";
10
+ const VALIDATION_MODEL = "qwen3.5-plus";
11
+
12
+ export async function loginAlibabaCodingPlan(options: OAuthController): Promise<OAuthCredentials> {
13
+ if (!options.onPrompt) {
14
+ throw new AIError.OnPromptRequiredError("Alibaba Coding Plan");
15
+ }
16
+
17
+ // Ask which endpoint to use
18
+ const endpointChoice = await options.onPrompt({
19
+ message: "Select Alibaba Coding Plan endpoint: 1=International (default), 2=China, 3=Custom — enter 1, 2, or 3",
20
+ placeholder: "1",
21
+ });
22
+
23
+ // Check for abort after endpoint selection (Escape returns "")
24
+ if (options.signal?.aborted) {
25
+ throw new AIError.LoginCancelledError();
26
+ }
27
+
28
+ const choice = endpointChoice.trim();
29
+ let baseUrl: string;
30
+ let authUrl: string;
31
+ let instructions: string;
32
+ if (choice === "2") {
33
+ baseUrl = CHINA_API_BASE_URL;
34
+ authUrl = CHINA_AUTH_URL;
35
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console (China mainland)";
36
+ } else if (choice === "3") {
37
+ const customUrl = await options.onPrompt({
38
+ message: "Enter custom base URL",
39
+ placeholder: "https://your-proxy.com/v1",
40
+ });
41
+ const trimmedUrl = customUrl.trim().replace(/\/+$/, "");
42
+ if (!trimmedUrl) {
43
+ throw new AIError.ConfigurationError("Custom URL is required for option 3");
44
+ }
45
+ baseUrl = trimmedUrl;
46
+ authUrl = DEFAULT_AUTH_URL;
47
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console";
48
+ } else {
49
+ baseUrl = DEFAULT_API_BASE_URL;
50
+ authUrl = DEFAULT_AUTH_URL;
51
+ instructions = "Copy your API key from the Alibaba Cloud DashScope console (International)";
52
+ }
53
+
54
+ options.onAuth?.({
55
+ url: authUrl,
56
+ instructions,
57
+ });
58
+
59
+ const apiKey = await options.onPrompt({
60
+ message: "Paste your Alibaba Coding Plan API key",
61
+ placeholder: "sk-...",
62
+ });
63
+
64
+ if (options.signal?.aborted) {
65
+ throw new AIError.LoginCancelledError();
66
+ }
67
+
68
+ const trimmed = apiKey.trim();
69
+ if (!trimmed) {
70
+ throw new AIError.ApiKeyRequiredError();
71
+ }
72
+
73
+ options.onProgress?.("Validating API key...");
74
+ if (choice === "3") {
75
+ await apiKeyValidation.validateApiKeyAgainstModelsEndpoint({
76
+ provider: "Alibaba Coding Plan",
77
+ apiKey: trimmed,
78
+ modelsUrl: `${baseUrl}/models`,
79
+ signal: options.signal,
80
+ });
81
+ } else {
82
+ await apiKeyValidation.validateOpenAICompatibleApiKey({
83
+ provider: "Alibaba Coding Plan",
84
+ apiKey: trimmed,
85
+ baseUrl,
86
+ model: VALIDATION_MODEL,
87
+ signal: options.signal,
88
+ });
89
+ }
90
+
91
+ return {
92
+ access: trimmed,
93
+ refresh: trimmed,
94
+ expires: Number.MAX_SAFE_INTEGER,
95
+ enterpriseUrl: baseUrl,
96
+ };
97
+ }
98
+
99
+ export const alibabaCodingPlanProvider = {
100
+ id: "alibaba-coding-plan",
101
+ name: "Alibaba Coding Plan",
102
+ login: (cb: OAuthLoginCallbacks) => loginAlibabaCodingPlan(cb),
103
+ getApiKey: credentials => credentials.access,
104
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,125 @@
1
+ import {
2
+ ALIBABA_TOKEN_PLAN_BASE_URL,
3
+ ALIBABA_TOKEN_PLAN_CN_BASE_URL,
4
+ serializeAlibabaTokenPlanCredential,
5
+ } from "@linxiraos/pi-catalog/wire/alibaba-token-plan";
6
+ import * as AIError from "../error";
7
+ import { validateApiKeyAgainstModelsEndpoint } from "./api-key-validation";
8
+ import type { OAuthController, OAuthLoginCallbacks } from "./oauth/types";
9
+ import type { ProviderDefinition } from "./types";
10
+
11
+ const INTERNATIONAL_AUTH_URL = "https://home.qwencloud.com/billing/subscription/token-plan-individual";
12
+ const CHINA_AUTH_URL = "https://www.aliyun.com/benefit/scene/tokenplan";
13
+
14
+ /**
15
+ * Log in to the QwenCloud Token Plan provider.
16
+ *
17
+ * The Token Plan ships as two regionally separate products with
18
+ * non-interchangeable keys — International (Singapore) and China (Beijing) —
19
+ * so login first selects the region (or a custom base URL) before pasting the
20
+ * key, mirroring {@link loginAlibabaCodingPlan}. The chosen region is validated
21
+ * against its own `/models` endpoint and, when it diverges from the default
22
+ * international endpoint, stored in the credential so inference and discovery
23
+ * both target it (#6682).
24
+ */
25
+ export async function loginAlibabaTokenPlan(options: OAuthController): Promise<string> {
26
+ if (!options.onPrompt) {
27
+ throw new AIError.OnPromptRequiredError("QwenCloud Token Plan");
28
+ }
29
+
30
+ const endpointChoice = await options.onPrompt({
31
+ message:
32
+ "Select QwenCloud Token Plan region: 1=International (default), 2=China (Beijing), 3=Custom — enter 1, 2, or 3",
33
+ placeholder: "1",
34
+ });
35
+ if (options.signal?.aborted) {
36
+ throw new AIError.LoginCancelledError();
37
+ }
38
+
39
+ const choice = endpointChoice.trim();
40
+ let baseUrl: string;
41
+ let authUrl: string;
42
+ let instructions: string;
43
+ if (choice === "2") {
44
+ baseUrl = ALIBABA_TOKEN_PLAN_CN_BASE_URL;
45
+ authUrl = CHINA_AUTH_URL;
46
+ instructions = "Subscribe to the China (Beijing) 百炼 Token Plan and copy its dedicated API key";
47
+ } else if (choice === "3") {
48
+ const customUrl = await options.onPrompt({
49
+ message: "Enter custom Token Plan base URL",
50
+ placeholder: "https://token-plan.<region>.maas.aliyuncs.com/compatible-mode/v1",
51
+ });
52
+ const trimmedUrl = customUrl.trim().replace(/\/+$/, "");
53
+ if (!trimmedUrl) {
54
+ throw new AIError.ConfigurationError("Custom URL is required for option 3");
55
+ }
56
+ baseUrl = trimmedUrl;
57
+ authUrl = INTERNATIONAL_AUTH_URL;
58
+ instructions = "Copy your Token Plan API key for the custom endpoint";
59
+ } else {
60
+ baseUrl = ALIBABA_TOKEN_PLAN_BASE_URL;
61
+ authUrl = INTERNATIONAL_AUTH_URL;
62
+ instructions =
63
+ "Subscribe to Token Plan Individual and copy its dedicated API key. Keep this page open; the next prompt explains how to enable optional quota reporting.";
64
+ }
65
+
66
+ options.onAuth?.({ url: authUrl, instructions });
67
+
68
+ const apiKeyInput = await options.onPrompt({
69
+ message: "Paste your QwenCloud Token Plan API key",
70
+ placeholder: "sk-sp-...",
71
+ });
72
+ if (options.signal?.aborted) {
73
+ throw new AIError.LoginCancelledError();
74
+ }
75
+ const apiKey = apiKeyInput.trim();
76
+ if (!apiKey) {
77
+ throw new AIError.ApiKeyRequiredError();
78
+ }
79
+
80
+ options.onProgress?.("Validating API key...");
81
+ await validateApiKeyAgainstModelsEndpoint({
82
+ provider: "QwenCloud Token Plan",
83
+ apiKey,
84
+ modelsUrl: `${baseUrl}/models`,
85
+ signal: options.signal,
86
+ fetch: options.fetch,
87
+ });
88
+
89
+ const rawCookie = await options.onPrompt({
90
+ message:
91
+ "Optional quota reporting: open browser DevTools → Network, reload the Token Plan page, filter for api.json, and select the cs-data.qwencloud.com/data/api.json request whose api query ends in /tokenplan/personal/api/v2/usage. Copy Request Headers → Cookie, then paste the complete name=value; ... value here, or press Enter to skip.",
92
+ placeholder: "name=value; name=value; ...",
93
+ allowEmpty: true,
94
+ });
95
+ const cookie = rawCookie
96
+ .trim()
97
+ .replace(/^Cookie:\s*/i, "")
98
+ .trim();
99
+ if (options.signal?.aborted) {
100
+ throw new AIError.LoginCancelledError();
101
+ }
102
+ if (
103
+ cookie &&
104
+ !cookie.split(";").some(segment => {
105
+ const separator = segment.indexOf("=");
106
+ return separator > 0 && Boolean(segment.slice(0, separator).trim() && segment.slice(separator + 1).trim());
107
+ })
108
+ ) {
109
+ throw new AIError.ConfigurationError(
110
+ "Invalid QwenCloud Cookie header. Copy the complete Cookie request header from the cs-data.qwencloud.com usage request, not a single cookie value.",
111
+ );
112
+ }
113
+
114
+ // International (default) logins keep their existing bare/cookie credential
115
+ // form; only a diverging region is persisted so it can override the catalog
116
+ // base URL at inference and discovery time.
117
+ const regionUrl = baseUrl === ALIBABA_TOKEN_PLAN_BASE_URL ? undefined : baseUrl;
118
+ return serializeAlibabaTokenPlanCredential(apiKey, cookie, regionUrl);
119
+ }
120
+
121
+ export const alibabaTokenPlanProvider = {
122
+ id: "alibaba-token-plan",
123
+ name: "QwenCloud Token Plan",
124
+ login: (cb: OAuthLoginCallbacks) => loginAlibabaTokenPlan(cb),
125
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,22 @@
1
+ import { $env } from "@linxiraos/pi-utils";
2
+ import type { ProviderDefinition } from "./types";
3
+
4
+ export const amazonBedrockProvider = {
5
+ id: "amazon-bedrock",
6
+ name: "Amazon Bedrock",
7
+ // Amazon Bedrock accepts bearer tokens, IAM keys, profiles, ECS/IRSA credential chains.
8
+ envKeys: () => {
9
+ const hasEcsCredentials =
10
+ !!$env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI || !!$env.AWS_CONTAINER_CREDENTIALS_FULL_URI;
11
+ const hasWebIdentity = !!$env.AWS_WEB_IDENTITY_TOKEN_FILE && !!$env.AWS_ROLE_ARN;
12
+ if (
13
+ $env.AWS_PROFILE ||
14
+ ($env.AWS_ACCESS_KEY_ID && $env.AWS_SECRET_ACCESS_KEY) ||
15
+ $env.AWS_BEARER_TOKEN_BEDROCK ||
16
+ hasEcsCredentials ||
17
+ hasWebIdentity
18
+ ) {
19
+ return "<authenticated>";
20
+ }
21
+ },
22
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,26 @@
1
+ import { $pickenv } from "@linxiraos/pi-utils";
2
+ import { isFoundryEnabled } from "../utils/foundry";
3
+ import type { OAuthCredentials, OAuthLoginCallbacks } from "./oauth/types";
4
+ import type { ProviderDefinition } from "./types";
5
+
6
+ export const anthropicProvider = {
7
+ id: "anthropic",
8
+ name: "Anthropic (Claude Pro/Max)",
9
+ // Foundry mode optionally switches Anthropic auth to enterprise gateway credentials.
10
+ envKeys: () =>
11
+ isFoundryEnabled()
12
+ ? $pickenv("ANTHROPIC_FOUNDRY_API_KEY", "ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY")
13
+ : $pickenv("ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"),
14
+ login: async (cb: OAuthLoginCallbacks) => {
15
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
16
+ const { loginAnthropic } = await import("./oauth/anthropic");
17
+ return loginAnthropic(cb);
18
+ },
19
+ refreshToken: async (credentials: OAuthCredentials) => {
20
+ // Lazy import: keep heavy OAuth flow modules out of the eager registry graph.
21
+ const { refreshAnthropicToken } = await import("./oauth/anthropic");
22
+ return refreshAnthropicToken(credentials.refresh);
23
+ },
24
+ callbackPort: 54545,
25
+ pasteCodeFlow: true,
26
+ } as const satisfies ProviderDefinition;
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Shared factory for API-key-paste "login" flows.
3
+ *
4
+ * Several providers (Cerebras, Synthetic, Moonshot, Together, NanoGPT, ZenMux)
5
+ * don't actually implement OAuth — they just ask the user to paste an API key,
6
+ * optionally validate it, and return the trimmed key.
7
+ */
8
+
9
+ import * as AIError from "../error";
10
+ import {
11
+ validateAnthropicCompatibleApiKey,
12
+ validateApiKeyAgainstModelsEndpoint,
13
+ validateOpenAICompatibleApiKey,
14
+ } from "./api-key-validation";
15
+ import type { OAuthController } from "./oauth/types";
16
+
17
+ type ChatCompletionsValidation = {
18
+ kind: "chat-completions";
19
+ provider: string;
20
+ baseUrl: string;
21
+ model: string;
22
+ };
23
+
24
+ type AnthropicMessagesValidation = {
25
+ kind: "anthropic-messages";
26
+ provider: string;
27
+ baseUrl: string;
28
+ model: string;
29
+ };
30
+
31
+ type ModelsEndpointValidation = {
32
+ kind: "models-endpoint";
33
+ provider: string;
34
+ modelsUrl: string | (() => string);
35
+ headers?: Record<string, string> | (() => Record<string, string> | undefined);
36
+ };
37
+
38
+ export type ApiKeyLoginConfig = {
39
+ /** Display name used in error messages, e.g. "Cerebras", "NanoGPT". */
40
+ providerLabel: string;
41
+ /** URL opened in browser for the user to grab their key. */
42
+ authUrl: string;
43
+ /** Instructions shown with the onAuth callback. */
44
+ instructions: string;
45
+ /** Prompt message shown when asking for the key paste. */
46
+ promptMessage: string;
47
+ /** Placeholder string for the prompt (e.g. "sk-...", "csk-..."). */
48
+ placeholder: string;
49
+ /** Validation strategy, or `null` to skip validation. */
50
+ validation: ChatCompletionsValidation | AnthropicMessagesValidation | ModelsEndpointValidation | null;
51
+ };
52
+
53
+ export function createApiKeyLogin(config: ApiKeyLoginConfig): (options: OAuthController) => Promise<string> {
54
+ return async function login(options: OAuthController): Promise<string> {
55
+ if (!options.onPrompt) {
56
+ throw new AIError.OnPromptRequiredError(config.providerLabel);
57
+ }
58
+
59
+ options.onAuth?.({
60
+ url: config.authUrl,
61
+ instructions: config.instructions,
62
+ });
63
+
64
+ const apiKey = await options.onPrompt({
65
+ message: config.promptMessage,
66
+ placeholder: config.placeholder,
67
+ });
68
+
69
+ if (options.signal?.aborted) {
70
+ throw new AIError.LoginCancelledError();
71
+ }
72
+
73
+ const trimmed = apiKey.trim();
74
+ if (!trimmed) {
75
+ throw new AIError.ApiKeyRequiredError();
76
+ }
77
+
78
+ if (config.validation) {
79
+ options.onProgress?.("Validating API key...");
80
+ if (config.validation.kind === "chat-completions") {
81
+ await validateOpenAICompatibleApiKey({
82
+ provider: config.validation.provider,
83
+ apiKey: trimmed,
84
+ baseUrl: config.validation.baseUrl,
85
+ model: config.validation.model,
86
+ signal: options.signal,
87
+ fetch: options.fetch,
88
+ });
89
+ } else if (config.validation.kind === "anthropic-messages") {
90
+ await validateAnthropicCompatibleApiKey({
91
+ provider: config.validation.provider,
92
+ apiKey: trimmed,
93
+ baseUrl: config.validation.baseUrl,
94
+ model: config.validation.model,
95
+ signal: options.signal,
96
+ fetch: options.fetch,
97
+ });
98
+ } else {
99
+ await validateApiKeyAgainstModelsEndpoint({
100
+ provider: config.validation.provider,
101
+ apiKey: trimmed,
102
+ modelsUrl:
103
+ typeof config.validation.modelsUrl === "function"
104
+ ? config.validation.modelsUrl()
105
+ : config.validation.modelsUrl,
106
+ headers: config.validation.headers,
107
+ signal: options.signal,
108
+ fetch: options.fetch,
109
+ });
110
+ }
111
+ }
112
+
113
+ return trimmed;
114
+ };
115
+ }
@@ -0,0 +1,145 @@
1
+ import { ProviderHttpError } from "../error/classes";
2
+ import type { FetchImpl } from "../types";
3
+
4
+ type OpenAICompatibleValidationOptions = {
5
+ provider: string;
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ model: string;
9
+ signal?: AbortSignal;
10
+ fetch?: FetchImpl;
11
+ };
12
+ type AnthropicCompatibleValidationOptions = {
13
+ provider: string;
14
+ apiKey: string;
15
+ baseUrl: string;
16
+ model: string;
17
+ signal?: AbortSignal;
18
+ fetch?: FetchImpl;
19
+ };
20
+
21
+ type ModelListValidationOptions = {
22
+ provider: string;
23
+ apiKey: string;
24
+ modelsUrl: string;
25
+ headers?: Record<string, string> | (() => Record<string, string> | undefined);
26
+ signal?: AbortSignal;
27
+ fetch?: FetchImpl;
28
+ };
29
+
30
+ const VALIDATION_TIMEOUT_MS = 15_000;
31
+
32
+ function normalizeAnthropicCompatibleBaseUrl(baseUrl: string): string {
33
+ const trimmed = baseUrl.trim().replace(/\/+$/, "");
34
+ return trimmed.endsWith("/v1") ? trimmed.slice(0, -3) : trimmed;
35
+ }
36
+
37
+ function resolveValidationHeaders(
38
+ headers: Record<string, string> | (() => Record<string, string> | undefined) | undefined,
39
+ ): Record<string, string> | undefined {
40
+ return typeof headers === "function" ? headers() : headers;
41
+ }
42
+
43
+ async function createApiKeyValidationError(provider: string, response: Response): Promise<ProviderHttpError> {
44
+ let details = "";
45
+ try {
46
+ details = (await response.text()).trim();
47
+ } catch {
48
+ // Ignore body read errors; the HTTP status still preserves the failure category.
49
+ }
50
+
51
+ const message = details
52
+ ? `${provider} API key validation failed (${response.status}): ${details}`
53
+ : `${provider} API key validation failed (${response.status})`;
54
+ return new ProviderHttpError(message, response.status, { headers: response.headers });
55
+ }
56
+
57
+ /**
58
+ * Validate an API key against an OpenAI-compatible chat completions endpoint.
59
+ *
60
+ * Performs a minimal request to verify credentials and endpoint access.
61
+ */
62
+ export async function validateOpenAICompatibleApiKey(options: OpenAICompatibleValidationOptions): Promise<void> {
63
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
64
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
65
+ const fetchImpl = options.fetch ?? fetch;
66
+
67
+ const response = await fetchImpl(`${options.baseUrl}/chat/completions`, {
68
+ method: "POST",
69
+ headers: {
70
+ "Content-Type": "application/json",
71
+ Authorization: `Bearer ${options.apiKey}`,
72
+ },
73
+ body: JSON.stringify({
74
+ model: options.model,
75
+ messages: [{ role: "user", content: "ping" }],
76
+ max_tokens: 1,
77
+ temperature: 0,
78
+ }),
79
+ signal,
80
+ });
81
+
82
+ if (response.ok) {
83
+ return;
84
+ }
85
+
86
+ throw await createApiKeyValidationError(options.provider, response);
87
+ }
88
+
89
+ /**
90
+ * Validate an API key against an Anthropic-compatible messages endpoint.
91
+ */
92
+ export async function validateAnthropicCompatibleApiKey(options: AnthropicCompatibleValidationOptions): Promise<void> {
93
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
94
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
95
+ const baseUrl = normalizeAnthropicCompatibleBaseUrl(options.baseUrl);
96
+ const fetchImpl = options.fetch ?? fetch;
97
+
98
+ const response = await fetchImpl(`${baseUrl}/v1/messages`, {
99
+ method: "POST",
100
+ headers: {
101
+ "Content-Type": "application/json",
102
+ "anthropic-version": "2023-06-01",
103
+ "x-api-key": options.apiKey,
104
+ },
105
+ body: JSON.stringify({
106
+ model: options.model,
107
+ messages: [{ role: "user", content: "ping" }],
108
+ max_tokens: 1,
109
+ }),
110
+ signal,
111
+ });
112
+
113
+ if (response.ok) {
114
+ return;
115
+ }
116
+
117
+ throw await createApiKeyValidationError(options.provider, response);
118
+ }
119
+
120
+ /**
121
+ * Validate an API key against a provider models endpoint.
122
+ *
123
+ * Useful for providers where access to specific models may vary by plan and
124
+ * should not block key validation.
125
+ */
126
+ export async function validateApiKeyAgainstModelsEndpoint(options: ModelListValidationOptions): Promise<void> {
127
+ const timeoutSignal = AbortSignal.timeout(VALIDATION_TIMEOUT_MS);
128
+ const signal = options.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal;
129
+ const fetchImpl = options.fetch ?? fetch;
130
+
131
+ const response = await fetchImpl(options.modelsUrl, {
132
+ method: "GET",
133
+ headers: {
134
+ ...(resolveValidationHeaders(options.headers) ?? {}),
135
+ Authorization: `Bearer ${options.apiKey}`,
136
+ },
137
+ signal,
138
+ });
139
+
140
+ if (response.ok) {
141
+ return;
142
+ }
143
+
144
+ throw await createApiKeyValidationError(options.provider, response);
145
+ }
@@ -0,0 +1,57 @@
1
+ import * as fs from "node:fs";
2
+ import { $env } from "@linxiraos/pi-utils";
3
+ import { hasConfiguredAwsProfile } from "../utils/aws-profile";
4
+ import { AUTHENTICATED_SENTINEL } from "./types";
5
+
6
+ export interface AwsBedrockProviderOptions extends Readonly<Record<string, unknown>> {
7
+ /** AWS region used in the service endpoint and SigV4 credential scope. */
8
+ region?: string;
9
+ /** Named AWS shared-credentials/config profile. */
10
+ profile?: string;
11
+ /** Amazon Bedrock API key sent as a bearer token, ahead of SigV4 credential resolution. */
12
+ bearerToken?: string;
13
+ }
14
+
15
+ function isEc2Host(): boolean {
16
+ for (const candidate of [
17
+ "/sys/hypervisor/uuid",
18
+ "/sys/devices/virtual/dmi/id/product_uuid",
19
+ "/sys/devices/virtual/dmi/id/board_asset_tag",
20
+ ]) {
21
+ try {
22
+ const value = fs.readFileSync(candidate, "utf8").trim().toLowerCase();
23
+ if (value.startsWith("ec2")) return true;
24
+ } catch {
25
+ // Missing/unreadable DMI metadata means this probe is inconclusive.
26
+ }
27
+ }
28
+ return false;
29
+ }
30
+
31
+ export function hasAwsCredentialSource(): boolean {
32
+ const hasEcsCredentials = !!$env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI || !!$env.AWS_CONTAINER_CREDENTIALS_FULL_URI;
33
+ const hasWebIdentity = !!$env.AWS_WEB_IDENTITY_TOKEN_FILE && !!$env.AWS_ROLE_ARN;
34
+ const hasProfile = hasConfiguredAwsProfile();
35
+ const hasInstanceRole =
36
+ $env.AWS_EC2_METADATA_DISABLED?.toLowerCase() !== "true" &&
37
+ (!!$env.AWS_EC2_METADATA_SERVICE_ENDPOINT || isEc2Host());
38
+ return !!(
39
+ ($env.AWS_ACCESS_KEY_ID && $env.AWS_SECRET_ACCESS_KEY) ||
40
+ $env.AWS_BEARER_TOKEN_BEDROCK ||
41
+ hasWebIdentity ||
42
+ hasProfile ||
43
+ hasEcsCredentials ||
44
+ hasInstanceRole
45
+ );
46
+ }
47
+
48
+ /** Registry key marker for AWS transports that resolve their own bearer/IAM credentials. */
49
+ export function resolveAwsRegistryApiKey(): string | undefined {
50
+ return hasAwsCredentialSource() ? AUTHENTICATED_SENTINEL : undefined;
51
+ }
52
+
53
+ /** Resolve a real AWS bearer token while filtering the registry's auth marker. */
54
+ export function resolveAwsBearerToken(apiKey?: string, bearerToken?: string): string | undefined {
55
+ const resolvedApiKey = apiKey === AUTHENTICATED_SENTINEL ? undefined : apiKey;
56
+ return bearerToken || resolvedApiKey || $env.AWS_BEARER_TOKEN_BEDROCK;
57
+ }
@@ -0,0 +1,6 @@
1
+ import type { ProviderDefinition } from "./types";
2
+
3
+ export const azureProvider = {
4
+ id: "azure",
5
+ name: "Azure OpenAI",
6
+ } as const satisfies ProviderDefinition;