Skip to content
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
c9f95fc
claude-code with OpenAI mode fix
Apr 3, 2026
fa5329d
Merge remote main: keep OpenAI fix
Apr 3, 2026
21b2854
1.0.4
Apr 3, 2026
dfe25b1
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
affc826
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
4fa7582
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
7631c0f
Merge remote main and resolve conflicts
Apr 4, 2026
3ae973c
ReWrite
Apr 4, 2026
e548369
ReWrite
Apr 4, 2026
ad10444
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
b5d1dbc
provider指令切换模型类型
Apr 4, 2026
0c9fd37
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
c33d5dc
Merge branch 'claude-code-best:main' into main
2228293026 Apr 4, 2026
ec5dfed
fix provider指令切换模型类型
Apr 4, 2026
eb6fbe5
分离OpenAI和Anthropic模型的环境变量
Apr 4, 2026
a0141c1
ConsoleOAuthFlow格式化恢复
Apr 5, 2026
1e53943
修复小问题
Apr 5, 2026
282f2f4
删除误导注释
Apr 5, 2026
41f733a
验证 OAuth 流程中的 base_url 防止无效 URL
Apr 5, 2026
a50971f
ConsoleOAuthFlow: 添加 base_url URL 格式验证
Apr 5, 2026
2f95d1a
Merge branch 'claude-code-best:main' into main
2228293026 Apr 5, 2026
ecac0ab
Merge branch 'claude-code-best:main' into main
2228293026 Apr 5, 2026
1f8f90e
Merge branch 'claude-code-best:main' into main
2228293026 Apr 5, 2026
26245e0
Merge branch 'main' into main
2228293026 Apr 6, 2026
a7a9659
解决报错
Apr 6, 2026
6f80e96
fix: make modelType take precedence over all env vars in getAPIProvider
Apr 6, 2026
14dc54a
gemini模型环境变量分离 provider指令支持切换gemini
Apr 6, 2026
81ecd82
Test
Apr 6, 2026
eb62b47
e
Apr 6, 2026
a15340f
Merge branch 'claude-code-best:main' into main
2228293026 Apr 6, 2026
5bf3c93
feat: add contributors auto-update workflow
Apr 6, 2026
fec8ec6
fix: correct contributors link in README
Apr 6, 2026
7d88b4d
docs: update contributors
2228293026 Apr 6, 2026
767d6fa
Merge branch 'claude-code-best:main' into main
2228293026 Apr 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ Feature flag `VOICE_MODE`,dev/build 默认启用。Push-to-Talk 语音输入
- **`src/services/api/openai/`** — client、消息/工具转换、流适配、模型映射
- **`src/utils/model/providers.ts`** — 添加 `'openai'` provider 类型(最高优先级)

关键环境变量:`CLAUDE_CODE_USE_OPENAI`、`OPENAI_API_KEY`、`OPENAI_BASE_URL`、`OPENAI_MODEL`、`OPENAI_MODEL_MAP`。详见 `docs/plans/openai-compatibility.md`。
关键环境变量:`CLAUDE_CODE_USE_OPENAI`、`OPENAI_API_KEY`、`OPENAI_BASE_URL`、`OPENAI_MODEL`、`OPENAI_DEFAULT_OPUS_MODEL`、`OPENAI_DEFAULT_SONNET_MODEL`、`OPENAI_DEFAULT_HAIKU_MODEL`。详见 `docs/plans/openai-compatibility.md`。

### Key Type Files

Expand Down
16 changes: 10 additions & 6 deletions docs/plans/openai-compatibility.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ claude-code 支持通过 OpenAI Chat Completions API(`/v1/chat/completions`)
| `OPENAI_API_KEY` | 是 | API key(Ollama 等可设为任意值) |
| `OPENAI_BASE_URL` | 推荐 | 端点 URL(如 `http://localhost:11434/v1`) |
| `OPENAI_MODEL` | 可选 | 覆盖所有请求的模型名(跳过映射) |
| `OPENAI_MODEL_MAP` | 可选 | JSON 映射,如 `{"claude-sonnet-4-6":"gpt-4o"}` |
| `OPENAI_DEFAULT_OPUS_MODEL` | 可选 | 覆盖 opus 家族对应的模型(如 `o3`, `o3-mini`, `o1-pro`) |
| `OPENAI_DEFAULT_SONNET_MODEL` | 可选 | 覆盖 sonnet 家族对应的模型(如 `gpt-4o`, `gpt-4.1`) |
| `OPENAI_DEFAULT_HAIKU_MODEL` | 可选 | 覆盖 haiku 家族对应的模型(如 `gpt-4o-mini`, `gpt-4.0-mini`) |
| `OPENAI_ORG_ID` | 可选 | Organization ID |
| `OPENAI_PROJECT_ID` | 可选 | Project ID |

