(models: Map<string, ModelEntry>)
| 249 | } |
| 250 | |
| 251 | function buildLabEntries(models: Map<string, ModelEntry>) { |
| 252 | const labs = new Map<string, ModelEntry[]>(); |
| 253 | |
| 254 | for (const model of models.values()) { |
| 255 | const existing = labs.get(model.labId) ?? []; |
| 256 | existing.push(model); |
| 257 | labs.set(model.labId, existing); |
| 258 | } |
| 259 | |
| 260 | return [...labs.entries()] |
| 261 | .map(([id, modelEntries]) => { |
| 262 | const providers = new Set<string>(); |
| 263 | const families = new Set<string>(); |
| 264 | let lastReleased: string | undefined; |
| 265 | let lastUpdated: string | undefined; |
| 266 | |
| 267 | for (const model of modelEntries) { |
| 268 | for (const provider of model.providers) providers.add(provider.providerId); |
| 269 | if (model.metadata.family) families.add(model.metadata.family); |
| 270 | if ( |
| 271 | model.metadata.release_date && |
| 272 | (!lastReleased || model.metadata.release_date > lastReleased) |
| 273 | ) { |
| 274 | lastReleased = model.metadata.release_date; |
| 275 | } |
| 276 | if ( |
| 277 | model.metadata.last_updated && |
| 278 | (!lastUpdated || model.metadata.last_updated > lastUpdated) |
| 279 | ) { |
| 280 | lastUpdated = model.metadata.last_updated; |
| 281 | } |
| 282 | } |
| 283 | |
| 284 | return { |
| 285 | id, |
| 286 | name: labName(id), |
| 287 | description: LabMetadata.get(id)?.description, |
| 288 | models: sortModels(modelEntries), |
| 289 | providerCount: providers.size, |
| 290 | families: [...families].sort(), |
| 291 | lastReleased, |
| 292 | lastUpdated, |
| 293 | }; |
| 294 | }) |
| 295 | .sort((a, b) => a.name.localeCompare(b.name)); |
| 296 | } |
| 297 | |
| 298 | function buildSearchItems( |
| 299 | models: ModelEntry[], |
no test coverage detected