回答操作

对已有的对话重新来过:重新生成、编辑后重发。给了适配器对应的能力函数时显示。

answer-actions.tsx
import '@volcengine/chatkit/styles.css';

import { Chatkit, SessionList } from '@volcengine/chatkit';
import { createMockAdapter } from '@volcengine/chatkit/adapters/mock';

import { useDemoSessions } from '../sessions';

const adapter = createMockAdapter();

// 回答操作不需要配置:适配器实现了 regenerate / edit,按钮就出现。
// 编辑需要消息关联运行记录,重新生成还需要原始输入;只允许编辑最新用户消息、重新生成最新回答。
// 不想要某一个时用 features 关掉,比如 features={{ edit: false }}。
export default function AnswerActions() {
  const { chat: sessions, listProps } = useDemoSessions({ adapter });
  return (
    <div className="demo-row">
      <SessionList {...listProps} style={{ width: 190 }} />
      <div className="demo-main">
        <Chatkit sessions={sessions} settings={{ placeholder: '发一句话,回答完成后试试重新生成和编辑' }} />
      </div>
    </div>
  );
}
先发一句话:重新生成已有回答、编辑用户消息后重发新窗口打开

两个操作

操作入口效果要给的能力函数
重新生成最新回答的操作栏用同一份输入再回答一次,这一轮及之后的内容被替换regenerate
编辑后重发关联了已知 Run 的用户消息消息变成编辑框;发送后,这一轮及之后的内容被替换edit

重新生成只出现在最新回答上;编辑可出现在任意一条属于当前运行时已知 Run 的用户消息上。正在生成、排队或加载历史时,两个操作不可用。适配器提供函数并不意味着缺少 Run 或原始输入的历史消息也能重发。

统一覆盖历史

编辑后重发与回复后重试(「重新生成」)都会覆盖目标轮次及之后的历史消息,保留之前的内容。编辑使用新输入,重试复用原始输入;旧内容不再参与后续上下文,也不会在刷新、翻页或重新打开会话后恢复。

后端必须支持相同的历史覆盖语义,才能提供 edit / regenerate 能力。请求未受理时恢复旧内容;已受理后生成失败则保留新轮次及失败状态。旧版本如需保存,应与当前主线分开。

用法

不需要配置。不想显示某一个时关掉:

<Chatkit sessions={sessions} features={{ edit: false }} />

配置项

配置项类型默认说明
features.regeneratebooleantrue重新生成;需要后端支持。
features.editbooleantrue编辑后重发;需要后端支持。
features.copybooleantrue复制回答。
slots.message.actionsChatkitStackSlot<ChatkitMessageSlotContext>—回答下方的操作栏,排在复制、赞踩之后。

在操作栏里加自己的按钮

message.actions 里的内容排在内置按钮之后:

<Chatkit
  sessions={sessions}
  slots={{ 'message.actions': ({ message }) => <FavoriteButton messageId={message.id} /> }}
/>

完整例子见收藏与分享。

从代码里触发

const { regenerate, edit } = useChatkitActions();

// 没给对应的能力函数时,这个函数不存在
regenerate?.();

说明

  • 从历史恢复后,编辑需要能够定位所属轮次;重新生成还需要保存这一轮的原始输入。只有消息或终态记录而没有原始输入,不能保证重新生成成功,见后端约定。
  • 重新生成复用原始输入,不会重新读取当前知识库、连接器等选择。编辑后的内置提交只携带编辑文本和可恢复的附件资源,不会自动保留原输入的 metadata 或结构化引用;依赖这些字段时应由业务编辑入口调用 useChatkitActions().edit(messageId, input) 并补齐。
  • 两种操作都不经过 onSend。旧内容会在重发时暂时移除;适配器拒绝受理时恢复。后端也必须支持一致地替换历史,界面变更本身不等于服务端已删除旧记录。
  • 后端自己保存会话内容、又不能作废某一轮时,不要给这两个函数,按钮就不显示。见能力一览。
  • 重新生成与编辑沿用发送的事件,载荷里的 via 区分来源,见事件。统计提问量时重新生成不算新的提问。