Compare commits
No commits in common. "a251d5e9659c67466be03b29b74ef9756e9b5c0c" and "477cb03ea26fdef136e324ea0ff527da7d13fba3" have entirely different histories.
a251d5e965
...
477cb03ea2
@ -15,8 +15,8 @@ You can put these in `.env` file or pass them as environment variables.
|
|||||||
Required.
|
Required.
|
||||||
- `SD_API_URL` - URL to Stable Diffusion API. Only used on first run. Default:
|
- `SD_API_URL` - URL to Stable Diffusion API. Only used on first run. Default:
|
||||||
`http://127.0.0.1:7860/`
|
`http://127.0.0.1:7860/`
|
||||||
- `TG_ADMIN_USERNAMES` - Comma separated list of usernames of users that can use admin commands.
|
- `TG_ADMIN_USERS` - Comma separated list of usernames of users that can use admin commands. Only
|
||||||
Only used on first run. Optional.
|
used on first run. Optional.
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
@ -25,9 +25,9 @@ You can put these in `.env` file or pass them as environment variables.
|
|||||||
|
|
||||||
## Codegen
|
## Codegen
|
||||||
|
|
||||||
The Stable Diffusion API in `app/sdApi.ts` is auto-generated. To regenerate it, first start your SD
|
The Stable Diffusion API in `sd/sdApi.ts` is auto-generated. To regenerate it, first start your SD
|
||||||
WebUI with `--nowebui --api`, and then run:
|
WebUI with `--nowebui --api`, and then run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
deno run npm:openapi-typescript http://localhost:7861/openapi.json -o app/sdApi.ts
|
deno run npm:openapi-typescript http://localhost:7861/openapi.json -o sd/sdApi.ts
|
||||||
```
|
```
|
||||||
|
@ -4,7 +4,6 @@ import { paramsRoute } from "./paramsRoute.ts";
|
|||||||
import { sessionsRoute } from "./sessionsRoute.ts";
|
import { sessionsRoute } from "./sessionsRoute.ts";
|
||||||
import { statsRoute } from "./statsRoute.ts";
|
import { statsRoute } from "./statsRoute.ts";
|
||||||
import { usersRoute } from "./usersRoute.ts";
|
import { usersRoute } from "./usersRoute.ts";
|
||||||
import { workersRoute } from "./workersRoute.ts";
|
|
||||||
|
|
||||||
export const serveApi = createLoggerMiddleware(
|
export const serveApi = createLoggerMiddleware(
|
||||||
createPathFilter({
|
createPathFilter({
|
||||||
@ -13,7 +12,6 @@ export const serveApi = createLoggerMiddleware(
|
|||||||
"users": usersRoute,
|
"users": usersRoute,
|
||||||
"settings/params": paramsRoute,
|
"settings/params": paramsRoute,
|
||||||
"stats": statsRoute,
|
"stats": statsRoute,
|
||||||
"workers": workersRoute,
|
|
||||||
}),
|
}),
|
||||||
{ filterStatus: (status) => status >= 400 },
|
{ filterStatus: (status) => status >= 400 },
|
||||||
);
|
);
|
||||||
|
@ -1,103 +0,0 @@
|
|||||||
import { createEndpoint, createMethodFilter, createPathFilter } from "t_rest/server";
|
|
||||||
import { activeGenerationWorkers } from "../app/generationQueue.ts";
|
|
||||||
import { getConfig } from "../app/config.ts";
|
|
||||||
import * as SdApi from "../app/sdApi.ts";
|
|
||||||
import createOpenApiFetch from "openapi_fetch";
|
|
||||||
|
|
||||||
export const workersRoute = createPathFilter({
|
|
||||||
"": createMethodFilter({
|
|
||||||
"GET": createEndpoint(
|
|
||||||
{ query: null, body: null },
|
|
||||||
async () => {
|
|
||||||
const activeWorkers = activeGenerationWorkers;
|
|
||||||
const { sdInstances } = await getConfig();
|
|
||||||
|
|
||||||
const workers = Object.entries(sdInstances).map(([sdInstanceId, sdInstance]) => ({
|
|
||||||
id: sdInstanceId,
|
|
||||||
name: sdInstance.name ?? sdInstanceId,
|
|
||||||
maxResolution: sdInstance.maxResolution,
|
|
||||||
active: activeWorkers.has(sdInstanceId),
|
|
||||||
lastOnline: null,
|
|
||||||
imagesPerMinute: null,
|
|
||||||
pixelsPerSecond: null,
|
|
||||||
pixelStepsPerSecond: null,
|
|
||||||
}));
|
|
||||||
|
|
||||||
return {
|
|
||||||
status: 200,
|
|
||||||
body: { type: "application/json", data: workers },
|
|
||||||
};
|
|
||||||
},
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
|
|
||||||
"{workerId}/loras": createMethodFilter({
|
|
||||||
GET: createEndpoint(
|
|
||||||
{ query: null, body: null },
|
|
||||||
async ({ params }) => {
|
|
||||||
const { sdInstances } = await getConfig();
|
|
||||||
const sdInstance = sdInstances[params.workerId];
|
|
||||||
if (!sdInstance) {
|
|
||||||
return { status: 404, body: { type: "text/plain", data: `Worker not found` } };
|
|
||||||
}
|
|
||||||
const sdClient = createOpenApiFetch<SdApi.paths>({ baseUrl: sdInstance.api.url });
|
|
||||||
const lorasResponse = await sdClient.GET("/sdapi/v1/loras", {
|
|
||||||
headers: sdInstance.api.auth ? { Authorization: sdInstance.api.auth } : undefined,
|
|
||||||
});
|
|
||||||
if (lorasResponse.error) {
|
|
||||||
return {
|
|
||||||
status: 500,
|
|
||||||
body: { type: "text/plain", data: `Loras request failed: ${lorasResponse["error"]}` },
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const loras = (lorasResponse.data as Lora[]).map((lora) => ({
|
|
||||||
name: lora.name,
|
|
||||||
alias: lora.alias ?? null,
|
|
||||||
}));
|
|
||||||
return {
|
|
||||||
status: 200,
|
|
||||||
body: { type: "application/json", data: loras },
|
|
||||||
};
|
|
||||||
},
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
|
|
||||||
"{workerId}/models": createMethodFilter({
|
|
||||||
GET: createEndpoint(
|
|
||||||
{ query: null, body: null },
|
|
||||||
async ({ params }) => {
|
|
||||||
const { sdInstances } = await getConfig();
|
|
||||||
const sdInstance = sdInstances[params.workerId];
|
|
||||||
if (!sdInstance) {
|
|
||||||
return { status: 404, body: { type: "text/plain", data: `Worker not found` } };
|
|
||||||
}
|
|
||||||
const sdClient = createOpenApiFetch<SdApi.paths>({ baseUrl: sdInstance.api.url });
|
|
||||||
const modelsResponse = await sdClient.GET("/sdapi/v1/sd-models", {
|
|
||||||
headers: sdInstance.api.auth ? { Authorization: sdInstance.api.auth } : undefined,
|
|
||||||
});
|
|
||||||
if (modelsResponse.error) {
|
|
||||||
return {
|
|
||||||
status: 500,
|
|
||||||
body: { type: "text/plain", data: `Models request failed: ${modelsResponse["error"]}` },
|
|
||||||
};
|
|
||||||
}
|
|
||||||
const models = modelsResponse.data.map((model) => ({
|
|
||||||
title: model.title,
|
|
||||||
modelName: model.model_name,
|
|
||||||
hash: model.hash,
|
|
||||||
sha256: model.sha256,
|
|
||||||
}));
|
|
||||||
return {
|
|
||||||
status: 200,
|
|
||||||
body: { type: "application/json", data: models },
|
|
||||||
};
|
|
||||||
},
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
});
|
|
||||||
|
|
||||||
export interface Lora {
|
|
||||||
name: string;
|
|
||||||
alias: string | null;
|
|
||||||
metadata: object;
|
|
||||||
}
|
|
@ -50,18 +50,12 @@ export async function getConfig(): Promise<Config> {
|
|||||||
const configEntry = await db.get<Config>(["config"]);
|
const configEntry = await db.get<Config>(["config"]);
|
||||||
const config = configEntry?.value;
|
const config = configEntry?.value;
|
||||||
return {
|
return {
|
||||||
adminUsernames: config?.adminUsernames ?? Deno.env.get("TG_ADMIN_USERNAMES")?.split(",") ?? [],
|
adminUsernames: config?.adminUsernames ?? [],
|
||||||
pausedReason: config?.pausedReason ?? null,
|
pausedReason: config?.pausedReason ?? null,
|
||||||
maxUserJobs: config?.maxUserJobs ?? Infinity,
|
maxUserJobs: config?.maxUserJobs ?? Infinity,
|
||||||
maxJobs: config?.maxJobs ?? Infinity,
|
maxJobs: config?.maxJobs ?? Infinity,
|
||||||
defaultParams: config?.defaultParams ?? {},
|
defaultParams: config?.defaultParams ?? {},
|
||||||
sdInstances: config?.sdInstances ??
|
sdInstances: config?.sdInstances ?? {},
|
||||||
{
|
|
||||||
"local": {
|
|
||||||
api: { url: Deno.env.get("SD_API_URL") ?? "http://127.0.0.1:7860/" },
|
|
||||||
maxResolution: 1024 * 1024,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +109,7 @@ export function SettingsPage(props: { sessionId: string }) {
|
|||||||
}))}
|
}))}
|
||||||
/>
|
/>
|
||||||
</span>
|
</span>
|
||||||
|
span
|
||||||
</label>
|
</label>
|
||||||
<label className="flex flex-col items-stretch gap-1">
|
<label className="flex flex-col items-stretch gap-1">
|
||||||
<span className="text-sm">
|
<span className="text-sm">
|
||||||
|
Loading…
Reference in New Issue
Block a user