Skip to content

Latest commit

 

History

History
752 lines (560 loc) · 31.7 KB

File metadata and controls

752 lines (560 loc) · 31.7 KB

ACP 配置参考手册

English | 中文

Active Context Pruning (ACP) 所有可配置参数的完整参考手册。

配置文件位置

ACP 从最多三层配置文件中读取(后加载的覆盖先加载的):

层级 路径 作用范围
全局 ~/.config/opencode/acp.jsonc 所有会话
配置目录 $OPENCODE_CONFIG_DIR/acp.jsonc 该配置目录下的所有会话
项目 .opencode/acp.jsonc(从当前目录向上搜索) 仅当前项目

提示: 在配置文件中添加 "$schema": "https://raw.githubusercontent.com/ranxianglei/opencode-acp/master/dcp.schema.json" 可获得 IDE 自动补全。

快速开始

// ~/.config/opencode/acp.jsonc
{
    "$schema": "https://raw.githubusercontent.com/ranxianglei/opencode-acp/master/dcp.schema.json",
    "enabled": true,
    "compress": {
        "maxContextLimit": "70%",
        "minContextLimit": "70%",
        "protectedTools": ["skill"],
    },
}

参数参考

状态说明:ACTIVE = 当前生效 | DEPRECATED = 保留向后兼容,计划移除(在此之前可能仍生效) | EXPERIMENTAL = 可能变更


通用参数

enabled

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 主开关。设为 false 可完全禁用 ACP。

autoUpdate

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 启动时自动检查并安装 ACP 更新,跟踪安装时所用的 dist-tag/规范(opencode-acp@stable 跟随 stable 标签;^1.14.0 等范围规范跟随 latest)。版本锁定的规范永不更新。

debug

  • 类型: boolean
  • 默认值: false
  • 状态: ACTIVE
  • 说明: 启用调试模式。设为 true 时,ACP 在每次压缩后发送聊天通知,显示块详情,并将 logLevel 置为 debug(INFO/DEBUG 日志与按请求的上下文快照,~/.config/opencode/logs/acp/)。设为 true 时此开关优先于 logLevel。

logLevel

  • 类型: "debug" | "info" | "warn" | "error" | "silent"
  • 默认值: "info"
  • 状态: ACTIVE
  • 说明: 文件日志详细级别(~/.config/opencode/logs/acp/daily/<日期>.log)。默认 info:默认落盘决策级事件(压缩提示决策、转换摘要、自动更新检查、模型切换等)。warn/error 减少输出;silent 完全关闭文件日志;debug 额外启用按请求的上下文快照与详细转储。debug: true 时忽略此配置。

storagePath

  • 类型: string

  • 默认值: 未设置 — $XDG_DATA_HOME/opencode/storage/plugin/acp(即 ~/.local/share/opencode/storage/plugin/acp)

  • 状态: ACTIVE

  • 说明: 会话状态文件({sessionId}.json,含压缩块、提示状态、token 统计)的持久化目录。路径语义:

    • 绝对路径 → 原样使用
    • ~ / ~/... → 相对于主目录展开
    • 相对路径 → 相对于项目目录(opencode 启动目录)解析

    目录不存在时会自动创建。若设置了此项、但会话状态文件仍位于默认位置,ACP 会记录一条 WARN(每会话一次)而不会自动迁移——如需保留会话历史,请手动移动该文件。

pruneNotification

  • 类型: "off" | "minimal" | "detailed"
  • 默认值: "off"
  • 状态: ACTIVE
  • 说明: 压缩通知的详细程度。
    • "off" — 不显示通知
    • "minimal" — 简短的一行摘要
    • "detailed" — 完整块详情(主题、token 数量、范围)

pruneNotificationType

  • 类型: "chat" | "toast"
  • 默认值: "toast"
  • 状态: ACTIVE
  • 说明: 压缩通知的投递方式。
    • "toast" — 瞬时弹窗提示(推荐;非阻塞)
    • "chat" — 注入为聊天消息(部分 provider 拒绝空消息时可能冻结会话)

protectedFilePatterns

  • 类型: string[]
  • 默认值: []
  • 状态: ACTIVE
  • 说明: 需保护文件内容的 Glob 匹配模式。当模型读取匹配这些模式的文件时,工具输出会被注入到压缩摘要中,而非被压缩。示例:["**/*.env", "**/secrets.json"]

