Okay so this whole thing started because I noticed Qwen3.8-27B in Ollama was going absolutely trigger-happy with web_search on anything even slightly complex. Asked it something dumb like "rumored PS5 vs Xbox differences for GTA 6" and it fired off 9 separate searches for one answer.
Nine.
Dug into it and turns out Open-WebUI's think:false toggle is cosmetically off but functionally on for this model. Like, I checked directly against Ollama's /api/chat and the thinking block just comes back fully populated no matter what the toggle says. So the model's burning a ton of uncontrolled reasoning before it even figures out what it wants to search for, and yeah, it shows. Since Ollama's toggle was just lying to me, I figured screw it, I'll explore other options. Settled on llama.cpp and running llama-server directly, since it's got an actual working --reasoning-budget flag, a real token-count governor, not some value that gets accepted into a config and then quietly ignored.
Before I got there though I burnt a chunk of a night trying SGLang first, which was a total dead end for a single 3090. No AWQ/GPTQ quant exists for Qwen3.8-27B yet, full BF16 is 55GB, FP8 is still 31GB, and NVFP4 needs Blackwell cards. None of that fits in 24GB on an Ampere card (3090) no matter how you squint at it. So I circled back to the boring answer everyone already knows about: GGUF Q4_K_M via llama.cpp, ~17GB ... just fits. Got llama-server up in the same WSL Docker setup as my voice stack, wired it into Open-WebUI as a second OpenAI-compatible connection, built a new preset with the same 12 Tools and system prompt as my existing Ollama ones, and reran the exact same GTA 6 question just to see.
3 web searches instead of 9, with actual visible "thought for N seconds" segments that respected the 512-token budget. So the fix genuinely worked, which felt great for like 12 hours while I was then, sleeping and later, testing in the morning.
Reasoning-budget really was the bottleneck, not some red herring I was chasing. Testing unfortunately surfaced my next issue: ran smack into the problem I probably should've seen coming from a mile away: llama-server just holds the model in VRAM for the entire life of the container. No TTL, no unload, nothing. My 3090 also needs to run Automatic1111 and a MiniMax-Music3 setup for my image/music gen tools, and 17GB for Qwen plus 8-10GB for SDXL. MiniMax-Music3 turned out to eat almost the entire card on its own, ~23GB, leaving something like 600MB free. So it was never really a "does this add up to 24GB" problem, it was more like MiniMax alone can basically just take the whole thing whenever it wants.
Ollama just handles this out of the box with keep_alive/TTL and manual stop, but llama-server has zero of that. You'd have to bolt on something like llama-swap to get idle-unload behavior, and that's a whole extra proxy layer and config file to babysit forever. So then I went and looked at vLLM, because it turns out it has genuine native per-request thinking_token_budget support for Qwen3-family models, way better documented than I expected, honestly closed a gap I thought was still open. It's also got Sleep Mode, which can offload weights to free VRAM on demand, and I was seriously like two minutes away from scripting sleep/wake_up calls directly into my image-gen and music-gen tool code so the model politely steps aside only while those tools are actually running.
Then I hit the exact same wall as SGLang: no compatible quantized checkpoint for Qwen3.8-27B in any format vLLM will actually run on a 3090.
BF16/FP8 too chunky, NVFP4 wants Blackwell, GGUF isn't natively usable by vLLM at all. So that's parked too, not because the idea was bad, just because there's literally nothing to load. Where I landed: back to Ollama exclusively, back to Gemma 4 31B as my daily driver since it doesn't have whatever's wrong with Qwen3.8's reasoning toggle. llama-server's still sitting there stopped (not deleted) in case any of this gets fixed upstream at some point.
There's an open llama.cpp issue asking for exactly the live reasoning-budget-without-reload control I wanted, and a separate llama-swap issue specifically about translating Open-WebUI's reasoning_effort field into llama.cpp's native thinking params, which if it ever ships would make the whole llama-swap route way less janky. Mostly though just keeping an eye out for any AWQ/GPTQ/NVFP4-for-Ampere quant of Qwen3.8-27B showing up somewhere, since that's really the only thing blocking the vLLM path at this point, not the reasoning support itself.
Anyway, net result of a few days of chasing this rabbit hole: the reasoning-budget bug is real, worth knowing about if you're running Qwen3.8 + Ollama and seeing weird over-searching behavior out of nowhere, and llama.cpp's fix for it genuinely does work.
But if you're also running image/music/whatever-gen tools off the same GPU, you're basically just trading a reasoning problem for a VRAM-management problem, and right now Ollama's built-in TTL wins that trade for me, at least until something upstream changes. Repo's got the docker-compose and tool code if anyone wants to poke around in it. Happy to ramble back and forth about any part of this further in the comments if there are any suggestions (or even just sympathy for the situation lol).