Skip to content

DCP API 参考 ​

学完你能做什么 ​

本节为插件开发者提供 DCP 的完整 API 参考,让你能够:

  • 理解 DCP 的插件入口和钩子机制
  • 掌握配置接口和所有配置项的作用
  • 了解 discard 和 extract 工具的规范
  • 使用状态管理 API 进行会话状态操作

核心概念 ​

DCP 插件基于 OpenCode Plugin SDK,通过注册钩子、工具和命令来实现上下文修剪功能。

插件生命周期:

1. OpenCode 加载插件
    ↓
2. Plugin 函数执行
    ↓
3. 注册钩子、工具、命令
    ↓
4. OpenCode 调用钩子处理消息
    ↓
5. 插件执行修剪逻辑
    ↓
6. 返回修改后的消息

插件入口 API ​

Plugin 函数 ​

DCP 的主入口函数,返回插件配置对象。

签名:

typescript
import type { Plugin } from "@opencode-ai/plugin"

const plugin: Plugin = (async (ctx) => {
    // 插件初始化逻辑
    return {
        // 注册的钩子、工具、命令
    }) satisfies Plugin

export default plugin

参数:

参数名类型描述
ctxPluginInputOpenCode 插件上下文,包含 client 和 directory 等信息

返回值:

插件配置对象,包含以下字段:

字段类型描述
experimental.chat.system.transformHandler系统提示词注入钩子
experimental.chat.messages.transformHandler消息转换钩子
chat.messageHandler消息捕获钩子
command.execute.beforeHandler命令执行钩子
toolRecord<string, Tool>注册的工具映射
configConfigHandler配置变异钩子

源码位置:index.ts


配置 API ​

PluginConfig 接口 ​

DCP 的完整配置类型定义。

typescript
export interface PluginConfig {
    enabled: boolean
    debug: boolean
    pruneNotification: "off" | "minimal" | "detailed"
    commands: Commands
    turnProtection: TurnProtection
    protectedFilePatterns: string[]
    tools: Tools
    strategies: {
        deduplication: Deduplication
        supersedeWrites: SupersedeWrites
        purgeErrors: PurgeErrors
    }
}

源码位置:lib/config.ts

配置项详解 ​

顶层配置 ​

配置项类型默认值描述
enabledbooleantrue是否启用插件
debugbooleanfalse是否启用调试日志,日志写入 ~/.config/opencode/logs/dcp/
pruneNotification"off" | "minimal" | "detailed""detailed"通知显示模式
protectedFilePatternsstring[][]文件保护 glob 模式列表,匹配的文件不会被修剪

Commands 配置 ​

typescript
export interface Commands {
    enabled: boolean
    protectedTools: string[]
}
字段类型默认值描述
enabledbooleantrue是否启用 /dcp 命令
protectedToolsstring[][...DEFAULT_PROTECTED_TOOLS]命令保护工具列表,这些工具不会被 /dcp sweep 修剪

TurnProtection 配置 ​

typescript
export interface TurnProtection {
    enabled: boolean
    turns: number
}
字段类型默认值描述
enabledbooleanfalse是否启用回合保护
turnsnumber4保护回合数,最近 N 个回合的工具不会被修剪

Tools 配置 ​

typescript
export interface Tools {
    settings: ToolSettings
    discard: DiscardTool
    extract: ExtractTool
}

ToolSettings:

typescript
export interface ToolSettings {
    nudgeEnabled: boolean
    nudgeFrequency: number
    protectedTools: string[]
}
字段类型默认值描述
nudgeEnabledbooleantrue是否启用 AI 提醒
nudgeFrequencynumber10提醒频率,每 N 个工具结果后提醒 AI 使用修剪工具
protectedToolsstring[][...DEFAULT_PROTECTED_TOOLS]工具保护列表

DiscardTool:

typescript
export interface DiscardTool {
    enabled: boolean
}
字段类型默认值描述
enabledbooleantrue是否启用 discard 工具

ExtractTool:

typescript
export interface ExtractTool {
    enabled: boolean
    showDistillation: boolean
}
字段类型默认值描述
enabledbooleantrue是否启用 extract 工具
showDistillationbooleanfalse是否在通知中显示提取内容

Strategies 配置 ​

Deduplication:

typescript
export interface Deduplication {
    enabled: boolean
    protectedTools: string[]
}
字段类型默认值描述
enabledbooleantrue是否启用去重策略
protectedToolsstring[][...DEFAULT_PROTECTED_TOOLS]不参与去重的工具列表

SupersedeWrites:

typescript
export interface SupersedeWrites {
    enabled: boolean
}
字段类型默认值描述
enabledbooleanfalse是否启用覆盖写入策略

PurgeErrors:

typescript
export interface PurgeErrors {
    enabled: boolean
    turns: number
    protectedTools: string[]
}
字段类型默认值描述
enabledbooleantrue是否启用错误清理策略
turnsnumber4错误清理阈值(回合数)
protectedToolsstring[][...DEFAULT_PROTECTED_TOOLS]不参与清理的工具列表

getConfig 函数 ​

加载并合并多层级配置。

typescript
export function getConfig(ctx: PluginInput): PluginConfig

参数:

参数名类型描述
ctxPluginInputOpenCode 插件上下文

返回值:

合并后的配置对象,优先级从高到低:

  1. 项目配置 (.opencode/dcp.jsonc)
  2. 环境变量配置 ($OPENCODE_CONFIG_DIR/dcp.jsonc)
  3. 全局配置 (~/.config/opencode/dcp.jsonc)
  4. 默认配置(代码中定义)

源码位置:lib/config.ts


工具 API ​

createDiscardTool ​

创建 discard 工具,用于移除已完成的任务或噪声工具输出。

typescript
export function createDiscardTool(ctx: PruneToolContext): ReturnType<typeof tool>

参数:

参数名类型描述
ctxPruneToolContext工具上下文,包含 client、state、logger、config、workingDirectory

工具规范:

字段类型描述
idsstring[]首元素为原因('completion' 或 'noise'),后续为数字 ID

源码位置:lib/strategies/tools.ts

createExtractTool ​

创建 extract 工具,用于提取关键发现后删除原始工具输出。

typescript
export function createExtractTool(ctx: PruneToolContext): ReturnType<typeof tool>

参数:

参数名类型描述
ctxPruneToolContext工具上下文,包含 client、state、logger、config、workingDirectory

工具规范:

字段类型描述
idsstring[]数字 ID 数组
distillationstring[]提取内容数组,长度与 ids 一致

源码位置:lib/strategies/tools.ts


状态 API ​

SessionState 接口 ​

会话状态对象,管理单个会话的运行时状态。

typescript
export interface SessionState {
    sessionId: string | null
    isSubAgent: boolean
    prune: Prune
    stats: SessionStats
    toolParameters: Map<string, ToolParameterEntry>
    nudgeCounter: number
    lastToolPrune: boolean
    lastCompaction: number
    currentTurn: number
    variant: string | undefined
}

字段说明:

字段类型描述
sessionIdstring | nullOpenCode 会话 ID
isSubAgentboolean是否为子代理会话
prunePrune修剪状态
statsSessionStats统计数据
toolParametersMap<string, ToolParameterEntry>工具调用缓存(callID → 元数据)
nudgeCounternumber累计工具调用次数(用于触发提醒)
lastToolPruneboolean上一次操作是否为修剪工具
lastCompactionnumber最后一次上下文压缩时间戳
currentTurnnumber当前回合数
variantstring | undefined模型变体(如 claude-3.5-sonnet)

源码位置:lib/state/types.ts

SessionStats 接口 ​

会话级别的 Token 修剪统计。

typescript
export interface SessionStats {
    pruneTokenCounter: number
    totalPruneTokens: number
}

字段说明:

字段类型描述
pruneTokenCounternumber当前会话已修剪 Token 数(累计)
totalPruneTokensnumber历史累计已修剪 Token 数

源码位置:lib/state/types.ts

Prune 接口 ​

修剪状态对象。

typescript
export interface Prune {
    toolIds: string[]
}

字段说明:

字段类型描述
toolIdsstring[]已标记修剪的工具调用 ID 列表

源码位置:lib/state/types.ts

ToolParameterEntry 接口 ​

单个工具调用的元数据缓存。

typescript
export interface ToolParameterEntry {
    tool: string
    parameters: any
    status?: ToolStatus
    error?: string
    turn: number
}

字段说明:

字段类型描述
toolstring工具名称
parametersany工具参数
statusToolStatus | undefined工具执行状态
errorstring | undefined错误信息(如有)
turnnumber创建该调用的回合数

ToolStatus 枚举:

typescript
export type ToolStatus = "pending" | "running" | "completed" | "error"

源码位置:lib/state/types.ts

createSessionState ​

创建新的会话状态对象。

typescript
export function createSessionState(): SessionState

返回值:初始化的 SessionState 对象


钩子 API ​

createSystemPromptHandler ​

创建系统提示词注入钩子处理器。

typescript
export function createSystemPromptHandler(
    state: SessionState,
    logger: Logger,
    config: PluginConfig,
): Handler

参数:

参数名类型描述
stateSessionState会话状态对象
loggerLogger日志系统实例
configPluginConfig配置对象

行为:

  • 检查是否为子代理会话,如果是则跳过
  • 检查是否为内部代理(如摘要生成器),如果是则跳过
  • 根据配置加载对应的提示词模板(both/discard/extract)
  • 将修剪工具说明注入到系统提示词

源码位置:lib/hooks.ts

createChatMessageTransformHandler ​

创建消息转换钩子处理器,执行自动修剪逻辑。

typescript
export function createChatMessageTransformHandler(
    client: any,
    state: SessionState,
    logger: Logger,
    config: PluginConfig,
): Handler

参数:

参数名类型描述
clientanyOpenCode 客户端实例
stateSessionState会话状态对象
loggerLogger日志系统实例
configPluginConfig配置对象

处理流程:

  1. 检查会话状态(是否为子代理)
  2. 同步工具缓存
  3. 执行自动策略(去重、覆盖写入、清除错误)
  4. 修剪已标记的工具内容
  5. 注入 <prunable-tools> 列表
  6. 保存上下文快照(如果配置了)

源码位置:lib/hooks.ts

createCommandExecuteHandler ​

创建命令执行钩子处理器,处理 /dcp 系列命令。

typescript
export function createCommandExecuteHandler(
    client: any,
    state: SessionState,
    logger: Logger,
    config: PluginConfig,
    workingDirectory: string,
): Handler

参数:

参数名类型描述
clientanyOpenCode 客户端实例
stateSessionState会话状态对象
loggerLogger日志系统实例
configPluginConfig配置对象
workingDirectorystring工作目录路径

支持的命令:

  • /dcp - 显示帮助信息
  • /dcp context - 显示当前会话 Token 使用分析
  • /dcp stats - 显示累计修剪统计
  • /dcp sweep [n] - 手动修剪工具(可选指定数量)

源码位置:lib/hooks.ts


本课小结 ​

本节提供了 DCP 插件的完整 API 参考,涵盖了:

  • 插件入口函数和钩子注册机制
  • 配置接口和所有配置项的详细说明
  • discard 和 extract 工具的规范和创建方法
  • 会话状态、统计数据和工具缓存的类型定义
  • 系统提示词、消息转换和命令执行的钩子处理器

如果你需要深入了解 DCP 的内部实现细节,建议阅读架构概览和Token 计算原理。


附录:源码参考 ​

点击展开查看源码位置

更新时间:2026-01-23

功能文件路径行号
插件入口函数index.ts12-102
配置接口定义lib/config.ts7-66
getConfig 函数lib/config.ts669-797
discard 工具创建lib/strategies/tools.ts155-181
extract 工具创建lib/strategies/tools.ts183-220
状态类型定义lib/state/types.ts1-39
系统提示词钩子lib/hooks.ts20-53
消息转换钩子lib/hooks.ts55-82
命令执行钩子lib/hooks.ts84-156

关键类型:

  • Plugin: OpenCode 插件函数签名
  • PluginConfig: DCP 配置接口
  • SessionState: 会话状态接口
  • ToolStatus: 工具状态枚举(pending | running | completed | error)

关键函数:

  • plugin(): 插件入口函数
  • getConfig(): 加载和合并配置
  • createDiscardTool(): 创建 discard 工具
  • createExtractTool(): 创建 extract 工具
  • createSessionState(): 创建会话状态