Skip to content

Commit 3c2f781

Browse files
author
iammm0
committed
fix(llm): 回退读取厂商环境变量中的 API Key 与 Base URL,并去除重复的 Bearer 前缀
1 parent 4163209 commit 3c2f781

2 files changed

Lines changed: 56 additions & 4 deletions

File tree

server/src/common/llm/llm.factory.ts

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,37 @@
11
import { LLMProvider } from './llm.interface';
22
import { OllamaProvider } from './ollama.provider';
33
import { OpenAICompatProvider } from './openai-compat.provider';
4-
import { getDefaultOpenAICompatBaseUrl } from '../../modules/system/llm-provider-registry';
4+
import {
5+
getDefaultOpenAICompatBaseUrl,
6+
getEnvBackedApiKey,
7+
getEnvBackedBaseUrl,
8+
} from '../../modules/system/llm-provider-registry';
9+
10+
/** 去掉用户误填的「Bearer 」前缀,避免 Authorization 变成 Bearer Bearer … */
11+
function normalizeBearerApiKey(raw: string): string {
12+
const t = raw.trim();
13+
if (!t) return '';
14+
return t.replace(/^Bearer\s+/i, '').trim();
15+
}
16+
17+
function resolveOpenAICompatApiKey(provider: string, explicit?: string): string {
18+
const candidates = [
19+
normalizeBearerApiKey(explicit ?? ''),
20+
normalizeBearerApiKey(process.env.LLM_API_KEY ?? ''),
21+
normalizeBearerApiKey(getEnvBackedApiKey(provider)),
22+
];
23+
return candidates.find((k) => k.length > 0) ?? '';
24+
}
25+
26+
function resolveOpenAICompatBaseUrl(provider: string, explicit?: string): string | undefined {
27+
const candidates = [
28+
(explicit ?? '').trim(),
29+
(process.env.LLM_BASE_URL ?? '').trim(),
30+
getEnvBackedBaseUrl(provider),
31+
];
32+
const first = candidates.find((u) => u.length > 0);
33+
return first;
34+
}
535

636
export interface LLMConfig {
737
provider: string;
@@ -21,11 +51,17 @@ export function createLLM(config: LLMConfig): LLMProvider {
2151
}
2252

2353
const baseUrl =
24-
config.baseUrl ??
54+
resolveOpenAICompatBaseUrl(provider, config.baseUrl) ??
2555
getDefaultOpenAICompatBaseUrl(provider) ??
2656
(provider === 'deepseek' ? 'https://api.deepseek.com' : 'https://api.openai.com');
27-
const model = config.model ?? (provider === 'deepseek' ? 'deepseek-chat' : 'gpt-4o-mini');
28-
const apiKey = config.apiKey ?? '';
57+
const modelFromEnv =
58+
(process.env.LLM_MODEL ?? '').trim() ||
59+
(provider === 'deepseek' ? (process.env.DEEPSEEK_MODEL ?? '').trim() : '');
60+
const model =
61+
(config.model ?? '').trim() ||
62+
modelFromEnv ||
63+
(provider === 'deepseek' ? 'deepseek-chat' : 'gpt-4o-mini');
64+
const apiKey = resolveOpenAICompatApiKey(provider, config.apiKey);
2965

3066
return new OpenAICompatProvider(baseUrl, apiKey, model);
3167
}

server/src/modules/system/llm-provider-registry.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,3 +280,19 @@ const REGISTRY_BY_ID = new Map(LLM_PROVIDER_REGISTRY.map((e) => [e.id, e]));
280280
export function getDefaultOpenAICompatBaseUrl(providerId: string): string | undefined {
281281
return REGISTRY_BY_ID.get(providerId.toLowerCase())?.defaultOpenAICompatBaseUrl;
282282
}
283+
284+
/** 当未设置 LLM_API_KEY 时,回退读取各厂商文档中的标准环境变量 */
285+
export function getEnvBackedApiKey(providerId: string): string {
286+
const entry = REGISTRY_BY_ID.get(providerId.toLowerCase());
287+
const envName = entry?.apiKeyEnv;
288+
if (!envName) return '';
289+
return (process.env[envName] ?? '').trim();
290+
}
291+
292+
/** 当未设置 LLM_BASE_URL 时,回退读取各厂商的 Base URL 环境变量 */
293+
export function getEnvBackedBaseUrl(providerId: string): string {
294+
const entry = REGISTRY_BY_ID.get(providerId.toLowerCase());
295+
const envName = entry?.baseUrlEnv;
296+
if (!envName) return '';
297+
return (process.env[envName] ?? '').trim();
298+
}

0 commit comments

Comments
 (0)