feat: add admin accounts and image templates

This commit is contained in:
inman
2026-07-03 11:25:25 +08:00
parent d98e58adfa
commit c3ea9f0eb1
61 changed files with 7016 additions and 199 deletions

View File

@@ -2,9 +2,8 @@ import { createHash } from "node:crypto";
import { assemblePrompt, type PromptAssemblyInput, type PromptMaterial } from "@/lib/prompt/assembler";
import { findGenerationJobByIdempotency } from "@/lib/server/data-store";
import { submitImageJob, type SubmitImageJobInput } from "@/lib/server/generation-service";
import { DEFAULT_OWNER_ID } from "@/lib/server/runtime";
import { submitVideoJob, type SubmitVideoJobInput } from "@/lib/server/video-generation-service";
import type { PublicApiClient } from "@/lib/server/public-api-auth";
import { publicApiOwnerId, type PublicApiClient } from "@/lib/server/public-api-auth";
import type { EnabledImageCapability, GenerationCapability, GenerationJob } from "@/lib/types";
export class PublicApiConflictError extends Error {
@@ -46,10 +45,11 @@ export async function createPublicGenerationJob(input: {
origin: string;
}): Promise<{ job: GenerationJob; reused: boolean }> {
const capability = input.body.capability || "image.generate";
const ownerId = publicApiOwnerId(input.client);
const idempotencyKey = input.request.headers.get("idempotency-key") || input.body.idempotencyKey;
const fingerprint = idempotencyKey ? fingerprintBody(input.body) : undefined;
if (idempotencyKey && fingerprint) {
const existing = await findGenerationJobByIdempotency(input.client.id, idempotencyKey);
const existing = await findGenerationJobByIdempotency(input.client.id, idempotencyKey, ownerId);
if (existing) {
if (existing.idempotencyFingerprint !== fingerprint) {
throw new PublicApiConflictError("Idempotency key was already used with a different request body.");
@@ -59,7 +59,7 @@ export async function createPublicGenerationJob(input: {
}
const common = {
ownerId: DEFAULT_OWNER_ID,
ownerId,
externalClientId: input.client.id,
idempotencyKey,
idempotencyFingerprint: fingerprint,