AkurAI Build
Menu

popagent

public

Latest 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(" ");
}