Skip to content
Agent Orchestration
Skill

/opencode-detect-openai-compat

OpenCode's caching detection misses OpenAI-compatible proxies routing to Anthropic/Bedrock. Broaden the predicate.

BOOST
From plugin
prompt-cache-skills
11613 skills
Install
$ npx -y skills add OnlyTerp/prompt-cache-skills --skill opencode-detect-openai-compat --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/opencode-detect-openai-compat

Context preview

The summary Claude sees to decide when to auto-load this skill.

OpenCode's caching detection misses OpenAI-compatible proxies routing to Anthropic/Bedrock. Broaden the predicate.

SKILL.md

opencode-detect-openai-compat.SKILL.md
name: opencode-detect-openai-compat
description: OpenCode's caching detection misses OpenAI-compatible proxies routing to Anthropic/Bedrock. Broaden the predicate.
target_harness: OpenCode
target_repo: sst/opencode
target_files:
  - packages/opencode/src/provider/transform.ts
target_commit: dev branch @ a9ef5a0f
estimated_savings: 0 → ~90% hit rate for users on LiteLLM/Bifrost/MiMo routing to Claude

OpenCode: detect OpenAI-compatible Anthropic proxies (#25984, #26460)

Target

`packages/opencode/src/provider/transform.ts` → `applyCaching()` in `sst/opencode`.

Open issues: #25984 (Bifrost/LiteLLM → Bedrock), #26460 (Xiaomi MiMo).

Symptom

When the user routes Anthropic-shaped models through an OpenAI-compatible proxy (LiteLLM, Bifrost, or any `@ai-sdk/openai-compatible` adapter), OpenCode falls through to the OpenAI caching path and sets `promptCacheKey` (OpenAI shape). The proxy forwards this verbatim to the Anthropic backend, which ignores it. Result: 0% cache hit rate on what is otherwise the canonical "long agent loop on Claude" use case.

Affected routes:

  • LiteLLM proxy → Bedrock Anthropic
  • Bifrost → Bedrock Anthropic
  • Xiaomi MiMo (Anthropic-shaped, marketed as OpenAI-compatible)
  • Any custom `@ai-sdk/openai-compatible` endpoint with Claude backend

Fix

Broaden the detection predicate so OpenAI-compatible adapters with Anthropic-shaped models get Anthropic-style caching:

--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ function applyCaching(msgs, model)
   if (
     model.providerID === "anthropic" ||
     model.api.id.includes("anthropic") ||
     model.api.id.includes("claude") ||
-    model.api.npm === "@ai-sdk/anthropic"
+    model.api.npm === "@ai-sdk/anthropic" ||
+    model.api.npm === "@ai-sdk/google-vertex/anthropic" ||
+    // OpenAI-compatible proxies routing to Anthropic-shaped backends
+    (model.api.npm === "@ai-sdk/openai-compatible" &&
+     (model.api.id.toLowerCase().includes("claude") ||
+      model.api.id.toLowerCase().includes("anthropic") ||
+      model.api.id.toLowerCase().includes("mimo"))) ||
+    // MiniMax and other Anthropic-shaped non-Anthropic models
+    model.api.id.startsWith("minimax/")
   ) {
     // Apply Anthropic-style cache_control on message blocks
   }

Optionally factor the predicate into a named helper (`isAnthropicShapedRoute(model)`) so the same check can be reused elsewhere in OpenCode.

Verify

1. Configure OpenCode with a LiteLLM endpoint pointing at a Bedrock Claude model:

   provider:
     openai-compatible:
       baseURL: http://localhost:4000/v1
       models:
         - claude-3-5-sonnet-bedrock

2. Run two identical prompts. 3. Capture wire to the LiteLLM endpoint. 4. **Before fix**: request body contains `prompt_cache_key`, no `cache_control` markers; response `cache_read_input_tokens` always 0. 5. **After fix**: request body has `cache_control` on system + last stable message; response shows `cache_read_input_tokens > 0` on turn 2.

Background

This is a routing-layer detection bug, not a caching-logic bug. The caching CODE is fine; it just never runs for these models because the predicate didn't anticipate proxy-shaped routes.

Related skills:

  • [opencode-bedrock-doc-blocks](../opencode-bedrock-doc-blocks/SKILL.md)

(#17300) for the DocumentBlock case

  • [opencode-mistral-cache-key](../opencode-mistral-cache-key/SKILL.md)

(#27556) for Mistral support

Full audit: [audits/opencode.md](../../audits/opencode.md).

Read more
Ships withprompt-cache-skills

Drop-in prompt-caching fixes for the LLM agent harness you use. Point your AI coding agent at this repo and it ships the patches.

Get the whole plugin

Other skills on prompt-cache-skills.