






















@@ -4,6 +4,7 @@ import type {
44ProviderAuthContext,
55ProviderAuthMethodNonInteractiveContext,
66ProviderResolveDynamicModelContext,
7+ProviderNormalizeResolvedModelContext,
78ProviderRuntimeModel,
89} from "openclaw/plugin-sdk/plugin-entry";
910import {
@@ -44,6 +45,7 @@ const PROVIDER_ID = "anthropic";
4445const DEFAULT_ANTHROPIC_MODEL = "anthropic/claude-opus-4-7";
4546const ANTHROPIC_OPUS_47_MODEL_ID = "claude-opus-4-7";
4647const ANTHROPIC_OPUS_47_DOT_MODEL_ID = "claude-opus-4.7";
48+const ANTHROPIC_OPUS_47_CONTEXT_TOKENS = 1_048_576;
4749const ANTHROPIC_OPUS_46_MODEL_ID = "claude-opus-4-6";
4850const ANTHROPIC_OPUS_46_DOT_MODEL_ID = "claude-opus-4.6";
4951const ANTHROPIC_OPUS_47_TEMPLATE_MODEL_IDS = [
@@ -282,6 +284,75 @@ function supportsAnthropicAdaptiveThinking(modelId: string): boolean {
282284return shouldUseAnthropicAdaptiveThinkingDefault(modelId) || isAnthropicOpus47Model(modelId);
283285}
284286287+function hasConfiguredModelContextOverride(
288+config: ProviderNormalizeResolvedModelContext["config"],
289+provider: string,
290+modelId: string,
291+): boolean {
292+const providers = config?.models?.providers;
293+if (!providers || typeof providers !== "object") {
294+return false;
295+}
296+const normalizedProvider = normalizeLowercaseStringOrEmpty(provider);
297+const normalizedModelId = normalizeLowercaseStringOrEmpty(modelId);
298+for (const [providerId, providerConfig] of Object.entries(providers)) {
299+if (normalizeLowercaseStringOrEmpty(providerId) !== normalizedProvider) {
300+continue;
301+}
302+if (!Array.isArray(providerConfig?.models)) {
303+continue;
304+}
305+for (const model of providerConfig.models) {
306+if (
307+normalizeLowercaseStringOrEmpty(typeof model?.id === "string" ? model.id : "") !==
308+normalizedModelId
309+) {
310+continue;
311+}
312+if (
313+(typeof model?.contextTokens === "number" && model.contextTokens > 0) ||
314+(typeof model?.contextWindow === "number" && model.contextWindow > 0)
315+) {
316+return true;
317+}
318+}
319+}
320+return false;
321+}
322+323+function applyAnthropicOpus47ContextWindow(params: {
324+config?: ProviderNormalizeResolvedModelContext["config"];
325+provider: string;
326+modelId: string;
327+model: ProviderRuntimeModel;
328+}): ProviderRuntimeModel | undefined {
329+if (!isAnthropicOpus47Model(params.modelId)) {
330+return undefined;
331+}
332+if (hasConfiguredModelContextOverride(params.config, params.provider, params.modelId)) {
333+return undefined;
334+}
335+const nextContextWindow = Math.max(
336+params.model.contextWindow ?? 0,
337+ANTHROPIC_OPUS_47_CONTEXT_TOKENS,
338+);
339+const nextContextTokens =
340+typeof params.model.contextTokens === "number"
341+ ? Math.max(params.model.contextTokens, ANTHROPIC_OPUS_47_CONTEXT_TOKENS)
342+ : ANTHROPIC_OPUS_47_CONTEXT_TOKENS;
343+if (
344+nextContextWindow === params.model.contextWindow &&
345+nextContextTokens === params.model.contextTokens
346+) {
347+return undefined;
348+}
349+return {
350+ ...params.model,
351+contextWindow: nextContextWindow,
352+contextTokens: nextContextTokens,
353+};
354+}
355+285356function matchesAnthropicModernModel(modelId: string): boolean {
286357const lower = normalizeLowercaseStringOrEmpty(modelId);
287358return ANTHROPIC_MODERN_MODEL_PREFIXES.some((prefix) => lower.startsWith(prefix));
@@ -486,7 +557,21 @@ export function buildAnthropicProvider(): ProviderPlugin {
486557normalizeConfig: ({ provider, providerConfig }) =>
487558normalizeAnthropicProviderConfigForProvider({ provider, providerConfig }),
488559applyConfigDefaults: ({ config, env }) => applyAnthropicConfigDefaults({ config, env }),
489-resolveDynamicModel: (ctx) => resolveAnthropicForwardCompatModel(ctx),
560+resolveDynamicModel: (ctx) => {
561+const model = resolveAnthropicForwardCompatModel(ctx);
562+if (!model) {
563+return undefined;
564+}
565+return (
566+applyAnthropicOpus47ContextWindow({
567+config: ctx.config,
568+provider: ctx.provider,
569+modelId: ctx.modelId,
570+ model,
571+}) ?? model
572+);
573+},
574+normalizeResolvedModel: (ctx) => applyAnthropicOpus47ContextWindow(ctx),
490575resolveSyntheticAuth: ({ provider }) =>
491576normalizeLowercaseStringOrEmpty(provider) === CLAUDE_CLI_BACKEND_ID
492577 ? resolveClaudeCliSyntheticAuth()
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。