@earendil-works/pi-ai 0.80.7 → 0.80.9

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 (206) hide show
  1. package/README.md +76 -22
  2. package/dist/api/lazy.d.ts.map +1 -1
  3. package/dist/api/lazy.js +9 -10
  4. package/dist/api/lazy.js.map +1 -1
  5. package/dist/api/openai-codex-responses.d.ts.map +1 -1
  6. package/dist/api/openai-codex-responses.js +3 -2
  7. package/dist/api/openai-codex-responses.js.map +1 -1
  8. package/dist/api/openai-completions.d.ts +2 -1
  9. package/dist/api/openai-completions.d.ts.map +1 -1
  10. package/dist/api/openai-completions.js +42 -2
  11. package/dist/api/openai-completions.js.map +1 -1
  12. package/dist/api/openai-responses.d.ts.map +1 -1
  13. package/dist/api/openai-responses.js +2 -0
  14. package/dist/api/openai-responses.js.map +1 -1
  15. package/dist/auth/credential-store.d.ts +2 -1
  16. package/dist/auth/credential-store.d.ts.map +1 -1
  17. package/dist/auth/credential-store.js +3 -0
  18. package/dist/auth/credential-store.js.map +1 -1
  19. package/dist/auth/helpers.d.ts +1 -0
  20. package/dist/auth/helpers.d.ts.map +1 -1
  21. package/dist/auth/helpers.js +4 -3
  22. package/dist/auth/helpers.js.map +1 -1
  23. package/dist/auth/oauth/anthropic.d.ts +9 -0
  24. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  25. package/dist/{utils → auth}/oauth/anthropic.js +51 -116
  26. package/dist/auth/oauth/anthropic.js.map +1 -0
  27. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  28. package/dist/auth/oauth/device-code.js.map +1 -0
  29. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  30. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  31. package/dist/{utils → auth}/oauth/github-copilot.js +18 -77
  32. package/dist/auth/oauth/github-copilot.js.map +1 -0
  33. package/dist/auth/oauth/load.d.ts +23 -0
  34. package/dist/auth/oauth/load.d.ts.map +1 -0
  35. package/dist/auth/oauth/load.js +49 -0
  36. package/dist/auth/oauth/load.js.map +1 -0
  37. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  38. package/dist/auth/oauth/oauth-page.js.map +1 -0
  39. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  40. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  41. package/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  42. package/dist/auth/oauth/openai-codex.js.map +1 -0
  43. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  44. package/dist/auth/oauth/pkce.js.map +1 -0
  45. package/dist/auth/oauth/radius.d.ts +16 -0
  46. package/dist/auth/oauth/radius.d.ts.map +1 -0
  47. package/dist/{utils → auth}/oauth/radius.js +31 -128
  48. package/dist/auth/oauth/radius.js.map +1 -0
  49. package/dist/auth/oauth/xai.d.ts +6 -0
  50. package/dist/auth/oauth/xai.d.ts.map +1 -0
  51. package/dist/auth/oauth/xai.js +189 -0
  52. package/dist/auth/oauth/xai.js.map +1 -0
  53. package/dist/auth/resolve.d.ts +2 -4
  54. package/dist/auth/resolve.d.ts.map +1 -1
  55. package/dist/auth/resolve.js +9 -7
  56. package/dist/auth/resolve.js.map +1 -1
  57. package/dist/auth/types.d.ts +49 -10
  58. package/dist/auth/types.d.ts.map +1 -1
  59. package/dist/auth/types.js.map +1 -1
  60. package/dist/bun-oauth.d.ts +3 -0
  61. package/dist/bun-oauth.d.ts.map +1 -0
  62. package/dist/bun-oauth.js +17 -0
  63. package/dist/bun-oauth.js.map +1 -0
  64. package/dist/cli.d.ts.map +1 -1
  65. package/dist/cli.js +58 -76
  66. package/dist/cli.js.map +1 -1
  67. package/dist/compat/extension-oauth-types.d.ts +39 -0
  68. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  69. package/dist/compat/extension-oauth-types.js +2 -0
  70. package/dist/compat/extension-oauth-types.js.map +1 -0
  71. package/dist/compat.d.ts.map +1 -1
  72. package/dist/compat.js +20 -7
  73. package/dist/compat.js.map +1 -1
  74. package/dist/env-api-keys.d.ts.map +1 -1
  75. package/dist/env-api-keys.js +1 -1
  76. package/dist/env-api-keys.js.map +1 -1
  77. package/dist/images-models.d.ts +4 -2
  78. package/dist/images-models.d.ts.map +1 -1
  79. package/dist/images-models.js +5 -4
  80. package/dist/images-models.js.map +1 -1
  81. package/dist/index.d.ts +2 -1
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +1 -0
  84. package/dist/index.js.map +1 -1
  85. package/dist/models-store.d.ts +25 -0
  86. package/dist/models-store.d.ts.map +1 -0
  87. package/dist/models-store.js +14 -0
  88. package/dist/models-store.js.map +1 -0
  89. package/dist/models.d.ts +66 -30
  90. package/dist/models.d.ts.map +1 -1
  91. package/dist/models.generated.d.ts +244 -4
  92. package/dist/models.generated.d.ts.map +1 -1
  93. package/dist/models.js +214 -29
  94. package/dist/models.js.map +1 -1
  95. package/dist/oauth.d.ts +2 -1
  96. package/dist/oauth.d.ts.map +1 -1
  97. package/dist/oauth.js +1 -1
  98. package/dist/oauth.js.map +1 -1
  99. package/dist/providers/all.d.ts +2 -1
  100. package/dist/providers/all.d.ts.map +1 -1
  101. package/dist/providers/all.js +3 -0
  102. package/dist/providers/all.js.map +1 -1
  103. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  104. package/dist/providers/amazon-bedrock.js +51 -10
  105. package/dist/providers/amazon-bedrock.js.map +1 -1
  106. package/dist/providers/anthropic.d.ts.map +1 -1
  107. package/dist/providers/anthropic.js +1 -1
  108. package/dist/providers/anthropic.js.map +1 -1
  109. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  110. package/dist/providers/cloudflare-ai-gateway.js +4 -3
  111. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  112. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  113. package/dist/providers/cloudflare-auth.js +13 -20
  114. package/dist/providers/cloudflare-auth.js.map +1 -1
  115. package/dist/providers/cloudflare-stream.d.ts +8 -0
  116. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  117. package/dist/providers/cloudflare-stream.js +21 -0
  118. package/dist/providers/cloudflare-stream.js.map +1 -0
  119. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  120. package/dist/providers/cloudflare-workers-ai.js +2 -1
  121. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  122. package/dist/providers/github-copilot.d.ts.map +1 -1
  123. package/dist/providers/github-copilot.js +11 -1
  124. package/dist/providers/github-copilot.js.map +1 -1
  125. package/dist/providers/google-vertex.d.ts.map +1 -1
  126. package/dist/providers/google-vertex.js +56 -5
  127. package/dist/providers/google-vertex.js.map +1 -1
  128. package/dist/providers/kimi-coding.models.d.ts +40 -0
  129. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  130. package/dist/providers/kimi-coding.models.js +36 -0
  131. package/dist/providers/kimi-coding.models.js.map +1 -1
  132. package/dist/providers/moonshotai-cn.models.d.ts +36 -0
  133. package/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  134. package/dist/providers/moonshotai-cn.models.js +19 -0
  135. package/dist/providers/moonshotai-cn.models.js.map +1 -1
  136. package/dist/providers/moonshotai.models.d.ts +36 -0
  137. package/dist/providers/moonshotai.models.d.ts.map +1 -1
  138. package/dist/providers/moonshotai.models.js +19 -0
  139. package/dist/providers/moonshotai.models.js.map +1 -1
  140. package/dist/providers/openai-codex.d.ts.map +1 -1
  141. package/dist/providers/openai-codex.js +1 -1
  142. package/dist/providers/openai-codex.js.map +1 -1
  143. package/dist/providers/openrouter.models.d.ts +42 -0
  144. package/dist/providers/openrouter.models.d.ts.map +1 -1
  145. package/dist/providers/openrouter.models.js +178 -142
  146. package/dist/providers/openrouter.models.js.map +1 -1
  147. package/dist/providers/radius-config.d.ts +26 -0
  148. package/dist/providers/radius-config.d.ts.map +1 -0
  149. package/dist/providers/radius-config.js +59 -0
  150. package/dist/providers/radius-config.js.map +1 -0
  151. package/dist/providers/radius.d.ts +9 -0
  152. package/dist/providers/radius.d.ts.map +1 -0
  153. package/dist/providers/radius.js +54 -0
  154. package/dist/providers/radius.js.map +1 -0
  155. package/dist/providers/vercel-ai-gateway.models.d.ts +84 -0
  156. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  157. package/dist/providers/vercel-ai-gateway.models.js +74 -2
  158. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  159. package/dist/providers/xai.d.ts +1 -1
  160. package/dist/providers/xai.d.ts.map +1 -1
  161. package/dist/providers/xai.js +15 -3
  162. package/dist/providers/xai.js.map +1 -1
  163. package/dist/providers/xai.models.d.ts +6 -4
  164. package/dist/providers/xai.models.d.ts.map +1 -1
  165. package/dist/providers/xai.models.js +3 -2
  166. package/dist/providers/xai.models.js.map +1 -1
  167. package/dist/types.d.ts +2 -0
  168. package/dist/types.d.ts.map +1 -1
  169. package/dist/types.js.map +1 -1
  170. package/package.json +6 -1
  171. package/dist/utils/oauth/anthropic.d.ts +0 -27
  172. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  173. package/dist/utils/oauth/anthropic.js.map +0 -1
  174. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  175. package/dist/utils/oauth/device-code.js.map +0 -1
  176. package/dist/utils/oauth/github-copilot.d.ts +0 -32
  177. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  178. package/dist/utils/oauth/github-copilot.js.map +0 -1
  179. package/dist/utils/oauth/index.d.ts +0 -59
  180. package/dist/utils/oauth/index.d.ts.map +0 -1
  181. package/dist/utils/oauth/index.js +0 -131
  182. package/dist/utils/oauth/index.js.map +0 -1
  183. package/dist/utils/oauth/load.d.ts +0 -5
  184. package/dist/utils/oauth/load.d.ts.map +0 -1
  185. package/dist/utils/oauth/load.js +0 -22
  186. package/dist/utils/oauth/load.js.map +0 -1
  187. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  188. package/dist/utils/oauth/oauth-page.js.map +0 -1
  189. package/dist/utils/oauth/openai-codex.d.ts +0 -45
  190. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  191. package/dist/utils/oauth/openai-codex.js.map +0 -1
  192. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  193. package/dist/utils/oauth/pkce.js.map +0 -1
  194. package/dist/utils/oauth/radius.d.ts +0 -39
  195. package/dist/utils/oauth/radius.d.ts.map +0 -1
  196. package/dist/utils/oauth/radius.js.map +0 -1
  197. package/dist/utils/oauth/types.d.ts +0 -64
  198. package/dist/utils/oauth/types.d.ts.map +0 -1
  199. package/dist/utils/oauth/types.js +0 -2
  200. package/dist/utils/oauth/types.js.map +0 -1
  201. /package/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  202. /package/dist/{utils → auth}/oauth/device-code.js +0 -0
  203. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  204. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  205. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  206. /package/dist/{utils → auth}/oauth/pkce.js +0 -0
