@code-yeongyu/senpi 2026.6.16-2 → 2026.6.17

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 (147) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/bun/restore-sandbox-env.d.ts +4 -0
  3. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  4. package/dist/bun/restore-sandbox-env.js +4 -0
  5. package/dist/bun/restore-sandbox-env.js.map +1 -1
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +8 -5
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/auth-storage.d.ts +5 -0
  10. package/dist/core/auth-storage.d.ts.map +1 -1
  11. package/dist/core/auth-storage.js +8 -1
  12. package/dist/core/auth-storage.js.map +1 -1
  13. package/dist/core/compaction/branch-summarization.d.ts +2 -0
  14. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  15. package/dist/core/compaction/branch-summarization.js +2 -2
  16. package/dist/core/compaction/branch-summarization.js.map +1 -1
  17. package/dist/core/compaction/compaction.d.ts +2 -4
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +11 -10
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/export-html/vendor/marked.min.js +75 -3
  22. package/dist/core/http-dispatcher.d.ts +1 -0
  23. package/dist/core/http-dispatcher.d.ts.map +1 -1
  24. package/dist/core/http-dispatcher.js +17 -1
  25. package/dist/core/http-dispatcher.js.map +1 -1
  26. package/dist/core/model-registry.d.ts +1 -0
  27. package/dist/core/model-registry.d.ts.map +1 -1
  28. package/dist/core/model-registry.js +10 -4
  29. package/dist/core/model-registry.js.map +1 -1
  30. package/dist/core/provider-attribution.d.ts.map +1 -1
  31. package/dist/core/provider-attribution.js +10 -0
  32. package/dist/core/provider-attribution.js.map +1 -1
  33. package/dist/core/resolve-config-value.d.ts +10 -6
  34. package/dist/core/resolve-config-value.d.ts.map +1 -1
  35. package/dist/core/resolve-config-value.js +32 -17
  36. package/dist/core/resolve-config-value.js.map +1 -1
  37. package/dist/core/sdk.d.ts.map +1 -1
  38. package/dist/core/sdk.js +2 -0
  39. package/dist/core/sdk.js.map +1 -1
  40. package/dist/core/settings-manager.d.ts +1 -0
  41. package/dist/core/settings-manager.d.ts.map +1 -1
  42. package/dist/core/settings-manager.js.map +1 -1
  43. package/dist/main.d.ts.map +1 -1
  44. package/dist/main.js +17 -5
  45. package/dist/main.js.map +1 -1
  46. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  47. package/dist/modes/interactive/components/login-dialog.js +0 -1
  48. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  49. package/docs/providers.md +20 -2
  50. package/docs/settings.md +12 -0
  51. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  52. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  53. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  54. package/examples/extensions/gondolin/package-lock.json +2 -2
  55. package/examples/extensions/gondolin/package.json +1 -1
  56. package/examples/extensions/sandbox/package-lock.json +2 -2
  57. package/examples/extensions/sandbox/package.json +1 -1
  58. package/examples/extensions/with-deps/package-lock.json +2 -2
  59. package/examples/extensions/with-deps/package.json +1 -1
  60. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  61. package/node_modules/@earendil-works/pi-ai/README.md +19 -0
  62. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts +5 -5
  63. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  64. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +21 -57
  65. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  66. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +149 -3
  67. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  68. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +135 -25
  69. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  70. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +52 -33
  72. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  74. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +10 -9
  75. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +7 -4
  78. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts +3 -3
  80. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +1 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js +4 -3
  82. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  84. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +13 -4
  85. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  86. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +107 -57
  88. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  90. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +15 -7
  91. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +2 -1
  94. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +8 -7
  97. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +1 -0
  100. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  101. package/node_modules/@earendil-works/pi-ai/dist/stream.js +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +8 -0
  104. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts +2 -8
  107. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js +17 -22
  109. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js +2 -1
  112. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  114. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js +2 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  116. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.d.ts +7 -0
  117. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.d.ts.map +1 -0
  118. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.js +44 -0
  119. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-env.js.map +1 -0
  120. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  121. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts +3 -0
  122. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  123. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +18 -0
  124. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +1 -1
  125. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +1 -0
  126. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  127. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -1
  128. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  129. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts +1 -0
  130. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  131. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +3 -0
  132. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +5 -0
  134. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +57 -15
  136. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  138. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-tui/dist/index.js +1 -1
  140. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  141. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +5 -0
  142. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  143. package/node_modules/@earendil-works/pi-tui/dist/tui.js +22 -0
  144. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  145. package/node_modules/@earendil-works/pi-tui/package.json +2 -2
  146. package/npm-shrinkwrap.json +11 -11
  147. package/package.json +5 -5
