Use your Claude Pro or Max subscription with OpenCode. Supports multiple accounts with automatic rotation when you hit rate limits.
AnomalyCo originally published this as a built-in plugin shipped with OpenCode itself. The repo was archived following a legal request from Anthropic. Before it was archived, rmk40 — a frequent contributor unrelated to AnomalyCo — had developed multi-account support that never made it upstream.
This fork continues that work and extends it with deeper research into how the official Claude Code CLI identifies itself to the API. The mimicry was derived by analyzing Claude Code's open source code on GitHub. This isn't just a system prompt injection — see the full mimicry analysis for details.
Educational purpose. This code exists to study how Anthropic's OAuth protocol and Claude Code's HTTP communication pattern work. It is not intended to be used in violation of Anthropic's Terms of Service.
Account risk. There is a real risk of account suspension if Anthropic detects requests are not coming from Claude Code. The mimicry tries hard to make every request look as close as possible to a genuine Claude Code request, but that reduces rather than eliminates the risk. Use at your own risk.
Prerequisites: OpenCode installed, a Claude Pro or Max subscription, and Bun.
# 1. Clone and install
git clone https://github.com/Vacbo/opencode-anthropic-fix.git
cd opencode-anthropic-fix
bun install
# 2. Install the plugin + CLI
bun run install:link
# 3. Start OpenCode and connect
opencode
# Press Ctrl+K → Connect Provider → Anthropic → "Claude Pro/Max (multi-account)"
# Follow the OAuth prompts to log inThat's it. OpenCode will now use your Claude subscription directly. All model costs show as $0.00.
Manual parallel QA: bash scripts/qa-parallel.sh
Fresh reverse-engineering notes for Claude Code login/status flows live in docs/claude-code-oauth-status-flow.md.
A higher-level request graph summary lives in docs/claude-code-request-graph.md.
The original plugin provided basic OAuth support. This fork adds:
- Multi-account support — add up to 10 Claude accounts and rotate between them
- Automatic rate limit handling — when one account hits a limit, the plugin switches to another
- Health scoring — tracks account reliability and prefers healthy accounts
- Standalone CLI — manage accounts without opening OpenCode
- Configurable strategies — sticky, round-robin, or hybrid account selection
- Claude Code signature emulation — full HTTP header, system prompt, beta flag, and metadata mimicry derived from Claude Code's open source code
- OAuth endpoint fingerprint parity — sends Claude Code-style
User-Agenton/v1/oauth/tokenand/v1/oauth/revoketo match current OAuth validation - Effort-based thinking for Opus 4.6 — maps
budgetTokensto effort levels (low/medium/high) and includeseffort-2025-11-24 - Upstream-aligned auto betas —
advanced-tool-use-2025-11-20andfast-mode-2026-02-01auto-included to match Claude Code 2.1.79+ (redact-thinking-2026-02-12available as opt-in to preserve thinking block visibility) - 1M context limit override — patches
model.limit.contextso OpenCode compacts at the right threshold whilemodels.devcatches up - Runtime config + custom betas —
/anthropic set,/anthropic config, and/anthropic betasslash commands for live feature toggling without restarting OpenCode - Files API integration — upload, list, download, and manage files via
/anthropic fileswith endpoint/content-scopedfiles-api-2025-04-14beta injection - Code execution support — available via explicit custom beta opt-in (
code-execution-2025-08-25), not auto-enabled
When Claude Code is installed and authenticated on the same machine, this plugin can reuse its OAuth credentials instead of creating separate tokens. This means:
- Same token: Anthropic sees exactly one client — Claude Code — with no second login event
- Zero detection surface: No duplicate token, no correlation between separate OAuth flows
- Automatic: Credentials are detected and loaded on plugin startup
- Claude Code must be installed (
claudecommand available) - Claude Code must be authenticated (
claude loginhas been run) - On macOS: credentials stored in Keychain (automatic)
- On Linux: credentials stored in
~/.claude/.credentials.json
| Platform | Keychain | File | Notes |
|---|---|---|---|
| macOS | ✓ | ✓ | Primary: Keychain, Fallback: file |
| Linux | ✗ | ✓ | File only |
| Windows | ✗ | ✗ | Not supported (use standard OAuth) |
Control the feature via ~/.config/opencode/anthropic-auth.json:
If you prefer to use separate OAuth tokens:
# Via config file
echo '{"cc_credential_reuse":{"enabled":false}}' > ~/.config/opencode/anthropic-auth.jsonOr set via environment variable (disables auto-detection):
export OPENCODE_ANTHROPIC_CC_REUSE_ENABLED=false"No Claude Code credentials found"
- Claude Code is not installed or not authenticated
- Run
claude loginfirst, then retry
Keychain permission prompts
- First read may trigger macOS Allow/Deny dialog
- Click "Allow" to grant access
- If denied, credentials will fall back to file reading
Token expiry
- CC credentials are refreshed by invoking
claude -p . --model haiku - This triggers CC's own token refresh mechanism
- If Claude Code is not in PATH, refresh will fail and account rotation will occur
Add to your opencode.json:
{
"plugins": ["opencode-anthropic-fix@latest"]
}OpenCode will install and load the plugin automatically on next start.
Best for active development. Edits to source files take effect immediately.
bun run install:linkThis creates:
- Plugin:
~/.config/opencode/plugin/opencode-anthropic-auth-plugin.js→./src/index.ts - CLI:
~/.local/bin/opencode-anthropic-auth→./src/cli.ts
Heads up: the symlink means every edit to
src/hot-reloads into every running OpenCode session. A parse-time error kills live sessions. For wire-visible or experimental changes, prefer the sandbox below.
An isolated OpenCode tree under ./.sandbox/ that runs the plugin as a copied bundle instead of a live symlink. Edits to src/ do not reach the sandbox until you explicitly rebuild, so live OpenCode sessions are protected.
bun run sandbox:up # build + install into .sandbox/
source scripts/sandbox-env.sh # activate sandbox in this shell
opencode # runs against the sandbox plugin
bun run sandbox:reinstall # after each src/ edit
bun run sandbox:down # wipe the sandbox when doneFull guide: docs/dev-sandbox.md.
Bundles the plugin and CLI into self-contained single files (via esbuild) and copies them. No symlinks, no node_modules needed at the destination.
bun run install:copyThis creates:
- Plugin:
~/.config/opencode/plugin/opencode-anthropic-auth-plugin.js(standalone, ~50KB) - CLI:
~/.local/bin/opencode-anthropic-auth(standalone, ~35KB)
bun run uninstallIf ~/.local/bin isn't on your PATH, add it:
export PATH="$HOME/.local/bin:$PATH"- Open OpenCode
- Press
Ctrl+K→ Connect Provider → Anthropic - Select "Claude Pro/Max (multi-account)"
- Open the URL in your browser, authorize, and paste the code back
You can also add accounts directly from the CLI without opening OpenCode:
opencode-anthropic-auth loginRun the auth flow again (via CLI login or OpenCode's Connect Provider). The plugin detects existing accounts and shows a menu:
2 account(s) configured:
1. alice@example.com (active)
2. bob@example.com
(a)dd new, (f)resh start, (m)anage, (c)ancel? [a/f/m/c]:
- Add — log in with another Claude account
- Fresh start — clear all accounts and start over
- Manage — enable/disable/remove accounts inline
- Cancel — keep current setup
This fork is OAuth-first. Use claude.ai login flows (login / reauth) for all accounts.
The CLI lets you manage accounts outside of OpenCode.
opencode-anthropic-auth [command] [args]| Command | Description |
|---|---|
login |
Add a new account via browser OAuth flow |
logout <N> |
Revoke tokens and remove account N |
logout --all |
Revoke all tokens and clear all accounts |
reauth <N> |
Re-authenticate account N with fresh OAuth tokens |
refresh <N> |
Attempt token refresh (no browser needed) |
list |
Show all accounts with status and live usage quotas (default) |
status |
Compact one-liner for scripts/prompts |
switch <N> |
Set account N as active |
enable <N> |
Enable a disabled account |
disable <N> |
Disable an account (skipped in rotation) |
remove <N> |
Remove an account permanently |
reset <N|all> |
Clear rate-limit / failure tracking |
stats |
Show per-account token usage statistics |
reset-stats [N|all] |
Reset usage statistics |
strategy [name] |
Show or change selection strategy |
config |
Show configuration and file paths |
manage |
Interactive account management menu |
help |
Show help |
# Add a new account via browser OAuth
opencode-anthropic-auth login
# See account status (includes live usage quotas)
opencode-anthropic-auth list
# Output:
# Anthropic Multi-Account Status
# # Account Status Failures Rate Limit
# ──────────────────────────────────────────────────────────────
# 1 alice@example.com ● active 0 —
# 5h █████░░░░░ 45% resets in 2h 30m
# 7d █████░░░░░ 45% resets in 4d 16h
# Sonnet 7d ░░░░░░░░░░ 0%
#
# 2 bob@example.com ● ready 0 —
# 5h ███░░░░░░░ 31% resets in 30m
# 7d ███████░░░ 70% resets in 19h 31m
# Sonnet 7d █░░░░░░░░░ 11% resets in 2d 10h
#
# Strategy: sticky | 2 of 2 enabled
# Storage: ~/.config/opencode/anthropic-accounts.json
# Switch active account
opencode-anthropic-auth switch 2
# Re-authenticate a broken account (opens browser)
opencode-anthropic-auth reauth 1
# Quick token refresh without browser
opencode-anthropic-auth refresh 1
# Revoke tokens and remove an account
opencode-anthropic-auth logout 2
# Revoke all tokens and clear all accounts
opencode-anthropic-auth logout --all
# View token usage per account
opencode-anthropic-auth stats
# Reset all usage counters
opencode-anthropic-auth reset-stats all
# One-liner for shell prompts
opencode-anthropic-auth status
# anthropic: 2 accounts (2 active), strategy: sticky, next: #1
# Interactive management
opencode-anthropic-auth manage| Flag | Description |
|---|---|
--force |
Skip confirmation prompts (for remove, logout) |
--all |
Target all accounts (for logout) |
--no-color |
Disable colored output |
--help |
Show help message |
Most commands have short aliases: ln, lo, ra, rf, ls, st, sw, en, dis, rm, strat, cfg, mg.
The plugin registers a built-in /anthropic slash command for account management, feature toggles, and custom beta headers — all without leaving OpenCode.
/anthropic # list accounts (default)
/anthropic usage # full account list + quota windows
/anthropic switch 2
/anthropic refresh 1
/anthropic logout 2 # revoke tokens and remove account 2
/anthropic logout --all # revoke all tokens and clear all accounts
/anthropic stats
Toggle features live without restarting OpenCode. Changes are persisted to anthropic-auth.json.
/anthropic config # show all current settings
/anthropic set emulation on # enable/disable Claude signature emulation
/anthropic set compaction minimal # set prompt compaction mode (minimal/off)
/anthropic set 1m-context on # enable/disable 1M context limit override
/anthropic set idle-refresh on # enable/disable idle account refresh
/anthropic set strategy round-robin # change account selection strategy
/anthropic set debug on # enable/disable debug logging
/anthropic set quiet on # suppress non-error toasts
Add or remove beta flags that get included in every anthropic-beta header. Persisted across sessions.
/anthropic betas # show active betas (auto + custom) with presets
/anthropic betas add <beta-name> # add a custom beta
/anthropic betas remove <beta-name> # remove a custom beta
/anthropic betas add 1m # shortcut => context-1m-2025-08-07
Available preset betas (shown by /anthropic betas):
| Beta | Description |
|---|---|
prompt-caching-scope-2026-01-05 |
Cache control with scope: "org" — free perf win |
context-management-2025-06-27 |
Server-side auto-summarization when context fills |
structured-outputs-2025-12-15 |
Strict JSON schema output enforcement |
tool-examples-2025-10-29 |
Input/output examples in tool definitions |
compact-2026-01-12 |
Conversation compaction endpoint |
mcp-servers-2025-12-04 |
MCP servers in API request payload |
web-search-2025-03-05 |
Web search (Vertex/Foundry only) |
context-1m-2025-08-07 |
1M context beta (provider/model dependent) |
redact-thinking-2026-02-12 |
Hide thinking blocks from responses (opt-in) |
Example workflow:
/anthropic betas add prompt-caching-scope-2026-01-05
/anthropic betas add context-management-2025-06-27
/anthropic betas # verify
Upload, list, download, and delete files via the Anthropic Files API. The files-api-2025-04-14 beta is injected only when needed (/v1/files requests or Messages payloads with file_id).
/anthropic files # list files across ALL accounts
/anthropic files upload ./report.pdf # upload a file
/anthropic files get file_abc123 # get file metadata
/anthropic files download file_abc123 # download to current directory
/anthropic files download file_abc123 ./out.pdf # download to specific path
/anthropic files delete file_abc123 # delete a file
Supported formats: PDF, DOCX, TXT, CSV, Excel, Markdown, images (max 350 MB per file). Uploaded files can be referenced by file_id in Messages API requests.
Multi-account behavior: Files on Anthropic are per-account. With multiple accounts:
/anthropic files list(no--account) queries all enabled accounts, labeling each file with its owner email- Use
--account <email|index>to target a specific account for any action:/anthropic files list --account alice@example.com /anthropic files upload ./data.csv --account 2 - Auto-pinning: When you upload or list files, the plugin remembers which account owns each
file_id. If a subsequent Messages API request references thatfile_id, the plugin automatically routes it to the correct account — even with round-robin or hybrid strategies.
Login and reauth are two-step flows in slash mode:
/anthropic login
# opens URL instructions in chat
/anthropic login complete <code#state>
/anthropic reauth 1
# opens URL instructions in chat
/anthropic reauth complete <code#state>
Pending slash OAuth flows expire after 10 minutes. If completion fails with an expiration message, run the start command again.
- Destructive commands (
remove,logout) run with non-interactive--forcebehavior in slash mode. - Interactive
manageis terminal-only; use granular slash commands instead.
Control how the plugin picks which account to use for each request.
| Strategy | Behavior | Best For |
|---|---|---|
sticky (default) |
Stay on one account until it fails or is rate-limited | Single account, predictable behavior, full feature compatibility |
round-robin |
Rotate through accounts on every request | Spreading load evenly across accounts (see limitations) |
hybrid |
Score-based selection with stickiness bias. Considers health, token budget, and freshness | Multiple accounts with varying rate limits |
# Via CLI
opencode-anthropic-auth strategy round-robin
# Via environment variable (overrides config file)
export OPENCODE_ANTHROPIC_STRATEGY=hybrid
# Via config file
# Edit ~/.config/opencode/anthropic-auth.jsonSome Anthropic API features maintain server-side per-account state that breaks when requests alternate between accounts:
| Feature | Impact | Plugin Mitigation |
|---|---|---|
Files API (files-api-2025-04-14) |
file_id is per-account; referencing Account A's file from Account B = file_not_found |
Auto-pinning: the plugin tracks which account owns each file_id and routes the request accordingly |
Prompt Caching (prompt-caching-scope-2026-01-05) |
Cache is per-workspace; alternating accounts means zero cache hits, doubling token costs | Auto-skipped in round-robin: the prompt-caching-scope beta is excluded from the header |
Code Execution (code-execution-2025-08-25) |
Sandbox state is ephemeral per-request; multi-step workflows lose files/state when routed to a different account | Manual opt-in only: add the beta explicitly, and prefer sticky/pinned sessions for multi-step flows |
Message Batches (message-batches-2024-09-24) |
batch_id is per-account; polling from wrong account = 404 |
No automatic mitigation (not auto-included) |
Recommendation for round-robin users: If you need prompt caching or code execution, pin each OpenCode session to a single account:
# Terminal 1 — uses account 1
OPENCODE_ANTHROPIC_INITIAL_ACCOUNT=1 opencode
# Terminal 2 — uses account 2
OPENCODE_ANTHROPIC_INITIAL_ACCOUNT=2 opencodeThis automatically overrides the strategy to sticky for that session, re-enabling strategy-sensitive auto betas (for example prompt-caching-scope-2026-01-05). Other sessions are unaffected.
Configuration is stored at ~/.config/opencode/anthropic-auth.json. All settings are optional — defaults work well for most users.
{
// Account selection strategy: "sticky" | "round-robin" | "hybrid"
"account_selection_strategy": "sticky",
// Seconds before consecutive failure count resets (60-7200)
"failure_ttl_seconds": 3600,
// Enable debug logging
"debug": false,
// Claude Code signature emulation behavior
"signature_emulation": {
// Enable Claude-style attribution/stainless headers and betas
"enabled": true,
// Resolve latest @anthropic-ai/claude-code version once on plugin startup
"fetch_claude_code_version_on_startup": true,
// Compact long injected system instructions to reduce token usage.
// In "minimal" mode, repeated/contained blocks are deduplicated and title-generator
// requests are replaced with a compact dedicated prompt.
// "minimal" | "off"
"prompt_compaction": "minimal",
// Run the legacy regex-based sanitizer that rewrites OpenCode / Sisyphus /
// morph_edit identifiers in system prompt text. Default false because the
// plugin's primary defense is now aggressive relocation: non-CC blocks are
// moved into the first user message wrapped in <system-instructions>, and
// CC's system prompt is kept byte-for-byte pristine. Set this to true if
// you want belt-and-suspenders rewriting on top of relocation. The new
// regex uses negative lookarounds for [\w\-/] so hyphenated identifiers
// and file paths survive verbatim.
"sanitize_system_prompt": false,
},
// Top-level alias for signature_emulation.sanitize_system_prompt. When set,
// takes precedence over the nested value. Provided so you can flip the
// sanitizer without learning the nested schema.
"sanitize_system_prompt": false,
// Context limit override for 1M-window models.
// Prevents OpenCode from compacting too early when models.dev hasn't been
// updated yet (e.g. claude-opus-4-6 and any *-1m model variants).
// Only applied for OAuth (Max Plan) sessions — API key users use the
// context-1m-2025-08-07 beta header instead.
"override_model_limits": {
// Enable/disable the override (default: off — enable if you need 1M context)
"enabled": false,
// Context window to inject (tokens). Default: 1_000_000.
"context": 1000000,
// Max output tokens to inject. 0 = leave the model's default unchanged.
"output": 0,
},
// Health score tuning (0-100 scale)
"health_score": {
"initial": 70,
"success_reward": 1,
"rate_limit_penalty": -10,
"failure_penalty": -20,
"recovery_rate_per_hour": 2,
"min_usable": 50,
"max_score": 100,
},
// Client-side rate limiting (token bucket)
"token_bucket": {
"max_tokens": 50,
"regeneration_rate_per_minute": 6,
"initial_tokens": 50,
},
// Custom beta headers (added to every request via /anthropic betas add)
"custom_betas": [],
// Toast notification settings
"toasts": {
// Suppress non-error toasts (account status, switching)
"quiet": false,
// Minimum seconds between account-switch toasts (0-300)
"debounce_seconds": 30,
},
}| Variable | Description |
|---|---|
OPENCODE_ANTHROPIC_STRATEGY |
Override the account selection strategy at runtime. |
OPENCODE_ANTHROPIC_DEBUG |
Set to 1 to enable debug logging. |
OPENCODE_ANTHROPIC_QUIET |
Set to 1 to suppress non-error toasts (account status, switching). |
OPENCODE_ANTHROPIC_EMULATE_CLAUDE_CODE_SIGNATURE |
Set to 0 to disable Claude signature emulation (legacy mode). |
OPENCODE_ANTHROPIC_FETCH_CLAUDE_CODE_VERSION |
Set to 0 to skip npm version lookup at startup. |
OPENCODE_ANTHROPIC_PROMPT_COMPACTION |
Set to off to disable default minimal system prompt compaction. |
OPENCODE_ANTHROPIC_SANITIZE_SYSTEM_PROMPT |
Set to 1/true to enable the legacy regex-based sanitizer (default off). Overrides both nested and top-level config values. |
OPENCODE_ANTHROPIC_DEBUG_SYSTEM_PROMPT |
Set to 1 to log the final transformed system prompt to stderr (title-generator requests are skipped). |
OPENCODE_ANTHROPIC_OVERRIDE_MODEL_LIMITS |
Set to 0 to disable context limit overrides for 1M-window models (e.g. when models.dev has been updated). |
OPENCODE_ANTHROPIC_INITIAL_ACCOUNT |
Pin this session to a specific account (1-based index or email). Overrides strategy to sticky. See Round-Robin Limitations. |
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS |
Set to 1 to suppress experimental auto-betas (mirrors Claude Code gateway safety switch). |
- The expected auth mode is OAuth (
claude login/ browser flow), not directANTHROPIC_API_KEYusage. - In OAuth mode, the plugin always includes
oauth-2025-04-20inanthropic-beta. - This applies to all models, including Haiku.
The plugin uses a dedicated HTTP proxy per OpenCode instance to handle TLS fingerprint mimicry. This architecture provides isolation and graceful degradation:
- Each OpenCode instance owns its own proxy — when you open multiple OpenCode tabs or windows, each gets an independent proxy process
- Proxy dies with parent process — the proxy monitors its parent PID and exits automatically if the parent dies, preventing orphaned processes
- Ephemeral port allocation — each proxy binds to an available ephemeral port (port 0) to avoid conflicts between instances
- Graceful fallback to native fetch — if Bun is unavailable or the proxy fails to start, requests fall back to native Node.js fetch without TLS mimicry
This design ensures that proxy failures are isolated to a single OpenCode instance and never affect other running instances.
When you make a request through OpenCode:
- The plugin selects an account based on your strategy
- It refreshes the OAuth token if expired
- It transforms the request (adds OAuth headers,
oauth-2025-04-20, signature headers, beta flags, tool prefixes) - If the response is account-specific (429/401, plus 400/403 billing/quota/permission errors), it marks that account and immediately tries the next account
- If the response is service-wide (500/503/529), it returns the error directly (switching accounts would not help)
- It tries each available account at most once per request
- Successful responses have tool name prefixes stripped from the stream
The plugin also:
- Zeros out model costs (your subscription covers usage)
- Emulates Claude-style request headers and beta flags by default
- Keeps Claude Code's system prompt byte-for-byte pristine.
parsed.systemis reduced to exactly two blocks — the billing header and the canonical identity string — matching what genuine Claude Code emits. Every other block (OpenCode behavior, plugin instructions, agent system prompts, env blocks, AGENTS.md content, etc.) is moved into the first user message wrapped in<system-instructions>with an explicit instruction telling the model to treat the wrapped content with the same authority as a system prompt. Claude (and Claude Code itself) misbehaves when third-party content is appended to its system prompt, so we route it through the user channel instead. - Optionally rewrites
OpenCode/Sisyphus/morph_editidentifiers via regex whensanitize_system_promptis set totrue(defaultfalse). The regex uses negative lookarounds for[\w\-/]so hyphenated identifiers and file paths likeopencode-anthropic-fixand/Users/.../opencode/distare preserved verbatim. Provided as a belt-and-suspenders option on top of the relocation strategy. - In
prompt_compaction="minimal", deduplicates repeated/contained system blocks and uses a compact dedicated prompt for internal title-generation requests - Adds
?beta=trueto/v1/messagesand/v1/messages/count_tokensrequests
When signature emulation is disabled (signature_emulation.enabled=false), the plugin falls back to legacy behavior: the relocation pass is skipped and incoming system blocks are forwarded as-is alongside the injected Claude Code identity prefix.
| Path | Description |
|---|---|
~/.config/opencode/anthropic-auth.json |
Plugin configuration |
~/.config/opencode/anthropic-accounts.json |
Account credentials (0600 permissions) |
~/.config/opencode/plugin/opencode-anthropic-auth-plugin.js |
Installed plugin entry point |
~/.local/bin/opencode-anthropic-auth |
CLI binary |
Account credentials are stored with restrictive file permissions (owner read/write only) and are excluded from git via an auto-generated .gitignore.
Make sure the plugin is installed in ~/.config/opencode/plugin/. Restart OpenCode after installing.
Your OAuth token may have expired. Try a quick refresh first, or re-authenticate with fresh browser login:
# Quick token refresh (no browser needed)
opencode-anthropic-auth refresh 1
# Full re-authentication (opens browser)
opencode-anthropic-auth reauth 1Or re-run the auth flow from OpenCode: Ctrl+K → Connect Provider → Anthropic.
Enable system prompt debug logging:
export OPENCODE_ANTHROPIC_DEBUG_SYSTEM_PROMPT=1
opencodeWhen enabled, the plugin prints the transformed system block (after sanitization/compaction) to stderr with prefix:
[opencode-anthropic-auth][system-debug] transformed system:
Note: internal title-generator requests are intentionally skipped by this debug log to avoid noisy high-volume output.
When all accounts are exhausted for an account-specific error, the plugin returns immediately instead of sleeping in-process. Try:
# Check status
opencode-anthropic-auth list
# Reset tracking if stuck
opencode-anthropic-auth reset allYou may see Claude: <email> toasts even when your selected model is not Anthropic (e.g., OpenAI Codex, Gemini). This is expected behavior — OpenCode uses Claude Haiku as a background "small model" for internal tasks like generating session titles, regardless of which model you selected. These background API calls go through the Anthropic provider, which triggers the plugin's fetch interceptor and its account-usage toast.
To suppress non-error toasts, set quiet mode in your config:
// ~/.config/opencode/anthropic-auth.json
{
"toasts": { "quiet": true },
}Or via environment variable:
export OPENCODE_ANTHROPIC_QUIET=1Error toasts (e.g., "Disabled Account 1 (token refresh failed)") are never suppressed.
Make sure ~/.local/bin is on your PATH:
export PATH="$HOME/.local/bin:$PATH"-
Windows native fetch fallback — On Windows, the Bun-based TLS mimicry proxy is not available. Requests fall back to native Node.js fetch without fingerprint mimicry. This is a platform limitation; the plugin still functions but with reduced request signature parity.
-
Claude Code refresh blocking — When reusing Claude Code credentials, token refresh can block for up to 60 seconds while invoking the
claudeCLI. This is a known latent issue in the credential reuse flow and is outside the scope of this plugin's control.
Same as upstream. See anomalyco/opencode-anthropic-auth.
Maintained at marco-jardim/opencode-anthropic-fix.
{ "cc_credential_reuse": { "enabled": true, // Enable/disable the feature (default: true) "auto_detect": true, // Auto-load on plugin startup (default: true) "prefer_over_oauth": true, // Use CC credentials first when available (default: true) }, }