@@ -0,0 +1,26 @@
1
+ import type { OAuthCredential } from "../auth/types.ts";
2
+ import type { Model, ThinkingLevelMap } from "../types.ts";
3
+ export declare const DEFAULT_RADIUS_GATEWAY = "https://radius.pi.dev";
4
+ export type RadiusGatewayModel = {
5
+ id: string;
6
+ name: string;
7
+ reasoning: boolean;
8
+ thinkingLevelMap?: ThinkingLevelMap;
9
+ input: ("text" | "image")[];
10
+ cost: Model<"pi-messages">["cost"];
11
+ contextWindow: number;
12
+ maxTokens: number;
13
+ };
14
+ export type RadiusGatewayConfig = {
15
+ baseUrl: string;
16
+ models: RadiusGatewayModel[];
17
+ };
18
+ export type RadiusOAuthCredential = OAuthCredential & {
19
+ gatewayConfig?: RadiusGatewayConfig;
20
+ };
21
+ export declare function normalizeRadiusGatewayUrl(value: string): string;
22
+ export declare function getRadiusCredentialConfig(credential: OAuthCredential | undefined): RadiusGatewayConfig | undefined;
23
+ export declare function getRadiusModelsFromConfig(providerId: string, config: RadiusGatewayConfig): Model<"pi-messages">[];
24
+ export declare function getRadiusModels(providerId: string, credential: OAuthCredential | undefined): Model<"pi-messages">[];
25
+ export declare function loadRadiusGatewayConfig(gateway: string, apiKey?: string, signal?: AbortSignal): Promise<RadiusGatewayConfig>;
26
+ //# sourceMappingURL=radius-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radius-config.d.ts","sourceRoot":"","sources":["../../src/providers/radius-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,eAAO,MAAM,sBAAsB,0BAA0B,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC;IAC5B,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,eAAe,GAAG;IACrD,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACpC,CAAC;AA2BF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,eAAe,GAAG,SAAS,GAAG,mBAAmB,GAAG,SAAS,CAElH;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,CAOjH;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,GAAG,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,EAAE,CAGnH;AAOD,wBAAsB,uBAAuB,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,mBAAmB,CAAC,CAY9B","sourcesContent":["import type { OAuthCredential } from \"../auth/types.ts\";\nimport type { Model, ThinkingLevelMap } from \"../types.ts\";\n\nexport const DEFAULT_RADIUS_GATEWAY = \"https://radius.pi.dev\";\n\nexport type RadiusGatewayModel = {\n\tid: string;\n\tname: string;\n\treasoning: boolean;\n\tthinkingLevelMap?: ThinkingLevelMap;\n\tinput: (\"text\" | \"image\")[];\n\tcost: Model<\"pi-messages\">[\"cost\"];\n\tcontextWindow: number;\n\tmaxTokens: number;\n};\n\nexport type RadiusGatewayConfig = {\n\tbaseUrl: string;\n\tmodels: RadiusGatewayModel[];\n};\n\nexport type RadiusOAuthCredential = OAuthCredential & {\n\tgatewayConfig?: RadiusGatewayConfig;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isRadiusGatewayModel(value: unknown): value is RadiusGatewayModel {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.name === \"string\" &&\n\t\ttypeof value.reasoning === \"boolean\" &&\n\t\tArray.isArray(value.input) &&\n\t\tisRecord(value.cost) &&\n\t\ttypeof value.contextWindow === \"number\" &&\n\t\ttypeof value.maxTokens === \"number\"\n\t);\n}\n\nfunction sanitizeRadiusGatewayConfig(config: unknown): RadiusGatewayConfig | undefined {\n\tif (!isRecord(config) || typeof config.baseUrl !== \"string\" || !Array.isArray(config.models)) return undefined;\n\treturn {\n\t\tbaseUrl: config.baseUrl,\n\t\tmodels: config.models.filter(isRadiusGatewayModel).map((model) => ({ ...model })),\n\t};\n}\n\nexport function normalizeRadiusGatewayUrl(value: string): string {\n\tconst withScheme = /^https?:\\/\\//iu.test(value) ? value : `https://${value}`;\n\treturn withScheme.replace(/\\/+$/u, \"\");\n}\n\nexport function getRadiusCredentialConfig(credential: OAuthCredential | undefined): RadiusGatewayConfig | undefined {\n\treturn sanitizeRadiusGatewayConfig((credential as RadiusOAuthCredential | undefined)?.gatewayConfig);\n}\n\nexport function getRadiusModelsFromConfig(providerId: string, config: RadiusGatewayConfig): Model<\"pi-messages\">[] {\n\treturn config.models.map((model) => ({\n\t\t...model,\n\t\tapi: \"pi-messages\",\n\t\tprovider: providerId,\n\t\tbaseUrl: config.baseUrl,\n\t}));\n}\n\nexport function getRadiusModels(providerId: string, credential: OAuthCredential | undefined): Model<\"pi-messages\">[] {\n\tconst config = getRadiusCredentialConfig(credential);\n\treturn config ? getRadiusModelsFromConfig(providerId, config) : [];\n}\n\nfunction truncateHttpBody(body: string): string {\n\tconst trimmed = body.trim();\n\treturn trimmed.length > 512 ? `${trimmed.slice(0, 512)}…` : trimmed;\n}\n\nexport async function loadRadiusGatewayConfig(\n\tgateway: string,\n\tapiKey?: string,\n\tsignal?: AbortSignal,\n): Promise<RadiusGatewayConfig> {\n\tconst headers: Record<string, string> = { accept: \"application/json\" };\n\tif (apiKey) headers.authorization = `Bearer ${apiKey}`;\n\tconst response = await fetch(new URL(\"/v1/config\", gateway), { headers, signal });\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Could not load Radius config from ${gateway}: ${response.status}: ${truncateHttpBody(await response.text())}`,\n\t\t);\n\t}\n\tconst config = sanitizeRadiusGatewayConfig(await response.json());\n\tif (!config) throw new Error(`Invalid Radius config from ${gateway}`);\n\treturn config;\n}\n"]}
@@ -0,0 +1,59 @@
1
+ export const DEFAULT_RADIUS_GATEWAY = "https://radius.pi.dev";
2
+ function isRecord(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value);
4
+ }
5
+ function isRadiusGatewayModel(value) {
6
+ return (isRecord(value) &&
7
+ typeof value.id === "string" &&
8
+ typeof value.name === "string" &&
9
+ typeof value.reasoning === "boolean" &&
10
+ Array.isArray(value.input) &&
11
+ isRecord(value.cost) &&
12
+ typeof value.contextWindow === "number" &&
13
+ typeof value.maxTokens === "number");
14
+ }
15
+ function sanitizeRadiusGatewayConfig(config) {
16
+ if (!isRecord(config) || typeof config.baseUrl !== "string" || !Array.isArray(config.models))
17
+ return undefined;
18
+ return {
19
+ baseUrl: config.baseUrl,
20
+ models: config.models.filter(isRadiusGatewayModel).map((model) => ({ ...model })),
21
+ };
22
+ }
23
+ export function normalizeRadiusGatewayUrl(value) {
24
+ const withScheme = /^https?:\/\//iu.test(value) ? value : `https://${value}`;
25
+ return withScheme.replace(/\/+$/u, "");
26
+ }
27
+ export function getRadiusCredentialConfig(credential) {
28
+ return sanitizeRadiusGatewayConfig(credential?.gatewayConfig);
29
+ }
30
+ export function getRadiusModelsFromConfig(providerId, config) {
31
+ return config.models.map((model) => ({
32
+ ...model,
33
+ api: "pi-messages",
34
+ provider: providerId,
35
+ baseUrl: config.baseUrl,
36
+ }));
37
+ }
38
+ export function getRadiusModels(providerId, credential) {
39
+ const config = getRadiusCredentialConfig(credential);
40
+ return config ? getRadiusModelsFromConfig(providerId, config) : [];
41
+ }
42
+ function truncateHttpBody(body) {
43
+ const trimmed = body.trim();
44
+ return trimmed.length > 512 ? `${trimmed.slice(0, 512)}…` : trimmed;
45
+ }
46
+ export async function loadRadiusGatewayConfig(gateway, apiKey, signal) {
47
+ const headers = { accept: "application/json" };
48
+ if (apiKey)
49
+ headers.authorization = `Bearer ${apiKey}`;
50
+ const response = await fetch(new URL("/v1/config", gateway), { headers, signal });
51
+ if (!response.ok) {
52
+ throw new Error(`Could not load Radius config from ${gateway}: ${response.status}: ${truncateHttpBody(await response.text())}`);
53
+ }
54
+ const config = sanitizeRadiusGatewayConfig(await response.json());
55
+ if (!config)
56
+ throw new Error(`Invalid Radius config from ${gateway}`);
57
+ return config;
58
+ }
59
+ //# sourceMappingURL=radius-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radius-config.js","sourceRoot":"","sources":["../../src/providers/radius-config.ts"],"names":[],"mappings":"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","sourcesContent":["import type { OAuthCredential } from \"../auth/types.ts\";\nimport type { Model, ThinkingLevelMap } from \"../types.ts\";\n\nexport const DEFAULT_RADIUS_GATEWAY = \"https://radius.pi.dev\";\n\nexport type RadiusGatewayModel = {\n\tid: string;\n\tname: string;\n\treasoning: boolean;\n\tthinkingLevelMap?: ThinkingLevelMap;\n\tinput: (\"text\" | \"image\")[];\n\tcost: Model<\"pi-messages\">[\"cost\"];\n\tcontextWindow: number;\n\tmaxTokens: number;\n};\n\nexport type RadiusGatewayConfig = {\n\tbaseUrl: string;\n\tmodels: RadiusGatewayModel[];\n};\n\nexport type RadiusOAuthCredential = OAuthCredential & {\n\tgatewayConfig?: RadiusGatewayConfig;\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isRadiusGatewayModel(value: unknown): value is RadiusGatewayModel {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.id === \"string\" &&\n\t\ttypeof value.name === \"string\" &&\n\t\ttypeof value.reasoning === \"boolean\" &&\n\t\tArray.isArray(value.input) &&\n\t\tisRecord(value.cost) &&\n\t\ttypeof value.contextWindow === \"number\" &&\n\t\ttypeof value.maxTokens === \"number\"\n\t);\n}\n\nfunction sanitizeRadiusGatewayConfig(config: unknown): RadiusGatewayConfig | undefined {\n\tif (!isRecord(config) || typeof config.baseUrl !== \"string\" || !Array.isArray(config.models)) return undefined;\n\treturn {\n\t\tbaseUrl: config.baseUrl,\n\t\tmodels: config.models.filter(isRadiusGatewayModel).map((model) => ({ ...model })),\n\t};\n}\n\nexport function normalizeRadiusGatewayUrl(value: string): string {\n\tconst withScheme = /^https?:\\/\\//iu.test(value) ? value : `https://${value}`;\n\treturn withScheme.replace(/\\/+$/u, \"\");\n}\n\nexport function getRadiusCredentialConfig(credential: OAuthCredential | undefined): RadiusGatewayConfig | undefined {\n\treturn sanitizeRadiusGatewayConfig((credential as RadiusOAuthCredential | undefined)?.gatewayConfig);\n}\n\nexport function getRadiusModelsFromConfig(providerId: string, config: RadiusGatewayConfig): Model<\"pi-messages\">[] {\n\treturn config.models.map((model) => ({\n\t\t...model,\n\t\tapi: \"pi-messages\",\n\t\tprovider: providerId,\n\t\tbaseUrl: config.baseUrl,\n\t}));\n}\n\nexport function getRadiusModels(providerId: string, credential: OAuthCredential | undefined): Model<\"pi-messages\">[] {\n\tconst config = getRadiusCredentialConfig(credential);\n\treturn config ? getRadiusModelsFromConfig(providerId, config) : [];\n}\n\nfunction truncateHttpBody(body: string): string {\n\tconst trimmed = body.trim();\n\treturn trimmed.length > 512 ? `${trimmed.slice(0, 512)}…` : trimmed;\n}\n\nexport async function loadRadiusGatewayConfig(\n\tgateway: string,\n\tapiKey?: string,\n\tsignal?: AbortSignal,\n): Promise<RadiusGatewayConfig> {\n\tconst headers: Record<string, string> = { accept: \"application/json\" };\n\tif (apiKey) headers.authorization = `Bearer ${apiKey}`;\n\tconst response = await fetch(new URL(\"/v1/config\", gateway), { headers, signal });\n\tif (!response.ok) {\n\t\tthrow new Error(\n\t\t\t`Could not load Radius config from ${gateway}: ${response.status}: ${truncateHttpBody(await response.text())}`,\n\t\t);\n\t}\n\tconst config = sanitizeRadiusGatewayConfig(await response.json());\n\tif (!config) throw new Error(`Invalid Radius config from ${gateway}`);\n\treturn config;\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { Provider } from "../models.ts";
2
+ export interface RadiusProviderOptions {
3
+ id?: string;
4
+ name?: string;
5
+ gateway?: string;
6
+ }
7
+ /** Radius gateway provider with a persisted, dynamically refreshed catalog. */
8
+ export declare function radiusProvider(options?: RadiusProviderOptions): Provider<"pi-messages">;
9
+ //# sourceMappingURL=radius.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radius.d.ts","sourceRoot":"","sources":["../../src/providers/radius.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAS7C,MAAM,WAAW,qBAAqB;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAAC,aAAa,CAAC,CA+C3F","sourcesContent":["import { piMessagesApi } from \"../api/pi-messages.lazy.ts\";\nimport { envApiKeyAuth, lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadRadiusOAuth } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport {\n\tDEFAULT_RADIUS_GATEWAY,\n\tgetRadiusModels,\n\tgetRadiusModelsFromConfig,\n\tloadRadiusGatewayConfig,\n\tnormalizeRadiusGatewayUrl,\n} from \"./radius-config.ts\";\n\nexport interface RadiusProviderOptions {\n\tid?: string;\n\tname?: string;\n\tgateway?: string;\n}\n\n/** Radius gateway provider with a persisted, dynamically refreshed catalog. */\nexport function radiusProvider(options: RadiusProviderOptions = {}): Provider<\"pi-messages\"> {\n\tconst id = options.id ?? \"radius\";\n\tconst name = options.name ?? \"Radius\";\n\tconst gateway = normalizeRadiusGatewayUrl(options.gateway ?? DEFAULT_RADIUS_GATEWAY);\n\tlet models = getRadiusModels(id, undefined);\n\tlet inflightRefresh: Promise<void> | undefined;\n\tconst streams = piMessagesApi();\n\n\treturn {\n\t\tid,\n\t\tname,\n\t\tauth: {\n\t\t\tapiKey: envApiKeyAuth(\"Radius API key\", [\"RADIUS_API_KEY\"]),\n\t\t\toauth: lazyOAuth({ name, load: () => loadRadiusOAuth({ name, gateway }) }),\n\t\t},\n\t\tgetModels: () => models,\n\t\trefreshModels: (context) => {\n\t\t\tinflightRefresh ??= (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst stored = await context.store.read();\n\t\t\t\t\tif (stored) models = stored.models.filter((model) => model.provider === id) as typeof models;\n\n\t\t\t\t\t// Import catalogs cached by the pre-ModelsStore Radius implementation.\n\t\t\t\t\tif (!stored && context.credential?.type === \"oauth\") {\n\t\t\t\t\t\tconst legacy = getRadiusModels(id, context.credential);\n\t\t\t\t\t\tif (legacy.length > 0) {\n\t\t\t\t\t\t\tmodels = legacy;\n\t\t\t\t\t\t\tawait context.store.write({ models: legacy, checkedAt: Date.now() });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!context.allowNetwork || context.signal?.aborted) return;\n\t\t\t\t\tconst apiKey =\n\t\t\t\t\t\tcontext.credential?.type === \"oauth\" ? context.credential.access : context.credential?.key;\n\t\t\t\t\tconst config = await loadRadiusGatewayConfig(gateway, apiKey, context.signal);\n\t\t\t\t\tif (context.signal?.aborted) return;\n\t\t\t\t\tmodels = getRadiusModelsFromConfig(id, config);\n\t\t\t\t\tawait context.store.write({ models, checkedAt: Date.now() });\n\t\t\t\t} finally {\n\t\t\t\t\tinflightRefresh = undefined;\n\t\t\t\t}\n\t\t\t})();\n\t\t\treturn inflightRefresh;\n\t\t},\n\t\tstream: (model, context, streamOptions) => streams.stream(model, context, streamOptions),\n\t\tstreamSimple: (model, context, streamOptions) => streams.streamSimple(model, context, streamOptions),\n\t};\n}\n"]}
@@ -0,0 +1,54 @@
1
+ import { piMessagesApi } from "../api/pi-messages.lazy.js";
2
+ import { envApiKeyAuth, lazyOAuth } from "../auth/helpers.js";
3
+ import { loadRadiusOAuth } from "../auth/oauth/load.js";
4
+ import { DEFAULT_RADIUS_GATEWAY, getRadiusModels, getRadiusModelsFromConfig, loadRadiusGatewayConfig, normalizeRadiusGatewayUrl, } from "./radius-config.js";
5
+ /** Radius gateway provider with a persisted, dynamically refreshed catalog. */
6
+ export function radiusProvider(options = {}) {
7
+ const id = options.id ?? "radius";
8
+ const name = options.name ?? "Radius";
9
+ const gateway = normalizeRadiusGatewayUrl(options.gateway ?? DEFAULT_RADIUS_GATEWAY);
10
+ let models = getRadiusModels(id, undefined);
11
+ let inflightRefresh;
12
+ const streams = piMessagesApi();
13
+ return {
14
+ id,
15
+ name,
16
+ auth: {
17
+ apiKey: envApiKeyAuth("Radius API key", ["RADIUS_API_KEY"]),
18
+ oauth: lazyOAuth({ name, load: () => loadRadiusOAuth({ name, gateway }) }),
19
+ },
20
+ getModels: () => models,
21
+ refreshModels: (context) => {
22
+ inflightRefresh ??= (async () => {
23
+ try {
24
+ const stored = await context.store.read();
25
+ if (stored)
26
+ models = stored.models.filter((model) => model.provider === id);
27
+ // Import catalogs cached by the pre-ModelsStore Radius implementation.
28
+ if (!stored && context.credential?.type === "oauth") {
29
+ const legacy = getRadiusModels(id, context.credential);
30
+ if (legacy.length > 0) {
31
+ models = legacy;
32
+ await context.store.write({ models: legacy, checkedAt: Date.now() });
33
+ }
34
+ }
35
+ if (!context.allowNetwork || context.signal?.aborted)
36
+ return;
37
+ const apiKey = context.credential?.type === "oauth" ? context.credential.access : context.credential?.key;
38
+ const config = await loadRadiusGatewayConfig(gateway, apiKey, context.signal);
39
+ if (context.signal?.aborted)
40
+ return;
41
+ models = getRadiusModelsFromConfig(id, config);
42
+ await context.store.write({ models, checkedAt: Date.now() });
43
+ }
44
+ finally {
45
+ inflightRefresh = undefined;
46
+ }
47
+ })();
48
+ return inflightRefresh;
49
+ },
50
+ stream: (model, context, streamOptions) => streams.stream(model, context, streamOptions),
51
+ streamSimple: (model, context, streamOptions) => streams.streamSimple(model, context, streamOptions),
52
+ };
53
+ }
54
+ //# sourceMappingURL=radius.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"radius.js","sourceRoot":"","sources":["../../src/providers/radius.ts"],"names":[],"mappings":"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","sourcesContent":["import { piMessagesApi } from \"../api/pi-messages.lazy.ts\";\nimport { envApiKeyAuth, lazyOAuth } from \"../auth/helpers.ts\";\nimport { loadRadiusOAuth } from \"../auth/oauth/load.ts\";\nimport type { Provider } from \"../models.ts\";\nimport {\n\tDEFAULT_RADIUS_GATEWAY,\n\tgetRadiusModels,\n\tgetRadiusModelsFromConfig,\n\tloadRadiusGatewayConfig,\n\tnormalizeRadiusGatewayUrl,\n} from \"./radius-config.ts\";\n\nexport interface RadiusProviderOptions {\n\tid?: string;\n\tname?: string;\n\tgateway?: string;\n}\n\n/** Radius gateway provider with a persisted, dynamically refreshed catalog. */\nexport function radiusProvider(options: RadiusProviderOptions = {}): Provider<\"pi-messages\"> {\n\tconst id = options.id ?? \"radius\";\n\tconst name = options.name ?? \"Radius\";\n\tconst gateway = normalizeRadiusGatewayUrl(options.gateway ?? DEFAULT_RADIUS_GATEWAY);\n\tlet models = getRadiusModels(id, undefined);\n\tlet inflightRefresh: Promise<void> | undefined;\n\tconst streams = piMessagesApi();\n\n\treturn {\n\t\tid,\n\t\tname,\n\t\tauth: {\n\t\t\tapiKey: envApiKeyAuth(\"Radius API key\", [\"RADIUS_API_KEY\"]),\n\t\t\toauth: lazyOAuth({ name, load: () => loadRadiusOAuth({ name, gateway }) }),\n\t\t},\n\t\tgetModels: () => models,\n\t\trefreshModels: (context) => {\n\t\t\tinflightRefresh ??= (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst stored = await context.store.read();\n\t\t\t\t\tif (stored) models = stored.models.filter((model) => model.provider === id) as typeof models;\n\n\t\t\t\t\t// Import catalogs cached by the pre-ModelsStore Radius implementation.\n\t\t\t\t\tif (!stored && context.credential?.type === \"oauth\") {\n\t\t\t\t\t\tconst legacy = getRadiusModels(id, context.credential);\n\t\t\t\t\t\tif (legacy.length > 0) {\n\t\t\t\t\t\t\tmodels = legacy;\n\t\t\t\t\t\t\tawait context.store.write({ models: legacy, checkedAt: Date.now() });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!context.allowNetwork || context.signal?.aborted) return;\n\t\t\t\t\tconst apiKey =\n\t\t\t\t\t\tcontext.credential?.type === \"oauth\" ? context.credential.access : context.credential?.key;\n\t\t\t\t\tconst config = await loadRadiusGatewayConfig(gateway, apiKey, context.signal);\n\t\t\t\t\tif (context.signal?.aborted) return;\n\t\t\t\t\tmodels = getRadiusModelsFromConfig(id, config);\n\t\t\t\t\tawait context.store.write({ models, checkedAt: Date.now() });\n\t\t\t\t} finally {\n\t\t\t\t\tinflightRefresh = undefined;\n\t\t\t\t}\n\t\t\t})();\n\t\t\treturn inflightRefresh;\n\t\t},\n\t\tstream: (model, context, streamOptions) => streams.stream(model, context, streamOptions),\n\t\tstreamSimple: (model, context, streamOptions) => streams.streamSimple(model, context, streamOptions),\n\t};\n}\n"]}
@@ -633,6 +633,31 @@ export declare const VERCEL_AI_GATEWAY_MODELS: {
633
633
  contextWindow: number;
634
634
  maxTokens: number;
635
635
  };
