list-models-tool.ts•2.14 kB
import { z } from 'zod';
import { BaseTool, ToolDefinition, ToolResponse } from './base-tool.js';
import { OpenAIClient } from '../openai-client.js';
const ListModelsSchema = z.object({
includeDetails: z.boolean().optional().describe('Include detailed model information')
});
export class ListModelsTool extends BaseTool {
readonly definition: ToolDefinition = {
name: 'list_models',
description: 'List available OpenAI models with metadata and capabilities',
inputSchema: ListModelsSchema
};
constructor(private openaiClient: OpenAIClient) {
super();
}
async execute(args: z.infer<typeof ListModelsSchema>): Promise<ToolResponse> {
try {
const models = await this.openaiClient.listModels();
if (args.includeDetails) {
const detailedInfo = models.map(model => ({
id: model.id,
created: new Date(model.created * 1000).toISOString(),
ownedBy: model.owned_by,
capabilities: this.getModelCapabilities(model.id)
}));
return this.createSuccessResponse(
`Available OpenAI Models (Detailed):\n\n${JSON.stringify(detailedInfo, null, 2)}`
);
} else {
const modelList = models.map(model => `- ${model.id}`).join('\n');
return this.createSuccessResponse(`Available OpenAI Models:\n\n${modelList}`);
}
} catch (error) {
return this.createErrorResponse(`Failed to list models: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
private getModelCapabilities(modelId: string): string[] {
const capabilities: string[] = [];
if (modelId.includes('gpt-5')) {
capabilities.push('reasoning', 'advanced-analysis', 'high-creativity');
}
if (modelId.includes('gpt-4')) {
capabilities.push('multimodal', 'code-generation', 'analysis');
}
if (modelId.includes('gpt-3.5')) {
capabilities.push('chat', 'text-completion', 'fast-responses');
}
if (modelId.includes('davinci') || modelId.includes('text-')) {
capabilities.push('text-completion', 'fine-tuning');
}
return capabilities;
}
}