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(): 建立會話狀態