feat: image content

This commit is contained in:
Cristina Poncela Cubeiro
2026-04-28 13:43:28 +02:00
parent 9848b3145a
commit c3c10737d8
14 changed files with 385 additions and 27 deletions

View File

@@ -88,20 +88,29 @@ function getBedrockBaseUrl(modelId: string): string {
async function fetchOpenRouterModels(): Promise<Model<any>[]> {
try {
console.log("Fetching models from OpenRouter API...");
const response = await fetch("https://openrouter.ai/api/v1/models");
const data = await response.json();
const [generalResponse, imageResponse] = await Promise.all([
fetch("https://openrouter.ai/api/v1/models"),
fetch("https://openrouter.ai/api/v1/models?output_modalities=image"),
]);
const generalData = await generalResponse.json();
const imageData = await imageResponse.json();
const combinedModels = new Map<string, any>();
for (const model of [...generalData.data, ...imageData.data]) {
combinedModels.set(model.id, model);
}
const models: Model<any>[] = [];
for (const model of data.data) {
// Only include models that support tools
if (!model.supported_parameters?.includes("tools")) continue;
// Parse provider from model ID
let provider: KnownProvider = "openrouter";
let modelKey = model.id;
modelKey = model.id; // Keep full ID for OpenRouter
for (const model of combinedModels.values()) {
const supportsTools = model.supported_parameters?.includes("tools");
const supportsImageOutput = model.architecture?.output_modalities?.includes("image");
if (!supportsTools && !supportsImageOutput) continue;
// Parse input modalities
const input: ("text" | "image")[] = ["text"];
@@ -123,6 +132,7 @@ async function fetchOpenRouterModels(): Promise<Model<any>[]> {
provider,
reasoning: model.supported_parameters?.includes("reasoning") || false,
input,
compat: supportsImageOutput ? { openRouterImageGeneration: true } : undefined,
cost: {
input: inputCost,
output: outputCost,
@@ -130,12 +140,12 @@ async function fetchOpenRouterModels(): Promise<Model<any>[]> {
cacheWrite: cacheWriteCost,
},
contextWindow: model.context_length || 4096,
maxTokens: model.top_provider?.max_completion_tokens || 4096,
maxTokens: model.top_provider?.max_completion_tokens || model.context_length || 4096,
};
models.push(normalizedModel);
}
console.log(`Fetched ${models.length} tool-capable models from OpenRouter`);
console.log(`Fetched ${models.length} tool-capable or image-generation models from OpenRouter`);
return models;
} catch (error) {
console.error("Failed to fetch OpenRouter models:", error);