ai_api / src /lib /providers /catalog.ts
Yogesh
initial deploy
cd8bd0a
Raw
History Blame Contribute Delete
7.04 kB
import {
APIKEY_PROVIDERS,
AUDIO_ONLY_PROVIDERS,
CLOUD_AGENT_PROVIDERS,
LOCAL_PROVIDERS,
NOAUTH_PROVIDERS,
OAUTH_PROVIDERS,
SEARCH_PROVIDERS,
UPSTREAM_PROXY_PROVIDERS,
WEB_COOKIE_PROVIDERS,
isClaudeCodeCompatibleProvider,
supportsApiKeyOnFreeProvider,
type RiskNoticeVariant,
} from "@/shared/constants/providers";
export type ProviderDisplayAuthType = "oauth" | "apikey" | "compatible" | "no-auth";
export type ProviderToggleAuthType = "oauth" | "free" | "apikey" | "no-auth";
export type StaticProviderCatalogCategory =
| "no-auth"
| "oauth"
| "web-cookie"
| "local"
| "search"
| "audio"
| "upstream-proxy"
| "apikey"
| "cloud-agent";
export interface ProviderCatalogMetadata {
id: string;
name: string;
color: string;
alias?: string;
icon?: string;
textIcon?: string;
website?: string;
authHint?: string;
apiHint?: string;
passthroughModels?: boolean;
subscriptionRisk?: boolean;
riskNoticeVariant?: RiskNoticeVariant;
apiType?: string;
baseUrl?: string;
[key: string]: unknown;
}
type ProviderRecord = Record<string, ProviderCatalogMetadata>;
export interface StaticProviderCatalogGroup {
category: StaticProviderCatalogCategory;
providers: ProviderRecord;
displayAuthType: Exclude<ProviderDisplayAuthType, "compatible">;
toggleAuthType: ProviderToggleAuthType;
}
export interface CompatibleProviderNodeLike {
id: string;
name?: string | null;
type?: string | null;
apiType?: string | null;
baseUrl?: string | null;
}
export interface CompatibleProviderLabels {
ccCompatibleName: string;
anthropicCompatibleName: string;
openAiCompatibleName: string;
}
export interface ResolvedStaticProviderCatalogEntry extends ProviderCatalogMetadata {
category: StaticProviderCatalogCategory;
displayAuthType: Exclude<ProviderDisplayAuthType, "compatible">;
toggleAuthType: ProviderToggleAuthType;
isCompatible: false;
}
export interface ResolvedCompatibleProviderCatalogEntry extends ProviderCatalogMetadata {
category: "compatible";
displayAuthType: "compatible";
toggleAuthType: "apikey";
isCompatible: true;
type?: string | null;
}
export type ResolvedProviderCatalogEntry =
| ResolvedStaticProviderCatalogEntry
| ResolvedCompatibleProviderCatalogEntry;
export const STATIC_PROVIDER_CATALOG_GROUPS: Record<
StaticProviderCatalogCategory,
StaticProviderCatalogGroup
> = {
"no-auth": {
category: "no-auth",
providers: NOAUTH_PROVIDERS as ProviderRecord,
displayAuthType: "no-auth",
toggleAuthType: "no-auth",
},
oauth: {
category: "oauth",
providers: OAUTH_PROVIDERS as ProviderRecord,
displayAuthType: "oauth",
toggleAuthType: "oauth",
},
"web-cookie": {
category: "web-cookie",
providers: WEB_COOKIE_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
local: {
category: "local",
providers: LOCAL_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
search: {
category: "search",
providers: SEARCH_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
audio: {
category: "audio",
providers: AUDIO_ONLY_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
"upstream-proxy": {
category: "upstream-proxy",
providers: UPSTREAM_PROXY_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
apikey: {
category: "apikey",
providers: APIKEY_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
"cloud-agent": {
category: "cloud-agent",
providers: CLOUD_AGENT_PROVIDERS as ProviderRecord,
displayAuthType: "apikey",
toggleAuthType: "apikey",
},
};
export const STATIC_PROVIDER_CATALOG_RESOLUTION_ORDER: StaticProviderCatalogCategory[] = [
"no-auth",
"oauth",
"web-cookie",
"local",
"search",
"audio",
"upstream-proxy",
"cloud-agent",
"apikey",
];
const MANAGED_PROVIDER_CONNECTION_CATEGORIES = new Set<StaticProviderCatalogCategory>([
"apikey",
"web-cookie",
"local",
"search",
"audio",
"cloud-agent",
]);
export function getStaticProviderCatalogGroup(
category: StaticProviderCatalogCategory
): StaticProviderCatalogGroup {
return STATIC_PROVIDER_CATALOG_GROUPS[category];
}
export function getStaticProviderCategories(providerId: string): StaticProviderCatalogCategory[] {
const categories: StaticProviderCatalogCategory[] = [];
for (const category of STATIC_PROVIDER_CATALOG_RESOLUTION_ORDER) {
if (STATIC_PROVIDER_CATALOG_GROUPS[category].providers[providerId]) {
categories.push(category);
}
}
return categories;
}
export function resolveStaticProviderCatalogEntry(
providerId: string
): ResolvedStaticProviderCatalogEntry | null {
for (const category of STATIC_PROVIDER_CATALOG_RESOLUTION_ORDER) {
const group = STATIC_PROVIDER_CATALOG_GROUPS[category];
const provider = group.providers[providerId];
if (!provider) continue;
return {
...provider,
category,
displayAuthType: group.displayAuthType,
toggleAuthType: group.toggleAuthType,
isCompatible: false,
};
}
return null;
}
export function isManagedProviderConnectionId(providerId: string): boolean {
if (supportsApiKeyOnFreeProvider(providerId)) return true;
const entry = resolveStaticProviderCatalogEntry(providerId);
return !!(entry && MANAGED_PROVIDER_CONNECTION_CATEGORIES.has(entry.category));
}
export function resolveCompatibleProviderCatalogEntry(
providerNode: CompatibleProviderNodeLike,
labels: CompatibleProviderLabels
): ResolvedCompatibleProviderCatalogEntry {
const isCcCompatible = isClaudeCodeCompatibleProvider(providerNode.id);
const isAnthropicCompatible = providerNode.type === "anthropic-compatible" && !isCcCompatible;
return {
id: providerNode.id,
name:
providerNode.name ||
(isCcCompatible
? labels.ccCompatibleName
: isAnthropicCompatible
? labels.anthropicCompatibleName
: labels.openAiCompatibleName),
color: isCcCompatible ? "#B45309" : isAnthropicCompatible ? "#D97757" : "#10A37F",
textIcon: isCcCompatible ? "CC" : isAnthropicCompatible ? "AC" : "OC",
apiType: providerNode.apiType || undefined,
baseUrl: providerNode.baseUrl || undefined,
type: providerNode.type,
category: "compatible",
displayAuthType: "compatible",
toggleAuthType: "apikey",
isCompatible: true,
};
}
export function resolveProviderCatalogEntry(
providerId: string,
options?: {
providerNode?: CompatibleProviderNodeLike | null;
compatibleLabels?: CompatibleProviderLabels | null;
}
): ResolvedProviderCatalogEntry | null {
if (options?.providerNode && options.compatibleLabels) {
return resolveCompatibleProviderCatalogEntry(options.providerNode, options.compatibleLabels);
}
return resolveStaticProviderCatalogEntry(providerId);
}