Expand Down Expand Up @@ -49,11 +51,12 @@ OPENAI_BASE_URL=https://your-one-api.example.com/v1 \
OPENAI_MODEL=gpt-4o \
bun run dev

# 自定义模型映射
# 自定义模型映射(使用家族变量)
CLAUDE_CODE_USE_OPENAI=1 \
OPENAI_API_KEY=sk-xxx \
OPENAI_BASE_URL=https://my-gateway.example.com/v1 \
OPENAI_MODEL_MAP='{"claude-sonnet-4-6":"gpt-4o-2024-11-20","claude-haiku-4-5":"gpt-4o-mini"}' \
OPENAI_DEFAULT_SONNET_MODEL="gpt-4o-2024-11-20" \
OPENAI_DEFAULT_HAIKU_MODEL="gpt-4o-mini" \
bun run dev
```

Expand Down Expand Up @@ -85,9 +88,10 @@ queryModel() [claude.ts]
`resolveOpenAIModel()` 的解析顺序:

1. `OPENAI_MODEL` 环境变量 → 直接使用,覆盖所有
2. `OPENAI_MODEL_MAP` JSON 查表 → 自定义映射
3. 内置默认映射(见下表)
4. 以上都不匹配 → 原名透传
2. `OPENAI_DEFAULT_{FAMILY}_MODEL` 变量(如 `OPENAI_DEFAULT_SONNET_MODEL`)→ 按模型家族覆盖
3. `ANTHROPIC_DEFAULT_{FAMILY}_MODEL` 变量(向后兼容)
4. 内置默认映射(见下表)
5. 以上都不匹配 → 原名透传

### 内置模型映射

Expand Down
2 changes: 2 additions & 0 deletions src/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ import sandboxToggle from './commands/sandbox-toggle/index.js'
import chrome from './commands/chrome/index.js'
import stickers from './commands/stickers/index.js'
import advisor from './commands/advisor.js'
import provider from './commands/provider.js'
import { logError } from './utils/log.js'
import { toError } from './utils/errors.js'
import { logForDebugging } from './utils/debug.js'
Expand Down Expand Up @@ -258,6 +259,7 @@ export const INTERNAL_ONLY_COMMANDS = [
const COMMANDS = memoize((): Command[] => [
addDir,
advisor,
provider,
agents,
branch,
btw,
Expand Down
109 changes: 109 additions & 0 deletions src/commands/provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import type { Command } from '../commands.js'
import type { LocalCommandCall } from '../types/command.js'
import { getAPIProvider } from '../utils/model/providers.js'
import { updateSettingsForSource } from '../utils/settings/settings.js'
import { getSettings_DEPRECATED } from '../utils/settings/settings.js'
import { applyConfigEnvironmentVariables } from '../utils/managedEnv.js'

function getEnvVarForProvider(provider: string): string {
switch (provider) {
case 'bedrock':
return 'CLAUDE_CODE_USE_BEDROCK'
case 'vertex':
return 'CLAUDE_CODE_USE_VERTEX'
case 'foundry':
return 'CLAUDE_CODE_USE_FOUNDRY'
default:
throw new Error(`Unknown provider: ${provider}`)
}
}

// Get merged env: process.env + settings.env (from userSettings)
function getMergedEnv(): Record<string, string> {
const settings = getSettings_DEPRECATED()
const merged = { ...process.env }
if (settings?.env) {
Object.assign(merged, settings.env)
}
return merged
}

const call: LocalCommandCall = async (args, context) => {
const arg = args.trim().toLowerCase()

// No argument: show current provider
if (!arg) {
const current = getAPIProvider()
return { type: 'text', value: `Current API provider: ${current}` }
}

// unset - clear settings, fallback to env vars
if (arg === 'unset') {
updateSettingsForSource('userSettings', { modelType: undefined })
// Also clear all provider-specific env vars to prevent conflicts
delete process.env.CLAUDE_CODE_USE_BEDROCK
delete process.env.CLAUDE_CODE_USE_VERTEX
delete process.env.CLAUDE_CODE_USE_FOUNDRY
delete process.env.CLAUDE_CODE_USE_OPENAI
return { type: 'text', value: 'API provider cleared (will use environment variables).' }
}

// Validate provider
const validProviders = ['anthropic', 'openai', 'bedrock', 'vertex', 'foundry']
if (!validProviders.includes(arg)) {
return { type: 'text', value: `Invalid provider: ${arg}\nValid: ${validProviders.join(', ')}` }
}

// Check env vars when switching to openai (including settings.env)
if (arg === 'openai') {
const mergedEnv = getMergedEnv()
const hasKey = !!mergedEnv.OPENAI_API_KEY
const hasUrl = !!mergedEnv.OPENAI_BASE_URL
if (!hasKey || !hasUrl) {
updateSettingsForSource('userSettings', { modelType: 'openai' })
const missing = []
if (!hasKey) missing.push('OPENAI_API_KEY')
if (!hasUrl) missing.push('OPENAI_BASE_URL')
return {
type: 'text',
value: `Switched to OpenAI provider.\nWarning: Missing env vars: ${missing.join(', ')}\nConfigure them via /login or set manually.`,
}
}
}
Comment thread
coderabbitai[bot] marked this conversation as resolved.

// Handle different provider types
// - 'anthropic' and 'openai' are stored in settings.json (persistent)
// - 'bedrock', 'vertex', 'foundry' are env-only (do NOT touch settings.json)
if (arg === 'anthropic' || arg === 'openai') {
// Clear any cloud provider env vars to avoid conflicts
delete process.env.CLAUDE_CODE_USE_BEDROCK
delete process.env.CLAUDE_CODE_USE_VERTEX
delete process.env.CLAUDE_CODE_USE_FOUNDRY
// Update settings.json
updateSettingsForSource('userSettings', { modelType: arg })
// Ensure settings.env gets applied to process.env
applyConfigEnvironmentVariables()
return { type: 'text', value: `API provider set to ${arg}.` }
} else {
// Cloud providers: set env vars only, do NOT touch settings.modelType
delete process.env.CLAUDE_CODE_USE_OPENAI
delete process.env.OPENAI_API_KEY
delete process.env.OPENAI_BASE_URL
process.env[getEnvVarForProvider(arg)] = '1'
// Do not modify settings.json - cloud providers controlled solely by env vars
applyConfigEnvironmentVariables()
return { type: 'text', value: `API provider set to ${arg} (via environment variable).` }
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
}
}

const provider = {
type: 'local',
name: 'provider',
description: 'Switch API provider (anthropic/openai/bedrock/vertex/foundry)',
aliases: ['api'],
argumentHint: '[anthropic|openai|bedrock|vertex|foundry|unset]',
supportsNonInteractive: true,
load: () => Promise.resolve({ call }),
} satisfies Command

export default provider
33 changes: 14 additions & 19 deletions src/components/ConsoleOAuthFlow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -303,17 +303,10 @@ export function ConsoleOAuthFlow({
!pendingOAuthStartRef.current
) {
pendingOAuthStartRef.current = true
process.nextTick(
(
startOAuth: () => Promise<void>,
pendingOAuthStartRef: React.MutableRefObject<boolean>,
) => {
void startOAuth()
pendingOAuthStartRef.current = false
},
startOAuth,
pendingOAuthStartRef,
)
// Start OAuth flow and reset the pending flag when complete
void startOAuth().finally(() => {
pendingOAuthStartRef.current = false
})
}
}, [oauthStatus.state, startOAuth])

Expand Down Expand Up @@ -538,9 +531,9 @@ function OAuthStatusMessage({
state: 'openai_chat_api',
baseUrl: process.env.OPENAI_BASE_URL ?? '',
apiKey: process.env.OPENAI_API_KEY ?? '',
haikuModel: process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL ?? '',
sonnetModel: process.env.ANTHROPIC_DEFAULT_SONNET_MODEL ?? '',
opusModel: process.env.ANTHROPIC_DEFAULT_OPUS_MODEL ?? '',
haikuModel: process.env.OPENAI_DEFAULT_HAIKU_MODEL ?? '',
sonnetModel: process.env.OPENAI_DEFAULT_SONNET_MODEL ?? '',
opusModel: process.env.OPENAI_DEFAULT_OPUS_MODEL ?? '',
Comment on lines +553 to +555

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Mirror runtime fallback when prefilling OpenAI model fields.

The runtime still falls back from OPENAI_DEFAULT_* to ANTHROPIC_DEFAULT_* for OpenAI model resolution, but this form now reads only the new keys. Users upgrading with only legacy overrides set will see blank fields even though those overrides are still active.

💡 Suggested fix
-                    haikuModel: process.env.OPENAI_DEFAULT_HAIKU_MODEL ?? '',
-                    sonnetModel: process.env.OPENAI_DEFAULT_SONNET_MODEL ?? '',
-                    opusModel: process.env.OPENAI_DEFAULT_OPUS_MODEL ?? '',
+                    haikuModel:
+                      process.env.OPENAI_DEFAULT_HAIKU_MODEL ||
+                      process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL ||
+                      '',
+                    sonnetModel:
+                      process.env.OPENAI_DEFAULT_SONNET_MODEL ||
+                      process.env.ANTHROPIC_DEFAULT_SONNET_MODEL ||
+                      '',
+                    opusModel:
+                      process.env.OPENAI_DEFAULT_OPUS_MODEL ||
+                      process.env.ANTHROPIC_DEFAULT_OPUS_MODEL ||
+                      '',
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
haikuModel: process.env.OPENAI_DEFAULT_HAIKU_MODEL ?? '',
sonnetModel: process.env.OPENAI_DEFAULT_SONNET_MODEL ?? '',
opusModel: process.env.OPENAI_DEFAULT_OPUS_MODEL ?? '',
haikuModel:
process.env.OPENAI_DEFAULT_HAIKU_MODEL ||
process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL ||
'',
sonnetModel:
process.env.OPENAI_DEFAULT_SONNET_MODEL ||
process.env.ANTHROPIC_DEFAULT_SONNET_MODEL ||
'',
opusModel:
process.env.OPENAI_DEFAULT_OPUS_MODEL ||
process.env.ANTHROPIC_DEFAULT_OPUS_MODEL ||
'',
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ConsoleOAuthFlow.tsx` around lines 534 - 536, Prefill logic
for haikuModel/sonnetModel/opusModel only reads OPENAI_DEFAULT_* and thus
ignores legacy ANTHROPIC_DEFAULT_* fallbacks; update the prefilling to try
OPENAI_DEFAULT_HAIKU_MODEL (etc.) then fallback to ANTHROPIC_DEFAULT_HAIKU_MODEL
(etc.) before finally using '' so existing installs with only legacy overrides
still show values—apply this change to the haikuModel, sonnetModel and opusModel
assignments in ConsoleOAuthFlow.tsx.

