Skip to content

[FEATURE]:Built-in per-message feedback (👍/👎) with a plugin hook to capture it #33584

Closed as not planned

Description

@jiangshanwe

Feature hasn't been suggested before.

  • I have verified this feature I'm about to request hasn't been suggested before.

Describe the enhancement you want to request

Summary

Add a built-in, opencode-owned per-message feedback affordance (thumbs
up/down, like ChatGPT/Claude) and expose a plugin hook/event that delivers
the user's rating. opencode owns the rendering; plugins just receive the
signal. I explicitly do not want a plugin-maintained custom-UI framework —
just a standard primitive plus a callback.

Problem

A plugin wants to collect per-response satisfaction feedback. The natural place
is an inline 👍/👎 under each assistant message — on the desktop GUI especially,
this would feel completely native. Today there is no way to do it:

  • Toasts (client.tui.showToast) are output, not input — can't capture
    a click, and popping one up is itself an interruption.
  • Slash commands require the user to proactively type / and discover the
    command. Most users only ask questions and read replies; they never explore
    the palette.
  • Natural language ("that was wrong") relies on the user volunteering and
    the model routing it — near-zero coverage for ordinary users.

Inline buttons are the only spot that is always visible yet never interrupts
— they sit under the reply the user is already reading. Nothing today can
occupy it.

Proposed (primary): built-in feedback + plugin callback

opencode renders a standard rating control on each assistant message and emits
an event plugins can subscribe to:

export const MyPlugin = {
  // fired when the user rates a message via the built-in control
  async messageFeedback({ sessionID, messageID, rating, comment }) {
    //   rating:  "up" | "down"  (or a numeric scale, your call)
    //   comment: optional free text, if the control offers an input
    // plugin persists / forwards it
  },
}

opencode fully owns placement, look, and behavior. Plugins never render or
maintain UI — they only receive { sessionID, messageID, rating, comment? }.

Also acceptable (secondary): generic per-message action slot

If you'd rather expose a generic primitive, a per-message action contribution
with an onClick callback (custom bottom icons + click delivery) would also
satisfy this and subsumes the above:

message: {
  actions(message) {
    return [{ id: "thumbs-up", icon: "👍" }, { id: "thumbs-down", icon: "👎" }]
  },
  async onAction({ actionId, message, sessionID }) { /* ... */ },
}

Either one works. Preference is the built-in control, to keep UI ownership with
opencode.

Use cases

- 👍/👎 response rating → telemetry / eval datasets
- quality signals for plugin authors to improve their agents
- (with the generic slot) "regenerate", "save as template", "bookmark", etc.

Related (not duplicates)

- #17492 (Plugin API for TUI customization) — closed; scoped to static
content injection + layout config. No interactive or message-scoped primitive.
- #23539 (status bar widgets) — open, but render-only and a global bar,
not per-message.

Neither offers an interactive, message-scoped feedback primitive. Keeping
this ask deliberately minimal: a built-in control + a callback, not a TUI
framework.

Activity

  1. github-actions commented on Aug 24, 2026

    @github-actions
    Contributor

    To stay organized issues are automatically closed after 60 days of no activity. If the issue is still relevant please open a new one.

  2. qdrddr commented on Oct 26, 2026

    @qdrddr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions