@@ -42,33 +42,33 @@ export function setApiKey(apiKey: string): void {
42
42
}
43
43
44
44
export function getBaseUrl ( provider : string = "openai" ) : string | undefined {
45
- // If the provider is `openai` and `OPENAI_BASE_URL` is set, use it
46
- if ( provider === "openai" && OPENAI_BASE_URL !== "" ) {
47
- return OPENAI_BASE_URL ;
48
- }
49
-
50
- // Check for a PROVIDER-specific override: e.g. OLLAMA_BASE_URL
45
+ // Check for a PROVIDER-specific override: e.g. OPENAI_BASE_URL or OLLAMA_BASE_URL.
51
46
const envKey = `${ provider . toUpperCase ( ) } _BASE_URL` ;
52
47
if ( process . env [ envKey ] ) {
53
48
return process . env [ envKey ] ;
54
49
}
55
50
56
- // Use the default URL from providers if available
57
- const providerInfo = providers [ provider . toLowerCase ( ) ] ;
51
+ // Get providers config from config file.
52
+ const config = loadConfig ( ) ;
53
+ const providersConfig = config . providers ?? providers ;
54
+ const providerInfo = providersConfig [ provider . toLowerCase ( ) ] ;
58
55
if ( providerInfo ) {
59
56
return providerInfo . baseURL ;
60
57
}
61
58
62
- // If the provider not found in the providers list and `OPENAI_BASE_URL` is set, use it
59
+ // If the provider not found in the providers list and `OPENAI_BASE_URL` is set, use it.
63
60
if ( OPENAI_BASE_URL !== "" ) {
64
61
return OPENAI_BASE_URL ;
65
62
}
66
63
64
+ // We tried.
67
65
return undefined ;
68
66
}
69
67
70
68
export function getApiKey ( provider : string = "openai" ) : string | undefined {
71
- const providerInfo = providers [ provider . toLowerCase ( ) ] ;
69
+ const config = loadConfig ( ) ;
70
+ const providersConfig = config . providers ?? providers ;
71
+ const providerInfo = providersConfig [ provider . toLowerCase ( ) ] ;
72
72
if ( providerInfo ) {
73
73
if ( providerInfo . name === "Ollama" ) {
74
74
return process . env [ providerInfo . envKey ] ?? "dummy" ;
@@ -81,12 +81,10 @@ export function getApiKey(provider: string = "openai"): string | undefined {
81
81
return OPENAI_API_KEY ;
82
82
}
83
83
84
+ // We tried.
84
85
return undefined ;
85
86
}
86
87
87
- // Formatting (quiet mode-only).
88
- export const PRETTY_PRINT = Boolean ( process . env [ "PRETTY_PRINT" ] || "" ) ;
89
-
90
88
// Represents config as persisted in config.json.
91
89
export type StoredConfig = {
92
90
model ?: string ;
@@ -98,6 +96,7 @@ export type StoredConfig = {
98
96
notify ?: boolean ;
99
97
/** Disable server-side response storage (send full transcript each request) */
100
98
disableResponseStorage ?: boolean ;
99
+ providers ?: Record < string , { name : string ; baseURL : string ; envKey : string } > ;
101
100
history ?: {
102
101
maxSize ?: number ;
103
102
saveHistory ?: boolean ;
@@ -134,13 +133,17 @@ export type AppConfig = {
134
133
135
134
/** Enable the "flex-mode" processing mode for supported models (o3, o4-mini) */
136
135
flexMode ?: boolean ;
136
+ providers ?: Record < string , { name : string ; baseURL : string ; envKey : string } > ;
137
137
history ?: {
138
138
maxSize : number ;
139
139
saveHistory : boolean ;
140
140
sensitivePatterns : Array < string > ;
141
141
} ;
142
142
} ;
143
143
144
+ // Formatting (quiet mode-only).
145
+ export const PRETTY_PRINT = Boolean ( process . env [ "PRETTY_PRINT" ] || "" ) ;
146
+
144
147
// ---------------------------------------------------------------------------
145
148
// Project doc support (codex.md)
146
149
// ---------------------------------------------------------------------------
@@ -399,6 +402,9 @@ export const loadConfig = (
399
402
} ;
400
403
}
401
404
405
+ // Merge default providers with user configured providers in the config.
406
+ config . providers = { ...providers , ...storedConfig . providers } ;
407
+
402
408
return config ;
403
409
} ;
404
410
@@ -431,6 +437,7 @@ export const saveConfig = (
431
437
const configToSave : StoredConfig = {
432
438
model : config . model ,
433
439
provider : config . provider ,
440
+ providers : config . providers ,
434
441
approvalMode : config . approvalMode ,
435
442
} ;
436
443
0 commit comments