inference-server
Version:
Libraries and server to build AI applications. Adapters to various native bindings allowing local inference. Integrate it with your application, or use as a microservice.
59 lines (53 loc) • 2.24 kB
text/typescript
import path from 'node:path'
interface ResolveModelFileLocationArgs {
url?: string
filePath?: string
modelsCachePath: string
}
/**
* Resolve a model file/url to an absolute path to either a file or directory.
* @param url - Optional URL to the model file. Location will be derived from it.
* @param filePath - Optional relative (to modelsCachePath) or absolute file path that short-circuits resolution.
* @param modelsCachePath - The path to the models cache directory.
* @returns The abs file path on the local filesystem.
* @throws If the model location could not be resolved.
*/
export function resolveModelFileLocation({ url, filePath, modelsCachePath }: ResolveModelFileLocationArgs) {
if (filePath) {
// immediately return if an absolute path is provided
if (path.isAbsolute(filePath)) {
return filePath
} else {
return path.join(modelsCachePath, filePath)
}
}
if (url) {
const parsedUrl = new URL(url)
let destinationPath = filePath
// support branches for huggingface URLs
if (parsedUrl.hostname === 'huggingface.co' && !destinationPath) {
const pathnameSegments = parsedUrl.pathname.split('/')
if (pathnameSegments[1] === 'datasets') {
const repoOrg = pathnameSegments[2]
const repoName = pathnameSegments[3]
// make sure theres no minus in the branch name
const branch = (pathnameSegments[5] || 'main').replace(/-/g, '')
const trailingPath = pathnameSegments.slice(6).join('/')
destinationPath = path.join(modelsCachePath, parsedUrl.hostname, 'datasets', repoOrg, `${repoName}-${branch}`, trailingPath)
} else {
const repoOrg = pathnameSegments[1]
const repoName = pathnameSegments[2]
const branch = (pathnameSegments[4] || 'main').replace(/-/g, '')
const trailingPath = pathnameSegments.slice(5).join('/')
destinationPath = path.join(modelsCachePath, parsedUrl.hostname, repoOrg, `${repoName}-${branch}`, trailingPath)
}
}
// otherwise, use the hostname and last path segment
if (!destinationPath) {
const fileName = parsedUrl.pathname.split('/').pop()
destinationPath = path.join(modelsCachePath, parsedUrl.hostname, fileName || '')
}
return destinationPath
}
throw new Error('Failed to resolve model location')
}