forked from pinks/eris
89 lines
2.1 KiB
TypeScript
89 lines
2.1 KiB
TypeScript
|
export async function txt2img(
|
||
|
apiUrl: string,
|
||
|
params: Partial<SdRequest>,
|
||
|
onProgress?: (progress: SdProgressResponse) => void,
|
||
|
signal?: AbortSignal,
|
||
|
): Promise<SdResponse> {
|
||
|
let response: Response | undefined;
|
||
|
let error: unknown;
|
||
|
|
||
|
fetch(new URL("sdapi/v1/txt2img", apiUrl), {
|
||
|
method: "POST",
|
||
|
headers: { "Content-Type": "application/json" },
|
||
|
body: JSON.stringify(params),
|
||
|
}).then(
|
||
|
(resp) => (response = resp),
|
||
|
(err) => (error = err),
|
||
|
);
|
||
|
|
||
|
try {
|
||
|
while (true) {
|
||
|
await new Promise((resolve) => setTimeout(resolve, 3000));
|
||
|
const progressRequest = await fetch(new URL("sdapi/v1/progress", apiUrl));
|
||
|
if (progressRequest.ok) {
|
||
|
const progress = (await progressRequest.json()) as SdProgressResponse;
|
||
|
onProgress?.(progress);
|
||
|
}
|
||
|
if (response != null) {
|
||
|
if (response.ok) {
|
||
|
const result = (await response.json()) as SdResponse;
|
||
|
return result;
|
||
|
} else {
|
||
|
throw new Error(`Request failed: ${response.status} ${response.statusText}`);
|
||
|
}
|
||
|
}
|
||
|
if (error != null) {
|
||
|
throw error;
|
||
|
}
|
||
|
signal?.throwIfAborted();
|
||
|
}
|
||
|
} finally {
|
||
|
if (!response && !error) {
|
||
|
await fetch(new URL("sdapi/v1/interrupt", apiUrl), { method: "POST" });
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export interface SdRequest {
|
||
|
denoising_strength: number;
|
||
|
prompt: string;
|
||
|
seed: number;
|
||
|
sampler_name: unknown;
|
||
|
batch_size: number;
|
||
|
n_iter: number;
|
||
|
steps: number;
|
||
|
cfg_scale: number;
|
||
|
width: number;
|
||
|
height: number;
|
||
|
negative_prompt: string;
|
||
|
send_images: boolean;
|
||
|
save_images: boolean;
|
||
|
}
|
||
|
|
||
|
export interface SdResponse {
|
||
|
images: string[];
|
||
|
parameters: SdRequest;
|
||
|
/** Contains serialized JSON */
|
||
|
info: string;
|
||
|
}
|
||
|
|
||
|
export interface SdProgressResponse {
|
||
|
progress: number;
|
||
|
eta_relative: number;
|
||
|
state: SdProgressState;
|
||
|
/** base64 encoded preview */
|
||
|
current_image: string | null;
|
||
|
textinfo: string | null;
|
||
|
}
|
||
|
|
||
|
export interface SdProgressState {
|
||
|
skipped: boolean;
|
||
|
interrupted: boolean;
|
||
|
job: string;
|
||
|
job_count: number;
|
||
|
job_timestamp: string;
|
||
|
job_no: number;
|
||
|
sampling_step: number;
|
||
|
sampling_steps: number;
|
||
|
}
|