code.verboo.ai router: 400 invalid request on role:"tool" messages for minimax-m3, glm-4.7-flash, qwen3.6-27b

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 5, 2026

Summary

The OpenAI-compatible router at https://code.verboo.ai/router/v1/chat/completions returns HTTP 400 {"code":"unclassified","error":"invalid request"} for any request that contains a role:"tool" message when the model is minimax-m3, glm-4.7-flash, or qwen3.6-27b. The identical payload succeeds on glm-5.2, kimi-k2.7, deepseek-v4-flash, deepseek-v4-pro, mimo-v2.5, mimo-v2.5-pro.

This breaks agent frameworks (e.g. Hermes Agent) that rely on tool-call round-trips for those three models: every real agent session fails on the first tool result.

Isolation

For minimax-m3:

  • tools array alone → 200
  • assistant message with tool_calls (no tool message) → 200
  • any message with role:"tool" → 400 (regardless of content type: plain string, JSON string, or even without a preceding assistant tool_calls)

Repro

import json, os, urllib.request, urllib.error
KEY = os.environ["VERBOO_ULTRA_API_KEY"]  # set your own key
URL = "https://code.verboo.ai/router/v1/chat/completions"
tools = [{"type":"function","function":{"name":"f_hi","description":"say hi",
         "parameters":{"type":"object","properties":{}}}}]
msgs = [
  {"role":"user","content":"call a tool"},
  {"role":"assistant","content":"","tool_calls":[
     {"id":"call_x","type":"function","function":{"name":"f_hi","arguments":"{}"}}]},
  {"role":"tool","tool_call_id":"call_x","content":"done"},
]
for model in ["minimax-m3","glm-4.7-flash","qwen3.6-27b","glm-5.2","deepseek-v4-flash"]:
    req = urllib.request.Request(URL, data=json.dumps(
        {"model": model, "messages": msgs, "tools": tools}).encode(),
        headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"})
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            print(model, "->", r.status)
    except urllib.error.HTTPError as e:
        print(model, "->", e.code, e.read().decode()[:120])

Expected output: 200 for all models. Actual: 400 invalid request for the first three.

Notes

  • Error body is a generic invalid request with no detail about which field is rejected, so clients can't self-diagnose.
  • All three failing models are listed by GET /models, so they look fully supported.

Environment

  • Tested 2026-08-04 against https://code.verboo.ai/router/v1
  • Key type: VERBOO_ULTRA_API_KEY (vbk_ultra_...)

View original on GitHub ↗