From 7a1dce307d47ec7726e6bbf196f4d2f765ae88a8 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 28 Mar 2026 00:55:37 +0000 Subject: [PATCH] refactor: split models-config provider policy helpers --- src/agents/models-config.providers.policy.ts | 53 ++++++++++++++++++++ src/agents/models-config.providers.ts | 53 +++----------------- 2 files changed, 59 insertions(+), 47 deletions(-) create mode 100644 src/agents/models-config.providers.policy.ts diff --git a/src/agents/models-config.providers.policy.ts b/src/agents/models-config.providers.policy.ts new file mode 100644 index 00000000000..79013ef724c --- /dev/null +++ b/src/agents/models-config.providers.policy.ts @@ -0,0 +1,53 @@ +import { resolveBedrockConfigApiKey } from "../plugin-sdk/amazon-bedrock.js"; +import { resolveAnthropicVertexConfigApiKey } from "../plugin-sdk/anthropic-vertex.js"; +import { + normalizeGoogleProviderConfig, + shouldNormalizeGoogleProviderConfig, +} from "../plugin-sdk/google.js"; +import { applyModelStudioNativeStreamingUsageCompat } from "../plugin-sdk/modelstudio.js"; +import { applyMoonshotNativeStreamingUsageCompat } from "../plugin-sdk/moonshot.js"; +import type { ProviderConfig } from "./models-config.providers.secrets.js"; + +const NATIVE_STREAMING_USAGE_COMPAT: Record ProviderConfig> = + { + moonshot: applyMoonshotNativeStreamingUsageCompat, + modelstudio: applyModelStudioNativeStreamingUsageCompat, + }; + +const PROVIDER_CONFIG_API_KEY_RESOLVERS: Partial< + Record string | undefined> +> = { + "amazon-bedrock": resolveBedrockConfigApiKey, + "anthropic-vertex": resolveAnthropicVertexConfigApiKey, +}; + +export function applyNativeStreamingUsageCompat( + providers: Record, +): Record { + let changed = false; + const nextProviders: Record = {}; + + for (const [providerKey, provider] of Object.entries(providers)) { + const nextProvider = NATIVE_STREAMING_USAGE_COMPAT[providerKey]?.(provider) ?? provider; + nextProviders[providerKey] = nextProvider; + changed ||= nextProvider !== provider; + } + + return changed ? nextProviders : providers; +} + +export function normalizeProviderSpecificConfig( + providerKey: string, + provider: ProviderConfig, +): ProviderConfig { + if (shouldNormalizeGoogleProviderConfig(providerKey, provider)) { + return normalizeGoogleProviderConfig(providerKey, provider); + } + return provider; +} + +export function resolveProviderConfigApiKeyResolver( + providerKey: string, +): ((env: NodeJS.ProcessEnv) => string | undefined) | undefined { + return PROVIDER_CONFIG_API_KEY_RESOLVERS[providerKey]; +} diff --git a/src/agents/models-config.providers.ts b/src/agents/models-config.providers.ts index 8864654b1d8..00a9c9ab1dc 100644 --- a/src/agents/models-config.providers.ts +++ b/src/agents/models-config.providers.ts @@ -1,15 +1,11 @@ import type { OpenClawConfig } from "../config/config.js"; -import { resolveBedrockConfigApiKey } from "../plugin-sdk/amazon-bedrock.js"; -import { resolveAnthropicVertexConfigApiKey } from "../plugin-sdk/anthropic-vertex.js"; -import { - normalizeGoogleProviderConfig, - shouldNormalizeGoogleProviderConfig, -} from "../plugin-sdk/google.js"; -import { applyModelStudioNativeStreamingUsageCompat } from "../plugin-sdk/modelstudio.js"; -import { applyMoonshotNativeStreamingUsageCompat } from "../plugin-sdk/moonshot.js"; import { ensureAuthProfileStore } from "./auth-profiles.js"; export * from "./models-config.providers.static.js"; export { resolveImplicitProviders } from "./models-config.providers.implicit.js"; +import { + normalizeProviderSpecificConfig, + resolveProviderConfigApiKeyResolver, +} from "./models-config.providers.policy.js"; import type { ProviderConfig, SecretDefaults } from "./models-config.providers.secrets.js"; import { normalizeConfiguredProviderApiKey, @@ -27,50 +23,13 @@ export type { SecretDefaults, } from "./models-config.providers.secrets.js"; export { enforceSourceManagedProviderSecrets }; +export { applyNativeStreamingUsageCompat } from "./models-config.providers.policy.js"; export { resolveOllamaApiBase } from "../plugin-sdk/ollama-surface.js"; export { normalizeGoogleModelId } from "../plugin-sdk/google.js"; export { normalizeXaiModelId } from "../plugin-sdk/xai.js"; type ModelsConfig = NonNullable; -const NATIVE_STREAMING_USAGE_COMPAT: Record ProviderConfig> = - { - moonshot: applyMoonshotNativeStreamingUsageCompat, - modelstudio: applyModelStudioNativeStreamingUsageCompat, - }; - -const PROVIDER_CONFIG_API_KEY_RESOLVERS: Partial< - Record string | undefined> -> = { - "amazon-bedrock": resolveBedrockConfigApiKey, - "anthropic-vertex": resolveAnthropicVertexConfigApiKey, -}; - -export function applyNativeStreamingUsageCompat( - providers: Record, -): Record { - let changed = false; - const nextProviders: Record = {}; - - for (const [providerKey, provider] of Object.entries(providers)) { - const nextProvider = NATIVE_STREAMING_USAGE_COMPAT[providerKey]?.(provider) ?? provider; - nextProviders[providerKey] = nextProvider; - changed ||= nextProvider !== provider; - } - - return changed ? nextProviders : providers; -} - -function normalizeProviderSpecificConfig( - providerKey: string, - provider: ProviderConfig, -): ProviderConfig { - if (shouldNormalizeGoogleProviderConfig(providerKey, provider)) { - return normalizeGoogleProviderConfig(providerKey, provider); - } - return provider; -} - export function normalizeProviders(params: { providers: ModelsConfig["providers"]; agentDir: string; @@ -147,7 +106,7 @@ export function normalizeProviders(params: { env, profileApiKey, secretRefManagedProviders: params.secretRefManagedProviders, - providerApiKeyResolver: PROVIDER_CONFIG_API_KEY_RESOLVERS[normalizedKey], + providerApiKeyResolver: resolveProviderConfigApiKeyResolver(normalizedKey), }); if (providerWithApiKey !== normalizedProvider) { mutated = true;