Skip to content

Commit 4c23d63

Browse files
ericdalloeca-agent
andcommitted
Add Claude Opus 4.7 support
Opus 4.7 returns 400 when sent thinking: {type: "enabled", budget_tokens: N}. Introduce anthropic-v2-variants with adaptive thinking, display: "summarized", and the new xhigh effort level. A hidden "default" variant ensures Opus 4.7 always gets adaptive thinking even when no variant is explicitly selected. - Add anthropic-v2-variants with default/low/medium/high/xhigh/max - Add variantsByModel regex for opus-4-7 - Add claude-opus-4-7 to default models and web search support - Fall back to "default" variant in extra-payload-considering-variant - Add selectable-variant-names helper to filter internal variants from UI 🤖 Generated with [eca](https://eca.dev) Co-Authored-By: eca-agent <git@eca.dev>
1 parent 9c2b97c commit 4c23d63

File tree

6 files changed

+32
-11
lines changed

6 files changed

+32
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Auto allow ask_user tool by default.
66
- Fix chat titles becoming empty when conversation history contains thinking blocks (Anthropic).
7+
- Add Claude Opus 4.7 support with adaptive thinking, `xhigh` effort level, and summarized thinking display.
78

89
## 0.127.0
910

src/eca/config.clj

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
[clojure.string :as string]
1818
[clojure.walk :as walk]
1919
[eca.features.agents :as agents]
20-
[rewrite-json.core :as rj]
2120
[eca.interpolation :as interpolation]
2221
[eca.logger :as logger]
2322
[eca.messenger :as messenger]
24-
[eca.shared :as shared :refer [multi-str]])
23+
[eca.shared :as shared :refer [multi-str]]
24+
[rewrite-json.core :as rj])
2525
(:import
2626
[java.io File]))
2727

@@ -64,6 +64,14 @@
6464
"high" {:output_config {:effort "high"} :thinking {:type "adaptive"}}
6565
"max" {:output_config {:effort "max"} :thinking {:type "adaptive"}}})
6666

67+
(def ^:private anthropic-v2-variants
68+
{"default" {:thinking {:type "adaptive" :display "summarized"}}
69+
"low" {:output_config {:effort "low"} :thinking {:type "adaptive" :display "summarized"}}
70+
"medium" {:output_config {:effort "medium"} :thinking {:type "adaptive" :display "summarized"}}
71+
"high" {:output_config {:effort "high"} :thinking {:type "adaptive" :display "summarized"}}
72+
"xhigh" {:output_config {:effort "xhigh"} :thinking {:type "adaptive" :display "summarized"}}
73+
"max" {:output_config {:effort "max"} :thinking {:type "adaptive" :display "summarized"}}})
74+
6775
(def ^:private initial-config*
6876
{:providers {"openai" {:api "openai-responses"
6977
:url "${env:OPENAI_API_URL:https://api.openai.com}"
@@ -79,7 +87,8 @@
7987
:key "${env:ANTHROPIC_API_KEY}"
8088
:requiresAuth? true
8189
:models {"claude-sonnet-4-6" {}
82-
"claude-opus-4-6" {}}}
90+
"claude-opus-4-6" {}
91+
"claude-opus-4-7" {}}}
8392
"github-copilot" {:api "openai-chat"
8493
:url "${env:GITHUB_COPILOT_API_URL:https://api.githubcopilot.com}"
8594
:key nil ;; not supported, requires login auth
@@ -172,6 +181,7 @@
172181
:shellCommand {:summaryMaxLength 35}
173182
:outputTruncation {:lines 2000 :sizeKb 50}}
174183
:variantsByModel {".*sonnet[-._]4[-._]6|opus[-._]4[-._][56]" {:variants anthropic-variants}
184+
".*opus[-._]4[-._]7" {:variants anthropic-v2-variants}
175185
".*gpt[-._]5(?:[-._](?:2|4)(?!\\d)|[-._]3[-._]codex)" {:variants openai-variants
176186
:excludeProviders ["github-copilot"]}}
177187
:mcpTimeoutSeconds 60
@@ -243,6 +253,13 @@
243253
(when (seq filtered)
244254
filtered)))))
245255

256+
(defn selectable-variant-names
257+
"Returns sorted variant names suitable for UI display, excluding internal-only
258+
variants like \"default\" which are applied automatically."
259+
[variants]
260+
(when (seq variants)
261+
(vec (sort (remove #{"default"} (keys variants))))))
262+
246263
(def ^:private fallback-agent "code")
247264

248265
(defn primary-agent-names

src/eca/features/tools/agent.clj

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
(let [provider (subs full-model 0 idx)
104104
model (subs full-model (inc idx))
105105
user-variants (get-in config [:providers provider :models model :variants])]
106-
(keys (config/effective-model-variants config provider model user-variants)))))))
106+
(config/selectable-variant-names (config/effective-model-variants config provider model user-variants)))))))
107107
(into (sorted-set)))]
108108
(when (seq all-variants)
109109
(vec all-variants))))))
@@ -118,8 +118,7 @@
118118
model (subs full-model (inc idx))
119119
user-variants (get-in config [:providers provider :models model :variants])
120120
variants (config/effective-model-variants config provider model user-variants)]
121-
(when (seq variants)
122-
(vec (sort (keys variants)))))))))
121+
(config/selectable-variant-names variants))))))
123122

124123
(defn ^:private spawn-agent
125124
"Handler for the spawn_agent tool.

src/eca/handlers.clj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@
3333
model (subs full-model (inc idx))
3434
user-variants (get-in config [:providers provider :models model :variants])
3535
variants (config/effective-model-variants config provider model user-variants)]
36-
(when (seq variants)
37-
(vec (sort (keys variants)))))))))
36+
(config/selectable-variant-names variants))))))
3837

3938
(defn ^:private select-variant
4039
"Returns the variant to select: the agent's configured variant if it exists

src/eca/llm_api.clj

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,12 @@
154154
(defn ^:private extra-payload-considering-variant
155155
"Resolves the effective extra-payload by merging extraPayload with variant payload.
156156
Variant values take priority over extraPayload on clashing keys.
157-
When reason? is false, strips provider-specific reasoning keys from the result."
157+
When reason? is false, strips provider-specific reasoning keys from the result.
158+
Falls back to a \"default\" variant when no explicit variant is selected."
158159
[model-config variant {:keys [api]} reason?]
159-
(let [variant-payload (get-in model-config [:variants variant])
160+
(let [variant-payload (or (get-in model-config [:variants variant])
161+
(when (nil? variant)
162+
(get-in model-config [:variants "default"])))
160163
extra-payload (:extraPayload model-config)
161164
merged (if variant-payload
162165
(shared/deep-merge extra-payload variant-payload)

src/eca/models.clj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,15 @@
7474
"anthropic/claude-opus-4.1"
7575
"anthropic/claude-opus-4.5"
7676
"anthropic/claude-opus-4.6"
77+
"anthropic/claude-opus-4-6"
7778
"anthropic/claude-haiku-4.5"
7879
"anthropic/claude-sonnet-4-5-20250929"
7980
"anthropic/claude-sonnet-4-20250514"
8081
"anthropic/claude-opus-4-20250514"
8182
"anthropic/claude-opus-4-1-20250805"
8283
"anthropic/claude-opus-4-5-20251101"
83-
"anthropic/claude-opus-4-6"
84+
"anthropic/claude-opus-4.7"
85+
"anthropic/claude-opus-4-7"
8486
"anthropic/claude-haiku-4-5-20251001"})
8587

8688
(defn ^:private all

0 commit comments

Comments
 (0)