activeField: 'base_url',
})
} else if (value === 'platform') {
Expand Down Expand Up @@ -640,7 +633,7 @@ function OAuthStatusMessage({
if (error) {
setOAuthStatus({
state: 'error',
message: `Failed to save: ${error.message}`,
message: 'Failed to save settings. Please try again.',
toRetry: {
state: 'custom_platform',
baseUrl: '',
Expand All @@ -654,6 +647,7 @@ function OAuthStatusMessage({
} else {
for (const [k, v] of Object.entries(env)) process.env[k] = v
setOAuthStatus({ state: 'success' })
// Schedule onDone after state update to avoid potential state update on unmounted component
void onDone()
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
}
}, [activeField, inputValue, displayValues, setOAuthStatus, onDone])
Expand Down Expand Up @@ -826,17 +820,17 @@ function OAuthStatusMessage({
const env: Record<string, string> = {}
if (finalVals.base_url) env.OPENAI_BASE_URL = finalVals.base_url
if (finalVals.api_key) env.OPENAI_API_KEY = finalVals.api_key
if (finalVals.haiku_model) env.ANTHROPIC_DEFAULT_HAIKU_MODEL = finalVals.haiku_model
if (finalVals.sonnet_model) env.ANTHROPIC_DEFAULT_SONNET_MODEL = finalVals.sonnet_model
if (finalVals.opus_model) env.ANTHROPIC_DEFAULT_OPUS_MODEL = finalVals.opus_model
if (finalVals.haiku_model) env.OPENAI_DEFAULT_HAIKU_MODEL = finalVals.haiku_model
if (finalVals.sonnet_model) env.OPENAI_DEFAULT_SONNET_MODEL = finalVals.sonnet_model
if (finalVals.opus_model) env.OPENAI_DEFAULT_OPUS_MODEL = finalVals.opus_model
const { error } = updateSettingsForSource('userSettings', {
modelType: 'openai' as any,
env,
} as any)
if (error) {
setOAuthStatus({
state: 'error',
message: `Failed to save: ${error.message}`,
message: 'Failed to save settings. Please try again.',
toRetry: {
state: 'openai_chat_api',
baseUrl: '',
Expand All @@ -850,6 +844,7 @@ function OAuthStatusMessage({
} else {
for (const [k, v] of Object.entries(env)) process.env[k] = v
setOAuthStatus({ state: 'success' })
// Schedule onDone after state update to avoid potential state update on unmounted component
void onDone()
}
}, [activeField, openaiInputValue, openaiDisplayValues, setOAuthStatus, onDone])
Expand Down
6 changes: 6 additions & 0 deletions src/services/api/openai/__tests__/modelMapping.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,19 @@ import { resolveOpenAIModel } from '../modelMapping.js'
describe('resolveOpenAIModel', () => {
const originalEnv = {
OPENAI_MODEL: process.env.OPENAI_MODEL,
OPENAI_DEFAULT_HAIKU_MODEL: process.env.OPENAI_DEFAULT_HAIKU_MODEL,
OPENAI_DEFAULT_SONNET_MODEL: process.env.OPENAI_DEFAULT_SONNET_MODEL,
OPENAI_DEFAULT_OPUS_MODEL: process.env.OPENAI_DEFAULT_OPUS_MODEL,
ANTHROPIC_DEFAULT_HAIKU_MODEL: process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL,
ANTHROPIC_DEFAULT_SONNET_MODEL: process.env.ANTHROPIC_DEFAULT_SONNET_MODEL,
ANTHROPIC_DEFAULT_OPUS_MODEL: process.env.ANTHROPIC_DEFAULT_OPUS_MODEL,
}

beforeEach(() => {
delete process.env.OPENAI_MODEL
delete process.env.OPENAI_DEFAULT_HAIKU_MODEL
delete process.env.OPENAI_DEFAULT_SONNET_MODEL
delete process.env.OPENAI_DEFAULT_OPUS_MODEL
delete process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL
delete process.env.ANTHROPIC_DEFAULT_SONNET_MODEL
delete process.env.ANTHROPIC_DEFAULT_OPUS_MODEL
Expand Down
21 changes: 14 additions & 7 deletions src/services/api/openai/modelMapping.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,10 @@ function getModelFamily(model: string): 'haiku' | 'sonnet' | 'opus' | null {
*
* Priority:
* 1. OPENAI_MODEL env var (override all)
* 2. ANTHROPIC_DEFAULT_{FAMILY}_MODEL env var (e.g. ANTHROPIC_DEFAULT_SONNET_MODEL)
* 3. DEFAULT_MODEL_MAP lookup
* 4. Pass through original model name
* 2. OPENAI_DEFAULT_{FAMILY}_MODEL env var (e.g. OPENAI_DEFAULT_SONNET_MODEL)
* 3. ANTHROPIC_DEFAULT_{FAMILY}_MODEL env var (backward compatibility)
* 4. DEFAULT_MODEL_MAP lookup
* 5. Pass through original model name
*/
export function resolveOpenAIModel(anthropicModel: string): string {
// Highest priority: explicit override
Expand All @@ -44,12 +45,18 @@ export function resolveOpenAIModel(anthropicModel: string): string {
// Strip [1m] suffix if present (Claude-specific modifier)
const cleanModel = anthropicModel.replace(/\[1m\]$/, '')

// Check ANTHROPIC_DEFAULT_*_MODEL env vars based on model family
// Check family-specific overrides
const family = getModelFamily(cleanModel)
if (family) {
const envVar = `ANTHROPIC_DEFAULT_${family.toUpperCase()}_MODEL`
const override = process.env[envVar]
if (override) return override
// OpenAI-specific family override (preferred for openai provider)
const openaiEnvVar = `OPENAI_DEFAULT_${family.toUpperCase()}_MODEL`
const openaiOverride = process.env[openaiEnvVar]
if (openaiOverride) return openaiOverride

// Anthropic env var (backward compatibility)
const anthropicEnvVar = `ANTHROPIC_DEFAULT_${family.toUpperCase()}_MODEL`
const anthropicOverride = process.env[anthropicEnvVar]
if (anthropicOverride) return anthropicOverride
}

return DEFAULT_MODEL_MAP[cleanModel] ?? cleanModel
Expand Down
34 changes: 34 additions & 0 deletions src/utils/managedEnvConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
* @[MODEL LAUNCH]: New models usually don't need changes here —
* VERTEX_REGION_CLAUDE_* is prefix-matched. New providers or new routing
* config vars (endpoint, project, region, auth) do.
*
* Note: OpenAI provider uses OPENAI_* env vars (OPENAI_API_KEY, OPENAI_BASE_URL,
* OPENAI_MODEL, OPENAI_DEFAULT_*_MODEL, OPENAI_SMALL_FAST_MODEL) which are all
* provider-managed to keep routing config isolated from Anthropic settings.
*/
const PROVIDER_MANAGED_ENV_VARS = new Set([
// The flag itself — settings can't unset it once the host set it
Expand Down Expand Up @@ -50,6 +54,23 @@ const PROVIDER_MANAGED_ENV_VARS = new Set([
'ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION',
'ANTHROPIC_DEFAULT_SONNET_MODEL_NAME',
'ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',
// OpenAI provider specific
'OPENAI_API_KEY',
'OPENAI_BASE_URL',
'OPENAI_MODEL',
'OPENAI_DEFAULT_HAIKU_MODEL',
'OPENAI_DEFAULT_HAIKU_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_HAIKU_MODEL_NAME',
'OPENAI_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES',
'OPENAI_DEFAULT_OPUS_MODEL',
'OPENAI_DEFAULT_OPUS_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_OPUS_MODEL_NAME',
'OPENAI_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES',
'OPENAI_DEFAULT_SONNET_MODEL',
'OPENAI_DEFAULT_SONNET_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_SONNET_MODEL_NAME',
'OPENAI_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',
'OPENAI_SMALL_FAST_MODEL',
'ANTHROPIC_SMALL_FAST_MODEL',
'ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION',
'CLAUDE_CODE_SUBAGENT_MODEL',
Expand Down Expand Up @@ -122,6 +143,19 @@ export const SAFE_ENV_VARS = new Set([
'ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION',
'ANTHROPIC_DEFAULT_SONNET_MODEL_NAME',
'ANTHROPIC_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',
// OpenAI provider specific
'OPENAI_DEFAULT_HAIKU_MODEL',
'OPENAI_DEFAULT_HAIKU_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_HAIKU_MODEL_NAME',
'OPENAI_DEFAULT_HAIKU_MODEL_SUPPORTED_CAPABILITIES',
'OPENAI_DEFAULT_OPUS_MODEL',
'OPENAI_DEFAULT_OPUS_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_OPUS_MODEL_NAME',
'OPENAI_DEFAULT_OPUS_MODEL_SUPPORTED_CAPABILITIES',
'OPENAI_DEFAULT_SONNET_MODEL',
'OPENAI_DEFAULT_SONNET_MODEL_DESCRIPTION',
'OPENAI_DEFAULT_SONNET_MODEL_NAME',
'OPENAI_DEFAULT_SONNET_MODEL_SUPPORTED_CAPABILITIES',
'ANTHROPIC_FOUNDRY_API_KEY',
'ANTHROPIC_MODEL',
'ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION',
Expand Down
Loading
Loading