commands

控制 ACP 斜杠命令(/acp context、/acp stats 等)。

commands.enabled

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 启用或禁用所有 /acp 斜杠命令。

commands.protectedTools

  • 类型: string[]
  • 默认值: ["task", "skill", "todowrite", "todoread", "compress", "decompress", "batch", "plan_enter", "plan_exit", "write", "edit"]
  • 状态: ACTIVE
  • 说明: 这些工具的输出受保护,不会被压缩。受保护工具的输出完整保留在可见上下文中。显式数组会替换默认值(设 [] 表示不保护任何工具)。

allowSubAgents

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 允许 ACP 在子代理(sub-agent)会话中运行。开启后,子代理会话获得完整的压缩、nudge 和上下文管理能力。设为 false 可将 ACP 限制在主会话中。
  • 迁移: v1.14.13 从 experimental.allowSubAgents(默认 false)移至顶层 allowSubAgents(默认 true)。旧的 experimental.allowSubAgents 仍可读取以保持向后兼容 —— 顶层优先。

experimental

实验性功能,可能变更或移除。

experimental.customPrompts

  • 类型: boolean
  • 默认值: false
  • 状态: EXPERIMENTAL
  • 说明: 启用从 ~/.config/opencode/acp-prompts/ 加载自定义 prompt 覆盖。

compress

核心压缩行为。

compress.permission

  • 类型: "ask" | "allow" | "deny"
  • 默认值: "allow"
  • 状态: ACTIVE
  • 说明: compress 工具的权限级别。
    • "allow" — 自动批准压缩调用
    • "ask" — 每次压缩前提示用户确认
    • "deny" — 阻止所有压缩调用

compress.showCompression

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 在聊天 UI 中显示压缩状态指示。

compress.summaryBuffer

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 将摘要缓冲区指引注入系统 prompt,帮助模型了解现有块及其覆盖范围。

compress.candidates

  • 类型: boolean
  • 默认值: false
  • 状态: ACTIVE(可选开启)
  • 说明: 启用 MICRO/EPISODE 压缩候选。为 true 时,nudge 与 acp_status 显示预先校验、可批量提交的压缩候选(MICRO = 单条大消息或完整工具事务;EPISODE = 相邻小单元构成的历史片段),而非原始可压缩范围。候选通过与 compress 工具相同的执行校验路径,列表中的目标均可直接提交。为 false(默认)时保持传统的范围列表行为。

compress.maxContextLimit

  • 类型: number | \${number}%``
  • 默认值: "55%"
  • 状态: ACTIVE
  • 说明: 上下文使用率上限(以模型上下文窗口的百分比或绝对 token 数表示)。超过此值时,ACP 提示模型进行压缩。示例:"55%" 或 100000。

compress.minContextLimit

  • 类型: number | \${number}%``
  • 默认值: "80%"
  • 状态: DEPRECATED
  • 说明: 已废弃——计划移除。 轮次/迭代提醒 nudge 的上下文使用率下限。使用率降至此值以下时,ACP 停止注入这些提醒(当限制无法换算为具体数值时同样停止,例如模型上下文窗口未知时的 "X%")。增长 nudge 由 minNudgeContextPercent 单独控制。在此之前仍然生效;移除时,轮次/迭代提醒 nudge 的下限门控将随之取消(新配置应依赖增长 nudge 体系)。

compress.modelMaxLimits

  • 类型: Record<string, number | \${number}%`>`
  • 默认值: undefined
  • 状态: ACTIVE
  • 说明: 按模型覆盖 maxContextLimit。以模型 ID 为键。示例:{"gpt-4": 80000, "claude-3-opus": "50%"}

compress.modelMinLimits

  • 类型: Record<string, number | \${number}%`>`
  • 默认值: undefined
  • 状态: DEPRECATED
  • 说明: 已废弃——将与 minContextLimit 一同移除。 按模型覆盖 minContextLimit。在此之前仍然生效。

compress.contextLimitFallback

  • 类型: number
  • 默认值: 128000
  • 状态: ACTIVE
  • 说明: 当模型上下文窗口未知时使用的回退窗口(绝对 token 数)——例如未声明 limit 的自定义 provider、从未学到 limit 的 headless spawn+resume 会话,或模型切换使旧 limit 失效后的短暂窗口。驱动所有百分比阈值(maxContextLimit/minContextLimit)、紧急 nudge 覆盖、批量清理 GC 与 in-flight 工具输出截断。已知真实模型 limit 时始终优先,按模型覆盖(modelMaxLimits/modelMinLimits)同样优先。设为 0 可禁用回退(旧行为:学到 limit 前无安全网)。

