Spaces:
Running
on
L40S
Running
on
L40S
File size: 3,947 Bytes
4450790 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
import type {RgthreeModelInfo} from "typings/rgthree.js";
type ModelInfoType = "loras";
class RgthreeApi {
private baseUrl: string;
getCheckpointsPromise: Promise<string[]> | null = null;
getSamplersPromise: Promise<string[]> | null = null;
getSchedulersPromise: Promise<string[]> | null = null;
getLorasPromise: Promise<string[]> | null = null;
getWorkflowsPromise: Promise<string[]> | null = null;
constructor(baseUrl?: string) {
this.baseUrl = baseUrl || "./rgthree/api";
}
apiURL(route: string) {
return `${this.baseUrl}${route}`;
}
fetchApi(route: string, options?: RequestInit) {
return fetch(this.apiURL(route), options);
}
async fetchJson(route: string, options?: RequestInit) {
const r = await this.fetchApi(route, options);
return await r.json();
}
async postJson(route: string, json: any) {
const body = new FormData();
body.append("json", JSON.stringify(json));
return await rgthreeApi.fetchJson(route, {method: "POST", body});
}
getLoras(force = false) {
if (!this.getLorasPromise || force) {
this.getLorasPromise = this.fetchJson("/loras", {cache: "no-store"});
}
return this.getLorasPromise;
}
async fetchApiJsonOrNull<T>(route: string, options?: RequestInit) {
const response = await this.fetchJson(route, options);
if (response.status === 200 && response.data) {
return (response.data as T) || null;
}
return null;
}
/**
* Fetches the lora information.
*
* @param light Whether or not to generate a json file if there isn't one. This isn't necessary if
* we're just checking for values, but is more necessary when opening an info dialog.
*/
async getLorasInfo(lora: string, light?: boolean): Promise<RgthreeModelInfo | null>;
async getLorasInfo(light?: boolean): Promise<RgthreeModelInfo[] | null>;
async getLorasInfo(...args: any) {
return this.getModelInfo("loras", ...args);
}
async refreshLorasInfo(file: string): Promise<RgthreeModelInfo | null>;
async refreshLorasInfo(): Promise<RgthreeModelInfo[] | null>;
async refreshLorasInfo(file?: string) {
return this.refreshModelInfo("loras", file);
}
async clearLorasInfo(file?: string): Promise<void> {
return this.clearModelInfo("loras", file);
}
/**
* Saves partial data sending it to the backend..
*/
async saveLoraInfo(
file: string,
data: Partial<RgthreeModelInfo>,
): Promise<RgthreeModelInfo | null> {
return this.saveModelInfo("loras", file, data);
}
private async getModelInfo(type: ModelInfoType, ...args: any) {
const params = new URLSearchParams();
const isSingle = typeof args[0] == "string";
if (isSingle) {
params.set("file", args[0]);
}
params.set("light", (isSingle ? args[1] : args[0]) === false ? "0" : "1");
const path = `/${type}/info?` + params.toString();
return await this.fetchApiJsonOrNull<RgthreeModelInfo[] | RgthreeModelInfo>(path);
}
private async refreshModelInfo(type: ModelInfoType, file?: string) {
const path = `/${type}/info/refresh` + (file ? `?file=${encodeURIComponent(file)}` : "");
const infos = await this.fetchApiJsonOrNull<RgthreeModelInfo[] | RgthreeModelInfo>(path);
return infos;
}
private async clearModelInfo(type: ModelInfoType, file?: string) {
const path = `/${type}/info/clear` + (file ? `?file=${encodeURIComponent(file)}` : "");
await this.fetchApiJsonOrNull<RgthreeModelInfo[]>(path);
return;
}
private async saveModelInfo(
type: ModelInfoType,
file: string,
data: Partial<RgthreeModelInfo>,
): Promise<RgthreeModelInfo | null> {
const body = new FormData();
body.append("json", JSON.stringify(data));
return await this.fetchApiJsonOrNull<RgthreeModelInfo>(
`/${type}/info?file=${encodeURIComponent(file)}`,
{cache: "no-store", method: "POST", body},
);
}
}
export const rgthreeApi = new RgthreeApi();
|