Files
agent-estate-wiki/incidents/2026-08-04-omniroute-free-deepseek-silent-stops.md

45 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [2026-08-04] OmniRoute free-DeepSeek silent stops (empty-after-tool)
## Status
Mitigated — combos reworked; upstream still degraded.
## Symptom
On **both** Hermes instances (ops/Tusk + the other instance), turns using `deepseek-flash-free` (and `smart-route` via `good-free`) did one tool call, then went **silently** — no text, no error. "continue" → one more tool call → silent stop again.
## Root cause
The free-DeepSeek upstreams behind the combos started returning **valid-but-empty HTTP 200s right after a tool_calls turn** (no content, no further tool call). Hermes can't distinguish "empty" from "model chose to stop" → ends turn silently. Began **2026-08-01 ~09:14 UTC**, still active. OmniRoute log markers:
```
[STREAM] Empty assistant response after tool_calls completion (<provider>:<model>)
[ProxyEgress] <provider>/<conn-hash> ... status=error
```
Per-model evidence (counts in `storage.sqlite` era log):
- `238d5978/deepseek-v4-flash` — 63× empty-after-tool (conn `d4b9fee0`, 189 proxy errors)
- `238d5978/deepseek-v4-flash-0731` — 70× empty-after-tool
- `eb5af0da/deepseek-v4-flash-thinking:free` (conn `f8169018`) — 504 proxy errors (combo #1 slot)
- `nvidia` deepseek + `opencode-zen` deepseek-free — noisy, errors
Strategy trap: both combos used `priority`, which retries the **same** broken connection and never fails over on an empty 200.
## Change applied (2026-08-04, ~03:30 AWST)
Edited `combos` in `/var/lib/omniroute/storage.sqlite` on CT600 (live DB, hot-reloads — no restart):
- **`deepseek-flash-free`** — strategy `priority``fill-first`; 8 → 7 models: healthy free first (`mimo-v2.5-free`, `laguna-s-2.1:free` ×2 providers, `step-3.7-flash`, `glm-5.2-cheap:free`), one deepseek (`deepseek-v4-flash-thinking:free`) demoted to last resort.
- **`good-free`** — strategy `priority``fill-first`; 15 → 12 models. **Dropped** the proven culprits: `238d5978/deepseek-v4-flash`, `nvidia/deepseek-ai/deepseek-v4-pro`, `nvidia/deepseek-ai/deepseek-v4-flash`. `opencode/deepseek-v4-flash-free` kept as last resort.
Backup of both pre-change rows: `/tmp/combo_backup_20260804.json` on the Hermes gateway LXC.
## Verification
- Live API (`/v1/combos`) reflects both changes immediately (hot reload).
- 2-step tool-call round-trip through `deepseek-flash-free` returns proper final content.
- Direct round-trips (stream + non-stream) through the OLD combo were also healthy — the failure needs the degraded upstream + real session, hence counts not repro.
## Follow-ups
- Upstream free-DeepSeek tier still degraded; re-check counts in a few days and restore deepseek-first ordering if it recovers.
- Consider `auto`+explorationRate for self-tuning if free tier stays flaky.
- Hermes-side: empty-post-tool turns are nudge/retry/fallback handled, but still end silently once exhausted — possible future improvement: surface "(empty after tool calls)" more visibly.
## Refs
- [[systems/omniroute]]