list-models.tsโข3.04 kB
import { ProviderManager } from '../providers/manager.js';
import { ModelInfo } from '../providers/types.js';
import { duckArt } from '../utils/ascii-art.js';
import { logger } from '../utils/logger.js';
export async function listModelsTool(
providerManager: ProviderManager,
args: Record<string, unknown>
) {
const { provider, fetch_latest = false } = args as {
provider?: string;
fetch_latest?: boolean;
};
try {
let response = `${duckArt.panel}\n๐ **Available Models**\n\n`;
if (provider) {
// List models for a specific provider
const providerInfo = providerManager.getAllProviders().find(p => p.name === provider);
if (!providerInfo) {
throw new Error(`Provider "${provider}" not found`);
}
const models = await providerManager.getAvailableModels(provider);
response += formatProviderModels(providerInfo.info.nickname, provider, models, providerInfo.info.model);
} else {
// List models for all providers
const allProviders = providerManager.getAllProviders();
for (const providerInfo of allProviders) {
try {
const models = await providerManager.getAvailableModels(providerInfo.name);
response += formatProviderModels(
providerInfo.info.nickname,
providerInfo.name,
models,
providerInfo.info.model
);
response += '\n';
} catch (error) {
logger.warn(`Failed to get models for ${providerInfo.name}:`, error);
response += `\n๐ฆ **${providerInfo.info.nickname}** (${providerInfo.name})\n`;
response += ` โ ๏ธ Failed to fetch models\n\n`;
}
}
}
response += `\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n`;
response += fetch_latest ? '๐ Fetched from API' : '๐ Using cached/configured models';
logger.info(`Listed models for ${provider || 'all providers'}`);
return {
content: [
{
type: 'text',
text: response,
},
],
};
} catch (error: unknown) {
logger.error('Error listing models:', error);
throw error;
}
}
function formatProviderModels(
nickname: string,
providerName: string,
models: ModelInfo[],
defaultModel: string
): string {
let output = `\n๐ฆ **${nickname}** (${providerName})\n`;
if (models.length === 0) {
output += ` ๐ญ No models available\n`;
return output;
}
for (const model of models) {
const isDefault = model.id === defaultModel;
const defaultMarker = isDefault ? ' **(default)**' : '';
output += ` โข ${model.id}${defaultMarker}`;
if (model.description) {
output += ` - ${model.description}`;
} else if (model.owned_by) {
output += ` - by ${model.owned_by}`;
}
if (model.context_window) {
output += ` [${model.context_window} tokens]`;
}
output += '\n';
}
return output;
}