@@ -38,6 +38,7 @@ Unified LLM API with automatic model discovery, provider configuration, token an
38
38
  - [Browser Usage](#browser-usage)
39
39
  - [Browser Compatibility Notes](#browser-compatibility-notes)
40
40
  - [Environment Variables](#environment-variables-nodejs-only)
41
+ - [Provider-Scoped Environment Overrides](#provider-scoped-environment-overrides)
41
42
  - [Checking Environment Variables](#checking-environment-variables)
42
43
  - [OAuth Providers](#oauth-providers)
43
44
  - [Vertex AI](#vertex-ai)
@@ -1147,6 +1148,24 @@ const response = await complete(model, context, {
1147
1148
  });
1148
1149
  ```
1149
1150
 
1151
+ ### Provider-Scoped Environment Overrides
1152
+
1153
+ Pass `env` in stream options to scope provider configuration to a request. Values in `env` are used before process environment variables for API key discovery and provider configuration such as Cloudflare account IDs, Azure OpenAI settings, Vertex project/location, Bedrock settings, `PI_CACHE_RETENTION`, and `HTTP_PROXY`/`HTTPS_PROXY`.
1154
+
1155
+ ```typescript
1156
+ const model = getModel('cloudflare-ai-gateway', 'workers-ai/@cf/moonshotai/kimi-k2.6');
1157
+
1158
+ const response = await complete(model, context, {
1159
+ env: {
1160
+ CLOUDFLARE_API_KEY: '...',
1161
+ CLOUDFLARE_ACCOUNT_ID: 'account-id',
1162
+ CLOUDFLARE_GATEWAY_ID: 'gateway-id'
1163
+ }
1164
+ });
1165
+ ```
1166
+
1167
+ Use this when one process needs different provider settings per request, or when ambient environment variables should not leak into a provider call.
1168
+
1150
1169
  ### Checking Environment Variables
1151
1170
 
1152
1171
  ```typescript
@@ -1,4 +1,4 @@
1
- import type { KnownProvider } from "./types.ts";
1
+ import type { KnownProvider, ProviderEnv } from "./types.ts";
2
2
  /**
3
3
  * Find configured environment variables that can provide an API key for a provider.
4
4
  *
@@ -6,13 +6,13 @@ import type { KnownProvider } from "./types.ts";
6
6
  * credential sources such as AWS profiles, AWS IAM credentials, and Google
7
7
  * Application Default Credentials.
8
8
  */
9
- export declare function findEnvKeys(provider: KnownProvider): string[] | undefined;
10
- export declare function findEnvKeys(provider: string): string[] | undefined;
9
+ export declare function findEnvKeys(provider: KnownProvider, env?: ProviderEnv): string[] | undefined;
10
+ export declare function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined;
11
11
  /**
12
12
  * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.
13
13
  *
14
14
  * Will not return API keys for providers that require OAuth tokens.
15
15
  */
16
- export declare function getEnvApiKey(provider: KnownProvider): string | undefined;
17
- export declare function getEnvApiKey(provider: string): string | undefined;
16
+ export declare function getEnvApiKey(provider: KnownProvider, env?: ProviderEnv): string | undefined;
17
+ export declare function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined;
18
18
  //# sourceMappingURL=env-api-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-api-keys.d.ts","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiHhD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAC3E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AASpE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAC1E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"env-api-keys.d.ts","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAsF7D;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAC9F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AASvF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAC7F,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC"}
@@ -26,40 +26,13 @@ if (typeof process !== "undefined" && (process.versions?.node || process.version
26
26
  _join = m.join;
27
27
  });
28
28
  }
29
- let _procEnvCache = null;
30
- /**
31
- * Fallback for https://github.com/oven-sh/bun/issues/27802
32
- * Bun compiled binaries have an empty `process.env` inside sandbox
33
- * environments on Linux. We can recover the env from `/proc/self/environ`.
34
- */
35
- function getProcEnv(key) {
36
- if (!process.versions?.bun)
37
- return undefined;
38
- if (typeof process === "undefined")
39
- return undefined;
40
- // If process.env already has entries, the bug is not triggered.
41
- if (Object.keys(process.env).length > 0)
42
- return undefined;
43
- if (_procEnvCache === null) {
44
- _procEnvCache = new Map();
45
- try {
46
- const { readFileSync } = require("node:fs");
47
- const data = readFileSync("/proc/self/environ", "utf-8");
48
- for (const entry of data.split("\0")) {
49
- const idx = entry.indexOf("=");
50
- if (idx > 0) {
51
- _procEnvCache.set(entry.slice(0, idx), entry.slice(idx + 1));
52
- }
53
- }
54
- }
55
- catch {
56
- // /proc/self/environ may not be readable.
57
- }
58
- }
59
- return _procEnvCache.get(key);
60
- }
29
+ import { getProviderEnvValue } from "./utils/provider-env.js";
61
30
  let cachedVertexAdcCredentialsExists = null;
62
- function hasVertexAdcCredentials() {
31
+ function hasVertexAdcCredentials(env) {
32
+ const explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;
33
+ if (explicitCredentialsPath) {
34
+ return _existsSync ? _existsSync(explicitCredentialsPath) : false;
35
+ }
63
36
  if (cachedVertexAdcCredentialsExists === null) {
64
37
  // If node modules haven't loaded yet (async import race at startup),
65
38
  // return false WITHOUT caching so the next call retries once they're ready.
@@ -73,7 +46,7 @@ function hasVertexAdcCredentials() {
73
46
  return false;
74
47
  }
75
48
  // Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)
76
- const gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS || getProcEnv("GOOGLE_APPLICATION_CREDENTIALS");
49
+ const gacPath = getProviderEnvValue("GOOGLE_APPLICATION_CREDENTIALS", env);
77
50
  if (gacPath) {
78
51
  cachedVertexAdcCredentialsExists = _existsSync(gacPath);
79
52
  }
@@ -128,27 +101,24 @@ function getApiKeyEnvVars(provider) {
128
101
  const envVar = envMap[provider];
129
102
  return envVar ? [envVar] : undefined;
130
103
  }
131
- export function findEnvKeys(provider) {
104
+ export function findEnvKeys(provider, env) {
132
105
  const envVars = getApiKeyEnvVars(provider);
133
106
  if (!envVars)
134
107
  return undefined;
135
- const found = envVars.filter((envVar) => !!process.env[envVar] || !!getProcEnv(envVar));
108
+ const found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));
136
109
  return found.length > 0 ? found : undefined;
137
110
  }
138
- export function getEnvApiKey(provider) {
139
- const envKeys = findEnvKeys(provider);
111
+ export function getEnvApiKey(provider, env) {
112
+ const envKeys = findEnvKeys(provider, env);
140
113
  if (envKeys?.[0]) {
141
- return process.env[envKeys[0]] || getProcEnv(envKeys[0]);
114
+ return getProviderEnvValue(envKeys[0], env);
142
115
  }
143
116
  // Vertex AI supports either an explicit API key or Application Default Credentials.
144
117
  // Auth is configured via `gcloud auth application-default login`.
145
118
  if (provider === "google-vertex") {
146
- const hasCredentials = hasVertexAdcCredentials();
147
- const hasProject = !!(process.env.GOOGLE_CLOUD_PROJECT ||
148
- process.env.GCLOUD_PROJECT ||
149
- getProcEnv("GOOGLE_CLOUD_PROJECT") ||
150
- getProcEnv("GCLOUD_PROJECT"));
151
- const hasLocation = !!(process.env.GOOGLE_CLOUD_LOCATION || getProcEnv("GOOGLE_CLOUD_LOCATION"));
119
+ const hasCredentials = hasVertexAdcCredentials(env);
120
+ const hasProject = !!(getProviderEnvValue("GOOGLE_CLOUD_PROJECT", env) || getProviderEnvValue("GCLOUD_PROJECT", env));
121
+ const hasLocation = !!getProviderEnvValue("GOOGLE_CLOUD_LOCATION", env);
152
122
  if (hasCredentials && hasProject && hasLocation) {
153
123
  return "<authenticated>";
154
124
  }
@@ -161,18 +131,12 @@ export function getEnvApiKey(provider) {
161
131
  // 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles
162
132
  // 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)
163
133
  // 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)
164
- if (process.env.AWS_PROFILE ||
165
- (process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||
166
- process.env.AWS_BEARER_TOKEN_BEDROCK ||
167
- process.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||
168
- process.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||
169
- process.env.AWS_WEB_IDENTITY_TOKEN_FILE ||
170
- getProcEnv("AWS_PROFILE") ||
171
- (getProcEnv("AWS_ACCESS_KEY_ID") && getProcEnv("AWS_SECRET_ACCESS_KEY")) ||
172
- getProcEnv("AWS_BEARER_TOKEN_BEDROCK") ||
173
- getProcEnv("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI") ||
174
- getProcEnv("AWS_CONTAINER_CREDENTIALS_FULL_URI") ||
175
- getProcEnv("AWS_WEB_IDENTITY_TOKEN_FILE")) {
134
+ if (getProviderEnvValue("AWS_PROFILE", env) ||
135
+ (getProviderEnvValue("AWS_ACCESS_KEY_ID", env) && getProviderEnvValue("AWS_SECRET_ACCESS_KEY", env)) ||
136
+ getProviderEnvValue("AWS_BEARER_TOKEN_BEDROCK", env) ||
137
+ getProviderEnvValue("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI", env) ||
138
+ getProviderEnvValue("AWS_CONTAINER_CREDENTIALS_FULL_URI", env) ||
139
+ getProviderEnvValue("AWS_WEB_IDENTITY_TOKEN_FILE", env)) {
176
140
  return "<authenticated>";
177
141
  }
178
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider } from \"./types.ts\";\n\nlet _procEnvCache: Map<string, string> | null = null;\n\n/**\n * Fallback for https://github.com/oven-sh/bun/issues/27802\n * Bun compiled binaries have an empty `process.env` inside sandbox\n * environments on Linux. We can recover the env from `/proc/self/environ`.\n */\nfunction getProcEnv(key: string): string | undefined {\n\tif (!process.versions?.bun) return undefined;\n\tif (typeof process === \"undefined\") return undefined;\n\n\t// If process.env already has entries, the bug is not triggered.\n\tif (Object.keys(process.env).length > 0) return undefined;\n\n\tif (_procEnvCache === null) {\n\t\t_procEnvCache = new Map();\n\t\ttry {\n\t\t\tconst { readFileSync } = require(\"node:fs\") as typeof import(\"node:fs\");\n\t\t\tconst data = readFileSync(\"/proc/self/environ\", \"utf-8\");\n\t\t\tfor (const entry of data.split(\"\\0\")) {\n\t\t\t\tconst idx = entry.indexOf(\"=\");\n\t\t\t\tif (idx > 0) {\n\t\t\t\t\t_procEnvCache.set(entry.slice(0, idx), entry.slice(idx + 1));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// /proc/self/environ may not be readable.\n\t\t}\n\t}\n\n\treturn _procEnvCache.get(key);\n}\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(): boolean {\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = process.env.GOOGLE_APPLICATION_CREDENTIALS || getProcEnv(\"GOOGLE_APPLICATION_CREDENTIALS\");\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\nfunction getApiKeyEnvVars(provider: string): readonly string[] | undefined {\n\tif (provider === \"github-copilot\") {\n\t\treturn [\"COPILOT_GITHUB_TOKEN\"];\n\t}\n\n\t// ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY\n\tif (provider === \"anthropic\") {\n\t\treturn [\"ANTHROPIC_OAUTH_TOKEN\", \"ANTHROPIC_API_KEY\"];\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\t\"ant-ling\": \"ANT_LING_API_KEY\",\n\t\topenai: \"OPENAI_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tnvidia: \"NVIDIA_API_KEY\",\n\t\tdeepseek: \"DEEPSEEK_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\t\"google-vertex\": \"GOOGLE_CLOUD_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\t\"zai-coding-cn\": \"ZAI_CODING_CN_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\tmoonshotai: \"MOONSHOT_API_KEY\",\n\t\t\"moonshotai-cn\": \"MOONSHOT_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\tfireworks: \"FIREWORKS_API_KEY\",\n\t\ttogether: \"TOGETHER_API_KEY\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"cloudflare-workers-ai\": \"CLOUDFLARE_API_KEY\",\n\t\t\"cloudflare-ai-gateway\": \"CLOUDFLARE_API_KEY\",\n\t\txiaomi: \"XIAOMI_API_KEY\",\n\t\t\"xiaomi-token-plan-cn\": \"XIAOMI_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"xiaomi-token-plan-ams\": \"XIAOMI_TOKEN_PLAN_AMS_API_KEY\",\n\t\t\"xiaomi-token-plan-sgp\": \"XIAOMI_TOKEN_PLAN_SGP_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? [envVar] : undefined;\n}\n\n/**\n * Find configured environment variables that can provide an API key for a provider.\n *\n * This only reports actual API key variables. It intentionally excludes ambient\n * credential sources such as AWS profiles, AWS IAM credentials, and Google\n * Application Default Credentials.\n */\nexport function findEnvKeys(provider: KnownProvider): string[] | undefined;\nexport function findEnvKeys(provider: string): string[] | undefined;\nexport function findEnvKeys(provider: string): string[] | undefined {\n\tconst envVars = getApiKeyEnvVars(provider);\n\tif (!envVars) return undefined;\n\n\tconst found = envVars.filter((envVar) => !!process.env[envVar] || !!getProcEnv(envVar));\n\treturn found.length > 0 ? found : undefined;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider): string | undefined;\nexport function getEnvApiKey(provider: string): string | undefined;\nexport function getEnvApiKey(provider: string): string | undefined {\n\tconst envKeys = findEnvKeys(provider);\n\tif (envKeys?.[0]) {\n\t\treturn process.env[envKeys[0]] || getProcEnv(envKeys[0]);\n\t}\n\n\t// Vertex AI supports either an explicit API key or Application Default Credentials.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials();\n\t\tconst hasProject = !!(\n\t\t\tprocess.env.GOOGLE_CLOUD_PROJECT ||\n\t\t\tprocess.env.GCLOUD_PROJECT ||\n\t\t\tgetProcEnv(\"GOOGLE_CLOUD_PROJECT\") ||\n\t\t\tgetProcEnv(\"GCLOUD_PROJECT\")\n\t\t);\n\t\tconst hasLocation = !!(process.env.GOOGLE_CLOUD_LOCATION || getProcEnv(\"GOOGLE_CLOUD_LOCATION\"));\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tprocess.env.AWS_PROFILE ||\n\t\t\t(process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY) ||\n\t\t\tprocess.env.AWS_BEARER_TOKEN_BEDROCK ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_RELATIVE_URI ||\n\t\t\tprocess.env.AWS_CONTAINER_CREDENTIALS_FULL_URI ||\n\t\t\tprocess.env.AWS_WEB_IDENTITY_TOKEN_FILE ||\n\t\t\tgetProcEnv(\"AWS_PROFILE\") ||\n\t\t\t(getProcEnv(\"AWS_ACCESS_KEY_ID\") && getProcEnv(\"AWS_SECRET_ACCESS_KEY\")) ||\n\t\t\tgetProcEnv(\"AWS_BEARER_TOKEN_BEDROCK\") ||\n\t\t\tgetProcEnv(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\") ||\n\t\t\tgetProcEnv(\"AWS_CONTAINER_CREDENTIALS_FULL_URI\") ||\n\t\t\tgetProcEnv(\"AWS_WEB_IDENTITY_TOKEN_FILE\")\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\treturn undefined;\n}\n"]}
1
+ {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider, ProviderEnv } from \"./types.ts\";\nimport { getProviderEnvValue } from \"./utils/provider-env.ts\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(env?: ProviderEnv): boolean {\n\tconst explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;\n\tif (explicitCredentialsPath) {\n\t\treturn _existsSync ? _existsSync(explicitCredentialsPath) : false;\n\t}\n\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = getProviderEnvValue(\"GOOGLE_APPLICATION_CREDENTIALS\", env);\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\nfunction getApiKeyEnvVars(provider: string): readonly string[] | undefined {\n\tif (provider === \"github-copilot\") {\n\t\treturn [\"COPILOT_GITHUB_TOKEN\"];\n\t}\n\n\t// ANTHROPIC_OAUTH_TOKEN takes precedence over ANTHROPIC_API_KEY\n\tif (provider === \"anthropic\") {\n\t\treturn [\"ANTHROPIC_OAUTH_TOKEN\", \"ANTHROPIC_API_KEY\"];\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\t\"ant-ling\": \"ANT_LING_API_KEY\",\n\t\topenai: \"OPENAI_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tnvidia: \"NVIDIA_API_KEY\",\n\t\tdeepseek: \"DEEPSEEK_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\t\"google-vertex\": \"GOOGLE_CLOUD_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\t\"zai-coding-cn\": \"ZAI_CODING_CN_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\tmoonshotai: \"MOONSHOT_API_KEY\",\n\t\t\"moonshotai-cn\": \"MOONSHOT_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\tfireworks: \"FIREWORKS_API_KEY\",\n\t\ttogether: \"TOGETHER_API_KEY\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"cloudflare-workers-ai\": \"CLOUDFLARE_API_KEY\",\n\t\t\"cloudflare-ai-gateway\": \"CLOUDFLARE_API_KEY\",\n\t\txiaomi: \"XIAOMI_API_KEY\",\n\t\t\"xiaomi-token-plan-cn\": \"XIAOMI_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"xiaomi-token-plan-ams\": \"XIAOMI_TOKEN_PLAN_AMS_API_KEY\",\n\t\t\"xiaomi-token-plan-sgp\": \"XIAOMI_TOKEN_PLAN_SGP_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? [envVar] : undefined;\n}\n\n/**\n * Find configured environment variables that can provide an API key for a provider.\n *\n * This only reports actual API key variables. It intentionally excludes ambient\n * credential sources such as AWS profiles, AWS IAM credentials, and Google\n * Application Default Credentials.\n */\nexport function findEnvKeys(provider: KnownProvider, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {\n\tconst envVars = getApiKeyEnvVars(provider);\n\tif (!envVars) return undefined;\n\n\tconst found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));\n\treturn found.length > 0 ? found : undefined;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined {\n\tconst envKeys = findEnvKeys(provider, env);\n\tif (envKeys?.[0]) {\n\t\treturn getProviderEnvValue(envKeys[0], env);\n\t}\n\n\t// Vertex AI supports either an explicit API key or Application Default Credentials.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials(env);\n\t\tconst hasProject = !!(\n\t\t\tgetProviderEnvValue(\"GOOGLE_CLOUD_PROJECT\", env) || getProviderEnvValue(\"GCLOUD_PROJECT\", env)\n\t\t);\n\t\tconst hasLocation = !!getProviderEnvValue(\"GOOGLE_CLOUD_LOCATION\", env);\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tgetProviderEnvValue(\"AWS_PROFILE\", env) ||\n\t\t\t(getProviderEnvValue(\"AWS_ACCESS_KEY_ID\", env) && getProviderEnvValue(\"AWS_SECRET_ACCESS_KEY\", env)) ||\n\t\t\tgetProviderEnvValue(\"AWS_BEARER_TOKEN_BEDROCK\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_FULL_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_WEB_IDENTITY_TOKEN_FILE\", env)\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\treturn undefined;\n}\n"]}
@@ -4115,6 +4115,26 @@ export declare const MODELS: {
4115
4115
  contextWindow: number;
4116
4116
  maxTokens: number;
4117
4117
  };
4118
+ readonly "@cf/zai-org/glm-5.2": {
4119
+ id: string;
4120
+ name: string;
4121
+ api: "openai-completions";
4122
+ provider: string;
4123
+ baseUrl: string;
4124
+ compat: {
4125
+ sendSessionAffinityHeaders: true;
4126
+ };
4127
+ reasoning: true;
4128
+ input: "text"[];
4129
+ cost: {
4130
+ input: number;
4131
+ output: number;
4132
+ cacheRead: number;
4133
+ cacheWrite: number;
4134
+ };
4135
+ contextWindow: number;
4136
+ maxTokens: number;
4137
+ };
4118
4138
  };
4119
4139
  readonly deepseek: {
4120
4140
  readonly "deepseek-v4-flash": {
@@ -4244,6 +4264,29 @@ export declare const MODELS: {
4244
4264
  contextWindow: number;
4245
4265
  maxTokens: number;
4246
4266
  };
4267
+ readonly "accounts/fireworks/models/glm-5p2": {
4268
+ id: string;
4269
+ name: string;
4270
+ api: "anthropic-messages";
4271
+ provider: string;
4272
+ baseUrl: string;
4273
+ compat: {
4274
+ sendSessionAffinityHeaders: true;
4275
+ supportsEagerToolInputStreaming: false;
4276
+ supportsCacheControlOnTools: false;
4277
+ supportsLongCacheRetention: false;
4278
+ };
4279
+ reasoning: true;
4280
+ input: "text"[];
4281
+ cost: {
4282
+ input: number;
4283
+ output: number;
4284
+ cacheRead: number;
4285
+ cacheWrite: number;
4286
+ };
4287
+ contextWindow: number;
4288
+ maxTokens: number;
4289
+ };
4247
4290
  readonly "accounts/fireworks/models/gpt-oss-120b": {
4248
4291
  id: string;
4249
4292
  name: string;
@@ -7170,6 +7213,34 @@ export declare const MODELS: {
7170
7213
  contextWindow: number;
7171
7214
  maxTokens: number;
7172
7215
  };
7216
+ readonly "kimi-k2.7-code-highspeed": {
7217
+ id: string;
7218
+ name: string;
7219
+ api: "openai-completions";
7220
+ provider: string;
7221
+ baseUrl: string;
7222
+ compat: {
7223
+ supportsStore: false;
7224
+ supportsDeveloperRole: false;
7225
+ supportsReasoningEffort: false;
7226
+ maxTokensField: "max_tokens";
7227
+ supportsStrictMode: false;
7228
+ thinkingFormat: "deepseek";
7229
+ };
7230
+ reasoning: true;
7231
+ thinkingLevelMap: {
7232
+ off: null;
7233
+ };
7234
+ input: ("image" | "text")[];
7235
+ cost: {
7236
+ input: number;
7237
+ output: number;
7238
+ cacheRead: number;
7239
+ cacheWrite: number;
7240
+ };
7241
+ contextWindow: number;
7242
+ maxTokens: number;
7243
+ };
7173
7244
  };
7174
7245
  readonly "moonshotai-cn": {
7175
7246
  readonly "kimi-k2-0711-preview": {
@@ -7375,6 +7446,34 @@ export declare const MODELS: {
7375
7446
  contextWindow: number;
7376
7447
  maxTokens: number;
7377
7448
  };
7449
+ readonly "kimi-k2.7-code-highspeed": {
7450
+ id: string;
7451
+ name: string;
7452
+ api: "openai-completions";
7453
+ provider: string;
7454
+ baseUrl: string;
7455
+ compat: {
7456
+ supportsStore: false;
7457
+ supportsDeveloperRole: false;
7458
+ supportsReasoningEffort: false;
7459
+ maxTokensField: "max_tokens";
7460
+ supportsStrictMode: false;
7461
+ thinkingFormat: "deepseek";
7462
+ };
7463
+ reasoning: true;
7464
+ thinkingLevelMap: {
7465
+ off: null;
7466
+ };
7467
+ input: ("image" | "text")[];
7468
+ cost: {
7469
+ input: number;
7470
+ output: number;
7471
+ cacheRead: number;
7472
+ cacheWrite: number;
7473
+ };
7474
+ contextWindow: number;
7475
+ maxTokens: number;
7476
+ };
7378
7477
  };
7379
7478
  readonly nvidia: {
7380
7479
  readonly "meta/llama-3.1-70b-instruct": {
@@ -9007,7 +9106,6 @@ export declare const MODELS: {
9007
9106
  maxTokensField: "max_tokens";
9008
9107
  supportsLongCacheRetention: false;
9009
9108
  requiresReasoningContentOnAssistantMessages: true;
9010
- thinkingFormat: "deepseek";
9011
9109
  };
9012
9110
  reasoning: true;
9013
9111
  thinkingLevelMap: {
@@ -9036,7 +9134,6 @@ export declare const MODELS: {
9036
9134
  compat: {
9037
9135
  maxTokensField: "max_tokens";
9038
9136
  requiresReasoningContentOnAssistantMessages: true;
9039
- thinkingFormat: "deepseek";
9040
9137
  };
9041
9138
  reasoning: true;
9042
9139
  thinkingLevelMap: {
@@ -9066,7 +9163,6 @@ export declare const MODELS: {
9066
9163
  maxTokensField: "max_tokens";
9067
9164
  supportsLongCacheRetention: false;
9068
9165
  requiresReasoningContentOnAssistantMessages: true;
9069
- thinkingFormat: "deepseek";
9070
9166
  };
9071
9167
  reasoning: true;
9072
9168
  thinkingLevelMap: {
@@ -14241,6 +14337,23 @@ export declare const MODELS: {
14241
14337
  contextWindow: number;
14242
14338
  maxTokens: number;
14243
14339
  };
14340
+ readonly "z-ai/glm-5.2": {
14341
+ id: string;
14342
+ name: string;
14343
+ api: "openai-completions";
14344
+ provider: string;
14345
+ baseUrl: string;
14346
+ reasoning: true;
14347
+ input: "text"[];
14348
+ cost: {
14349
+ input: number;
14350
+ output: number;
14351
+ cacheRead: number;
14352
+ cacheWrite: number;
14353
+ };
14354
+ contextWindow: number;
14355
+ maxTokens: number;
14356
+ };
14244
14357
  readonly "~anthropic/claude-fable-latest": {
14245
14358
  id: string;
14246
14359
  name: string;
@@ -17841,6 +17954,23 @@ export declare const MODELS: {
17841
17954
  contextWindow: number;
17842
17955
  maxTokens: number;
17843
17956
  };
17957
+ readonly "zai/glm-5.2": {
17958
+ id: string;
17959
+ name: string;
17960
+ api: "anthropic-messages";
17961
+ provider: string;
17962
+ baseUrl: string;
17963
+ reasoning: true;
17964
+ input: "text"[];
17965
+ cost: {
17966
+ input: number;
17967
+ output: number;
17968
+ cacheRead: number;
17969
+ cacheWrite: number;
17970
+ };
17971
+ contextWindow: number;
17972
+ maxTokens: number;
17973
+ };
17844
17974
  readonly "zai/glm-5v-turbo": {
17845
17975
  id: string;
17846
17976
  name: string;
@@ -18547,9 +18677,17 @@ export declare const MODELS: {
18547
18677
  compat: {
18548
18678
  supportsDeveloperRole: false;
18549
18679
  thinkingFormat: "zai";
18680
+ supportsReasoningEffort: true;
18550
18681
  zaiToolStream: true;
18551
18682
  };
18552
18683
  reasoning: true;
18684
+ thinkingLevelMap: {
18685
+ minimal: null;
18686
+ low: string;
18687
+ medium: string;
18688
+ high: string;
18689
+ xhigh: string;
18690
+ };
18553
18691
  input: "text"[];
18554
18692
  cost: {
18555
18693
  input: number;
@@ -18680,9 +18818,17 @@ export declare const MODELS: {
18680
18818
  compat: {
18681
18819
  supportsDeveloperRole: false;
18682
18820
  thinkingFormat: "zai";
18821
+ supportsReasoningEffort: true;
18683
18822
  zaiToolStream: true;
18684
18823
  };
18685
18824
  reasoning: true;
18825
+ thinkingLevelMap: {
18826
+ minimal: null;
18827
+ low: string;
18828
+ medium: string;
18829
+ high: string;
18830
+ xhigh: string;
18831
+ };
18686
18832
  input: "text"[];
18687
18833
  cost: {
18688
18834
  input: number;