Title generation runs experimental.chat.system.transform, so plugin-added context is re-sent on every new session
@kitlangton ya está trabajando en esto.
Desde el 22/9/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
Description
Session title generation streams the built-in title agent through the same LLMRequestPrep.prepare as chat turns (packages/opencode/src/session/prompt.ts: llm.stream({ agent: title, system: [], small: true, sessionID: <parent session id> })), so experimental.chat.system.transform fires for it. The hook input is { sessionID, model } with the parent's id, so a plugin cannot tell the title request from the first real turn.
Whatever a plugin appends in that hook is therefore sent again in a request whose only output is a short title. With a plugin that appends ~45K tokens of instructions for the main agent, every new session's title call was a 46K-token prompt, ~80s time-to-first-token on a local model, running in parallel with the real first turn. doobidoo/mcp-memory-service injects memories in the same hook keyed only on input.sessionID, so it pays the same.
Proposed fix: do not run experimental.chat.system.transform for the title agent. experimental.chat.messages.transform already never runs for it, and on v2 title generation has its own session.title hook with no agent or tools (#47663, #48212). Users who want a different title prompt have agent: { title: { prompt, model } }, and agent: { title: { disable: true } } still turns the call off.
Why skip the hook rather than make the title request share the main request's cached prefix: what plugins add in this hook differs per user and per plugin, so the title request cannot rely on a matching cached prefix, and the title call's latency and cost still land on every new session. Not running the hook for the title is the smallest change and sends the fewest tokens. I have a one-line PR ready and will open it against this issue.
Related: #23114 (plugin context reaching the title model through messages), #46115 (a redaction plugin wants title requests to run messages.transform), #46371 (title calls billed but absent from session cost).
Plugins
A local plugin that appends project context in experimental.chat.system.transform.
OpenCode version
v1.18.32 (dev @ fe3f3a41f7)
Steps to reproduce
- In an empty directory, save
repro.js:import { appendFileSync } from "node:fs" export default async () => ({ "experimental.chat.system.transform": async (input, output) => { appendFileSync("hook.log", JSON.stringify({ inputKeys: Object.keys(input), sessionID: input.sessionID, system: output.system[0].slice(0, 26) }) + "\n") }, }) opencode.jsonin the same directory:{ "plugin": ["file:///absolute/path/to/repro.js"] }opencode run "hello" </dev/nullhook.loghas two lines with the samesessionIDandinputKeys: ["sessionID","model"]; onesystemis the chat prompt, the other starts withYou are a title generator.Nothing in the input lets the plugin skip the second one.
Screenshot and/or share link
n/a
Operating System
macOS 26.3
Terminal
iTerm2
- Lenguaje dominante
- TypeScript
- Estrellas
- 209k
- Forks
- 27.5k
- Merge medio
- 8 h 12 min
- PR fusionados (30 d)
- 352
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de anomalyco/opencode
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
NO API KEY Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 90/100
Todos los issues de anomalyco/opencode
Issues similares
-
blocklist removal
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
MetaMask/eth-phishing-detect#296544 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
pastelsky/bundlephobia#1122 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
category/development priority/P2 scope/file-operations scope/testing type/enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
-
Enatega Customer and Rider app: Add-ons price is not visible to customer after order is placed. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100