636
+ readonly "anthropic/claude-opus-4.7-fast": {
637
+ id: string;
638
+ name: string;
639
+ api: "anthropic-messages";
640
+ provider: string;
641
+ baseUrl: string;
642
+ compat: {
643
+ forceAdaptiveThinking: true;
644
+ supportsTemperature: false;
645
+ };
646
+ reasoning: true;
647
+ thinkingLevelMap: {
648
+ xhigh: string;
649
+ max: string;
650
+ };
651
+ input: ("image" | "text")[];
652
+ cost: {
653
+ input: number;
654
+ output: number;
655
+ cacheRead: number;
656
+ cacheWrite: number;
657
+ };
658
+ contextWindow: number;
659
+ maxTokens: number;
660
+ };
636
661
  readonly "anthropic/claude-opus-4.8": {
637
662
  id: string;
638
663
  name: string;
@@ -658,6 +683,31 @@ export declare const VERCEL_AI_GATEWAY_MODELS: {
658
683
  contextWindow: number;
659
684
  maxTokens: number;
660
685
  };
686
+ readonly "anthropic/claude-opus-4.8-fast": {
687
+ id: string;
688
+ name: string;
689
+ api: "anthropic-messages";
690
+ provider: string;
691
+ baseUrl: string;
692
+ compat: {
693
+ forceAdaptiveThinking: true;
694
+ supportsTemperature: false;
695
+ };
696
+ reasoning: true;
697
+ thinkingLevelMap: {
698
+ xhigh: string;
699
+ max: string;
700
+ };
701
+ input: ("image" | "text")[];
702
+ cost: {
703
+ input: number;
704
+ output: number;
705
+ cacheRead: number;
706
+ cacheWrite: number;
707
+ };
708
+ contextWindow: number;
709
+ maxTokens: number;
710
+ };
661
711
  readonly "anthropic/claude-sonnet-4": {
662
712
  id: string;
663
713
  name: string;
@@ -1878,6 +1928,23 @@ export declare const VERCEL_AI_GATEWAY_MODELS: {
1878
1928
  contextWindow: number;
1879
1929
  maxTokens: number;
1880
1930
  };
1931
+ readonly "moonshotai/kimi-k3": {
1932
+ id: string;
1933
+ name: string;
1934
+ api: "anthropic-messages";
1935
+ provider: string;
1936
+ baseUrl: string;
1937
+ reasoning: true;
1938
+ input: ("image" | "text")[];
1939
+ cost: {
1940
+ input: number;
1941
+ output: number;
1942
+ cacheRead: number;
1943
+ cacheWrite: number;
1944
+ };
1945
+ contextWindow: number;
1946
+ maxTokens: number;
1947
+ };
1881
1948
  readonly "nvidia/nemotron-3-nano-30b-a3b": {
1882
1949
  id: string;
1883
1950
  name: string;
@@ -2776,6 +2843,23 @@ export declare const VERCEL_AI_GATEWAY_MODELS: {
2776
2843
  contextWindow: number;
2777
2844
  maxTokens: number;
2778
2845
  };
2846
+ readonly "thinkingmachines/inkling": {
2847
+ id: string;
2848
+ name: string;
2849
+ api: "anthropic-messages";
2850
+ provider: string;
2851
+ baseUrl: string;
2852
+ reasoning: true;
2853
+ input: ("image" | "text")[];
2854
+ cost: {
2855
+ input: number;
2856
+ output: number;
2857
+ cacheRead: number;
2858
+ cacheWrite: number;
2859
+ };
2860
+ contextWindow: number;
2861
+ maxTokens: number;
2862
+ };
2779
2863
  readonly "xai/grok-4.1-fast-non-reasoning": {
2780
2864
  id: string;
2781
2865
  name: string;