Something went wrong. Try again.
more up to date at codeberg https://codeberg.org/cowie/tau.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112/** * List available models with optional fuzzy search */
import type { Api, Model } from "@earendil-works/pi-ai";import { fuzzyFilter } from "@earendil-works/pi-tui";import chalk from "chalk";import { formatNoModelsAvailableMessage } from "../core/auth-guidance.ts";import type { ModelRegistry } from "../core/model-registry.ts";
/** * Format a number as human-readable (e.g., 200000 -> "200K", 1000000 -> "1M") */function formatTokenCount(count: number): string { if (count >= 1_000_000) { const millions = count / 1_000_000; return millions % 1 === 0 ? `${millions}M` : `${millions.toFixed(1)}M`; } if (count >= 1_000) { const thousands = count / 1_000; return thousands % 1 === 0 ? `${thousands}K` : `${thousands.toFixed(1)}K`; } return count.toString();}
/** * List available models, optionally filtered by search pattern */export async function listModels(modelRegistry: ModelRegistry, searchPattern?: string): Promise<void> { const loadError = modelRegistry.getError(); if (loadError) { console.error(chalk.yellow(`Warning: errors loading models.json:\n${loadError}`)); }
const models = modelRegistry.getAvailable();
if (models.length === 0) { console.log(formatNoModelsAvailableMessage()); return; }
// Apply fuzzy filter if search pattern provided let filteredModels: Model<Api>[] = models; if (searchPattern) { filteredModels = fuzzyFilter(models, searchPattern, (m) => `${m.provider} ${m.id}`); }
if (filteredModels.length === 0) { console.log(`No models matching "${searchPattern}"`); return; }
// Sort by provider, then by model id filteredModels.sort((a, b) => { const providerCmp = a.provider.localeCompare(b.provider); if (providerCmp !== 0) return providerCmp; return a.id.localeCompare(b.id); });
// Calculate column widths const rows = filteredModels.map((m) => ({ provider: m.provider, model: m.id, context: formatTokenCount(m.contextWindow), maxOut: formatTokenCount(m.maxTokens), thinking: m.reasoning ? "yes" : "no", images: m.input.includes("image") ? "yes" : "no", }));
const headers = { provider: "provider", model: "model", context: "context", maxOut: "max-out", thinking: "thinking", images: "images", };
const widths = { provider: Math.max(headers.provider.length, ...rows.map((r) => r.provider.length)), model: Math.max(headers.model.length, ...rows.map((r) => r.model.length)), context: Math.max(headers.context.length, ...rows.map((r) => r.context.length)), maxOut: Math.max(headers.maxOut.length, ...rows.map((r) => r.maxOut.length)), thinking: Math.max(headers.thinking.length, ...rows.map((r) => r.thinking.length)), images: Math.max(headers.images.length, ...rows.map((r) => r.images.length)), };
// Print header const headerLine = [ headers.provider.padEnd(widths.provider), headers.model.padEnd(widths.model), headers.context.padEnd(widths.context), headers.maxOut.padEnd(widths.maxOut), headers.thinking.padEnd(widths.thinking), headers.images.padEnd(widths.images), ].join(" "); console.log(headerLine);
// Print rows for (const row of rows) { const line = [ row.provider.padEnd(widths.provider), row.model.padEnd(widths.model), row.context.padEnd(widths.context), row.maxOut.padEnd(widths.maxOut), row.thinking.padEnd(widths.thinking), row.images.padEnd(widths.images), ].join(" "); console.log(line); }}