openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
146 lines (145 loc) • 7.52 kB
JavaScript
import { a as normalizeFastMode } from "./string-coerce-CIXf7egm.js";
import { c as resolveAgentConfig } from "./agent-scope-config-DcbEhP0R.js";
import { r as normalizeProviderId } from "./provider-id-DMd-TDFp.js";
import { t as modelKey } from "./model-key-CMdQNkZf.js";
import { a as normalizeOptionalAgentRuntimeId, o as resolveAgentScopedRuntimeOverride, r as isDefaultAgentRuntimeId } from "./agent-runtime-id-BpfvnoN1.js";
import { y as resolveSessionAgentIds } from "./agent-scope-DbtJyKUL.js";
import { t as resolveModelRuntimePolicy } from "./model-runtime-policy-BAKiaBCi.js";
import { t as canonicalizeProviderModelId } from "./provider-model-route-zfHlXKpI.js";
import { s as normalizeThinkLevel } from "./thinking.shared-bHYuuc1L.js";
import { a as resolveOpenAIModelRoutes } from "./openai-model-routes-Bte2KVl5.js";
//#region src/agents/model-extra-params.ts
const FAST_MODE_CUTOFF_MODEL_PARAM_KEYS = /* @__PURE__ */ new Set([
"fastAutoOnSeconds",
"fastSeconds",
"fast_auto_on_seconds",
"fast_seconds"
]);
function isAgentRuntimeModelParam(key, value) {
if (key === "thinking") return value === false || value === "disabled" || value === "none" || typeof value === "string" && normalizeThinkLevel(value) !== void 0;
if (key === "fastMode" || key === "fast_mode") return normalizeFastMode(value) !== void 0;
return FAST_MODE_CUTOFF_MODEL_PARAM_KEYS.has(key) && typeof value === "number" && Number.isInteger(value) && value > 0;
}
function legacyModelKey(provider, modelId) {
const rawKey = `${provider.trim()}/${modelId.trim()}`;
return rawKey === modelKey(provider, modelId) ? void 0 : rawKey;
}
/** Resolves the config records merged into one model request. */
function resolveModelExtraParamSources(params) {
const defaultParams = params.config?.agents?.defaults?.params;
const configuredModels = params.config?.agents?.defaults?.models;
const canonicalKey = params.modelId ? modelKey(params.provider, params.modelId) : void 0;
const legacyKey = params.modelId ? legacyModelKey(params.provider, params.modelId) : void 0;
return {
defaultParams,
modelParams: canonicalKey ? configuredModels?.[canonicalKey]?.params ?? (legacyKey ? configuredModels?.[legacyKey]?.params : void 0) : void 0,
agentParams: params.agentId && params.config ? resolveAgentConfig(params.config, params.agentId)?.params : void 0
};
}
/** Returns whether embedded OpenClaw would apply authored provider request parameters. */
function hasAuthoredProviderRequestParams(params) {
const sources = resolveModelExtraParamSources(params);
if ([sources.defaultParams, sources.agentParams].some((source) => source !== void 0 && Object.keys(source).length > 0)) return true;
return Object.entries(sources.modelParams ?? {}).some(([key, value]) => !isAgentRuntimeModelParam(key, value));
}
//#endregion
//#region src/agents/openai-routing.ts
/**
* OpenAI provider routing decisions shared by model selection, auth profiles, and runtime setup.
*
* Custom OpenAI-compatible base URLs intentionally bypass Codex-runtime defaults.
*/
/** Canonical provider id for OpenAI-hosted model routes. */
const OPENAI_PROVIDER_ID = "openai";
const OPENAI_CODEX_PROVIDER_ID = OPENAI_PROVIDER_ID;
/** Returns true for provider ids that normalize to OpenAI. */
function isOpenAIProvider(provider) {
return normalizeProviderId(provider ?? "") === OPENAI_PROVIDER_ID;
}
/** Canonicalizes shipped OpenAI model aliases at runtime boundaries. */
function canonicalizeOpenAIModelId(provider, modelId) {
return isOpenAIProvider(provider) ? canonicalizeProviderModelId(OPENAI_PROVIDER_ID, modelId) : modelId;
}
/** Resolves the provider-owned implicit runtime for one concrete OpenAI route. */
function resolveOpenAIImplicitAgentRuntime(params) {
if (!isOpenAIProvider(params.provider)) return null;
const modelId = params.modelId;
const agentId = params.config && (params.agentId?.trim() || params.sessionKey?.trim()) ? resolveSessionAgentIds({
config: params.config,
agentId: params.agentId,
sessionKey: params.sessionKey
}).sessionAgentId : params.agentId;
const hasConfiguredProviderRequestParams = hasAuthoredProviderRequestParams({
config: params.config,
provider: params.provider ?? "openai",
modelId,
agentId
});
const requestTransportOverrides = params.requestTransportOverrides === "present" || hasConfiguredProviderRequestParams ? "present" : "none";
const resolution = resolveOpenAIModelRoutes({
provider: params.provider,
modelId,
api: params.api,
baseUrl: params.baseUrl,
config: params.config,
env: params.env,
requestTransportOverrides
});
if (!resolution) return "openclaw";
return resolution.kind !== "incompatible" && resolution.defaultRuntimeId === "codex" ? "codex" : "openclaw";
}
/** Parses the provider portion from a provider/model ref. */
function parseModelRefProvider(value) {
if (typeof value !== "string") return;
const slashIndex = value.trim().indexOf("/");
if (slashIndex <= 0) return;
return normalizeProviderId(value.trim().slice(0, slashIndex));
}
/** Returns true when selected model config should ensure the Codex plugin exists. */
function modelSelectionShouldEnsureCodexPlugin(params) {
const provider = parseModelRefProvider(params.model);
if (provider !== "openai") return false;
const modelRef = params.model?.trim();
const slashIndex = modelRef?.indexOf("/") ?? -1;
const modelId = slashIndex >= 0 ? modelRef?.slice(slashIndex + 1) : void 0;
const configuredPolicy = resolveModelRuntimePolicy({
config: params.config,
provider,
modelId,
agentId: params.agentId
}).policy;
const configuredRuntime = normalizeOptionalAgentRuntimeId(configuredPolicy?.id);
if (configuredRuntime && !isDefaultAgentRuntimeId(configuredRuntime)) return configuredRuntime === "codex";
if (!configuredPolicy) {
const agentRuntime = resolveAgentScopedRuntimeOverride({
config: params.config,
agentId: params.agentId
});
if (agentRuntime && !isDefaultAgentRuntimeId(agentRuntime)) return agentRuntime === "codex";
}
return resolveOpenAIImplicitAgentRuntime({
provider,
modelId,
config: params.config,
agentId: params.agentId
}) === "codex";
}
/** Lists auth-profile providers for an OpenAI runtime route. */
function listOpenAIAuthProfileProvidersForAgentRuntime(params) {
if (!isOpenAIProvider(params.provider)) return [params.provider];
return [OPENAI_PROVIDER_ID];
}
/** Resolves the provider id passed to OpenAI runtime auth/execution paths. */
function resolveOpenAIRuntimeProvider(params) {
return isOpenAIProvider(params.provider) ? OPENAI_PROVIDER_ID : params.provider;
}
/** Resolves the selected provider id displayed for OpenAI runtime routes. */
function resolveSelectedOpenAIRuntimeProvider(params) {
return isOpenAIProvider(params.provider) ? OPENAI_PROVIDER_ID : params.provider;
}
/** Resolves the config provider used for context-window lookup. */
function resolveContextConfigProviderForRuntime(params) {
return isOpenAIProvider(params.provider) ? OPENAI_PROVIDER_ID : params.provider;
}
//#endregion
export { listOpenAIAuthProfileProvidersForAgentRuntime as a, resolveContextConfigProviderForRuntime as c, resolveSelectedOpenAIRuntimeProvider as d, hasAuthoredProviderRequestParams as f, isOpenAIProvider as i, resolveOpenAIImplicitAgentRuntime as l, resolveModelExtraParamSources as m, OPENAI_PROVIDER_ID as n, modelSelectionShouldEnsureCodexPlugin as o, isAgentRuntimeModelParam as p, canonicalizeOpenAIModelId as r, parseModelRefProvider as s, OPENAI_CODEX_PROVIDER_ID as t, resolveOpenAIRuntimeProvider as u };