From aefea715b12eaab5d63e4793a2c23cb15ebde335 Mon Sep 17 00:00:00 2001 From: kurihada Date: Sun, 14 Dec 2025 23:34:32 +0800 Subject: [PATCH] =?UTF-8?q?feat(context):=20=E6=A0=B9=E6=8D=AE=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=8A=A8=E6=80=81=E8=AE=BE=E7=BD=AE=20contextLimit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AgentConfig 添加 contextWindow 字段 - ProviderRegistry 添加 getModelInfo() 方法查询模型信息 - loadConfig() 从 ProviderRegistry 获取模型的 contextWindow - Agent 构造函数使用 contextWindow 初始化压缩管理器 效果: - Anthropic Claude: 168k (200k - 32k 输出预留) - DeepSeek: 32k (64k - 32k 输出预留) - 未知模型回退到默认 200k --- packages/core/src/core/agent.ts | 10 +++++++++- packages/core/src/provider/registry.ts | 11 +++++++++++ packages/core/src/types/index.ts | 2 ++ packages/core/src/utils/config.ts | 5 +++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/packages/core/src/core/agent.ts b/packages/core/src/core/agent.ts index 5564449..8dacc55 100644 --- a/packages/core/src/core/agent.ts +++ b/packages/core/src/core/agent.ts @@ -57,8 +57,16 @@ export class Agent { baseUrl: config.baseUrl, }); + // 构建压缩配置,使用模型的 contextWindow(如果有) + const finalCompressionConfig: Partial = { + ...compressionConfig, + }; + if (config.contextWindow) { + finalCompressionConfig.contextLimit = config.contextWindow; + } + // 初始化压缩管理器 - this.compressionManager = new CompressionManager(compressionConfig); + this.compressionManager = new CompressionManager(finalCompressionConfig); // 设置主模型(作为摘要模型的后备) this.compressionManager.setModel(this.getModel(config.model)); diff --git a/packages/core/src/provider/registry.ts b/packages/core/src/provider/registry.ts index 1bed0f0..19559bb 100644 --- a/packages/core/src/provider/registry.ts +++ b/packages/core/src/provider/registry.ts @@ -300,6 +300,17 @@ export class ProviderRegistry { return [...provider.info.models, ...customModels]; } + /** + * 获取指定模型的详细信息 + * @param providerId 提供商 ID + * @param modelId 模型 ID + * @returns 模型信息,未找到时返回 undefined + */ + getModelInfo(providerId: string, modelId: string): ModelInfo | undefined { + const models = this.getModels(providerId); + return models.find((m) => m.id === modelId); + } + /** * 添加自定义模型 */ diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 1a476f3..ee059e7 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -78,6 +78,8 @@ export interface AgentConfig { systemPrompt: string; /** 自定义 API 基础 URL(用于兼容 OpenAI API 的第三方服务,如阿里云百炼) */ baseUrl?: string; + /** 模型的上下文窗口大小(tokens),用于压缩管理 */ + contextWindow?: number; } // 会话上下文 diff --git a/packages/core/src/utils/config.ts b/packages/core/src/utils/config.ts index 6cf2854..c31a9db 100644 --- a/packages/core/src/utils/config.ts +++ b/packages/core/src/utils/config.ts @@ -121,6 +121,10 @@ export function loadConfig(): AgentConfig { // 确定 baseUrl const finalBaseUrl = storedConfig.baseUrl || providerConfig?.baseUrl; + // 获取模型的 contextWindow(从 ProviderRegistry 查询) + const modelInfo = providerRegistry.getModelInfo(finalProvider, finalModel); + const contextWindow = modelInfo?.contextWindow; + return { provider: finalProvider, apiKey: finalApiKey, @@ -128,6 +132,7 @@ export function loadConfig(): AgentConfig { maxTokens: storedConfig.maxTokens || 4096, systemPrompt: DEFAULT_SYSTEM_PROMPT, baseUrl: finalBaseUrl, + contextWindow, }; }