Menu
popagent
publicLatest change 6edc7e928c57dab23c0973ed3f7ee70b3ebb72d5 - Initial popagent baseline by AkurAI Build
const PROVIDERS: Record<string, string> = {
ag: "Antigravity",
cc: "Claude",
cf: "Cloudflare",
cx: "Codex",
gc: "Google",
nvidia: "NVIDIA",
openrouter: "OpenRouter",
};
const SPECIAL_WORDS: Record<string, string> = {
ai: "AI",
api: "API",
gpt: "GPT",
glm: "GLM",
kimi: "Kimi",
minimax: "MiniMax",
};
type ModelGroup = { provider: string; models: string[] };
export function providerLabel(id: string): string {
const separator = id.indexOf("/");
return separator === -1 ? "Routes" : (PROVIDERS[id.slice(0, separator)] ?? titleCase(id.slice(0, separator)));
}
export function modelLabel(id: string): string {
const route = id.includes("/") ? id.slice(id.lastIndexOf("/") + 1) : id;
return route
.replace(/:free$/, " Free")
.split("-")
.filter(Boolean)
.map((word) => SPECIAL_WORDS[word.toLowerCase()] ?? `${word.charAt(0).toUpperCase()}${word.slice(1)}`)
.join(" ");
}
export function groupModels(models: readonly string[]): ModelGroup[] {
const groups = new Map<string, string[]>();
for (const model of models) {
const provider = providerLabel(model);
const group = groups.get(provider);
if (group) group.push(model);
else groups.set(provider, [model]);
}
return [...groups].map(([provider, groupedModels]) => ({ provider, models: groupedModels }));
}
export function filterModels(models: readonly string[], query: string): string[] {
const normalized = query.trim().toLowerCase();
if (!normalized) return [...models];
return models.filter((model) => `${model} ${modelLabel(model)} ${providerLabel(model)}`.toLowerCase().includes(normalized));
}
function titleCase(value: string): string {
return value.split(/[-_]/).map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`).join(" ");
}