auto-save 2026-05-19 10:35 (+3, ~8, -1)
This commit is contained in:
52
src/app/api/character/lock-from-upload/route.ts
Normal file
52
src/app/api/character/lock-from-upload/route.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { NextResponse } from 'next/server';
|
||||
import { buildCharacterSpec, cleanupCharacterAnchor } from '@/lib/packGenerator';
|
||||
import { detectProvider } from '@/lib/providers';
|
||||
import { loadSession, saveSession } from '@/lib/storage';
|
||||
import type { LockCharacterFromUploadRequest, LockCharacterResponse } from '@/lib/types';
|
||||
|
||||
export const runtime = 'nodejs';
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function POST(req: Request) {
|
||||
const { sessionId, subjectImageId, userHint, force = false } = (await req.json()) as LockCharacterFromUploadRequest;
|
||||
|
||||
if (!sessionId || !subjectImageId) {
|
||||
return NextResponse.json({ error: 'sessionId and subjectImageId required' }, { status: 400 });
|
||||
}
|
||||
|
||||
const session = await loadSession(sessionId);
|
||||
if (!session) return NextResponse.json({ error: 'session not found' }, { status: 404 });
|
||||
|
||||
const sourceImage = session.images.find(image =>
|
||||
image.id === subjectImageId || image.meta?.uploadedImageId === subjectImageId
|
||||
);
|
||||
if (!sourceImage) return NextResponse.json({ error: 'subject image not found' }, { status: 404 });
|
||||
|
||||
if (!force && session.characterSpec?.sourceImageId === sourceImage.id && session.characterSpec.cleanReferenceImageUrl) {
|
||||
return NextResponse.json({
|
||||
characterSpec: session.characterSpec,
|
||||
provider: detectProvider(),
|
||||
} satisfies LockCharacterResponse);
|
||||
}
|
||||
|
||||
try {
|
||||
if (userHint?.trim()) session.prompt = userHint.trim();
|
||||
const characterSpec = await buildCharacterSpec(session, sourceImage);
|
||||
const cleaned = await cleanupCharacterAnchor({
|
||||
session,
|
||||
sourceImage,
|
||||
characterSpec,
|
||||
force: true,
|
||||
preserveLevel: 'strict',
|
||||
});
|
||||
session.characterSpec = cleaned.characterSpec;
|
||||
await saveSession(session);
|
||||
|
||||
return NextResponse.json({
|
||||
characterSpec: cleaned.characterSpec,
|
||||
provider: cleaned.provider,
|
||||
} satisfies LockCharacterResponse);
|
||||
} catch (error) {
|
||||
return NextResponse.json({ error: String(error) }, { status: 500 });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user