
























@@ -1,4 +1,10 @@
1-import { completeSimple, type Api, type AssistantMessage, type Model } from "@mariozechner/pi-ai";
1+import {
2+completeSimple,
3+getModel,
4+type Api,
5+type AssistantMessage,
6+type Model,
7+} from "@mariozechner/pi-ai";
28import { getRuntimeConfig } from "../config/config.js";
39import { isTruthyEnvValue } from "../infra/env.js";
410import { resolveDefaultAgentDir } from "./agent-scope.js";
@@ -161,14 +167,38 @@ export async function resolveLiveDirectModel(params: {
161167envVar: string;
162168preferredModelIds: readonly string[];
163169}): Promise<LiveResolvedModel> {
170+const liveKeys = collectProviderApiKeys(params.provider);
171+const rawModel = process.env[params.envVar]?.trim();
172+const parsed = rawModel ? parseModelRef(rawModel, params.provider) : null;
173+const requestedModelId =
174+parsed && normalizeProviderId(parsed.provider) === params.provider ? parsed.model : rawModel;
175+if (liveKeys.length > 0) {
176+const selectedModel = requestedModelId
177+ ? getModel(params.provider, requestedModelId as never)
178+ : params.preferredModelIds
179+.map((id) => getModel(params.provider, id as never))
180+.find((model) => model?.api === params.api);
181+if (!selectedModel || selectedModel.api !== params.api) {
182+throw new Error(
183+requestedModelId
184+ ? `Model not found for ${params.provider}: ${requestedModelId}`
185+ : `No built-in ${params.provider} ${params.api} model available.`,
186+);
187+}
188+logLiveCache(`resolved ${params.provider} model ${selectedModel.id} from live env key`);
189+return {
190+model: selectedModel,
191+apiKey: liveKeys[0] ?? "",
192+};
193+}
194+195+logLiveCache(`resolving ${params.provider} model from configured auth storage`);
164196const cfg = getRuntimeConfig();
165197await ensureOpenClawModelsJson(cfg);
166198const agentDir = resolveDefaultAgentDir(cfg);
167199const authStorage = discoverAuthStorage(agentDir);
168200const models = discoverModels(authStorage, agentDir).getAll();
169201170-const rawModel = process.env[params.envVar]?.trim();
171-const parsed = rawModel ? parseModelRef(rawModel, params.provider) : null;
172202const candidates = models.filter(
173203(model) => normalizeProviderId(model.provider) === params.provider && model.api === params.api,
174204);
@@ -193,17 +223,17 @@ export async function resolveLiveDirectModel(params: {
193223);
194224}
195225196-const liveKeys = collectProviderApiKeys(params.provider);
197-const apiKey =
198-liveKeys[0] ??
199-requireApiKey(
200-await getApiKeyForModel({
201- model: resolvedModel,
202- cfg,
203- agentDir,
204- }),
205- resolvedModel.provider,
206- );
226+const apiKey = requireApiKey(
227+ await getApiKeyForModel({
228+ model: resolvedModel,
229+ cfg,
230+agentDir,
231+}),
232+resolvedModel.provider,
233+);
234+logLiveCache(
235+`resolved ${params.provider} model ${resolvedModel.id} from configured auth storage`,
236+);
207237return {
208238model: resolvedModel,
209239 apiKey,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。