mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 20:21:09 +02:00
feat(comic): image-model picker — OpenAI + Nano Banana wählbar
Comic nutzte bisher 'openai/gpt-image-2' hartcodiert auf drei Ebenen (generate-panel.ts, comic.generatePanel MCP-Tool, generate_comic_panel AI-Tool). Wardrobe hat seit dem Nano-Banana-Commit einen TryOnModelPicker mit drei Optionen — Comic spiegelt das jetzt 1:1. Wählbar in allen drei Editoren (PanelEditor, BatchPanelEditor, StoryboardSuggester): - openai/gpt-image-2 (Default) — OpenAI GPT-image Standard - google/gemini-3-pro-image-preview — Nano Banana Pro, hohe Konsistenz, teurer - google/gemini-3.1-flash-image-preview — Nano Banana 2, neuestes, schnell, günstig Implementierung: - api/generate-panel.ts: PanelModel Union + DEFAULT_PANEL_MODEL + model? Param auf RunPanelGenerateParams + im HTTP-Body weitergereicht (vorher hart 'openai/gpt-image-2'). - components/PanelModelPicker.svelte: neue Komponente, Stil/Markup identisch zu TryOnModelPicker für Muskel-Memory über beide Flows. - components/PanelEditor.svelte: `let model = $state(DEFAULT_PANEL_MODEL)` + Picker oberhalb der Qualität-/Format-Leiste + model im runPanelGenerate-Call. - components/BatchPanelEditor.svelte: gleiche Änderung — ein Model pro Batch (nicht pro Row) damit der Batch konsistent rendert. - components/StoryboardSuggester.svelte: gleiches Pattern; der Picker landet zwischen "Panel manuell"-Button und dem Qualität/Format-Block. - packages/mana-tool-registry/src/modules/comic.ts: generatePanel Input-Schema bekommt model mit zod.enum() + default; im Body wird input.model durchgereicht. - packages/shared-ai/src/tools/schemas.ts: generate_comic_panel bekommt Parameter 'model' optional mit gleicher Enum-Liste. - apps/mana/apps/web/src/lib/modules/comic/tools.ts: isValidModel Guard + Parameter-Validierung; model an runPanelGenerate. Keine Story-Level-Persistierung — model bleibt lokaler State pro Editor-Mount. Eine model-Spalte auf comicStories würde Migration brauchen und die Wahl ist eh ad-hoc pro Panel/Batch. Plan-Doc (§2.1) dokumentiert die Entscheidung + die drei Optionen. 107 shared-ai tests weiter grün. check + validate:all clean. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
5501f472ae
commit
364522db87
9 changed files with 252 additions and 6 deletions
|
|
@ -282,6 +282,21 @@ const generatePanelInput = z.object({
|
|||
/** 1024×1024 square is the default; pass `1024x1536` for vertical
|
||||
* framings (e.g. webtoon tall panels). */
|
||||
size: z.enum(['1024x1024', '1024x1536']).optional(),
|
||||
/** Rendering backend. Same closed set as Wardrobe's Try-On picker:
|
||||
* - `openai/gpt-image-2` (default) — mid-tier cost, strong
|
||||
* structure, server-side fallback to gpt-image-1 if org is
|
||||
* unverified.
|
||||
* - `google/gemini-3-pro-image-preview` — Nano Banana Pro, strong
|
||||
* character consistency, higher cost.
|
||||
* - `google/gemini-3.1-flash-image-preview` — Nano Banana 2,
|
||||
* newest + fast + cheap. */
|
||||
model: z
|
||||
.enum([
|
||||
'openai/gpt-image-2',
|
||||
'google/gemini-3-pro-image-preview',
|
||||
'google/gemini-3.1-flash-image-preview',
|
||||
])
|
||||
.default('openai/gpt-image-2'),
|
||||
});
|
||||
|
||||
const generatePanelOutput = z.object({
|
||||
|
|
@ -353,7 +368,7 @@ export const comicGeneratePanel: ToolSpec<typeof generatePanelInput, typeof gene
|
|||
body: JSON.stringify({
|
||||
prompt: composed,
|
||||
referenceMediaIds,
|
||||
model: 'openai/gpt-image-2',
|
||||
model: input.model,
|
||||
quality: input.quality,
|
||||
size: effectiveSize,
|
||||
n: 1,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue