



























@@ -0,0 +1,110 @@
1+import {
2+resolveAgentModelFallbackValues,
3+resolveAgentModelPrimaryValue,
4+} from "../../config/model-input.js";
5+import type { AgentModelConfig } from "../../config/types.agents-shared.js";
6+import type { OpenClawConfig } from "../../config/types.openclaw.js";
7+import { normalizeProviderId } from "../provider-id.js";
8+9+export type ExternalCliAuthScope = {
10+providerIds: string[];
11+profileIds: string[];
12+};
13+14+function addProviderScopeId(out: Set<string>, value: string | undefined): void {
15+const raw = value?.trim();
16+if (!raw) {
17+return;
18+}
19+out.add(raw);
20+const normalized = normalizeProviderId(raw);
21+if (normalized) {
22+out.add(normalized);
23+}
24+}
25+26+function addProviderScopeFromModelRef(out: Set<string>, value: string | undefined): void {
27+const raw = value?.trim();
28+if (!raw) {
29+return;
30+}
31+const slash = raw.indexOf("/");
32+if (slash <= 0) {
33+return;
34+}
35+addProviderScopeId(out, raw.slice(0, slash));
36+}
37+38+function addProviderScopeFromModelConfig(out: Set<string>, model: AgentModelConfig | undefined) {
39+addProviderScopeFromModelRef(out, resolveAgentModelPrimaryValue(model));
40+for (const fallback of resolveAgentModelFallbackValues(model)) {
41+addProviderScopeFromModelRef(out, fallback);
42+}
43+}
44+45+function addExternalCliRuntimeScope(out: Set<string>, value: string | undefined): void {
46+const normalized = normalizeProviderId(value?.trim() ?? "");
47+if (
48+normalized === "claude-cli" ||
49+normalized === "codex" ||
50+normalized === "codex-cli" ||
51+normalized === "openai-codex" ||
52+normalized === "minimax" ||
53+normalized === "minimax-cli" ||
54+normalized === "minimax-portal"
55+) {
56+addProviderScopeId(out, normalized);
57+}
58+}
59+60+export function resolveExternalCliAuthScopeFromConfig(
61+cfg: OpenClawConfig,
62+): ExternalCliAuthScope | undefined {
63+const providerIds = new Set<string>();
64+const profileIds = new Set<string>();
65+66+for (const id of Object.keys(cfg.models?.providers ?? {})) {
67+addProviderScopeId(providerIds, id);
68+}
69+for (const [profileId, profile] of Object.entries(cfg.auth?.profiles ?? {})) {
70+const normalizedProfileId = profileId.trim();
71+if (normalizedProfileId) {
72+profileIds.add(normalizedProfileId);
73+}
74+addProviderScopeId(providerIds, profile?.provider);
75+}
76+for (const provider of Object.keys(cfg.auth?.order ?? {})) {
77+addProviderScopeId(providerIds, provider);
78+}
79+80+const defaults = cfg.agents?.defaults;
81+addProviderScopeFromModelConfig(providerIds, defaults?.model);
82+addProviderScopeFromModelConfig(providerIds, defaults?.imageModel);
83+addProviderScopeFromModelConfig(providerIds, defaults?.imageGenerationModel);
84+addProviderScopeFromModelConfig(providerIds, defaults?.videoGenerationModel);
85+addProviderScopeFromModelConfig(providerIds, defaults?.musicGenerationModel);
86+addProviderScopeFromModelConfig(providerIds, defaults?.pdfModel);
87+for (const modelRef of Object.keys(defaults?.models ?? {})) {
88+addProviderScopeFromModelRef(providerIds, modelRef);
89+}
90+addExternalCliRuntimeScope(providerIds, defaults?.agentRuntime?.id);
91+addExternalCliRuntimeScope(providerIds, defaults?.embeddedHarness?.runtime);
92+for (const backendId of Object.keys(defaults?.cliBackends ?? {})) {
93+addExternalCliRuntimeScope(providerIds, backendId);
94+}
95+96+for (const agent of cfg.agents?.list ?? []) {
97+addProviderScopeFromModelConfig(providerIds, agent.model);
98+addProviderScopeFromModelConfig(providerIds, agent.subagents?.model);
99+addExternalCliRuntimeScope(providerIds, agent.agentRuntime?.id);
100+addExternalCliRuntimeScope(providerIds, agent.embeddedHarness?.runtime);
101+}
102+103+if (providerIds.size === 0 && profileIds.size === 0) {
104+return undefined;
105+}
106+return {
107+providerIds: [...providerIds].toSorted((left, right) => left.localeCompare(right)),
108+profileIds: [...profileIds].toSorted((left, right) => left.localeCompare(right)),
109+};
110+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。