onlyterp/prompt-cache-skills/opencode-bedrock-doc-blocks

Claude Code and agent skill by onlyterp/prompt-cache-skills

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

OpenCode places cachePoint on Bedrock messages containing DocumentBlocks, which produces a "nothing available to cache" error.

Install

npx vskill@latest install onlyterp/prompt-cache-skills/opencode-bedrock-doc-blocks

SKILL.md

OpenCode: skip cachePoint on Bedrock DocumentBlock messages (#17300)

Target

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

Open issue: #17300 — "Bedrock prompt caching error: nothing available to cache".

Symptom

applyCaching() places cachePoint markers on the last 2 non-system messages. If either of those messages contains a DocumentBlock (PDF/file attachment that Bedrock processes server-side), the cachePoint lands on content that Bedrock considers non-cacheable, producing an API error:

ValidationException: nothing available to cache

The error fails the entire request, not just the caching attempt.

Fix

Add a DocumentBlock detector and skip cachePoint placement on affected messages, falling through to the next-most-recent stable non-document message:

diff
--- a/packages/opencode/src/provider/transform.ts
+++ b/packages/opencode/src/provider/transform.ts
@@ function applyCaching(msgs, model)
+ function hasDocumentBlock(msg: ModelMessage): boolean {
+ if (!Array.isArray(msg.content)) return false;
+ return msg.content.some((b: any) =>
+ b?.type === "document" ||
+ b?.type === "file" ||
+ b?.documentBlock != null
+ );
+ }
+
+ function findLastStableNonDoc(msgs: ModelMessage[], skip: number): number {
+ for (let i = msgs.length - 1 - skip; i >= 0; i--) {
+ if (msgs[i].role !== "system" && !hasDocumentBlock(msgs[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
@@
- // Apply to last 2 non-system messages
- const nonSystemMsgs = msgs.filter(m => m.role !== "system").slice(-2)
- nonSystemMsgs.forEach(msg => {
- msg.providerOptions = { /* cachePoint etc. */ }
- })
+ // For Bedrock, skip DocumentBlock-containing messages — they
+ // can't be cached and produce a hard error.
+ const isBedrock = model.providerID.includes("bedrock");
+ if (isBedrock) {
+ const lastStable = findLastStableNonDoc(msgs, 0);
+ const prevStable = findLastStableNonDoc(msgs, msgs.length - 1 - lastStable + 1);
+ [lastStable, prevStable].forEach(idx => {
+ if (idx < 0) return;
+ msgs[idx].providerOptions = { bedrock: { cachePoint: { type: "default" } } };
+ });
+ } else {
+ // Existing behavior for non-Bedrock providers
+ const nonSystemMsgs = msgs.filter(m => m.role !== "system").slice(-2);
+ nonSystemMsgs.forEach(msg => {
+ msg.providerOptions = { /* cachePoint etc. */ };
+ });
+ }

Verify

  1. Configure OpenCode with a Bedrock Claude model.
  2. Attach a PDF or text document to a chat message.
  3. Send a follow-up prompt referencing the document.
  4. Before fix: Bedrock returns 400 ValidationException.
  5. After fix: request succeeds; cachePoint lands on the most

recent non-document message; response shows cacheReadInputTokenCount > 0 on the second identical follow-up.

Background

Bedrock's cachePoint requires that the prefix it caches contains cacheable content. DocumentBlocks are processed server-side and don't count toward the cacheable token budget — placing a cachePoint on a message where the only content is a document produces the "nothing to cache" error.

The fix is to detect document-containing messages and route the breakpoint to the next-most-stable text-bearing message.

See `docs/concepts/bedrock.md`. Full audit: `audits/opencode.md`.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
114
Repository forks
9
7-day trend score
24

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/onlyterp/prompt-cache-skills/opencode-bedrock-doc-blocks/badge)](https://verified-skill.com/skills/onlyterp/prompt-cache-skills/opencode-bedrock-doc-blocks)

Something wrong with this skill or its page? Tell us.