jan/web/app/_hooks/useGetDownloadedModels.ts
James dbe2cc848e allow pagination for querying hf
Signed-off-by: James <james@jan.ai>
2023-10-06 16:46:47 +07:00

91 lines
2.4 KiB
TypeScript

import { ModelVersion, Product, ProductType } from "@/_models/Product";
import { useEffect, useState } from "react";
import { executeSerial } from "../../../electron/core/plugin-manager/execution/extension-manager";
import { DataService, ModelManagementService } from "../../shared/coreService";
import { SearchModelParamHf } from "@/_models/hf/SearchModelParam.hf";
export function useGetDownloadedModels() {
const [downloadedModels, setDownloadedModels] = useState<Product[]>([]);
useEffect(() => {
getDownloadedModels().then((downloadedModels) => {
setDownloadedModels(downloadedModels);
});
}, []);
return { downloadedModels };
}
export async function getDownloadedModels(): Promise<Product[]> {
const downloadedModels: Product[] = await executeSerial(
DataService.GET_FINISHED_DOWNLOAD_MODELS
);
return downloadedModels ?? [];
}
export async function getModelFiles(): Promise<Product[]> {
const downloadedModels: Product[] = await executeSerial(
ModelManagementService.GET_DOWNLOADED_MODELS
);
return downloadedModels ?? [];
}
export async function searchHfModels(
params: SearchModelParamHf
): Promise<QueryProductResult> {
const result = await executeSerial(
ModelManagementService.SEARCH_HF_MODELS,
params
);
const products: Product[] = result.data.map((model: any) => {
const modelVersions: ModelVersion[] = [];
for (const [, file] of Object.entries(model.files)) {
const modelVersion: ModelVersion = {
path: file.path,
type: file.type,
downloadUrl: file.downloadLink,
size: file.size,
};
modelVersions.push(modelVersion);
}
const p = {
id: model.id,
slug: model.name,
name: model.name,
description: model.name,
avatarUrl: "",
longDescription: model.name,
technicalDescription: model.name,
author: model.name.split("/")[0],
version: "1.0.0",
modelUrl: "https://google.com",
nsfw: false,
greeting: "Hello there",
type: ProductType.LLM,
createdAt: -1,
accelerated: true,
totalSize: -1,
format: "",
status: "Not downloaded",
releaseDate: -1,
availableVersions: modelVersions,
};
return p;
});
return {
data: products,
hasMore: result.hasMore,
};
}
// TODO define somewhere else
export type QueryProductResult = {
data: Product[];
hasMore: boolean;
};