| class RgthreeApi { |
| constructor(baseUrl) { |
| this.getCheckpointsPromise = null; |
| this.getSamplersPromise = null; |
| this.getSchedulersPromise = null; |
| this.getLorasPromise = null; |
| this.getWorkflowsPromise = null; |
| this.baseUrl = baseUrl || "./rgthree/api"; |
| } |
| apiURL(route) { |
| return `${this.baseUrl}${route}`; |
| } |
| fetchApi(route, options) { |
| return fetch(this.apiURL(route), options); |
| } |
| async fetchJson(route, options) { |
| const r = await this.fetchApi(route, options); |
| return await r.json(); |
| } |
| async postJson(route, json) { |
| 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(route, options) { |
| const response = await this.fetchJson(route, options); |
| if (response.status === 200 && response.data) { |
| return response.data || null; |
| } |
| return null; |
| } |
| async getLorasInfo(...args) { |
| return this.getModelInfo("loras", ...args); |
| } |
| async refreshLorasInfo(file) { |
| return this.refreshModelInfo("loras", file); |
| } |
| async clearLorasInfo(file) { |
| return this.clearModelInfo("loras", file); |
| } |
| async saveLoraInfo(file, data) { |
| return this.saveModelInfo("loras", file, data); |
| } |
| async getModelInfo(type, ...args) { |
| 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(path); |
| } |
| async refreshModelInfo(type, file) { |
| const path = `/${type}/info/refresh` + (file ? `?file=${encodeURIComponent(file)}` : ""); |
| const infos = await this.fetchApiJsonOrNull(path); |
| return infos; |
| } |
| async clearModelInfo(type, file) { |
| const path = `/${type}/info/clear` + (file ? `?file=${encodeURIComponent(file)}` : ""); |
| await this.fetchApiJsonOrNull(path); |
| return; |
| } |
| async saveModelInfo(type, file, data) { |
| const body = new FormData(); |
| body.append("json", JSON.stringify(data)); |
| return await this.fetchApiJsonOrNull(`/${type}/info?file=${encodeURIComponent(file)}`, { cache: "no-store", method: "POST", body }); |
| } |
| } |
| export const rgthreeApi = new RgthreeApi(); |
|
|