cjovs's picture
Add Custom LLM Endpoint plugin
df23150 verified
Raw
History Blame Contribute Delete
1.94 kB
import { PLUGIN_SCHEMA_VERSION } from "../constants.js";
import type { GlobalProviderConfig, GlobalProviderRecord } from "../types.js";
function compareProviders(left: GlobalProviderRecord, right: GlobalProviderRecord) {
return left.name.localeCompare(right.name) || left.id.localeCompare(right.id);
}
export function createEmptyConfig(): GlobalProviderConfig {
return {
schemaVersion: PLUGIN_SCHEMA_VERSION,
providers: [],
};
}
export function normalizePluginConfig(value: unknown): GlobalProviderConfig {
if (!value || typeof value !== "object" || Array.isArray(value)) {
return createEmptyConfig();
}
const record = value as Record<string, unknown>;
const providers = Array.isArray(record.providers)
? record.providers.filter((provider): provider is GlobalProviderRecord => {
return Boolean(provider && typeof provider === "object" && !Array.isArray(provider));
}).map((provider) => ({
...provider,
defaultModel: provider.defaultModel ?? null,
modelCatalog: Array.isArray(provider.modelCatalog) ? provider.modelCatalog : [],
lastSyncedAt: provider.lastSyncedAt ?? null,
lastSyncError: provider.lastSyncError ?? null,
}))
: [];
return {
schemaVersion: typeof record.schemaVersion === "number" ? record.schemaVersion : PLUGIN_SCHEMA_VERSION,
providers: [...providers].sort(compareProviders),
};
}
export function upsertProvider(
config: GlobalProviderConfig,
provider: GlobalProviderRecord,
): GlobalProviderConfig {
const withoutCurrent = config.providers.filter((existing) => existing.id !== provider.id);
return {
...config,
providers: [...withoutCurrent, provider].sort(compareProviders),
};
}
export function removeProvider(
config: GlobalProviderConfig,
providerId: string,
): GlobalProviderConfig {
return {
...config,
providers: config.providers.filter((provider) => provider.id !== providerId),
};
}