fix: convert search hgf repo include mmproj models

This commit is contained in:
Faisal Amir 2025-08-15 22:23:34 +07:00
parent 9afeb5e514
commit 050d38c0ab
2 changed files with 37 additions and 14 deletions

View File

@ -115,8 +115,8 @@ function Hub() {
return (b.downloads || 0) - (a.downloads || 0) return (b.downloads || 0) - (a.downloads || 0)
} else { } else {
return ( return (
new Date(b.created_at || 0).getTime() - new Date(b.createdAt || 0).getTime() -
new Date(a.created_at || 0).getTime() new Date(a.createdAt || 0).getTime()
) )
} }
}) })

View File

@ -27,7 +27,8 @@ export interface CatalogModel {
num_quants: number num_quants: number
quants: ModelQuant[] quants: ModelQuant[]
mmproj_models?: MMProjModel[] mmproj_models?: MMProjModel[]
created_at?: string num_mmproj: number
createdAt?: string
readme?: string readme?: string
tools?: boolean tools?: boolean
} }
@ -44,7 +45,7 @@ export interface HuggingFaceRepo {
library_name?: string library_name?: string
tags: string[] tags: string[]
pipeline_tag?: string pipeline_tag?: string
created_at: string createdAt: string
last_modified: string last_modified: string
private: boolean private: boolean
disabled: boolean disabled: boolean
@ -155,21 +156,30 @@ export const fetchHuggingFaceRepo = async (
export const convertHfRepoToCatalogModel = ( export const convertHfRepoToCatalogModel = (
repo: HuggingFaceRepo repo: HuggingFaceRepo
): CatalogModel => { ): CatalogModel => {
// Format file size helper
const formatFileSize = (size?: number) => {
if (!size) return 'Unknown size'
if (size < 1024 ** 3) return `${(size / 1024 ** 2).toFixed(1)} MB`
return `${(size / 1024 ** 3).toFixed(1)} GB`
}
// Extract GGUF files from the repository siblings // Extract GGUF files from the repository siblings
const ggufFiles = const ggufFiles =
repo.siblings?.filter((file) => repo.siblings?.filter((file) =>
file.rfilename.toLowerCase().endsWith('.gguf') file.rfilename.toLowerCase().endsWith('.gguf')
) || [] ) || []
// Convert GGUF files to quants format // Separate regular GGUF files from mmproj files
const quants = ggufFiles.map((file) => { const regularGgufFiles = ggufFiles.filter(
// Format file size (file) => !file.rfilename.toLowerCase().includes('mmproj')
const formatFileSize = (size?: number) => { )
if (!size) return 'Unknown size'
if (size < 1024 ** 3) return `${(size / 1024 ** 2).toFixed(1)} MB`
return `${(size / 1024 ** 3).toFixed(1)} GB`
}
const mmprojFiles = ggufFiles.filter((file) =>
file.rfilename.toLowerCase().includes('mmproj')
)
// Convert regular GGUF files to quants format
const quants = regularGgufFiles.map((file) => {
// Generate model_id from filename (remove .gguf extension, case-insensitive) // Generate model_id from filename (remove .gguf extension, case-insensitive)
const modelId = file.rfilename.replace(/\.gguf$/i, '') const modelId = file.rfilename.replace(/\.gguf$/i, '')
@ -180,15 +190,28 @@ export const convertHfRepoToCatalogModel = (
} }
}) })
// Convert mmproj files to mmproj_models format
const mmprojModels = mmprojFiles.map((file) => {
const modelId = file.rfilename.replace(/\.gguf$/i, '')
return {
model_id: sanitizeModelId(modelId),
path: `https://huggingface.co/${repo.modelId}/resolve/main/${file.rfilename}`,
file_size: formatFileSize(file.size),
}
})
return { return {
model_name: repo.modelId, model_name: repo.modelId,
description: `**Tags**: ${repo.tags?.join(', ')}`,
developer: repo.author, developer: repo.author,
downloads: repo.downloads || 0, downloads: repo.downloads || 0,
createdAt: repo.createdAt,
num_quants: quants.length, num_quants: quants.length,
quants: quants, quants: quants,
created_at: repo.created_at, num_mmproj: mmprojModels.length,
mmproj_models: mmprojModels,
readme: `https://huggingface.co/${repo.modelId}/resolve/main/README.md`, readme: `https://huggingface.co/${repo.modelId}/resolve/main/README.md`,
description: `**Tags**: ${repo.tags?.join(', ')}`,
} }
} }