mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-03 05:12:15 +00:00
83 lines
2.3 KiB
TypeScript
83 lines
2.3 KiB
TypeScript
import { normalizeProviderId } from "../agents/model-selection.js";
|
|
import type { OpenClawConfig } from "../config/config.js";
|
|
import type { ProviderAuthMethod, ProviderPlugin } from "./types.js";
|
|
|
|
export function resolveProviderMatch(
|
|
providers: ProviderPlugin[],
|
|
rawProvider?: string,
|
|
): ProviderPlugin | null {
|
|
const raw = rawProvider?.trim();
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
const normalized = normalizeProviderId(raw);
|
|
return (
|
|
providers.find((provider) => normalizeProviderId(provider.id) === normalized) ??
|
|
providers.find(
|
|
(provider) =>
|
|
provider.aliases?.some((alias) => normalizeProviderId(alias) === normalized) ?? false,
|
|
) ??
|
|
null
|
|
);
|
|
}
|
|
|
|
export function pickAuthMethod(
|
|
provider: ProviderPlugin,
|
|
rawMethod?: string,
|
|
): ProviderAuthMethod | null {
|
|
const raw = rawMethod?.trim();
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
const normalized = raw.toLowerCase();
|
|
return (
|
|
provider.auth.find((method) => method.id.toLowerCase() === normalized) ??
|
|
provider.auth.find((method) => method.label.toLowerCase() === normalized) ??
|
|
null
|
|
);
|
|
}
|
|
|
|
function isPlainRecord(value: unknown): value is Record<string, unknown> {
|
|
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
}
|
|
|
|
export function mergeConfigPatch<T>(base: T, patch: unknown): T {
|
|
if (!isPlainRecord(base) || !isPlainRecord(patch)) {
|
|
return patch as T;
|
|
}
|
|
|
|
const next: Record<string, unknown> = { ...base };
|
|
for (const [key, value] of Object.entries(patch)) {
|
|
const existing = next[key];
|
|
if (isPlainRecord(existing) && isPlainRecord(value)) {
|
|
next[key] = mergeConfigPatch(existing, value);
|
|
} else {
|
|
next[key] = value;
|
|
}
|
|
}
|
|
return next as T;
|
|
}
|
|
|
|
export function applyDefaultModel(cfg: OpenClawConfig, model: string): OpenClawConfig {
|
|
const models = { ...cfg.agents?.defaults?.models };
|
|
models[model] = models[model] ?? {};
|
|
|
|
const existingModel = cfg.agents?.defaults?.model;
|
|
return {
|
|
...cfg,
|
|
agents: {
|
|
...cfg.agents,
|
|
defaults: {
|
|
...cfg.agents?.defaults,
|
|
models,
|
|
model: {
|
|
...(existingModel && typeof existingModel === "object" && "fallbacks" in existingModel
|
|
? { fallbacks: (existingModel as { fallbacks?: string[] }).fallbacks }
|
|
: undefined),
|
|
primary: model,
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|