({
router,
modelId,
endpoint,
}: {
router: RouterName
modelId?: string
endpoint?: string
})
| 34 | } |
| 35 | |
| 36 | export const getModelEndpoints = async ({ |
| 37 | router, |
| 38 | modelId, |
| 39 | endpoint, |
| 40 | }: { |
| 41 | router: RouterName |
| 42 | modelId?: string |
| 43 | endpoint?: string |
| 44 | }): Promise<ModelRecord> => { |
| 45 | // OpenRouter is the only provider that supports model endpoints, but you |
| 46 | // can see how we'd extend this to other providers in the future. |
| 47 | if (router !== "openrouter" || !modelId || !endpoint) { |
| 48 | return {} |
| 49 | } |
| 50 | |
| 51 | const key = getCacheKey(router, modelId) |
| 52 | let modelProviders = memoryCache.get<ModelRecord>(key) |
| 53 | |
| 54 | if (modelProviders) { |
| 55 | // console.log(`[getModelProviders] NodeCache hit for ${key} -> ${Object.keys(modelProviders).length}`) |
| 56 | return modelProviders |
| 57 | } |
| 58 | |
| 59 | modelProviders = await getOpenRouterModelEndpoints(modelId) |
| 60 | |
| 61 | // Copy model-level capabilities from the parent model to each endpoint |
| 62 | // These are capabilities that don't vary by provider (tools, reasoning, etc.) |
| 63 | if (Object.keys(modelProviders).length > 0) { |
| 64 | const parentModels = await getModels({ provider: "openrouter" }) |
| 65 | const parentModel = parentModels[modelId] |
| 66 | |
| 67 | if (parentModel) { |
| 68 | // Copy model-level capabilities to all endpoints |
| 69 | // Clone arrays to avoid shared mutable references |
| 70 | for (const endpointKey of Object.keys(modelProviders)) { |
| 71 | modelProviders[endpointKey].supportsReasoningEffort = parentModel.supportsReasoningEffort |
| 72 | modelProviders[endpointKey].supportedParameters = parentModel.supportedParameters |
| 73 | ? [...parentModel.supportedParameters] |
| 74 | : undefined |
| 75 | } |
| 76 | } |
| 77 | } |
| 78 | |
| 79 | if (Object.keys(modelProviders).length > 0) { |
| 80 | // console.log(`[getModelProviders] API fetch for ${key} -> ${Object.keys(modelProviders).length}`) |
| 81 | memoryCache.set(key, modelProviders) |
| 82 | |
| 83 | try { |
| 84 | await writeModelEndpoints(key, modelProviders) |
| 85 | // console.log(`[getModelProviders] wrote ${key} endpoints to file cache`) |
| 86 | } catch (error) { |
| 87 | console.error(`[getModelProviders] error writing ${key} endpoints to file cache`, error) |
| 88 | } |
| 89 | |
| 90 | return modelProviders |
| 91 | } |
| 92 | |
| 93 | try { |
no test coverage detected