Skip to content

fix(opencode): declare free-tier lowercase quartet tool fingerprint and canonical session identity - #24

Merged
b3nw merged 1 commit into
prod/antigravity-claude-5-5from
feat/opencode-free-tier-fingerprint-rebased
Oct 10, 2026
Merged

b3nw merged 1 commit into
prod/antigravity-claude-5-5from
feat/opencode-free-tier-fingerprint-rebased

Conversation

@claw-io

@claw-io claw-io commented Oct 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

Keyless OpenCode free-tier models answered 403 FreeTierError ("OpenCode's free tier can only be used from within OpenCode") because upstream strictly enforces client fingerprinting on keyless free-tier requests (https://opencode.ai/zen/v1).

Ports upstream diegosouzapw/OmniRoute#15322 and #14013:

  • Tool Quartet Fingerprint: Upstream requires the lowercase file-search quartet bash, glob, grep, read to be present in body.tools. Implements open-sse/utils/opencodeFingerprint.ts to inject missing quartet members, canonicalize client casing (e.g. Bash -> bash), and restore the caller's tool spelling in outgoing SSE and JSON responses.
  • Free-Tier Contract: Implements open-sse/executors/opencodeFreeTierContract.ts to gate free models on the zen surface, force streaming, and lazily rebuild JSON for non-streaming downstream callers.
  • Canonical Session IDs: open-sse/utils/opencodeHeaders.ts generates canonical ses_[0-9a-f]{12}[0-9A-Za-z]{14} session IDs and msg_ request IDs matching the OpenCode client contract.
  • Versioned User-Agent: Sets default User-Agent to opencode/1.18.31 and preserves client UAs satisfying the version rule (>= 1.17).

Validation

  • npm run typecheck:core: Clean (0 errors).
  • bash local-ops/scripts/github-pre-push-gate.sh: All leak scans and pre-push verification gates passed.
  • Unit tests:
    • tests/unit/opencode-free-tier-fingerprint.test.ts: 31/31 passed.
    • tests/unit/opencode-cli-headers-synthesis-5997.test.ts: 9/9 passed.
    • Full suite of 354 opencode unit tests passed.

…nd canonical session identity

Match upstream OpenCode free-tier request contract and client fingerprint
requirements to resolve HTTP 403 FreeTierError ("OpenCode's free tier can
only be used from within OpenCode").

- Port upstream cheaper-inference/OmniRoute#15322 and #14013:
  - Add open-sse/utils/opencodeFingerprint.ts: inject canonical lowercase
    file-search quartet (`bash`, `glob`, `grep`, `read`) into body.tools,
    canonicalize client casing on dispatch, and restore caller's tool spelling
    in SSE/JSON responses.
  - Add open-sse/executors/opencodeFreeTierContract.ts: gate free models on
    zen surface, enforce streaming, and lazily rebuild JSON for non-streaming
    callers.
  - Update open-sse/utils/opencodeHeaders.ts: default User-Agent to
    opencode/1.18.31 (>= 1.17) and synthesize canonical `ses_` and `msg_` IDs.
  - Update OpencodeExecutor to apply free tier contract and restore names.
  - Add unit tests in tests/unit/opencode-free-tier-fingerprint.test.ts (31 passing).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants