十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepChat 可配置 Agent 输出上限:三项输出截断设置的契约、UI 与源码实现

DeepChat 可配置 Agent 输出上限:三项输出截断设置的契约、UI 与源码实现 DeepChat 可配置 Agent 输出上限三项输出截断设置的契约、UI 与源码实现【免费下载链接】deepchatDeepChat - A smart assistant that connects powerful AI to your personal world项目地址: https://gitcode.com/GitHub_Trending/dee/deepchatDeepChat 为每个 DeepChat Agent 提供了三个用户可见的输出上限设置文件读取自动截断、工具输出内联上限与命令输出预览上限。它们决定工具结果中有多少字符能直接进入模型上下文、多少被外置到磁盘日志从而在内联上下文量与后续文件读取成本之间提供可调节的权衡。本文基于 功能规格文档结合 共享归一化助手、Zod 路由契约、工具输出守卫 等源码完整梳理这三项设置的默认值、取值范围、生效机制、上下文安全流程与回归测试边界。一、功能背景从三个默认值说起该功能源于上游 issue #2102。在实现之前DeepChat Agent 的每个工具输出上限都是硬编码的文件读取未显式指定limit时内容在4,500 字符处截断被输出守卫output guard覆盖的大型工具结果在5,000 字符处被外置offload前台命令与 skill 脚本结果最多暴露12,000 个输出字符。问题在于用户无法按 Agent 用途调整这个权衡以读大量日志为主的 Agent 需要更大的文件读取上限而执行长命令的 Agent 需要更大的命令预览上限。该功能把这三个常量提升为每个 Agent 可独立配置的字段且缺失设置时保留上述默认值已有 Agent 记录无需迁移保存后的修改对已有会话中的后续工具调用立即生效不改变模型上下文安全检查与内部磁盘 spooling 的行为。规格文档还特别澄清了两处容易误读的实现细节代码中另有两处 10,000 字符常量它们是内部磁盘 spooling 的上限而非前台命令预览的实际值webContentLengthLimit设置在当前 Agent 运行时中已不存在。规格文档选择不暴露这些实现细节避免产生误导性的设置项。二、用户可见契约三个配置项Agent 编辑器在Tools工具分区下新增一个折叠的Advanced output limits高级输出上限小节包含三项设置设置项配置字段默认值允许范围含义File read auto-truncate文件读取自动截断readFileAutoTruncateChars4,5001,000-200,000read工具省略limit时返回的最大文件内容Tool output inline limit工具输出内联上限toolOutputInlineChars5,0001,000-200,000已被输出守卫覆盖的工具的最大内联结果Command output inline limit命令输出内联上限commandOutputInlineChars12,0001,000-200,000exec与skill_run的最大前台输出预览取值均为整数。渲染端输入在保存时归一化路由层的 Zod 校验会拒绝契约范围外的外部值字段缺失时解析为默认值因此旧配置 JSON 保持有效无需迁移脚本。2.1 文件读取的语义显式传入的正数limit参数始终优先即使它大于 Agent 配置值——用户级参数永远压过 Agent 级默认未传limit时文本与预制备份文档prepared document两条读取路径都使用 Agent 的readFileAutoTruncateChars分页元数据继续报告实际的字符区间与文件总长度read工具描述不再硬编码 4,500而是描述按 Agent 配置的自动截断。在 AgentToolManager 源码中可以印证limit参数描述为 Maximum characters to read. Large files are auto-truncated if not specified读取说明改为 (auto-truncated using the configured Agent output limit if not specified)并在实际执行时把readOutputLimits.readFileAutoTruncateChars注入文本与文档两条读取路径。2.2 通用工具输出的语义受守卫覆盖的工具集合保持不变仅exec移交命令路径管理结果长度不超过配置值时保持内联超出的结果写入既有的按会话工具外置路径per-session tool-offload path并在上下文中以预览 stub摘要桩代替。2.3 命令与 skill 脚本的语义exec与skill_run返回配置的上限内预览 终端元数据后台会话保留启动时的 Agent 命令上限而后续显式process轮询使用当前Agent 命令上限——两者解耦改配置不会重写已在运行的后台任务语义固定的 10,000 字符 spooling 上限仍是内部上限当配置的预览值低于 10,000 时spooling 从较低的配置值开始被省略的输出仍可从生成的日志文件恢复通用工具守卫不会对已经准备好的命令预览做二次外置。2.4 上下文安全配置值是上限不是承诺配置值只是上界不保证每个字符都进入下一次模型请求。运行时按以下顺序收敛运行时按配置上限准备工具结果批次上下文预检batch context preflight检查完整的下一次请求若放不进合格的原始结果被替换为外置 stub对命令输出复用已生成的日志路径而不是新建嵌套外置文件只有更小的 stub 仍然放不下时才应用既有的 tool-error / terminal-error 回退。从 ToolOutputGuard 源码结构看这一流程由preflightRequestContext上下文预算预检与批次适配batch fit实现且对产物所有权做了明确区分守卫自己创建的外置文件offloadPath可以在被放弃的恢复流程中清理而工具自己创建的产物existingOffloadPath如命令日志守卫只可引用、绝不覆盖或删除。延迟结果适配使用模型的有效上下文预算、响应取消信号并在修改或持久化恢复结果前检查回合所有权。三、设置界面规格文档给出的 UI 线框如下---------------------------------------------------------- || Tools | || agent-filesystem [enabled] | || [read] [write] [edit] [glob] [grep] [exec] [process] | || | || Advanced output limits [v] | || Tune inline context per Agent | || File read [ 4500 ] chars | || Tool output [ 5000 ] chars | || Command output [12000 ] chars [Reset] | ----------------------------------------------------------实现位于 DeepChatAgentsSettings.vue。三个原生数字输入框带可见标签、min/max 约束与简短描述并配有Reset重置为默认值按钮。几个值得注意的行为细节折叠状态是本地展示状态不持久化——只有三个数值进入 Agent 配置空值、非法值、小数或超范围值在保存时被归一化到文档化的整数区间表单以字符串承载编辑态EditableNumberValue加载时用config.xxx ?? DEFAULT_AGENT_OUTPUT_LIMITS.xxx回填保存前经normalizeOutputLimit转换为整数保存脏状态dirty-state跟踪与相邻 Agent 设置的焦点、键盘输入行为保持稳定列入验收标准。四、源码级实现一条完整的落地链路4.1 共享纯助手默认值与防御性归一化三项设置的唯一权威定义在 agentOutputLimits.ts它是一个跨渲染端、路由与主进程边界的共享纯函数模块export const AGENT_OUTPUT_LIMIT_MIN_CHARS 1_000 export const AGENT_OUTPUT_LIMIT_MAX_CHARS 200_000 export const DEFAULT_AGENT_OUTPUT_LIMITS: ReadonlyAgentOutputLimits { readFileAutoTruncateChars: 4_500, toolOutputInlineChars: 5_000, commandOutputInlineChars: 12_000 } const normalizeLimit (value: number | undefined, fallback: number): number { if (typeof value ! number || !Number.isFinite(value)) return fallback return Math.min( AGENT_OUTPUT_LIMIT_MAX_CHARS, Math.max(AGENT_OUTPUT_LIMIT_MIN_CHARS, Math.round(value)) ) }resolveAgentOutputLimits(config?)对每个字段独立调用normalizeLimit非有限数值回退默认值有限数值先Math.round取整再夹到[1,000, 200,000]。这解释了规格中防御性读defensive in-process reads的含义——即便持久化数据被污染进程内解析也总是返回合法整数。4.2 数据模型与路由校验类型DeepChatAgentConfig 中三个字段均为可选readFileAutoTruncateChars?等因此旧配置 JSON 天然有效ACP Agent 不受影响因为字段属于 DeepChat Agent 运行时专属的配置类型路由契约domainSchemas.ts 中的DeepChatAgentConfigSchema对三个字段使用z.number().int().min(AGENT_OUTPUT_LIMIT_MIN_CHARS).max(AGENT_OUTPUT_LIMIT_MAX_CHARS).optional()直接引用共享助手导出的常量确保路由拒绝外部非法值与运行时归一化共用同一组边界存储所有权DeepChatAgentRepository 负责把保存的配置与运行时默认值合并且合并时保留这三个可选字段保证保存后重新加载不丢值。4.3 ToolOutputGuard通用上限与最终批次适配toolOutputGuard.ts 是上下文侧的执行者源码中可以看到契约细节const TOOL_OUTPUT_PREVIEW_LENGTH 1024 const TOOL_OUTPUT_OFFLOAD_MARKER [Tool output offloaded] const TOOLS_REQUIRING_OFFLOAD new Set([ls, find, grep, cdp_send]) const CONTEXT_FALLBACK_OFFLOAD_TOOLS new Set([ ...TOOLS_REQUIRING_OFFLOAD, exec, skill_run ])ls、find、grep、cdp_send属于必须走外置路径的工具集exec已移交命令路径不在其中上下文溢出回退CONTEXT_FALLBACK_OFFLOAD_TOOLS额外包含exec与skill_run且回退时优先复用工具已创建的日志路径即复用既有命令日志而非创建嵌套外置的代码体现结果类型为ok内联或外置附带offloadPath、tool_error、terminal_error三种对应规格第 5 步的既有回退链。4.4 AgentToolManager读取路径的上限注入agentToolManager.ts 负责文件读取侧它按会话解析所属 Agent 并调用resolveAgentOutputLimits把readFileAutoTruncateChars同时注入原始文本读取与预制备份文档两条路径——这正是验收标准raw text read 和 prepared document read 都遵守自定义文件读取上限的实现位置。五、非目标与兼容性边界规格文档明确列出的非目标值得单独强调因为它们界定了该功能的刻意不做什么不暴露内部命令/工具进程的磁盘 spooling 阈值10,000 字符上限保持内部化不恢复已删除的webContentLengthLimit设置或旧聊天模式的 web 管线不允许0之类的无限制取值以JavaScript 字符串字符数为契约单位不以 token 或字节估算不改动后台process工具的分页行为——轮询预览跟随 Agent 命令上限不移除最终请求上下文安全检查不新增任何设置存储、持久化表、IPC 路由、依赖或迁移——完全复用既有类型化 Agent 配置路由无需新 preload 或 IPC API。兼容性方面前台命令使用 Agent 命令上限且不会被通用工具阈值二次外置其自身的日志外置在超过命令上限后仍然可用字段缺失时三项默认值按文档继续生效。六、回归保护测试矩阵规格文档的回归保护章节在仓库中对应一组可定位的测试文件共享契约测试agentOutputLimits.test.ts 覆盖默认解析、防御性归一化与路由拒绝运行时测试toolOutputGuard.test.ts 覆盖守卫阈值、上下文适配、外置复用、取消与持久化agentToolManagerRead.test.ts 覆盖原始/预制备份读取与显式limit优先存储与生产解析deepChatAgentRepository.test.ts 验证生产环境配置解析保留全部三个保存值组件测试DeepChatAgentsSettings.test.ts 覆盖三个字段的加载、重置、归一化与保存。验收标准同时要求空/非法/小数/超范围输入归一化到文档化整数区间显式读取limit覆盖配置截断值exec与skill_run使用自定义前台预览并把溢出保留在可读文件中后台命令与 skill 会话保留启动时的预览值而后续process轮询使用当前值上下文溢出复用既有命令日志路径延迟结果适配在取消或回合所有权过期时停止且只清理新建的回退文件、绝不删除工具拥有的命令日志。七、在仓库中验证该功能的阅读路径如果你想在当前仓库中核实本文内容建议按以下顺序spec.md —— 完整契约与非目标src/shared/lib/agentOutputLimits.ts —— 默认值、范围与归一化的唯一权威src/shared/contracts/domainSchemas.ts —— 路由层 Zod 校验DeepChatAgentConfigSchema段落src/main/agent/deepchat/runtime/toolOutputGuard.ts —— 外置、预览 stub、批次适配与产物所有权src/main/tool/agentTools/agentToolManager.ts —— 文件读取路径的上限解析与注入src/renderer/settings/components/DeepChatAgentsSettings.vue —— 折叠小节 UI、重置与保存归一化。这套实现展示了 Electron 应用中多边界共享配置契约的典型做法默认值与范围常量定义在src/shared/lib的纯模块中类型声明、Zod 路由 schema、渲染端表单归一化、主进程运行时解析四处引用同一组常量配合全链路测试使得一个看似简单的三个数字输入框功能在渲染端、路由与主进程三个边界上始终语义一致。【免费下载链接】deepchatDeepChat - A smart assistant that connects powerful AI to your personal world项目地址: https://gitcode.com/GitHub_Trending/dee/deepchat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表