|
1 | 1 | import { ensureAuthProfileStore, listProfilesForProvider } from "../agents/auth-profiles.js"; |
| 2 | +import type { AuthProfileCredential } from "../agents/auth-profiles/types.js"; |
2 | 3 | import { resolveAgentHarnessPolicy } from "../agents/harness/policy.js"; |
3 | 4 | import { hasUsableCustomProviderApiKey, resolveEnvApiKey } from "../agents/model-auth.js"; |
4 | 5 | import { loadModelCatalog } from "../agents/model-catalog.js"; |
5 | 6 | import { resolveDefaultModelForAgent } from "../agents/model-selection.js"; |
6 | | -import { listOpenAIAuthProfileProvidersForAgentRuntime } from "../agents/openai-routing.js"; |
| 7 | +import { |
| 8 | + listOpenAIAuthProfileProvidersForAgentRuntime, |
| 9 | + openAIProviderUsesCodexRuntimeByDefault, |
| 10 | +} from "../agents/openai-routing.js"; |
7 | 11 | import type { OpenClawConfig } from "../config/types.openclaw.js"; |
8 | 12 | import type { WizardPrompter } from "../wizard/prompts.js"; |
9 | 13 | import { buildProviderAuthRecoveryHint } from "./provider-auth-guidance.js"; |
@@ -32,6 +36,37 @@ function resolveAuthProviderCandidates(params: { |
32 | 36 | ]; |
33 | 37 | } |
34 | 38 |
|
| 39 | +function resolveAcceptedAuthProfileTypes(params: { |
| 40 | + config: OpenClawConfig; |
| 41 | + provider: string; |
| 42 | +}): readonly AuthProfileCredential["type"][] | undefined { |
| 43 | + if ( |
| 44 | + openAIProviderUsesCodexRuntimeByDefault({ |
| 45 | + provider: params.provider, |
| 46 | + config: params.config, |
| 47 | + }) |
| 48 | + ) { |
| 49 | + return undefined; |
| 50 | + } |
| 51 | + return params.provider === "openai" ? ["api_key"] : undefined; |
| 52 | +} |
| 53 | + |
| 54 | +function hasProfileForProvider(params: { |
| 55 | + store: ReturnType<typeof ensureAuthProfileStore>; |
| 56 | + provider: string; |
| 57 | + acceptedTypes?: readonly AuthProfileCredential["type"][]; |
| 58 | +}): boolean { |
| 59 | + const profileIds = listProfilesForProvider(params.store, params.provider); |
| 60 | + if (!params.acceptedTypes) { |
| 61 | + return profileIds.length > 0; |
| 62 | + } |
| 63 | + const acceptedTypes = new Set(params.acceptedTypes); |
| 64 | + return profileIds.some((profileId) => { |
| 65 | + const profile = params.store.profiles[profileId]; |
| 66 | + return profile ? acceptedTypes.has(profile.type) : false; |
| 67 | + }); |
| 68 | +} |
| 69 | + |
35 | 70 | export async function warnIfModelConfigLooksOff( |
36 | 71 | config: OpenClawConfig, |
37 | 72 | prompter: WizardPrompter, |
@@ -66,8 +101,12 @@ export async function warnIfModelConfigLooksOff( |
66 | 101 | modelId: ref.model, |
67 | 102 | agentId: options?.agentId, |
68 | 103 | }); |
| 104 | + const acceptedTypes = resolveAcceptedAuthProfileTypes({ |
| 105 | + config, |
| 106 | + provider: ref.provider, |
| 107 | + }); |
69 | 108 | const hasAuth = |
70 | | - authProviders.some((provider) => listProfilesForProvider(store, provider).length > 0) || |
| 109 | + authProviders.some((provider) => hasProfileForProvider({ store, provider, acceptedTypes })) || |
71 | 110 | authProviders.some((provider) => resolveEnvApiKey(provider)) || |
72 | 111 | authProviders.some((provider) => hasUsableCustomProviderApiKey(config, provider)); |
73 | 112 | if (!hasAuth) { |
|
0 commit comments