diff --git a/config.yaml b/config.yaml index 96969227..d6c3ed7d 100644 --- a/config.yaml +++ b/config.yaml @@ -211,6 +211,11 @@ multi_agent: reduction_sub_agents: true # true:子代理也挂 reduction;false:仅编排主代理使用 reduction summarization_trigger_ratio: 0.8 # summarization 触发比例(max_total_tokens * ratio),建议 0.75~0.85 summarization_emit_internal_events: true # true:发出 summarization 内部事件(便于诊断) + summarization_user_intent_ledger_max_runes: 96000 # 压缩后注入模型上下文的「原始用户输入与约束账本」总字符上限;DB 原始消息不裁剪 + summarization_user_intent_ledger_entry_max_runes: 16000 # 账本中单条用户消息的字符上限;超出仅裁剪模型可见账本,不影响 DB 原文 + latest_user_message_max_runes: 48000 # 本轮最新 user 进入模型上下文的字符上限;超出时全文落盘,仅注入 head/tail 预览 + latest_user_message_head_runes: 24000 # 超长本轮 user 的头部预览字符数 + latest_user_message_tail_runes: 24000 # 超长本轮 user 的尾部预览字符数 plan_execute_user_input_budget_ratio: 0.35 # plan_execute 中 userInput 预算比例(planner/replanner/executor 共用) plan_execute_executed_steps_budget_ratio: 0.2 # plan_execute 中 executed_steps 预算比例 plan_execute_max_step_result_runes: 4000 # plan_execute 每步结果最大字符数(超出截断) diff --git a/web/static/css/style.css b/web/static/css/style.css index b5cd4890..cbf8c731 100644 --- a/web/static/css/style.css +++ b/web/static/css/style.css @@ -5719,6 +5719,20 @@ html[data-theme="dark"] .openapi-doc-btn:hover { margin-bottom: 16px; } +.settings-advanced-block { + grid-column: 1 / -1; + margin-top: 4px; + padding-top: 8px; + border-top: 1px solid var(--border-color); +} + +.settings-advanced-block summary { + cursor: pointer; + font-size: 0.875rem; + font-weight: 500; + color: var(--accent-color); +} + .robot-manager { margin-bottom: 24px; } diff --git a/web/static/i18n/en-US.json b/web/static/i18n/en-US.json index 24188e6f..1b581288 100644 --- a/web/static/i18n/en-US.json +++ b/web/static/i18n/en-US.json @@ -2267,6 +2267,17 @@ "multiAgentPeLoopHint": "Only for plan_execute; max execute↔replan rounds.", "multiAgentRobotMode": "Default conversation mode for bots", "multiAgentRobotModeHint": "Execution mode for WeCom / DingTalk / Lark bot messages. Deep / Plan-Execute / Supervisor require multi-agent to be enabled.", + "agentAdvanced": "Advanced settings", + "userLedgerMaxRunes": "User input ledger total character limit", + "userLedgerMaxRunesHint": "Total limit for the original user input ledger injected after compaction; 0 uses the backend default. DB-stored original messages are not truncated.", + "userLedgerEntryMaxRunes": "Per-message user input character limit", + "userLedgerEntryMaxRunesHint": "Model-visible limit for each user message in the ledger; 0 uses the backend default and does not affect DB originals.", + "latestUserMaxRunes": "Latest user input character limit", + "latestUserMaxRunesHint": "Runtime limit for the current user message sent to the model; oversized input is persisted and only a preview is injected. 0 uses the backend default.", + "latestUserHeadRunes": "Latest user input head preview", + "latestUserHeadRunesHint": "Head characters kept visible to the model for oversized current user input.", + "latestUserTailRunes": "Latest user input tail preview", + "latestUserTailRunesHint": "Tail characters kept visible to the model for oversized current user input.", "multiAgentBatchUse": "Use multi-agent for batch task queues", "multiAgentBatchUseHint": "When enabled, each sub-task executed by queue in Task Management will run through Eino DeepAgent (requires multi-agent).", "enableKnowledge": "Enable knowledge retrieval", diff --git a/web/static/i18n/zh-CN.json b/web/static/i18n/zh-CN.json index f25c01a3..33038303 100644 --- a/web/static/i18n/zh-CN.json +++ b/web/static/i18n/zh-CN.json @@ -2255,6 +2255,17 @@ "multiAgentPeLoopHint": "仅 plan_execute 有效;execute 与 replan 之间的最大轮次。", "multiAgentRobotMode": "机器人默认对话模式", "multiAgentRobotModeHint": "企业微信 / 钉钉 / 飞书机器人每条消息使用的执行模式;Deep / Plan-Execute / Supervisor 需启用多代理。", + "agentAdvanced": "高级设置", + "userLedgerMaxRunes": "用户原文账本总字符上限", + "userLedgerMaxRunesHint": "压缩后注入模型上下文的原始用户输入账本总上限;0 使用后端默认值。DB 原始消息不裁剪。", + "userLedgerEntryMaxRunes": "单条用户原文字符上限", + "userLedgerEntryMaxRunesHint": "账本中单条用户消息的模型可见上限;0 使用后端默认值,不影响 DB 原文。", + "latestUserMaxRunes": "最新用户输入字符上限", + "latestUserMaxRunesHint": "本轮最新 user 进入模型上下文的上限;超出时全文落盘,只注入预览。0 使用后端默认值。", + "latestUserHeadRunes": "最新用户输入头部预览", + "latestUserHeadRunesHint": "超长最新 user 保留给模型看的头部字符数。", + "latestUserTailRunes": "最新用户输入尾部预览", + "latestUserTailRunesHint": "超长最新 user 保留给模型看的尾部字符数。", "multiAgentBatchUse": "批量任务队列也使用多代理", "multiAgentBatchUseHint": "开启后,任务管理中按队列执行的每个子任务将走 Eino DeepAgent(需启用多代理)。", "enableKnowledge": "启用知识检索功能", diff --git a/web/static/js/settings.js b/web/static/js/settings.js index 3bbe1998..325dfaf9 100644 --- a/web/static/js/settings.js +++ b/web/static/js/settings.js @@ -708,6 +708,31 @@ async function loadConfig(loadTools = true) { maRobotMode.value = mode; syncRobotAgentModeSelectOptions(ma.enabled === true); } + const userLedgerMaxEl = document.getElementById('summarization-user-ledger-max-runes'); + if (userLedgerMaxEl) { + const v = ma.summarization_user_intent_ledger_max_runes; + userLedgerMaxEl.value = (v !== undefined && v !== null && !Number.isNaN(Number(v))) ? String(Number(v)) : '96000'; + } + const userLedgerEntryMaxEl = document.getElementById('summarization-user-ledger-entry-max-runes'); + if (userLedgerEntryMaxEl) { + const v = ma.summarization_user_intent_ledger_entry_max_runes; + userLedgerEntryMaxEl.value = (v !== undefined && v !== null && !Number.isNaN(Number(v))) ? String(Number(v)) : '16000'; + } + const latestUserMaxEl = document.getElementById('latest-user-message-max-runes'); + if (latestUserMaxEl) { + const v = ma.latest_user_message_max_runes; + latestUserMaxEl.value = (v !== undefined && v !== null && !Number.isNaN(Number(v))) ? String(Number(v)) : '48000'; + } + const latestUserHeadEl = document.getElementById('latest-user-message-head-runes'); + if (latestUserHeadEl) { + const v = ma.latest_user_message_head_runes; + latestUserHeadEl.value = (v !== undefined && v !== null && !Number.isNaN(Number(v))) ? String(Number(v)) : '24000'; + } + const latestUserTailEl = document.getElementById('latest-user-message-tail-runes'); + if (latestUserTailEl) { + const v = ma.latest_user_message_tail_runes; + latestUserTailEl.value = (v !== undefined && v !== null && !Number.isNaN(Number(v))) ? String(Number(v)) : '24000'; + } // 填充知识库配置 const knowledgeEnabledCheckbox = document.getElementById('knowledge-enabled'); @@ -1808,6 +1833,21 @@ async function applySettings() { const peRaw = document.getElementById('multi-agent-pe-loop')?.value; const peParsed = parseInt(peRaw, 10); const peLoop = Number.isNaN(peParsed) ? 0 : Math.max(0, peParsed); + const ledgerRaw = document.getElementById('summarization-user-ledger-max-runes')?.value; + const ledgerParsed = parseInt(ledgerRaw, 10); + const ledgerMax = Number.isNaN(ledgerParsed) ? 0 : Math.max(0, ledgerParsed); + const ledgerEntryRaw = document.getElementById('summarization-user-ledger-entry-max-runes')?.value; + const ledgerEntryParsed = parseInt(ledgerEntryRaw, 10); + const ledgerEntryMax = Number.isNaN(ledgerEntryParsed) ? 0 : Math.max(0, ledgerEntryParsed); + const latestRaw = document.getElementById('latest-user-message-max-runes')?.value; + const latestParsed = parseInt(latestRaw, 10); + const latestMax = Number.isNaN(latestParsed) ? 0 : Math.max(0, latestParsed); + const latestHeadRaw = document.getElementById('latest-user-message-head-runes')?.value; + const latestHeadParsed = parseInt(latestHeadRaw, 10); + const latestHead = Number.isNaN(latestHeadParsed) ? 0 : Math.max(0, latestHeadParsed); + const latestTailRaw = document.getElementById('latest-user-message-tail-runes')?.value; + const latestTailParsed = parseInt(latestTailRaw, 10); + const latestTail = Number.isNaN(latestTailParsed) ? 0 : Math.max(0, latestTailParsed); const maEnabled = document.getElementById('multi-agent-enabled')?.checked === true; let robotMode = document.getElementById('multi-agent-robot-mode')?.value || 'eino_single'; if (!maEnabled && ['deep', 'plan_execute', 'supervisor'].indexOf(robotMode) >= 0) { @@ -1817,7 +1857,12 @@ async function applySettings() { enabled: maEnabled, robot_default_agent_mode: robotMode, batch_use_multi_agent: currentConfig?.multi_agent?.batch_use_multi_agent === true, - plan_execute_loop_max_iterations: peLoop + plan_execute_loop_max_iterations: peLoop, + summarization_user_intent_ledger_max_runes: ledgerMax, + summarization_user_intent_ledger_entry_max_runes: ledgerEntryMax, + latest_user_message_max_runes: latestMax, + latest_user_message_head_runes: latestHead, + latest_user_message_tail_runes: latestTail }; })(), knowledge: knowledgeConfig, diff --git a/web/templates/index.html b/web/templates/index.html index a9683bfc..a19d8392 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -3053,6 +3053,36 @@ 企业微信 / 钉钉 / 飞书机器人每条消息使用的执行模式;Deep / Plan-Execute / Supervisor 需启用多代理。 + + 高级设置 + + + 用户原文账本总字符上限 + + 压缩后注入模型上下文的原始用户输入账本总上限;0 使用后端默认值。DB 原始消息不裁剪。 + + + 单条用户原文字符上限 + + 账本中单条用户消息的模型可见上限;0 使用后端默认值,不影响 DB 原文。 + + + 最新用户输入字符上限 + + 本轮最新 user 进入模型上下文的上限;超出时全文落盘,只注入预览。0 使用后端默认值。 + + + 最新用户输入头部预览 + + 超长最新 user 保留给模型看的头部字符数。 + + + 最新用户输入尾部预览 + + 超长最新 user 保留给模型看的尾部字符数。 + + +