Skip to content

Справочник API DCP

Чему вы научитесь

В этом разделе для разработчиков плагинов представлен полный справочник API DCP, который позволит вам:

  • Понять механизм входа плагина и хуков 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

Параметры:

Имя параметраТипОписание
ctxPluginInputКонтекст плагина OpenCode, содержит информацию о 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Включены ли напоминания ИИ
nudgeFrequencynumber10Частота напоминаний — напоминать ИИ об использовании инструментов обрезки каждые N результатов
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

Параметры:

Имя параметраТипОписание
ctxPluginInputКонтекст плагина OpenCode

Возвращаемое значение:

Объект объединённой конфигурации с приоритетом от высокого к низкому:

  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

Объект состояния сессии, управляющий runtime-состоянием отдельной сессии.

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 | nullID сессии OpenCode
isSubAgentbooleanЯвляется ли сессия подагентом
prunePruneСостояние обрезки
statsSessionStatsСтатистика
toolParametersMap<string, ToolParameterEntry>Кэш вызовов инструментов (callID → метаданные)
nudgeCounternumberСчётчик вызовов инструментов (для триггера напоминаний)
lastToolPrunebooleanБыла ли последняя операция обрезкой инструмента
lastCompactionnumberВременная метка последнего сжатия контекста
currentTurnnumberТекущий номер хода
variantstring | undefinedВариант модели (например, claude-3.5-sonnet)

Расположение исходного кода: lib/state/types.ts

Интерфейс SessionStats

Статистика обрезки токенов на уровне сессии.

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

Описание полей:

ПолеТипОписание
pruneTokenCounternumberКоличество обрезанных токенов в текущей сессии (нарастающий итог)
totalPruneTokensnumberИсторическое накопленное количество обрезанных токенов

Расположение исходного кода: 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

Параметры:

Имя параметраТипОписание
clientanyЭкземпляр клиента OpenCode
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

Параметры:

Имя параметраТипОписание
clientanyЭкземпляр клиента OpenCode
stateSessionStateОбъект состояния сессии
loggerLoggerЭкземпляр системы логирования
configPluginConfigОбъект конфигурации
workingDirectorystringПуть к рабочей директории

Поддерживаемые команды:

  • /dcp — отображение справочной информации
  • /dcp context — отображение анализа использования токенов текущей сессии
  • /dcp stats — отображение накопленной статистики обрезки
  • /dcp sweep [n] — ручная обрезка инструментов (опционально указать количество)

Расположение исходного кода: lib/hooks.ts


Резюме урока

В этом разделе представлен полный справочник API плагина DCP, охватывающий:

  • Функцию входа плагина и механизм регистрации хуков
  • Подробное описание интерфейсов конфигурации и всех параметров
  • Спецификации и методы создания инструментов discard и extract
  • Определения типов состояния сессии, статистики и кэша инструментов
  • Обработчики хуков для системных промптов, преобразования сообщений и выполнения команд

Если вам требуется более глубокое понимание внутренней реализации DCP, рекомендуется изучить обзор архитектуры и принципы подсчёта токенов.


Приложение: Справочник исходного кода

Нажмите для просмотра расположения исходного кода

Дата обновления: 2026-01-23

ФункцияПуть к файлуНомера строк
Функция входа плагинаindex.ts12-102
Определение интерфейса конфигурацииlib/config.ts7-66
Функция getConfiglib/config.ts669-797
Создание инструмента discardlib/strategies/tools.ts155-181
Создание инструмента extractlib/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(): Создание состояния сессии