anomalyco / anomalyco/opencode

v2 (opencode2): max_tokens never sent for @ai-sdk/openai-compatible models, limit.output ignored, thinking turns truncate at provider default

Open
#47,398 1 comment 0 reactions 1 assignee View on GitHub

@rekram1-node is already working on this.

Since Sep 4, 2026.

2.0
Dominant language
TypeScript
Stars
209k
Forks
27.5k
PR merge metrics
PR metrics pending

Description

Description

On the v2 CLI (opencode2, @opencode-ai/cli beta) requests to @ai-sdk/openai-compatible models go out without max_tokens, regardless of limit.output in the provider config. Stable opencode 1.18.20 with the same config sends max_tokens: 32000.

Because the field is missing, the upstream applies its own default budget. In my setup (DeepSeek V4 with thinking enabled, behind an OpenAI-compatible proxy) the effective cap was 4096 tokens: long-thinking turns spend the whole budget on reasoning and finish with finish_reason: length and empty content, at exactly 4096 output tokens. Same symptom as #46595 (Bedrock), different route.

Captured outbound body from the beta (sanitized, messages/tools omitted):

{
  "model": "combo-deepseek-v4-flash",
  "stream": true,
  "stream_options": { "include_usage": true },
  "store": false,
  "prompt_cache_key": "ses_…"
}

Same session on opencode/1.18.20:

{ "model": "combo-deepseek-v4-flash", "stream": true, "max_tokens": 32000, … }

Where it goes wrong, as far as I can tell:

  • packages/core/src/session/runner/llm.ts builds LLM.request({ model, http, providerOptions, system, messages, tools, toolChoice }) with no generation block.
  • packages/llm/src/protocols/openai-chat.ts fromRequest emits max_tokens: generation?.maxTokens, which is undefined, so the key is dropped.
  • packages/core/src/session/runner/model.ts (withDefaults) does put limit.output into route.defaults.limits, but nothing projects it into generation.maxTokens. v1 did this via ProviderTransform.maxOutputTokens (min(limit.output, 32000) || 32000).

The Anthropic route (anthropic-messages.ts) is built from the same request, so it is likely affected too, but I only verified the openai-compatible path.

Related: #46595 (same root cause on Bedrock), #29363 (v1 32K cap of limit.output).

Plugins

none

OpenCode version

@opencode-ai/cli 0.0.0-beta-19086 (opencode2). Not reproducible on opencode 1.18.20.

Steps to reproduce
  1. Config:
    "provider": {
      "my-proxy": {
        "npm": "@ai-sdk/openai-compatible",
        "options": { "baseURL": "https://…/v1", "apiKey": "…" },
        "models": {
          "combo-deepseek-v4-flash": { "limit": { "context": 1000000, "output": 131072 } }
        }
      }
    }
    
  2. Point the base URL at anything that logs request bodies (a local proxy is enough).
  3. Send a prompt from opencode2: the body has no max_tokens. Send the same prompt from opencode 1.18.20: max_tokens: 32000 is present.
  4. With a thinking model, long turns end at the provider's default output cap, reasoning only, no text.
Screenshot and/or share link

n/a (request bodies above)

Operating System

macOS 15.7.9

Terminal

n/a (not terminal-specific)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.