(options?: ApiHandlerOptions)
| 95 | */ |
| 96 | |
| 97 | export async function getOpenRouterModels(options?: ApiHandlerOptions): Promise<Record<string, ModelInfo>> { |
| 98 | const models: Record<string, ModelInfo> = {} |
| 99 | const baseURL = options?.openRouterBaseUrl || "https://openrouter.ai/api/v1" |
| 100 | |
| 101 | try { |
| 102 | const response = await axios.get<OpenRouterModelsResponse>(`${baseURL}/models`) |
| 103 | const result = openRouterModelsResponseSchema.safeParse(response.data) |
| 104 | const data = result.success ? result.data.data : response.data.data |
| 105 | |
| 106 | if (!result.success) { |
| 107 | console.error("OpenRouter models response is invalid", result.error.format()) |
| 108 | } |
| 109 | |
| 110 | for (const model of data) { |
| 111 | const { id, architecture, top_provider, supported_parameters = [] } = model |
| 112 | |
| 113 | // Skip image generation models (models that output images) |
| 114 | if (architecture?.output_modalities?.includes("image")) { |
| 115 | continue |
| 116 | } |
| 117 | |
| 118 | const parsedModel = parseOpenRouterModel({ |
| 119 | id, |
| 120 | model, |
| 121 | inputModality: architecture?.input_modalities, |
| 122 | outputModality: architecture?.output_modalities, |
| 123 | maxTokens: top_provider?.max_completion_tokens, |
| 124 | supportedParameters: supported_parameters, |
| 125 | }) |
| 126 | |
| 127 | models[id] = parsedModel |
| 128 | } |
| 129 | } catch (error) { |
| 130 | console.error( |
| 131 | `Error fetching OpenRouter models: ${JSON.stringify(error, Object.getOwnPropertyNames(error), 2)}`, |
| 132 | ) |
| 133 | } |
| 134 | |
| 135 | return models |
| 136 | } |
| 137 | |
| 138 | /** |
| 139 | * getOpenRouterModelEndpoints |
no test coverage detected