@earendil-works/pi-ai 0.80.7 → 0.80.8

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 (189) 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-responses.d.ts.map +1 -1
  9. package/dist/api/openai-responses.js +2 -0
  10. package/dist/api/openai-responses.js.map +1 -1
  11. package/dist/auth/credential-store.d.ts +2 -1
  12. package/dist/auth/credential-store.d.ts.map +1 -1
  13. package/dist/auth/credential-store.js +3 -0
  14. package/dist/auth/credential-store.js.map +1 -1
  15. package/dist/auth/helpers.d.ts.map +1 -1
  16. package/dist/auth/helpers.js +3 -3
  17. package/dist/auth/helpers.js.map +1 -1
  18. package/dist/auth/oauth/anthropic.d.ts +9 -0
  19. package/dist/auth/oauth/anthropic.d.ts.map +1 -0
  20. package/dist/{utils → auth}/oauth/anthropic.js +51 -116
  21. package/dist/auth/oauth/anthropic.js.map +1 -0
  22. package/dist/auth/oauth/device-code.d.ts.map +1 -0
  23. package/dist/auth/oauth/device-code.js.map +1 -0
  24. package/dist/auth/oauth/github-copilot.d.ts +6 -0
  25. package/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  26. package/dist/{utils → auth}/oauth/github-copilot.js +18 -77
  27. package/dist/auth/oauth/github-copilot.js.map +1 -0
  28. package/dist/auth/oauth/load.d.ts +23 -0
  29. package/dist/auth/oauth/load.d.ts.map +1 -0
  30. package/dist/auth/oauth/load.js +49 -0
  31. package/dist/auth/oauth/load.js.map +1 -0
  32. package/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  33. package/dist/auth/oauth/oauth-page.js.map +1 -0
  34. package/dist/auth/oauth/openai-codex.d.ts +9 -0
  35. package/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  36. package/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  37. package/dist/auth/oauth/openai-codex.js.map +1 -0
  38. package/dist/auth/oauth/pkce.d.ts.map +1 -0
  39. package/dist/auth/oauth/pkce.js.map +1 -0
  40. package/dist/auth/oauth/radius.d.ts +16 -0
  41. package/dist/auth/oauth/radius.d.ts.map +1 -0
  42. package/dist/{utils → auth}/oauth/radius.js +31 -128
  43. package/dist/auth/oauth/radius.js.map +1 -0
  44. package/dist/auth/oauth/xai.d.ts +6 -0
  45. package/dist/auth/oauth/xai.d.ts.map +1 -0
  46. package/dist/auth/oauth/xai.js +184 -0
  47. package/dist/auth/oauth/xai.js.map +1 -0
  48. package/dist/auth/resolve.d.ts +2 -4
  49. package/dist/auth/resolve.d.ts.map +1 -1
  50. package/dist/auth/resolve.js +9 -7
  51. package/dist/auth/resolve.js.map +1 -1
  52. package/dist/auth/types.d.ts +47 -10
  53. package/dist/auth/types.d.ts.map +1 -1
  54. package/dist/auth/types.js.map +1 -1
  55. package/dist/bun-oauth.d.ts +3 -0
  56. package/dist/bun-oauth.d.ts.map +1 -0
  57. package/dist/bun-oauth.js +17 -0
  58. package/dist/bun-oauth.js.map +1 -0
  59. package/dist/cli.d.ts.map +1 -1
  60. package/dist/cli.js +58 -76
  61. package/dist/cli.js.map +1 -1
  62. package/dist/compat/extension-oauth-types.d.ts +39 -0
  63. package/dist/compat/extension-oauth-types.d.ts.map +1 -0
  64. package/dist/compat/extension-oauth-types.js +2 -0
  65. package/dist/compat/extension-oauth-types.js.map +1 -0
  66. package/dist/compat.d.ts.map +1 -1
  67. package/dist/compat.js +20 -7
  68. package/dist/compat.js.map +1 -1
  69. package/dist/env-api-keys.d.ts.map +1 -1
  70. package/dist/env-api-keys.js +1 -1
  71. package/dist/env-api-keys.js.map +1 -1
  72. package/dist/images-models.d.ts +4 -2
  73. package/dist/images-models.d.ts.map +1 -1
  74. package/dist/images-models.js +5 -4
  75. package/dist/images-models.js.map +1 -1
  76. package/dist/index.d.ts +2 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +1 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/models-store.d.ts +25 -0
  81. package/dist/models-store.d.ts.map +1 -0
  82. package/dist/models-store.js +14 -0
  83. package/dist/models-store.js.map +1 -0
  84. package/dist/models.d.ts +66 -30
  85. package/dist/models.d.ts.map +1 -1
  86. package/dist/models.generated.d.ts +93 -4
  87. package/dist/models.generated.d.ts.map +1 -1
  88. package/dist/models.js +214 -29
  89. package/dist/models.js.map +1 -1
  90. package/dist/oauth.d.ts +2 -1
  91. package/dist/oauth.d.ts.map +1 -1
  92. package/dist/oauth.js +1 -1
  93. package/dist/oauth.js.map +1 -1
  94. package/dist/providers/all.d.ts +2 -1
  95. package/dist/providers/all.d.ts.map +1 -1
  96. package/dist/providers/all.js +3 -0
  97. package/dist/providers/all.js.map +1 -1
  98. package/dist/providers/amazon-bedrock.d.ts.map +1 -1
  99. package/dist/providers/amazon-bedrock.js +51 -10
  100. package/dist/providers/amazon-bedrock.js.map +1 -1
  101. package/dist/providers/anthropic.d.ts.map +1 -1
  102. package/dist/providers/anthropic.js +1 -1
  103. package/dist/providers/anthropic.js.map +1 -1
  104. package/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  105. package/dist/providers/cloudflare-ai-gateway.js +4 -3
  106. package/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  107. package/dist/providers/cloudflare-auth.d.ts.map +1 -1
  108. package/dist/providers/cloudflare-auth.js +13 -20
  109. package/dist/providers/cloudflare-auth.js.map +1 -1
  110. package/dist/providers/cloudflare-stream.d.ts +8 -0
  111. package/dist/providers/cloudflare-stream.d.ts.map +1 -0
  112. package/dist/providers/cloudflare-stream.js +21 -0
  113. package/dist/providers/cloudflare-stream.js.map +1 -0
  114. package/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  115. package/dist/providers/cloudflare-workers-ai.js +2 -1
  116. package/dist/providers/cloudflare-workers-ai.js.map +1 -1
  117. package/dist/providers/github-copilot.d.ts.map +1 -1
  118. package/dist/providers/github-copilot.js +11 -1
  119. package/dist/providers/github-copilot.js.map +1 -1
  120. package/dist/providers/google-vertex.d.ts.map +1 -1
  121. package/dist/providers/google-vertex.js +56 -5
  122. package/dist/providers/google-vertex.js.map +1 -1
  123. package/dist/providers/kimi-coding.models.d.ts +20 -0
  124. package/dist/providers/kimi-coding.models.d.ts.map +1 -1
  125. package/dist/providers/kimi-coding.models.js +18 -0
  126. package/dist/providers/kimi-coding.models.js.map +1 -1
  127. package/dist/providers/openai-codex.d.ts.map +1 -1
  128. package/dist/providers/openai-codex.js +1 -1
  129. package/dist/providers/openai-codex.js.map +1 -1
  130. package/dist/providers/openrouter.models.d.ts.map +1 -1
  131. package/dist/providers/openrouter.models.js +135 -135
  132. package/dist/providers/openrouter.models.js.map +1 -1
  133. package/dist/providers/radius-config.d.ts +26 -0
  134. package/dist/providers/radius-config.d.ts.map +1 -0
  135. package/dist/providers/radius-config.js +59 -0
  136. package/dist/providers/radius-config.js.map +1 -0
  137. package/dist/providers/radius.d.ts +9 -0
  138. package/dist/providers/radius.d.ts.map +1 -0
  139. package/dist/providers/radius.js +54 -0
  140. package/dist/providers/radius.js.map +1 -0
  141. package/dist/providers/vercel-ai-gateway.models.d.ts +67 -0
  142. package/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  143. package/dist/providers/vercel-ai-gateway.models.js +57 -2
  144. package/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  145. package/dist/providers/xai.d.ts +1 -1
  146. package/dist/providers/xai.d.ts.map +1 -1
  147. package/dist/providers/xai.js +11 -3
  148. package/dist/providers/xai.js.map +1 -1
  149. package/dist/providers/xai.models.d.ts +6 -4
  150. package/dist/providers/xai.models.d.ts.map +1 -1
  151. package/dist/providers/xai.models.js +3 -2
  152. package/dist/providers/xai.models.js.map +1 -1
  153. package/package.json +6 -1
  154. package/dist/utils/oauth/anthropic.d.ts +0 -27
  155. package/dist/utils/oauth/anthropic.d.ts.map +0 -1
  156. package/dist/utils/oauth/anthropic.js.map +0 -1
  157. package/dist/utils/oauth/device-code.d.ts.map +0 -1
  158. package/dist/utils/oauth/device-code.js.map +0 -1
  159. package/dist/utils/oauth/github-copilot.d.ts +0 -32
  160. package/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  161. package/dist/utils/oauth/github-copilot.js.map +0 -1
  162. package/dist/utils/oauth/index.d.ts +0 -59
  163. package/dist/utils/oauth/index.d.ts.map +0 -1
  164. package/dist/utils/oauth/index.js +0 -131
  165. package/dist/utils/oauth/index.js.map +0 -1
  166. package/dist/utils/oauth/load.d.ts +0 -5
  167. package/dist/utils/oauth/load.d.ts.map +0 -1
  168. package/dist/utils/oauth/load.js +0 -22
  169. package/dist/utils/oauth/load.js.map +0 -1
  170. package/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  171. package/dist/utils/oauth/oauth-page.js.map +0 -1
  172. package/dist/utils/oauth/openai-codex.d.ts +0 -45
  173. package/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  174. package/dist/utils/oauth/openai-codex.js.map +0 -1
  175. package/dist/utils/oauth/pkce.d.ts.map +0 -1
  176. package/dist/utils/oauth/pkce.js.map +0 -1
  177. package/dist/utils/oauth/radius.d.ts +0 -39
  178. package/dist/utils/oauth/radius.d.ts.map +0 -1
  179. package/dist/utils/oauth/radius.js.map +0 -1
  180. package/dist/utils/oauth/types.d.ts +0 -64
  181. package/dist/utils/oauth/types.d.ts.map +0 -1
  182. package/dist/utils/oauth/types.js +0 -2
  183. package/dist/utils/oauth/types.js.map +0 -1
  184. /package/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  185. /package/dist/{utils → auth}/oauth/device-code.js +0 -0
  186. /package/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  187. /package/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  188. /package/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  189. /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;
@@ -2776,6 +2826,23 @@ export declare const VERCEL_AI_GATEWAY_MODELS: {
2776
2826
  contextWindow: number;
2777
2827
  maxTokens: number;
2778
2828
  };
2829
+ readonly "thinkingmachines/inkling": {
2830
+ id: string;
2831
+ name: string;
2832
+ api: "anthropic-messages";
2833
+ provider: string;
2834
+ baseUrl: string;
2835
+ reasoning: true;
2836
+ input: ("image" | "text")[];
2837
+ cost: {
2838
+ input: number;
2839
+ output: number;
2840
+ cacheRead: number;
2841
+ cacheWrite: number;
2842
+ };
2843
+ contextWindow: number;
2844
+ maxTokens: number;
2845
+ };
2779
2846
  readonly "xai/grok-4.1-fast-non-reasoning": {
2780
2847
  id: string;
2781
2848
  name: string;