diff --git a/deployments/ai-stack/openwebui-models/image_studio.json b/deployments/ai-stack/openwebui-models/image_studio.json index c9d9a5f..5c93a30 100644 --- a/deployments/ai-stack/openwebui-models/image_studio.json +++ b/deployments/ai-stack/openwebui-models/image_studio.json @@ -1,7 +1,7 @@ [ { "id": "image-studio", - "base_model_id": "mistral-nemo:12b", + "base_model_id": "huihui_ai/qwen3.5-abliterated:9b", "name": "Image Studio", "params": { "system": "/no_think\n\nYou are an image-tool dispatcher. You do not respond in prose. Every user message MUST result in exactly one tool call.\n\nROUTING:\n- If the user attached an image → call edit_image(edit_instruction, style, denoise)\n- Otherwise → call generate_image(prompt, style)\n\nFire the tool on the FIRST message, with no preamble. Do not write a 'plan', 'approach', 'steps', 'breakdown', or any explanation before calling. Do not ask clarifying questions. Do not say what you are about to do. If the request is vague, pick reasonable defaults and call the tool — the user iterates after.\n\nSTYLES (pick one):\n photo photorealistic photo / portrait / cinematic\n juggernaut alternate photoreal — sharper, more saturated\n pony anime, cartoon, manga, stylised illustration\n general catch-all when nothing else fits\n furry-nai anthropomorphic, NAI-trained mix\n furry-noob anthropomorphic, NoobAI base\n furry-il anthropomorphic, Illustrious base (default for any furry/anthro request)\n\nFor edit_image, pick style for the DESIRED OUTPUT, not the input image. Default denoise 0.7. Use 0.3–0.5 for subtle changes (recolor, style transfer) and 0.85–1.0 for radical reimaginings.\n\nWrite rich, descriptive prompts (subject, action, environment, lighting, mood, framing). Do NOT add quality tags like 'masterpiece', 'best quality', 'score_9', 'absurdres' — the tool prepends the correct tags per style. Do NOT set sampler, CFG, steps, scheduler — the tool picks them.\n\nAFTER the tool returns, write at most one short sentence noting your style choice and offering one iteration idea. The image is already shown to the user; do not describe it.", diff --git a/deployments/ai-stack/openwebui-models/image_studio.md b/deployments/ai-stack/openwebui-models/image_studio.md index 6b25531..91f82a1 100644 --- a/deployments/ai-stack/openwebui-models/image_studio.md +++ b/deployments/ai-stack/openwebui-models/image_studio.md @@ -38,7 +38,7 @@ prompts. Verify after import: | Field | Value | | ----- | ----- | | Name | `Image Studio` | -| Base Model | `mistral-nemo:12b` (best tool-caller in this stack) | +| Base Model | `huihui_ai/qwen3.5-abliterated:9b` (vision-capable, 256K context, abliterated). Pull via `init-models.sh` first. | | Description | `Image generation and routing across SDXL checkpoints.` | | System Prompt | Paste the block from [System prompt](#system-prompt) below. | | Tools | enable **only** `smart_image_gen` | @@ -107,41 +107,42 @@ ignore it). Drop it only if it actually causes problems. The shipped preset sets `meta.capabilities.vision: true` so Open WebUI allows users to attach images to chats with this model. Two paths: -### Quick path — non-vision LLM with vision flag enabled (default) +### Default — `huihui_ai/qwen3.5-abliterated:9b` -`mistral-nemo:12b` isn't a vision model. With `vision: true` in the -preset, Open WebUI still permits image uploads; the image flows through -to `edit_image` via the tool's `__messages__` / `__files__` injection -and ComfyUI does the visual work in img2img. The LLM doesn't need to -"see" the image — it just needs to recognise the user attached one -and call `edit_image` with the user's instruction. +The shipped preset uses Qwen 3.5 abliterated 9B as the base — vision- +capable, 256K context, no censorship hedging. Preseed via +`init-models.sh` (an `s3_pull` line is already in place; see +[Mirroring models to S3](../README.md#mirroring-models-to-s3) for the +mirror workflow). -Limitation: the LLM can't answer questions like "what's in this -image?" or "describe this" — it never sees pixels. Editing with an -explicit instruction works fine. +**Important Qwen 3.x quirk:** thinking mode is on by default and +breaks native function calling — the model "thinks" about how to use +the tool instead of just calling it. The shipped system prompt starts +with `/no_think` to suppress this. If the model still plans instead +of firing the tool, also set `enable_thinking: false` in **Advanced +Params → Custom Parameters** (API-level enforcement). -### Better path — actual vision-capable LLM +### Alternatives -Swap the base model to one that can see. Recommended Ollama tags: +If Qwen 3.5 isn't a fit (size, language preferences, abliteration +caveats), other vision-capable Ollama tags worth trying: -- `qwen2.5vl:7b` — small, modern, good vision +- `qwen2.5vl:7b` — smaller, no thinking mode, very reliable tool-caller - `llama3.2-vision:11b` — Meta's vision variant, ~7 GB -- `minicpm-v:8b` — fast, capable, good for editing tasks +- `minicpm-v:8b` — fast, capable -Pull one via the Ollama init script or the Open WebUI model UI, then -edit Image Studio's Base Model field to point at it. The LLM can now -write smarter edit instructions ("the dog in the foreground is -backlit, route to photo style with denoise 0.5 to preserve the rim -light") and confirm what it sees before generating. +To swap, change `base_model_id` in `image_studio.json` (or the Base +Model field if you imported manually) and pull the model via +`init-models.sh` or the Open WebUI model UI. -To preseed automatically, add to `init-models.sh`: +### Non-vision base model -```sh -ollama pull qwen2.5vl:7b -``` - -Then change `base_model_id` in `image_studio.json` (or the Base Model -field if you imported manually) to `qwen2.5vl:7b`. +If you'd rather use a text-only LLM (e.g. `mistral-nemo:12b`), +keep `vision: true` in the preset so Open WebUI still permits image +attachments; the image flows through to `edit_image` via +`__messages__` / `__files__` and ComfyUI does the visual work. The +LLM can't see the image, but for explicit edit instructions ("change +the background to a sunset") that doesn't matter. ## Why this works when a generic chat model didn't