openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
217 lines (216 loc) • 9.64 kB
JavaScript
import { c as isRecord } from "./record-coerce-DItp3I4t.js";
import { o as normalizeLowercaseStringOrEmpty } from "./string-coerce-CIXf7egm.js";
import { c as resolveAgentConfig, o as listAgentIds } from "./agent-scope-config-DcbEhP0R.js";
import "./string-coerce-runtime-GQa0ehRA.js";
import "./agent-scope-runtime-h57Nypqc.js";
import { i as CLAUDE_CLI_DEFAULT_ALLOWLIST_REFS, l as CLAUDE_CLI_PROFILE_ID, t as CLAUDE_CLI_BACKEND_ID } from "./cli-constants-Dsp5krT8.js";
import { i as resolveKnownAnthropicModelRef, n as parseAnthropicModelRef, r as resolveClaudeCliAnthropicModelRefs, t as normalizeAnthropicProviderId } from "./claude-model-refs-CgkX-H6n.js";
//#region extensions/anthropic/config-defaults.ts
const ANTHROPIC_PROVIDER_API = "anthropic-messages";
const ANTHROPIC_API_KEY_DEFAULT_ALLOWLIST_REFS = ["anthropic/claude-sonnet-5", "anthropic/claude-sonnet-4-6"];
function resolveAnthropicDefaultAuthMode(config, env) {
if (usesRetiredClaudeCliProviderEntry(config)) return "oauth";
const profiles = config.auth?.profiles ?? {};
const anthropicProfiles = Object.entries(profiles).filter(([, profile]) => profile?.provider === "anthropic" || profile?.provider === "claude-cli");
const order = [...config.auth?.order?.anthropic ?? [], ...(config.auth?.order)?.["claude-cli"] ?? []];
for (const profileId of order) {
const entry = profiles[profileId];
if (!entry || entry.provider !== "anthropic" && entry.provider !== "claude-cli") continue;
if (entry.provider === "claude-cli") return "oauth";
if (entry.mode === "api_key") return "api_key";
if (entry.mode === "oauth" || entry.mode === "token") return "oauth";
}
const hasApiKey = anthropicProfiles.some(([, profile]) => profile?.provider === "anthropic" && profile?.mode === "api_key");
const hasOauth = anthropicProfiles.some(([, profile]) => profile?.provider === "claude-cli" || profile?.mode === "oauth" || profile?.mode === "token");
if (hasApiKey && !hasOauth) return "api_key";
if (hasOauth && !hasApiKey) return "oauth";
if (env.ANTHROPIC_OAUTH_TOKEN?.trim()) return "oauth";
if (env.ANTHROPIC_API_KEY?.trim()) return "api_key";
return null;
}
function usesRetiredClaudeCliProviderEntry(config) {
return Object.entries(config.models?.providers ?? {}).some(([provider, entry]) => normalizeAnthropicProviderId(provider) === "anthropic" && entry.apiKey === CLAUDE_CLI_PROFILE_ID);
}
function resolveModelPrimaryValue(value) {
if (typeof value === "string") return value.trim() || void 0;
const primary = value?.primary;
if (typeof primary !== "string") return;
return primary.trim() || void 0;
}
function isAnthropicCacheRetentionTarget(parsed) {
return Boolean(parsed && (parsed.provider === "anthropic" || parsed.provider === "amazon-bedrock" && normalizeLowercaseStringOrEmpty(parsed.model).includes("anthropic.claude")));
}
function usesClaudeCliModelSelection(config) {
const primary = resolveModelPrimaryValue(config.agents?.defaults?.model);
if ((primary ? parseAnthropicModelRef(primary) : null)?.provider === "claude-cli") return true;
return Object.entries(config.agents?.defaults?.models ?? {}).some(([key, entry]) => {
const parsed = parseAnthropicModelRef(key);
if (parsed?.provider === "claude-cli") return true;
const runtimeId = isRecord(entry?.agentRuntime) ? entry.agentRuntime.id : void 0;
return parsed?.provider === "anthropic" && normalizeLowercaseStringOrEmpty(runtimeId) === "claude-cli";
});
}
function usesSelectedClaudeCliAuthProfile(config) {
if (usesRetiredClaudeCliProviderEntry(config)) return true;
const profiles = config.auth?.profiles ?? {};
const orderedProfileIds = [...config.auth?.order?.anthropic ?? [], ...(config.auth?.order)?.["claude-cli"] ?? []];
for (const profileId of orderedProfileIds) {
const provider = profiles[profileId]?.provider;
if (provider === "claude-cli") return true;
if (provider === "anthropic") return false;
}
let hasClaudeCliProfile = false;
let hasAnthropicProfile = false;
for (const profile of Object.values(profiles)) {
if (profile?.provider === "claude-cli") hasClaudeCliProfile = true;
if (profile?.provider === "anthropic") hasAnthropicProfile = true;
}
return hasClaudeCliProfile && !hasAnthropicProfile;
}
function toCanonicalAnthropicModelRef(ref) {
return ref.startsWith(`claude-cli/`) ? `anthropic/${ref.slice(CLAUDE_CLI_BACKEND_ID.length + 1)}` : ref;
}
function modelEntryWithClaudeCliRuntime(entry) {
const base = isRecord(entry) ? { ...entry } : {};
const currentRuntimeId = isRecord(base.agentRuntime) ? base.agentRuntime.id : void 0;
const currentRuntime = normalizeLowercaseStringOrEmpty(currentRuntimeId);
if (currentRuntime && currentRuntime !== "auto") return base;
base.agentRuntime = {
...isRecord(base.agentRuntime) ? base.agentRuntime : {},
id: CLAUDE_CLI_BACKEND_ID
};
return base;
}
function collectClaudeCliRuntimeRefsFromConfig(config) {
const selections = [{
model: config.agents?.defaults?.model,
models: config.agents?.defaults?.models
}, ...listAgentIds(config).map((agentId) => {
const agent = resolveAgentConfig(config, agentId);
return {
model: agent?.model,
models: agent?.models
};
})];
const refs = /* @__PURE__ */ new Set();
for (const { model, models } of selections) {
const selected = typeof model === "string" ? [model] : [model?.primary, ...model?.fallbacks ?? []];
for (const rawRef of [...selected, ...Object.keys(models ?? {})]) {
if (typeof rawRef !== "string") continue;
for (const ref of resolveClaudeCliAnthropicModelRefs(rawRef)?.runtimeRefs ?? []) refs.add(ref);
}
}
return [...refs];
}
function normalizeAnthropicProviderConfig(providerConfig) {
if (providerConfig.api || !Array.isArray(providerConfig.models) || providerConfig.models.length === 0) return providerConfig;
return {
...providerConfig,
api: ANTHROPIC_PROVIDER_API
};
}
/** Normalize Anthropic provider config defaults for one provider entry. */
function normalizeAnthropicProviderConfigForProvider(params) {
const provider = normalizeAnthropicProviderId(params.provider);
if (provider !== "anthropic" && provider !== "claude-cli") return params.providerConfig;
return normalizeAnthropicProviderConfig(params.providerConfig);
}
/** Apply Anthropic and Claude CLI defaults to an OpenClaw config object. */
function applyAnthropicConfigDefaults(params) {
const defaults = params.config.agents?.defaults;
if (!defaults) return params.config;
const authMode = resolveAnthropicDefaultAuthMode(params.config, params.env);
if (!authMode) return params.config;
let mutated = false;
const nextDefaults = { ...defaults };
const contextPruning = defaults.contextPruning ?? {};
const heartbeat = defaults.heartbeat ?? {};
if (defaults.contextPruning?.mode === void 0) {
nextDefaults.contextPruning = {
...contextPruning,
mode: "cache-ttl",
ttl: defaults.contextPruning?.ttl ?? "1h"
};
mutated = true;
}
if (defaults.heartbeat?.every === void 0) {
nextDefaults.heartbeat = {
...heartbeat,
every: authMode === "oauth" ? "1h" : "30m"
};
mutated = true;
}
if (authMode === "api_key") {
const nextModels = defaults.models ? { ...defaults.models } : {};
let modelsMutated = false;
for (const [key, entry] of Object.entries(nextModels)) {
if (!isAnthropicCacheRetentionTarget(parseAnthropicModelRef(key))) continue;
const current = entry ?? {};
const paramsValue = current.params ?? {};
if (typeof paramsValue.cacheRetention === "string") continue;
nextModels[key] = {
...current,
params: {
...paramsValue,
cacheRetention: "short"
}
};
modelsMutated = true;
}
const primary = resolveKnownAnthropicModelRef(resolveModelPrimaryValue(defaults.model));
if (primary) {
const parsedPrimary = parseAnthropicModelRef(primary);
if (parsedPrimary && isAnthropicCacheRetentionTarget(parsedPrimary)) {
const key = `${parsedPrimary.provider}/${parsedPrimary.model}`;
const current = nextModels[key] ?? {};
const paramsValue = current.params ?? {};
if (typeof paramsValue.cacheRetention !== "string") {
nextModels[key] = {
...current,
params: {
...paramsValue,
cacheRetention: "short"
}
};
modelsMutated = true;
}
}
}
if (Object.keys(nextModels).some((key) => isAnthropicCacheRetentionTarget(parseAnthropicModelRef(key)))) for (const ref of ANTHROPIC_API_KEY_DEFAULT_ALLOWLIST_REFS) {
if (ref in nextModels) continue;
nextModels[ref] = { params: { cacheRetention: "short" } };
modelsMutated = true;
}
if (modelsMutated) {
nextDefaults.models = nextModels;
mutated = true;
}
}
if (authMode === "oauth" && (usesClaudeCliModelSelection(params.config) || usesSelectedClaudeCliAuthProfile(params.config))) {
const nextModels = defaults.models ? { ...defaults.models } : {};
let modelsMutated = false;
const runtimeRefs = new Set(collectClaudeCliRuntimeRefsFromConfig(params.config));
for (const rawRef of CLAUDE_CLI_DEFAULT_ALLOWLIST_REFS) runtimeRefs.add(toCanonicalAnthropicModelRef(rawRef));
for (const ref of runtimeRefs) {
const current = nextModels[ref];
const updated = modelEntryWithClaudeCliRuntime(current);
if (JSON.stringify(updated) === JSON.stringify(current ?? {})) continue;
nextModels[ref] = updated;
modelsMutated = true;
}
if (modelsMutated) {
nextDefaults.models = nextModels;
mutated = true;
}
}
if (!mutated) return params.config;
return {
...params.config,
agents: {
...params.config.agents,
defaults: nextDefaults
}
};
}
//#endregion
export { normalizeAnthropicProviderConfigForProvider as n, applyAnthropicConfigDefaults as t };