|
|
import { HF_HUB_URL } from "../config.js"; |
|
|
import { isUrl } from "./isUrl.js"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const taskCache = new Map<string, { task: string; date: Date }>(); |
|
|
const CACHE_DURATION = 10 * 60 * 1000; |
|
|
const MAX_CACHE_ITEMS = 1000; |
|
|
|
|
|
export interface DefaultTaskOptions { |
|
|
fetch?: typeof fetch; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export async function getDefaultTask( |
|
|
model: string, |
|
|
accessToken: string | undefined, |
|
|
options?: DefaultTaskOptions |
|
|
): Promise<string | null> { |
|
|
if (isUrl(model)) { |
|
|
return null; |
|
|
} |
|
|
|
|
|
const key = `${model}:${accessToken}`; |
|
|
let cachedTask = taskCache.get(key); |
|
|
|
|
|
if (cachedTask && cachedTask.date < new Date(Date.now() - CACHE_DURATION)) { |
|
|
taskCache.delete(key); |
|
|
cachedTask = undefined; |
|
|
} |
|
|
|
|
|
if (cachedTask === undefined) { |
|
|
const modelTask = await (options?.fetch ?? fetch)(`${HF_HUB_URL}/api/models/${model}?expand[]=pipeline_tag`, { |
|
|
headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : {}, |
|
|
}) |
|
|
.then((resp) => resp.json()) |
|
|
.then((json) => json.pipeline_tag) |
|
|
.catch(() => null); |
|
|
|
|
|
if (!modelTask) { |
|
|
return null; |
|
|
} |
|
|
|
|
|
cachedTask = { task: modelTask, date: new Date() }; |
|
|
taskCache.set(key, { task: modelTask, date: new Date() }); |
|
|
|
|
|
if (taskCache.size > MAX_CACHE_ITEMS) { |
|
|
|
|
|
taskCache.delete(taskCache.keys().next().value!); |
|
|
} |
|
|
} |
|
|
|
|
|
return cachedTask.task; |
|
|
} |
|
|
|