Skip to content

Conversation

@Gardelll
Copy link

@Gardelll Gardelll commented Dec 6, 2025

Prefix compaction/summarize/title system instruction with PROMPT_ANTHROPIC_SPOOF to support proxied Anthropic provider.

@rekram1-node
Copy link
Collaborator

rekram1-node commented Dec 6, 2025

The anthropic spoof is there solely for coding max/pro plans, are you running opencode through a proxy to your max plan? Because you may not really want that spoof unless you're doing that

@Gardelll
Copy link
Author

Gardelll commented Dec 6, 2025

The anthropic spoof is there solely for coding max/pro plans, are you running opencode through a proxy to your max plan? Because you may not really want that spoof unless you're doing that

Yes, it sounds unsafe, but there is indeed such a need.

@rekram1-node rekram1-node changed the title Support proxied Anthropic provider for compaction/summarize/title task tweak: include anthropic spoof for providers including "anthropic" in name Dec 6, 2025
@rekram1-node
Copy link
Collaborator

I don't know if we should be including it all the time, for example: google-vertex-anthropic is a valid provider, no reason to attach it in that case

@rekram1-node
Copy link
Collaborator

that is the only provider I see this being an issue for, but fr? You have a proxy setup that uses claude code subscriptions?

@Gardelll
Copy link
Author

Gardelll commented Dec 6, 2025

I don't know if we should be including it all the time, for example: google-vertex-anthropic is a valid provider, no reason to attach it in that case

Maybe we should use another option to include this spoof for custom providers?

that is the only provider I see this being an issue for, but fr? You have a proxy setup that uses claude code subscriptions?

I am using a config like this to bypass regional restrictions:

"anthropic-proxy": {
  "npm": "@ai-sdk/anthropic",
  "name": "ProxiedClaudeCode",
  "options": {
    "baseURL": "https://proxied-claude-endpoint/v1",
    "headers": {
      // claude code cli headers
    }
  },
  "models": {
    // ...
  }
}

It is working fine but excludes title generation, etc.

@rekram1-node
Copy link
Collaborator

ig this is fine, should prolly just exclude the case I mentioned

@cgwalters
Copy link

I tested this out, and also had Opus 4.5 do a local review and it noticed that this PR was missing a case; this patch should apply to the tip of this PR.

diff --git i/packages/opencode/src/session/system.ts w/packages/opencode/src/session/system.ts
index 5996f6c2b..ed15b35d1 100644
--- i/packages/opencode/src/session/system.ts
+++ w/packages/opencode/src/session/system.ts
@@ -25,7 +25,7 @@ export namespace SystemPrompt {
   }
 
   export function header(providerID: string) {
-    if (providerID.includes("anthropic")) return [PROMPT_ANTHROPIC_SPOOF.trim()]
+    if (shouldIncludeAnthropicSpoof(providerID)) return [PROMPT_ANTHROPIC_SPOOF.trim()]
     return []
   }

On top of that, I think it'd be more elegant if we did it this way:

diff --git a/packages/opencode/src/session/system.ts b/packages/opencode/src/session/system.ts
index ed15b35d1..1fc7f61a4 100644
--- a/packages/opencode/src/session/system.ts
+++ b/packages/opencode/src/session/system.ts
@@ -20,13 +20,15 @@ import PROMPT_CODEX from "./prompt/codex.txt"
 import type { Provider } from "@/provider/provider"
 
 export namespace SystemPrompt {
-  function shouldIncludeAnthropicSpoof(providerID: string) {
-    return providerID !== "google-vertex-anthropic" && providerID.includes("anthropic")
+  function providerSpoof(providerID: string) {
+    if (providerID !== "google-vertex-anthropic" && providerID.includes("anthropic")) {
+      return [PROMPT_ANTHROPIC_SPOOF.trim()]
+    }
+    return []
   }
 
   export function header(providerID: string) {
-    if (shouldIncludeAnthropicSpoof(providerID)) return [PROMPT_ANTHROPIC_SPOOF.trim()]
-    return []
+    return [...providerSpoof(providerID)]
   }
 
   export function provider(model: Provider.Model) {
@@ -124,23 +126,14 @@ export namespace SystemPrompt {
   }
 
   export function compaction(providerID: string) {
-    if (shouldIncludeAnthropicSpoof(providerID)) {
-      return [PROMPT_ANTHROPIC_SPOOF.trim(), PROMPT_COMPACTION]
-    }
-    return [PROMPT_COMPACTION]
+    return [...providerSpoof(providerID), PROMPT_COMPACTION]
   }
 
   export function summarize(providerID: string) {
-    if (shouldIncludeAnthropicSpoof(providerID)) {
-      return [PROMPT_ANTHROPIC_SPOOF.trim(), PROMPT_SUMMARIZE]
-    }
-    return [PROMPT_SUMMARIZE]
+    return [...providerSpoof(providerID), PROMPT_SUMMARIZE]
   }
 
   export function title(providerID: string) {
-    if (shouldIncludeAnthropicSpoof(providerID)) {
-      return [PROMPT_ANTHROPIC_SPOOF.trim(), PROMPT_TITLE]
-    }
-    return [PROMPT_TITLE]
+    return [...providerSpoof(providerID), PROMPT_TITLE]
   }
 }

@cgwalters
Copy link

FTR my interest in this PR is because we have this system prompt in our projects https://github.com/bootc-dev/infra/blob/dbc0159ca4b672e83cd3442917a5e8e0bfcb183d/common/AGENTS.md#attribution and I was really confused why most of the time OpenCode emitted Assisted-by: Claude Code

@Gardelll
Copy link
Author

This feature has been implemented in a different, unified way. However, special handling for google-vertex-anthropic is still lacking.

@cgwalters
Copy link

Friendly ping for review on this one, this is my biggest papercut right now with opencode.

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.

3 participants