OpenCode - подключение opencode-smart-title - автоматические имена сессий - 2026
Published: 2026-09-29
OpenCode сам придумывает сессиям названия вида «New session», и в списке проекта десятки безымянных диалогов. Плагин opencode-smart-title решает задачу: он смотрит на переписку и переименовывает сессию в короткий осмысленный заголовок, когда вы остановились печатать.
Просто добавить плагин в opencode.json в 2026 году недостаточно. Оригинал от Tarquinen падает на OpenCode 1.18.33 с ошибкой Unsupported model version v4, а свежие модели от Google дополнительно ломаются на схемах MCP-инструментов. Ниже — рабочая схема подключения на форке с локальным патчем промпта и проверка на живом сервере.
Обзор
Плагин не обращается к LLM напрямую. Он создаёт дочернюю (subagent) сессию через API самого OpenCode, отправляет в неё промпт с контекстом разговора, забирает ответ и записывает его в заголовок родительской сессии. Отсюда главное следствие: качество и доступность генератора зависят от моделей, которые видит OpenCode, а не от отдельного API-ключа.
| Параметр | Значение |
|---|---|
| Оригинал | @tarquinen/opencode-smart-title 0.1.7 |
| Рабочий вариант | @hyakt/opencode-smart-title 0.1.10 |
| Проверено на | OpenCode 1.18.33 |
| Модель генератора | opencode/big-pickle
|
| Файл конфига | ~/.config/opencode/smart-title.jsonc
|
| Лог отладки | ~/.config/opencode/logs/smart-title/YYYY-MM-DD.log
|
Почему оригинал не работает
Оригинальный плагин внутри себя использует пакет @tarquinen/opencode-auth-provider и AI SDK версии 5. Эта связка умеет только с моделями спецификации v2, а OpenCode 1.18.33 отдаёт модели спецификации v4. Ошибка возникает мгновенно, до первого токена, и одинакова для всех провайдеров:
Подмена модели не помогает: ошибка приходит на уровне протокола, а не на уровне доступа к ключу. Нужен форк, который вообще не импортирует AI SDK.
Форк hyakt убирает три тяжёлые зависимости (<code>ai</code>, <code>@ai-sdk/openai-compatible</code>, <code>@tarquinen/opencode-auth-provider</code>) и заменяет прямой вызов на <code>client.session.create()</code> плюс <code>client.session.prompt()</code>. В конфиг добавляется одна строка:
<syntaxhighlight lang="json"
{
"plugin": ["@hyakt/opencode-smart-title"]
}
Какую модель выбрать
В дочерней сессии наследуются все инструменты основной сессии, включая MCP-серверы. Модели Google при попытке построить схемы этих инструментов валятся на одном из параметров типа enum:
Это баг схемы одного из ваших MCP-инструментов, а не проблема заголовков. Модели семейства <code>google/gemini-*</code> в этой конфигурации непригодны, а модель <code>opencode/big-pickle</code> работает: она корректно принимает полный набор инструментов и отвечает быстро.
Конфигурация генератора (файл <code>smart-title.jsonc</code>, <code>model</code> указывается как <code>провайдер/модель</code>):
<syntaxhighlight lang="jsonc"
{
"enabled": true,
"debug": false,
"model": "opencode/big-pickle",
"updateThreshold": 1
}
Поле updateThreshold — это сколько событий простоя должно пройти перед переименованием. Значение 1 переименовывает сессию на каждой паузе, 3 заставит ждать более длинного диалога.
Встроенный title-агент
В OpenCode есть собственный агент title, который тоже проставляет заголовки. Одновременно с плагином они мешают друг другу: встроенный агент может выбрать модель с нулевым балансом и постоянно сыпать ошибки в лог. Отключается он в opencode.json:
Типичная ошибка, если этого не сделать, выглядит так: <code>Insufficient account funds</code> на модели <code>gpt-5.4-nano</code>. Заголовок при этом всё равно поставит плагин, но в логе будет постоянный шум.
== Заголовки на русском и английском ==
Промпт плагина в оригинале жёстко заточен под английский: в правилах стоит требование использовать глаголы с окончанием <code>-ing</code>, поэтому все заголовки выходят на английском независимо от языка разговора.
Два способа это исправить.
Первый — задать свой промпт в конфиге, поле <code>prompt</code> поддерживается плагином и полностью заменяет встроенный:
<syntaxhighlight lang="jsonc
{
"model": "opencode/big-pickle",
"prompt": "Ты генератор заголовков. Определи язык сообщений пользователя и ответь ОДНИМ заголовком на этом же языке, до 50 символов. Технические термины не переводи."
}
Второй — пропатчить промпт на диске. Он лежит в пакете рядом с основным файлом плагина, и правится без пересборки:
Практика показала, что правила в промпте недостаточно: модель продолжала отвечать по-русски на английский запрос. Надёжнее определить язык локально и передать его явной меткой. В <code>dist/index.js</code> рядом с отправкой промпта добавляется проверка наличия кириллицы: <syntaxhighlight lang="js const detectedLanguage = /[\u0400-\u04FF]/.test(context) ? 'ru' : 'en'
Далее в тело запроса добавляется тег <detected_language> со значением ru или en, а в промпте — правило «заголовок пишется строго на этом языке, технические термины не переводятся». После такой правки русский запрос даёт русский заголовок, английский — английский.
Установка локальной копии
Если плагин нужно патчить, удобно не зависеть от npm: файлы кладутся рядом с конфигом, а в списке плагинов указывается путь через file://. Такой способ описан в документации OpenCode по плагинам.
В <code>~/.config/opencode/opencode.json</code> плагин подключается по пути к файлу:
<syntaxhighlight lang="json"
{
"plugin": [
"file:///Users/antonmac/.config/opencode/plugins/smart-title/dist/index.js"
]
}
Единственная внешняя зависимость пакета — jsonc-parser для чтения файла конфигурации. Её нужно добавить в package.json самой папки конфига OpenCode и выполнить установку:
== Проверка и отладка == Включите <code>"debug": true</code> и посмотрите лог <code>~/.config/opencode/logs/smart-title/</code>. Полезная последовательность записей выглядит так: <syntaxhighlight lang="text Smart Title plugin initialized model=opencode/big-pickle Session became idle Turn context user=Объясни разницу между TCP и UDP Child session created model=opencode/big-pickle Detected conversation language detectedLanguage=ru Title generated successfully title=Разница между TCP и UDP Session title updated successfully
Обратите внимание на две строки. Запись No response from subagent означает, что дочерняя сессия не вернула ответ — обычно виновата модель, а не плагин. Запись Title generation returned null после неё означает, что заголовок не обновился.
Проверять удобно через opencode serve на отдельном порту: плагин работает и там, а сессии можно создавать и опрашивать по HTTP API, не трогая основной интерфейс.
| Запрос | Заголовок |
|---|---|
| Объясни разницу между TCP и UDP | Разница между TCP и UDP |
| Сравни цены на VPS в Европе и США | Сравнение цен на VPS в Европе и США |
| Explain the difference between TCP and UDP | TCP vs UDP differences |
| Add PostgreSQL indexes to the slow queries table | Adding PostgreSQL indexes to slow queries table |
Сравнение вариантов
| Вариант | Плюсы | Минусы |
|---|---|---|
| @tarquinen/opencode-smart-title | Каноничный, автор активно поддерживает репозиторий | Несовместим с OpenCode 1.18.33: прямой вызов через AI SDK 5 |
| @hyakt/opencode-smart-title | Работает с 1.18.33, любой провайдер OpenCode, есть свой промпт | Промпт только на английском, без патчей или замены модели |
| Локальная копия форка | Свой промпт, свой язык заголовков, независимость от npm | Патчи нужно переносить при обновлении пакета |
| Встроенный агент title | Не требует настройки | Ошибки при нулевом балансе провайдера, неконтролируемый выбор модели |
FAQ
Подскажите, заголовки не появляются вообще. С чего начать?
Включите "debug": true в smart-title.jsonc и откройте свежий лог в ~/.config/opencode/logs/smart-title/. Если строки Session became idle нет — плагин не загружен, проверьте путь в plugin и перезапустите OpenCode.
Ошибка Unsupported model version v4 Вы подключили оригинальный Tarquinen или его npm-версию. Он использует AI SDK 5 и не понимает спецификацию v4. Переходите на форк hyakt.
Ошибка Invalid value at tools[0].function_declarations
Модель Google не может построить схемы ваших MCP-инструментов в дочерней сессии. Поменяйте model в конфиге на opencode/big-pickle или другую модель, которая корректно принимает инструменты.
Можно ли задать свой промпт?
Да, поле prompt в smart-title.jsonc. Оно полностью заменяет встроенный промпт, поэтому все правила и примеры нужно указать в нём самому.
Заголовок обновляется слишком часто
Увеличьте updateThreshold с 1 до 3 или 5. Плагин будет переименовывать сессию реже и с более длинным контекстом.
Итог
Плагин подключается за пару минут, если взять совместимый форк, указать модель, которая тянет MCP-инструменты, и отключить встроенный агент title. Русские и английские заголовки требуют патча промпта: определение языка по наличию кириллицы в коде надёжнее, чем просьба к модели. Данные актуальны на 29.09.2026.
