Skip to content

v1.2.11 — native tools on free models, self-healing routes

Latest

Choose a tag to compare

@duyban23 duyban23 released this 17 Oct 01:27

Fixed

  • Free models can call tools again. The free-tier gate authenticates the client
    through headers alone (User-Agent, x-opencode-client,
    x-opencode-session + x-opencode-session-id); once the duplicate session
    header from 1.2.10 is present it accepts a normal pi request. The body-shaping
    layer (title-generator marker, flattened history, stripped tools) and the
    text-tool protocol that replaced native tools are therefore unnecessary, and
    they were what broke tool calls: big-pickle (zero-cost but without a -free
    suffix) was never converted back into a tool call, mimo-v2.6-flash-free
    emitted several calls inside one fenced block and lost all of them, and
    weaker models invented their own fences. Both are removed; free models now
    send and receive native tools, verified end-to-end (read + bash + follow-up
    turn) on big-pickle, muse-spark-1.3-contributor-free,
    mimo-v2.6-flash-free, nemotron-3-ultra-free and
    nemotron-3.5-lightning-free.
  • GATE_UA tracks opencode 2.0.32. The gate also re-checked its content rules:
    free requests now need stream: true and at least one tool definition, and
    the versionless opencode/cli user agent is rejected; pi's own request
    satisfies all of it, so the body still passes through untouched.
  • Cached catalogs cannot pin a stale protocol any more: healZenRoute
    re-derives the free-tier route from the model id on every read, in
    getModels()/getAllModels() — the accessors every request path uses.
    A models-store.json written by an older version (which survives upgrades
    because pi's post-login refresh is offline) no longer causes
    400 ModelProtocolUnsupported.

Highlights

  • Free models call native tools again — read, bash, multi-turn — with the
    request body passing through untouched.
  • A stale models-store.json can no longer pin a model to a dead protocol;
    routing is re-derived from code on every read (no more
    400 ModelProtocolUnsupported after upgrades).
  • Gate header User-Agent tracks opencode 2.0.32; probed against the live
    gateway (free requests need stream: true + at least one tool definition,
    both of which pi sends anyway).
  • Verified end-to-end on big-pickle, mimo-v2.6-flash-free,
    nemotron-3-ultra-free, nemotron-3.5-lightning-free,
    muse-spark-1.3-contributor-free, and the new beam-free,
    glm-5.3-flash-free, nemotron-3.5-super-vl-free, space-bunny-free,
    deepseek-v4.1-flash-free.

Upgrade: pi install npm:opencode-zen-oauth then restart pi.