Reasoning Guard: Proxy-Level Loop Detection for Local LLM Inference

A developer running Qwen3.6 MoE behind a vLLM proxy hit a common reliability issue: runaway reasoning loops where the model repeats itself inside a reasoning block, burning tokens and stalling agents. At 180+ tokens/sec, even a 20–30 second loop wastes GPU time and blocks client requests. They built a lightweight guard that lives in the proxy layer and enforces deterministic checks on the streaming output before it reaches the client.
Architecture
Client → Proxy → vLLM → Model
The proxy intercepts the streaming response as it leaves vLLM. It does not modify model weights, call a second LLM, or use embeddings or semantic analysis. All checks are cheap and deterministic.
What It Checks
- Reasoning token caps (configurable per effort level)
- Repeated paragraph detection
- Sliding-window n-gram repetition
- Repeated sentence fingerprinting
- Fuzzy opening-pattern detection (catches loops like “Actually, I think I’ve found it…”)
- Cut-and-continue recovery path
Recovery Flow
When the guard triggers, it:
- Stops the upstream stream
- Captures the reasoning produced so far
- Reissues the request with that reasoning baked in as prior assistant context
- Disables thinking for the continuation
- Merges phase 1 and phase 2 usage stats
Because vLLM prefix caching is already active, the continuation is effectively seamless. Phase 2 usually resumes with ~50–100ms TTFT, so the client sees reasoning flow directly into the final answer instead of hanging.
Observability
The proxy logs each trigger with:
- Whether the guard fired
- Trigger reason
- Token cap used
- Reasoning token count
- Merged total usage
- Stream-end metadata
Result
Before: occasional 2000+ token reasoning blocks that went nowhere. After: the model still reasons when useful, but runaway thinking gets cut and redirected into an answer. The author describes it as a “proxy-level seatbelt for local LLM inference.”
No model surgery, no extra LLM calls — just stream interception, token counting, loop detection, and a clean recovery path. The guard has been validated end-to-end through the live proxy against real trace logs.
📖 Read the full source: r/LocalLLaMA
👀 See Also

Open-source CLI tool sdf uses Claude to manage stacked GitHub PRs
sdf is a free, MIT-licensed CLI tool that automates stacked pull request workflows using git and gh, with Claude CLI handling complex tasks like diff analysis and conflict resolution.

Framework for AI Teammates in Slack, Operated Entirely from Claude Code
ginnie-agents is an open-source framework for running autonomous AI agents with Slack identities, three-tier memory, cron routines, and work hours — all configured and operated through Claude Code. Requires Claude Code Max, Docker, Node 22+, and a Slack workspace with app creation permissions.

Clooks: A Persistent Hook Runtime for Claude Code
Clooks is a persistent HTTP daemon that handles Claude Code hook dispatch without process spawning, reducing latency from ~34.6ms to ~0.31ms per invocation. It includes automatic migration, LLM handlers with prompt templates, dependency resolution, and plugin packaging.

Claude Code Memory Leak Fix for Linux Homelabs
A developer discovered Claude Code has a severe memory leak in glibc malloc that consumed 400GB RAM and crashed their Proxmox homelab, then created a two-tier guard solution with LD_PRELOAD shim and watchdog.