Local LLMs for an Infra-Monitoring Agent: The Ollama think Bug, and Why I Still Chose a Cloud Model A developer building a local-first infrastructure monitoring agent with PicoClaw encountered an undocumented Ollama bug where the 'think' parameter is not supported in Modelfile syntax, forcing a workaround via prompt template manipulation. After testing local models like Gemma4 and Qwen3, the developer chose DeepSeek V4 Flash via a self-hosted LiteLLM proxy for reliable tool-calling in production. OpenClaw went from a weekend project to one of the most-starred repos on GitHub in under five months, and now everyone's using it to run their inbox, their calendar, their whole digital life. I wanted the opposite: the smallest possible slice of that ecosystem, running local-first, doing one boring job well: infrastructure monitoring. This is what happened when I actually tried to build that, including an undocumented Ollama bug that ate an evening. OpenClaw is the reason "AI agent" stopped meaning a chatbot and started meaning something that reads your email, files your GitHub issues, reschedules your calendar, and runs semi-autonomously through a Discord or Telegram interface. It's impressive: full agent fleets, OAuth into a dozen services, voice mode, phone apps. It's also the wrong shape for something small enough to trust running unattended near infrastructure I'm responsible for. That's what pulled me toward PicoClaw, a much leaner, CLI-first agent runtime that keeps the same core idea a model, a toolset, a sandboxed workspace, a channel to talk to it through without the sprawl. No inbox integration, no calendar, no dozen-service OAuth surface. Just an agent loop pointed at a workspace folder and a set of tools I explicitly allow. The install was the easy part. The real work started with deciding which model to actually trust running inside it. Agent runtime: PicoClaw CLI, no web UI, no Docker Tier 1 local: tested — not adopted yet see below Tier 2 local: Qwen3, no-think config Tier 3 cloud: DeepSeek V4 Flash, via a self-hosted LiteLLM proxy "No Docker" up there isn't a stylistic choice. I tried the Docker install first, since that's what most of the setup guides default to. On Mac, PicoClaw's Docker path expects the model endpoint at host.docker.internal , and getting that to line up with a local Ollama instance and a tunneled cloud endpoint at the same time turned into more plumbing than it was worth. The native binary just uses localhost for everything. Docker is abandoned for this setup entirely now just for simplicity. PicoLM a tiny, instant-response local model meant for trivial one-word answers is sitting installed and untouched. I don't have a use case for it yet in an infra-monitoring context; "what time is it" isn't the problem I'm solving. It's on the list to revisit once there's an actual low-stakes, high-frequency task worth routing to something that fast. The real work went into everything above tier 1. I went in expecting a local model something like Gemma4 or Qwen3, running entirely on-device to be good enough for real analysis work. A lot of people online are running exactly that combination successfully for agent tool-use, and I don't doubt them. I tried several variants of Gemma4 and a few Qwen builds, specifically stress-testing tool-calling reliability rather than just chat quality, since an agent that can't reliably invoke read file or run command is useless no matter how articulate its prose is. Reasoning mode has to be turned off, and not the way you'd expect. Qwen3's default "thinking" output is great for open-ended reasoning and actively harmful for an agent loop that expects a clean, immediate tool call: the model talks itself in circles before ever calling anything. The obvious fix is a runtime flag: PARAMETER think false That throws Error: unknown parameter 'think' . Ollama's Modelfile syntax doesn't support it at all, despite it looking exactly like every other PARAMETER line that does work. It's not documented anywhere obvious, and it's an easy hour to lose assuming you've got a typo. The actual fix has to happen in the prompt template, not the parameters block. You build a custom model from a Modelfile whose TEMPLATE does three specific things: /no think to every single user message before it reaches the model