compress.nudgeFrequency

  • 类型: number
  • 默认值: 5
  • 状态: ACTIVE
  • 说明: nudge 注入之间的最小轮数间隔。防止每轮都打扰模型。

compress.minNudgeContextPercent

  • 类型: number
  • 默认值: 5
  • 状态: ACTIVE
  • 说明: 增长触发型 nudge 的上下文使用率下限(占模型上下文窗口的百分比):增长 nudge 要求上下文使用率达到或超过此百分比(此外还需满足增长阈值)。超过上限(maxContextLimit)与 98% 紧急覆盖的 nudge 不受此下限约束。若模型上下文窗口未知,则无法计算该下限,增长 nudge 回退为仅按增长触发的行为。轮次/迭代提醒 nudge 由 minContextLimit 控制,而非此字段。默认值刻意设低:在默认 nudgeGrowthTokens(50K)下,5% 下限对典型工作周期不生效,仅在非常大的(≥2M 级)窗口上才生效——更高的默认值(如 15%)会在 ≥400K 窗口上生效,并推高大型窗口模型上每个压缩周期的工作区间。设为 0 可完全禁用该下限,或调高(如 15–30%)使增长 nudge 等待更大的窗口占用比例。可通过 compress.providers 按 provider / 按模型细化(issue #344)。

compress.providers

  • 类型: Record<string, ProviderOverrides>,其中 ProviderOverrides = Partial<CompressOverridableConfig> & { models?: Record<string, Partial<CompressOverridableConfig>> }(两级均所有字段可选)
  • 默认值: undefined
  • 状态: ACTIVE
  • 说明: 对所有可调 compress 字段的嵌套按 provider / 按模型覆盖,逐字段按 模型 > provider > 全局 级联解析(与姊妹项目 billion-context-pi 一致,issue #344)。深层仅在该字段被显式设置时才覆盖——未设置的字段不会清空浅层取值;0 / false 是显式值,而非“未设置”。未知的 provider/model id 回退到全局值。百分比与 "X%" 限额按当前激活模型的上下文窗口换算。在三个配置文件层(全局 → 配置目录 → 项目)之间,该映射按 provider/model 键深度合并——项目层可以只细化某个 provider 而不清掉低层配置的其他 provider。
  • 可覆盖字段: maxContextLimit、emergencyThresholdPercent、minNudgeContextPercent、nudgeFrequency、iterationNudgeThreshold、toolOutputNudgeThreshold、nudgeGrowthTokens、minNudgeGrowthRatio、minNudgeGrowthFloor、nudgeForce、protectedTools、showCompression、summaryBuffer、protectTags、protectUserMessages、maxSummaryLengthHard、minCompressRange、maxVisibleSegments、keepEmbedMaxChars、lastSegmentSoftBlock、preserveRecentMessages、preserveRecentTokens、preserveLastUserMessage、reasoning(嵌套对象,字段级)。
  • 不可覆盖: permission(会话级,在得知模型信息前已固定)、已废弃的 minContextLimit / modelMinLimits 系列、扁平 modelMaxLimits / modelMinLimits 映射自身、以及 providers 本身。modelMaxLimits 本身未废弃 —— 仍完全支持(仅优先级被超越)。maxContextLimit 在嵌套层设置时的优先级为 嵌套覆盖 > modelMaxLimits 扁平映射 > 全局。在此设置的 protectedTools 影响压缩工具与 nudge 侧逻辑;系统提示词中的受保护工具列表(在提示词构建时生成,早于模型信息可用)始终反映全局值。
{
    "compress": {
        "maxContextLimit": "55%",
        "minNudgeContextPercent": 5,
        "nudgeGrowthTokens": 50000,
        "providers": {
            "anthropic": {
                "minNudgeContextPercent": 8,
                "nudgeForce": "strong",
                "models": {
                    "claude-sonnet-4-6": {
                        "minNudgeContextPercent": 30,
                        "maxContextLimit": "70%",
                        "nudgeGrowthTokens": 20000,
                    },
                },
            },
        },
    },
}

此例中,对 anthropic/claude-sonnet-4-6:下限为 30%,超限(over-max)区间从窗口的 70% 开始(而非全局 55%,即更大的工作区间),增长阈值为 20K,nudge 语气为 strong(继承自 provider 层)。其他 Anthropic 模型获得 8% 下限与 strong 语气,但保留全局的区间与 50K 增长阈值;其余全部使用纯全局值。provider 键为 provider id,model 键为模型 id(取自当前激活会话上报的标识,如 anthropic、claude-sonnet-4-6)。

compress.nudgeGrowthTokens

  • 类型: number
  • 默认值: 50000(固定值)
  • 状态: ACTIVE
  • 说明: nudge 增长阈值。当上下文自上次 nudge 以来增长超过此 token 数时,ACP 触发 nudge。默认值为固定值,所有模型上下文窗口大小一致(此前按窗口百分比缩放——v1.14.23 移除,因会导致小窗口模型 nudge 频率约 4 倍偏高)。

compress.toolOutputNudgeThreshold

  • 类型: number
  • 默认值: undefined
  • 状态: ACTIVE
  • 说明: 专门针对工具输出的 nudge token 阈值。当工具输出超过此值时,定向 nudge 建议压缩工具输出。

compress.iterationNudgeThreshold

  • 类型: number
  • 默认值: 15
  • 状态: ACTIVE
  • 说明: 当自上次用户消息以来积累了此数量的消息时,注入迭代 nudge(表示无用户交互的长工具调用链)。

compress.nudgeForce

  • 类型: "strong" | "soft"
  • 默认值: "soft"
  • 状态: ACTIVE
  • 说明: nudge 的语气。
    • "soft" — 信息性,让模型自行决定
    • "strong" — 更紧迫,强调上下文溢出风险

compress.protectedTools

  • 类型: string[]
  • 默认值: ["skill", "compress"]
  • 状态: ACTIVE
  • 说明: 这些工具的输出会从压缩范围中软过滤。与 commands.protectedTools(硬保护)不同,这些工具的输出从可压缩范围中排除,但其内容仍可在摘要中被引用。显式数组会替换默认值。

注意: "compress" 无论用户配置如何,都会被强制追加到此列表 — 压缩工具调用绝不能丢失。

compress.protectTags

  • 类型: boolean
  • 默认值: false
  • 状态: ACTIVE
  • 说明: 设为 true 时,<protect>...</protect> 标签包裹的内容受保护,不被压缩。

compress.protectUserMessages

  • 类型: boolean
  • 默认值: false
  • 状态: ACTIVE
  • 说明: 设为 true 时,所有用户消息受保护,不被压缩(不仅仅是最后一条)。

compress.maxSummaryLengthHard

  • 类型: number
  • 默认值: 20000
  • 状态: ACTIVE
  • 说明: 摘要长度的硬限制(字符数)。摘要超过此长度的压缩调用会被拒绝。

compress.minCompressRange

  • 类型: number
  • 默认值: 5000
  • 状态: ACTIVE
  • 说明: 压缩范围的最小估算 token 数。小于此值的范围会从推荐列表中过滤掉(不值得压缩)。

compress.minNudgeGrowthRatio

  • 类型: number
  • 默认值: 0.45
  • 状态: ACTIVE
  • 说明: 用于计算 nudge 增长下限的 nudgeGrowthTokens 比例。值越大 = nudge 频率越低。

compress.minNudgeGrowthFloor

  • 类型: number
  • 默认值: 5000
  • 状态: ACTIVE
  • 说明: nudge 增长阈值的最小 token 数。实际阈值为 max(此值, minNudgeGrowthRatio × nudgeGrowthTokens)。

compress.emergencyThresholdPercent

  • 类型: number | \${number}%``
  • 默认值: "98%"
  • 状态: ACTIVE
  • 说明: 触发"紧急"模式的上下文使用率阈值。超过此值时,ACP 覆盖所有保护过滤器,强制 nudge 模型立即压缩。

compress.maxVisibleSegments

  • 类型: number
  • 默认值: 50
  • 状态: ACTIVE
  • 说明: 系统 prompt 中分段指引显示的最大可见上下文分段数。

compress.keepEmbedMaxChars

  • 类型: number
  • 默认值: 2000
  • 状态: ACTIVE
  • 说明: 在压缩摘要中使用 [[KEEP:mNNNNN]] 标记时,每条消息嵌入的最大字符数。

compress.lastSegmentSoftBlock

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 设为 true 时,最后一个可见分段(最新消息)被视为软块 — 从压缩推荐中排除,但可通过 dangerous: true 覆盖。

compress.preserveRecentMessages

  • 类型: number
  • 默认值: 5
  • 状态: ACTIVE
  • 说明: 保护最近 N 条消息不被压缩。这些消息会从可压缩范围中软过滤。设为 0 可禁用。

compress.preserveRecentTokens

  • 类型: number
  • 默认值: 5000
  • 状态: ACTIVE
  • 说明: 近期消息保护的 token 预算。除了最近 N 条消息外,ACP 还保护此 token 预算内的消息(从最近消息向后扩展)。设为 0 可禁用。

compress.preserveLastUserMessage

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 始终保护最近一条用户消息不被压缩,无论 preserveRecentMessages 或 preserveRecentTokens 如何设置。

compress.reasoning

  • 类型: object { drop?: boolean; threshold?: number }
  • 默认值: { "drop": true, "threshold": 2048 }
  • 状态: ACTIVE (#368)
  • 说明: 控制从历史 compress 工具调用中丢弃超大 reasoning(思考)部分。compress 调用被硬排除在压缩之外,其思考内容会随每次请求原样重发,形成无法回收的上下文底座。本 pass 在请求时(从不修改持久化历史)移除已关闭轮次中 reasoning 总长超过 threshold 的 compress 消息的思考部分。活跃轮(最后一条真实用户消息及之后)永不触碰。
  • 字段:
    • drop(boolean,默认 true)— 总开关;false 完全禁用本 pass。
    • threshold(number,字符数,默认 2048)— 单条思考大小门:消息 reasoning 总长必须严格大于该值才丢弃。小思考保留;长度不跨消息累计。0 表示丢弃所有非空 reasoning(仅零长 reasoning 幸免)。
  • **按 provider/model 覆盖(字段级,走 compress.providers cascade):
{
    "compress": {
        "reasoning": { "drop": true, "threshold": 2048 },
        "providers": {
            "my-gateway": { "reasoning": { "drop": false } },
            "anthropic": {
                "reasoning": { "threshold": 8000 },
                "models": { "claude-opus-4-5": { "reasoning": { "threshold": 16000 } } },
            },
        },
    },
}

解析顺序:model 级 reasoning > provider 级 reasoning > 全局 compress.reasoning,逐字段生效(深层只覆盖显式设置的字段)。provider/model id 取自当前请求的模型标识。

compress.completionReserveTokens

  • 类型: number
  • 默认值: 32768
  • 状态: ACTIVE
  • 说明: 上下文预算守卫为模型补全预留的 token 数。守卫估算请求输入大小,若超过 window - completionReserveTokens,则确定性地截断(随后清除)旧的可压缩工具输出直至达标——摘要、受保护工具、首条用户消息和最近 3 条消息永不被改动。默认 32768 覆盖 opencode 对未声明 limit.output 模型的 32000 max_tokens 回退值。只有当模型的上下文窗口已知时守卫才生效(opencode.json 中声明的 limit.context,或目录条目)。绝对值(数字)compress.maxContextLimit 不会启用守卫——它是软性的提示阈值,而非后端的真实限制。

gc(生成与清理)

注意: GC 截断模块(gc/truncate.ts)已在 v1.14.4 中移除。剩余的 gc 字段用于块生成追踪和批量清理(块合并)。旧配置文件中的这些字段仍然有效。

gc.algorithm

  • 类型: "truncate"
  • 默认值: "truncate"
  • 状态: DEPRECATED
  • 说明: 历史上用于选择 GC 算法。只实现过 "truncate"。现为 no-op — 仅为配置兼容性保留。

gc.promotionThreshold

  • 类型: number
  • 默认值: 5
  • 状态: ACTIVE
  • 说明: 压缩块在从 "young"(新生代)提升为 "old"(老生代)之前,必须存活的消息变换周期数。老生代块有资格被 gc/merge.ts 批量合并。

gc.maxBlockAge

  • 类型: number
  • 默认值: 9007199254740991(Number.MAX_SAFE_INTEGER)
  • 状态: DEPRECATED
  • 说明: 历史上控制基于块年龄的去激活。已设为无穷大 — 实际禁用。仅为配置兼容性保留。

gc.maxOldGenSummaryLength

  • 类型: number
  • 默认值: 3000
  • 状态: ACTIVE
  • 说明: 当批量清理将多个老生代块合并为更高层级的块时,合并后摘要的最大长度(字符数)。

gc.majorGcThresholdPercent

  • 类型: number | \${number}%``
  • 默认值: "100%"
  • 状态: ACTIVE
  • 说明: 触发紧急工具输出截断的上下文使用率阈值。当上下文达到此级别时,最大的工具输出会被截断(保留 2000 字符前缀 + 后缀)以释放空间。设为 "200%" 或更高可实际禁用。摘要永远不会被截断。

gc.batchCleanup

批量清理将多个老生代块合并为更高层级的块。

gc.batchCleanup.lowThreshold
  • 类型: number | \${number}%``
  • 默认值: "55%"
  • 状态: ACTIVE
  • 说明: 低优先级批量清理的上下文使用率阈值。达到此级别时,批量清理开始考虑合并老生代块。
gc.batchCleanup.highThreshold
  • 类型: number | \${number}%``
  • 默认值: "75%"
  • 状态: ACTIVE
  • 说明: 中优先级批量清理阈值。
gc.batchCleanup.forceThreshold
  • 类型: number | \${number}%``
  • 默认值: "90%"
  • 状态: ACTIVE
  • 说明: 强制批量清理阈值。达到此级别时,批量清理激进地合并所有符合条件的块。

qualityGate

压缩后质量评估。在每次压缩后运行,验证摘要质量。

qualityGate.enabled

  • 类型: boolean
  • 默认值: false
  • 状态: ACTIVE
  • 说明: 启用压缩后质量评估。设为 true 时,ACP 根据质量指标评估每个压缩摘要。失败仅记录日志,不阻止压缩(非阻塞)。

qualityGate.algorithm

  • 类型: string
  • 默认值: "rouge-recall-v1"
  • 状态: ACTIVE
  • 说明: 使用的质量门控算法。目前仅支持 "rouge-recall-v1"。

qualityGate.algorithms

  • 类型: object
  • 状态: ACTIVE
  • 说明: 算法特定参数。见下文。
qualityGate.algorithms.rouge-recall-v1
参数 类型 默认值 说明
layer1MinChars number 200 摘要的最小长度(字符)
layer1MinRetentionPct number 5.0 最小内容保留百分比
layer2MaxRougeF1 number 0.05 ROUGE-1 F1 分数"过于相似"检测的最大值
layer2MaxTop20Recall number 0.20 质量检查的最大 top-20 关键词召回率

messageFilters

消息过滤器在 ACP 处理之前,从可见上下文中剥离或去重第三方插件注入的内容(例如 oh-my-opencode 的 system reminder、上下文转储、任务指令)。被过滤的内容不会获得消息引用(message ref),也不会计入上下文使用量或压缩触发阈值。

自 v1.14.8 起,ACP 内置了 5 个 oh-my-opencode(OMO)过滤器,全部默认启用:

过滤器 版本 行为
omo-system-reminder 1.3.0 保留最近 2 条 OMO <system-reminder> 消息;更早的会剥离 <system-reminder> 块和 <!-- OMO_INTERNAL_INITIATOR --> 标记,但保留你的实际用户内容
omo-context 1.0.0 只保留最新的 OMO [CONTEXT] 注入;丢弃更早的重复项
omo-task-directive 1.0.0 只保留最新的 OMO TASK: / ## TASK 指令;丢弃更早的
omo-todo-continuation 1.0.0 只保留最新的 OMO TODO CONTINUATION 指令;丢弃更早的
omo-mode-injection 1.1.0 剥离开头的模式块(<ultrawork-mode>、[search-mode] 等),保留用户内容

messageFilters.enabled

  • 类型: boolean
  • 默认值: true
  • 状态: ACTIVE
  • 说明: 主开关。设为 false 时不运行任何过滤器。

messageFilters.filters

  • 类型: object — Record<filterName, { enabled: boolean; keepLast?: number }>
  • 默认值: 所有内置过滤器启用
  • 状态: ACTIVE
  • 说明: 按过滤器配置。enabled 单独开关某个过滤器;keepLast(仅去重类过滤器)设置保留最近多少条匹配消息——默认 1,omo-system-reminder 除外(默认 2)。

示例:

{
    "messageFilters": {
        "enabled": true,
        "filters": {
            "omo-system-reminder": { "enabled": true, "keepLast": 2 },
            "omo-context": { "enabled": true },
            "omo-task-directive": { "enabled": true },
            "omo-todo-continuation": { "enabled": true },
            "omo-mode-injection": { "enabled": true },
        },
    },
}

常用配置模板

激进压缩(最大化上下文节省)

{
    "compress": {
        "maxContextLimit": "45%",
        "minContextLimit": "35%",
        "preserveRecentMessages": 3,
        "preserveRecentTokens": 2000,
        "nudgeFrequency": 3,
    },
}

保守压缩(最小化信息丢失)

{
    "compress": {
        "maxContextLimit": "70%",
        "minContextLimit": "60%",
        "preserveRecentMessages": 15,
        "preserveRecentTokens": 10000,
        "nudgeFrequency": 8,
        "protectedTools": ["skill", "bash", "read", "grep", "glob"],
    },
}

完全禁用自动压缩

{}

按模型设置上下文限制

{
    "compress": {
        "modelMaxLimits": {
            "gpt-4o": 80000,
            "claude-3.5-sonnet": "60%",
            "gemini-1.5-pro": 150000,
        },
        "modelMinLimits": {
            "gpt-4o": 60000,
            "claude-3.5-sonnet": "50%",
        },
    },
}

按模型设置增长 nudge 下限(嵌套 providers.models)

{
    "compress": {
        "minNudgeContextPercent": 5,
        "providers": {
            "anthropic": {
                "minNudgeContextPercent": 8,
                "models": {
                    "claude-sonnet-4-6": { "minNudgeContextPercent": 30 },
                    "claude-haiku-4-5": { "minNudgeContextPercent": 0 },
                },
            },
        },
    },
}

下限按 模型 > provider > 全局 逐字段解析。0 表示为该模型禁用下限——适用于小窗口模型,仅靠增长阈值触发即可。

按模型调优任意 compress 字段(嵌套 providers.models)

同样的级联适用于所有可调字段,而不仅是下限——例如给某个重度使用的模型设置更紧的增长阈值与更低的超限区间,而同 provider 的其他模型保持全局配置:

{
    "compress": {
        "providers": {
            "anthropic": {
                "models": {
                    "claude-sonnet-4-6": {
                        "nudgeGrowthTokens": 20000,
                        "maxContextLimit": "40%",
                    },
                },
            },
        },
    },
}

完整可覆盖字段列表见 compress.providers 参考节。

保护敏感文件

{
    "protectedFilePatterns": [
        "**/*.env",
        "**/*.pem",
        "**/*.key",
        "**/credentials.json",
        "**/secrets.*",
    ],
}

调整或禁用 oh-my-opencode(OMO)注入过滤器

5 个内置 OMO 过滤器默认开启(见 messageFilters)。可以保留更多最近的 system-reminder、单独禁用某个过滤器,或整体关闭:

{
    "messageFilters": {
        "enabled": true,
        "filters": {
            // 保留最近 3 条 OMO system-reminder(默认 2 条)
            "omo-system-reminder": { "enabled": true, "keepLast": 3 },
            // 只禁用一个过滤器,其余保持
            "omo-task-directive": { "enabled": false },
        },
    },
}
{
    // 关闭所有消息过滤器
    "messageFilters": { "enabled": false },
}

自定义会话状态存储位置

{
    // 绝对路径、~ 展开,或相对于项目目录
    "storagePath": "~/data/acp-state",
}

已移除的参数

以下参数存在于旧版本中,现已移除。包含这些参数的配置文件会显示警告提示,但仍可正常工作。

参数 移除版本 替代方案
strategies.deduplication.* PR #206 压缩工具自动处理重复
strategies.purgeErrors.* PR #206 压缩工具自动处理错误清理
compress.automaticStrategies PR #206 始终开启;无需配置
state.prune.tools PR #206 仅内部使用;无需配置

配置验证

ACP 在加载时验证配置。未知键和类型不匹配会触发警告提示。有效键定义在 lib/config-validation.ts(VALID_CONFIG_KEYS 集合)中。