openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
100 lines (99 loc) • 4.93 kB
JavaScript
import { c as normalizeOptionalLowercaseString } from "./string-coerce-CIXf7egm.js";
import { n as attachModelProviderRequestRouteFacts, p as sanitizeConfiguredModelProviderRequest, r as attachModelProviderRequestTransport, u as resolveProviderRequestConfig } from "./provider-request-config-DIOYidiO.js";
import { u as isSecretRefHeaderValueMarker } from "./model-auth-markers-jBKQn38x.js";
import { t as attachModelProviderLocalService } from "./provider-local-service-D9Gl9HJT.js";
import { n as normalizeGoogleApiBaseUrl } from "./google-api-base-url-UBNiBOzj.js";
//#region src/agents/embedded-agent-runner/model.inline-provider.ts
/**
* Converts inline provider model config into runtime model definitions.
*/
/** Returns a supported transport API id from raw config values. */
function normalizeResolvedTransportApi(api) {
switch (api) {
case "anthropic-messages":
case "bedrock-converse-stream":
case "github-copilot":
case "google-generative-ai":
case "google-vertex":
case "ollama":
case "openai-chatgpt-responses":
case "openai-completions":
case "openai-responses":
case "azure-openai-responses": return api;
default: return;
}
}
/** Sanitizes configured provider/model headers before they enter runtime model metadata. */
function sanitizeModelHeaders(headers, opts) {
if (!headers || typeof headers !== "object" || Array.isArray(headers)) return;
const next = {};
for (const [headerName, headerValue] of Object.entries(headers)) {
if (typeof headerValue !== "string") continue;
if (opts?.stripSecretRefMarkers && isSecretRefHeaderValueMarker(headerValue)) continue;
next[headerName] = headerValue;
}
return Object.keys(next).length > 0 ? next : void 0;
}
function isLegacyFoundryVisionModelCandidate(params) {
if (normalizeOptionalLowercaseString(params.provider) !== "microsoft-foundry") return false;
return [params.modelId, params.modelName].filter((value) => typeof value === "string").map((value) => normalizeOptionalLowercaseString(value)).filter((value) => Boolean(value)).some((candidate) => candidate.startsWith("gpt-") || candidate.startsWith("o1") || candidate.startsWith("o3") || candidate.startsWith("o4") || candidate === "computer-use-preview");
}
/** Resolves model input modalities with Foundry legacy vision-model compatibility. */
function resolveProviderModelInput(params) {
const resolvedInput = Array.isArray(params.input) ? params.input : params.fallbackInput;
const normalizedInput = Array.isArray(resolvedInput) ? resolvedInput.filter((item) => item === "text" || item === "image") : [];
if (normalizedInput.length > 0 && !normalizedInput.includes("image") && isLegacyFoundryVisionModelCandidate(params)) return ["text", "image"];
return normalizedInput.length > 0 ? normalizedInput : ["text"];
}
function resolveInlineProviderTransport(params) {
const api = normalizeResolvedTransportApi(params.api);
return {
api,
baseUrl: api === "google-generative-ai" ? normalizeGoogleApiBaseUrl(params.baseUrl) : params.baseUrl
};
}
/** Builds runtime model records from inline provider config. */
function buildInlineProviderModels(providers, options = {}) {
return Object.entries(providers).flatMap(([providerId, entry]) => {
const trimmed = providerId.trim();
if (!trimmed) return [];
const providerHeaders = sanitizeModelHeaders(entry?.headers, { stripSecretRefMarkers: true });
const providerRequest = sanitizeConfiguredModelProviderRequest(entry?.request);
return (entry?.models ?? []).map((model) => {
const transport = resolveInlineProviderTransport({
api: model.api ?? entry?.api,
baseUrl: model.baseUrl ?? entry?.baseUrl
});
const modelHeaders = sanitizeModelHeaders(model.headers, { stripSecretRefMarkers: true });
const requestConfig = resolveProviderRequestConfig({
provider: trimmed,
api: transport.api ?? model.api,
baseUrl: transport.baseUrl,
...options.providerMetadataOwners ? { providerMetadataOwners: options.providerMetadataOwners } : {},
providerHeaders,
modelHeaders,
authHeader: entry?.authHeader,
request: providerRequest,
capability: "llm",
transport: "stream"
});
const maxTokens = model.maxTokens ?? entry?.maxTokens;
return attachModelProviderRequestRouteFacts(attachModelProviderLocalService(attachModelProviderRequestTransport({
...model,
...maxTokens !== void 0 ? { maxTokens } : {},
input: resolveProviderModelInput({
provider: trimmed,
modelId: model.id,
modelName: model.name,
input: model.input
}),
provider: trimmed,
baseUrl: requestConfig.baseUrl ?? transport.baseUrl,
api: requestConfig.api ?? model.api,
headers: requestConfig.headers
}, providerRequest), entry?.localService), options.providerMetadataOwners);
});
});
}
//#endregion
export { sanitizeModelHeaders as i, normalizeResolvedTransportApi as n, resolveProviderModelInput as r, buildInlineProviderModels as t };