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(): Создание состояния сессии