diff --git a/extensions/cloudflare-ai-gateway/index.ts b/extensions/cloudflare-ai-gateway/index.ts index ddc0bd7405a..782cb43786d 100644 --- a/extensions/cloudflare-ai-gateway/index.ts +++ b/extensions/cloudflare-ai-gateway/index.ts @@ -12,14 +12,15 @@ import { } from "../../src/commands/auth-choice.api-key.js"; import { ensureApiKeyFromOptionEnvOrPrompt } from "../../src/commands/auth-choice.apply-helpers.js"; import { buildApiKeyCredential } from "../../src/commands/onboard-auth.credentials.js"; -import { - applyCloudflareAiGatewayConfig, - applyAuthProfileConfig, - CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, -} from "../../src/commands/onboard-auth.js"; +import { applyAuthProfileConfig } from "../../src/commands/onboard-auth.js"; import type { SecretInput } from "../../src/config/types.secrets.js"; import { coerceSecretRef } from "../../src/config/types.secrets.js"; import { normalizeOptionalSecretInput } from "../../src/utils/normalize-secret-input.js"; +import { + applyCloudflareAiGatewayConfig, + buildCloudflareAiGatewayConfigPatch, + CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, +} from "./onboard.js"; const PROVIDER_ID = "cloudflare-ai-gateway"; const PROVIDER_ENV_VAR = "CLOUDFLARE_AI_GATEWAY_API_KEY"; @@ -53,30 +54,6 @@ function resolveMetadataFromCredential( }; } -function buildCloudflareConfigPatch(params: { accountId: string; gatewayId: string }) { - const baseUrl = resolveCloudflareAiGatewayBaseUrl(params); - return { - models: { - providers: { - [PROVIDER_ID]: { - baseUrl, - api: "anthropic-messages" as const, - models: [buildCloudflareAiGatewayModelDefinition()], - }, - }, - }, - agents: { - defaults: { - models: { - [CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF]: { - alias: "Cloudflare AI Gateway", - }, - }, - }, - }, - }; -} - async function resolveCloudflareGatewayMetadataInteractive(ctx: { accountId?: string; gatewayId?: string; @@ -180,7 +157,7 @@ const cloudflareAiGatewayPlugin = { ), }, ], - configPatch: buildCloudflareConfigPatch(metadata), + configPatch: buildCloudflareAiGatewayConfigPatch(metadata), defaultModel: CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, }; }, diff --git a/extensions/cloudflare-ai-gateway/onboard.ts b/extensions/cloudflare-ai-gateway/onboard.ts new file mode 100644 index 00000000000..267c2f806f1 --- /dev/null +++ b/extensions/cloudflare-ai-gateway/onboard.ts @@ -0,0 +1,93 @@ +import { + buildCloudflareAiGatewayModelDefinition, + CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, + resolveCloudflareAiGatewayBaseUrl, +} from "../../src/agents/cloudflare-ai-gateway.js"; +import { + applyAgentDefaultModelPrimary, + applyProviderConfigWithDefaultModel, +} from "../../src/commands/onboard-auth.config-shared.js"; +import type { OpenClawConfig } from "../../src/config/config.js"; + +export { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF }; + +export function buildCloudflareAiGatewayConfigPatch(params: { + accountId: string; + gatewayId: string; +}) { + const baseUrl = resolveCloudflareAiGatewayBaseUrl(params); + return { + models: { + providers: { + "cloudflare-ai-gateway": { + baseUrl, + api: "anthropic-messages" as const, + models: [buildCloudflareAiGatewayModelDefinition()], + }, + }, + }, + agents: { + defaults: { + models: { + [CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF]: { + alias: "Cloudflare AI Gateway", + }, + }, + }, + }, + }; +} + +export function applyCloudflareAiGatewayProviderConfig( + cfg: OpenClawConfig, + params?: { accountId?: string; gatewayId?: string }, +): OpenClawConfig { + const models = { ...cfg.agents?.defaults?.models }; + models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF] = { + ...models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF], + alias: models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF]?.alias ?? "Cloudflare AI Gateway", + }; + + const existingProvider = cfg.models?.providers?.["cloudflare-ai-gateway"] as + | { baseUrl?: unknown } + | undefined; + const baseUrl = + params?.accountId && params?.gatewayId + ? resolveCloudflareAiGatewayBaseUrl({ + accountId: params.accountId, + gatewayId: params.gatewayId, + }) + : typeof existingProvider?.baseUrl === "string" + ? existingProvider.baseUrl + : undefined; + if (!baseUrl) { + return { + ...cfg, + agents: { + ...cfg.agents, + defaults: { + ...cfg.agents?.defaults, + models, + }, + }, + }; + } + + return applyProviderConfigWithDefaultModel(cfg, { + agentModels: models, + providerId: "cloudflare-ai-gateway", + api: "anthropic-messages", + baseUrl, + defaultModel: buildCloudflareAiGatewayModelDefinition(), + }); +} + +export function applyCloudflareAiGatewayConfig( + cfg: OpenClawConfig, + params?: { accountId?: string; gatewayId?: string }, +): OpenClawConfig { + return applyAgentDefaultModelPrimary( + applyCloudflareAiGatewayProviderConfig(cfg, params), + CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, + ); +} diff --git a/extensions/vercel-ai-gateway/index.ts b/extensions/vercel-ai-gateway/index.ts index 7946001981e..31f3ff3db70 100644 --- a/extensions/vercel-ai-gateway/index.ts +++ b/extensions/vercel-ai-gateway/index.ts @@ -1,9 +1,6 @@ import { emptyPluginConfigSchema, type OpenClawPluginApi } from "openclaw/plugin-sdk/core"; -import { - applyVercelAiGatewayConfig, - VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, -} from "../../src/commands/onboard-auth.js"; import { createProviderApiKeyAuthMethod } from "../../src/plugins/provider-api-key-auth.js"; +import { applyVercelAiGatewayConfig, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF } from "./onboard.js"; import { buildVercelAiGatewayProvider } from "./provider-catalog.js"; const PROVIDER_ID = "vercel-ai-gateway"; diff --git a/extensions/vercel-ai-gateway/onboard.ts b/extensions/vercel-ai-gateway/onboard.ts new file mode 100644 index 00000000000..d65d7224781 --- /dev/null +++ b/extensions/vercel-ai-gateway/onboard.ts @@ -0,0 +1,30 @@ +import { applyAgentDefaultModelPrimary } from "../../src/commands/onboard-auth.config-shared.js"; +import type { OpenClawConfig } from "../../src/config/config.js"; + +export const VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF = "vercel-ai-gateway/anthropic/claude-opus-4.6"; + +export function applyVercelAiGatewayProviderConfig(cfg: OpenClawConfig): OpenClawConfig { + const models = { ...cfg.agents?.defaults?.models }; + models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF] = { + ...models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF], + alias: models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF]?.alias ?? "Vercel AI Gateway", + }; + + return { + ...cfg, + agents: { + ...cfg.agents, + defaults: { + ...cfg.agents?.defaults, + models, + }, + }, + }; +} + +export function applyVercelAiGatewayConfig(cfg: OpenClawConfig): OpenClawConfig { + return applyAgentDefaultModelPrimary( + applyVercelAiGatewayProviderConfig(cfg), + VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, + ); +} diff --git a/src/commands/onboard-auth.config-gateways.ts b/src/commands/onboard-auth.config-gateways.ts index a7a4d4246ce..4699481d79a 100644 --- a/src/commands/onboard-auth.config-gateways.ts +++ b/src/commands/onboard-auth.config-gateways.ts @@ -1,91 +1,10 @@ -import { - buildCloudflareAiGatewayModelDefinition, - resolveCloudflareAiGatewayBaseUrl, -} from "../agents/cloudflare-ai-gateway.js"; -import type { OpenClawConfig } from "../config/config.js"; -import { - applyAgentDefaultModelPrimary, - applyProviderConfigWithDefaultModel, -} from "./onboard-auth.config-shared.js"; -import { +export { + applyCloudflareAiGatewayConfig, + applyCloudflareAiGatewayProviderConfig, CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, +} from "../../extensions/cloudflare-ai-gateway/onboard.js"; +export { + applyVercelAiGatewayConfig, + applyVercelAiGatewayProviderConfig, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, -} from "./onboard-auth.credentials.js"; - -export function applyVercelAiGatewayProviderConfig(cfg: OpenClawConfig): OpenClawConfig { - const models = { ...cfg.agents?.defaults?.models }; - models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF] = { - ...models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF], - alias: models[VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF]?.alias ?? "Vercel AI Gateway", - }; - - return { - ...cfg, - agents: { - ...cfg.agents, - defaults: { - ...cfg.agents?.defaults, - models, - }, - }, - }; -} - -export function applyCloudflareAiGatewayProviderConfig( - cfg: OpenClawConfig, - params?: { accountId?: string; gatewayId?: string }, -): OpenClawConfig { - const models = { ...cfg.agents?.defaults?.models }; - models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF] = { - ...models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF], - alias: models[CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF]?.alias ?? "Cloudflare AI Gateway", - }; - - const defaultModel = buildCloudflareAiGatewayModelDefinition(); - const existingProvider = cfg.models?.providers?.["cloudflare-ai-gateway"] as - | { baseUrl?: unknown } - | undefined; - const baseUrl = - params?.accountId && params?.gatewayId - ? resolveCloudflareAiGatewayBaseUrl({ - accountId: params.accountId, - gatewayId: params.gatewayId, - }) - : typeof existingProvider?.baseUrl === "string" - ? existingProvider.baseUrl - : undefined; - - if (!baseUrl) { - return { - ...cfg, - agents: { - ...cfg.agents, - defaults: { - ...cfg.agents?.defaults, - models, - }, - }, - }; - } - - return applyProviderConfigWithDefaultModel(cfg, { - agentModels: models, - providerId: "cloudflare-ai-gateway", - api: "anthropic-messages", - baseUrl, - defaultModel, - }); -} - -export function applyVercelAiGatewayConfig(cfg: OpenClawConfig): OpenClawConfig { - const next = applyVercelAiGatewayProviderConfig(cfg); - return applyAgentDefaultModelPrimary(next, VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF); -} - -export function applyCloudflareAiGatewayConfig( - cfg: OpenClawConfig, - params?: { accountId?: string; gatewayId?: string }, -): OpenClawConfig { - const next = applyCloudflareAiGatewayProviderConfig(cfg, params); - return applyAgentDefaultModelPrimary(next, CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF); -} +} from "../../extensions/vercel-ai-gateway/onboard.js"; diff --git a/src/commands/onboard-auth.ts b/src/commands/onboard-auth.ts index d27a807c69d..ac923e56710 100644 --- a/src/commands/onboard-auth.ts +++ b/src/commands/onboard-auth.ts @@ -58,7 +58,6 @@ export { applyOpencodeGoProviderConfig, } from "./onboard-auth.config-opencode-go.js"; export { - CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF, LITELLM_DEFAULT_MODEL_REF, OPENROUTER_DEFAULT_MODEL_REF, setOpenaiApiKey, @@ -87,9 +86,9 @@ export { setXaiApiKey, setModelStudioApiKey, writeOAuthCredentials, - VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF, XIAOMI_DEFAULT_MODEL_REF, } from "./onboard-auth.credentials.js"; +export { CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF } from "../../extensions/cloudflare-ai-gateway/onboard.js"; export { HUGGINGFACE_DEFAULT_MODEL_REF } from "../../extensions/huggingface/onboard.js"; export { KILOCODE_DEFAULT_MODEL_REF } from "../../extensions/kilocode/onboard.js"; export { MISTRAL_DEFAULT_MODEL_REF } from "../../extensions/mistral/onboard.js"; @@ -97,6 +96,7 @@ export { MODELSTUDIO_DEFAULT_MODEL_REF } from "../../extensions/modelstudio/onbo export { SYNTHETIC_DEFAULT_MODEL_REF } from "../../extensions/synthetic/onboard.js"; export { TOGETHER_DEFAULT_MODEL_REF } from "../../extensions/together/onboard.js"; export { VENICE_DEFAULT_MODEL_REF } from "../../extensions/venice/onboard.js"; +export { VERCEL_AI_GATEWAY_DEFAULT_MODEL_REF } from "../../extensions/vercel-ai-gateway/onboard.js"; export { XAI_DEFAULT_MODEL_REF } from "../../extensions/xai/onboard.js"; export { ZAI_DEFAULT_MODEL_REF } from "../../extensions/zai/onboard.js"; export {