关于 Convex Agents Messages
面向使用 Convex Agents 处理消息的开发者,涵盖线程历史的保存与检索、消息展示和更新管理。
主要功能
- 01分页检索线程消息
- 02在 React 中展示消息
- 03手动保存消息
- 04应用乐观 UI 更新
- 05删除单条或指定范围的消息
适用场景
- 01向用户展示对话历史
- 02生成回复前保存用户消息
- 03保存期间即时显示消息
- 04从可见历史中筛除工具消息
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sstobo/ convex-skills --skill convex-agents-messages安装后在 Claude Code 中输入/convex-agents-messages确认已加载。
详细介绍
用途
消息表示会话线程中的单次交流。本技能涵盖消息的保存、检索、显示和管理。
何时使用本技能
- 向用户显示对话历史
- 在生成响应前保存用户消息
- 在 UI 中实现乐观消息更新
- 使用 UIMessage 进行富文本格式化
- 从显示的历史中过滤工具消息
检索消息
import { listUIMessages } from "@convex-dev/agent";
export const listThreadMessages = query({
args: { threadId: v.string(), paginationOpts: paginationOptsValidator },
handler: async (ctx, { threadId, paginationOpts }) => {
return await listUIMessages(ctx, components.agent, {
threadId,
paginationOpts,
});
},
});
在 React 中显示
import { useUIMessages } from "@convex-dev/agent/react";
function ChatComponent({ threadId }: { threadId: string }) {
const { results } = useUIMessages(
api.messages.listThreadMessages,
{ threadId },
{ initialNumItems: 20 }
);
return (
<div>
{results?.map((message) => (
<div key={message.key}>{message.text}</div>
))}
</div>
);
}
手动保存消息
import { saveMessage } from "@convex-dev/agent";
export const saveUserMessage = mutation({
args: { threadId: v.string(), prompt: v.string() },
handler: async (ctx, { threadId, prompt }) => {
const { messageId } = await saveMessage(ctx, components.agent, {
threadId,
prompt,
skipEmbeddings: true,
});
return { messageId };
},
});
乐观更新
在消息保存前立即显示:
const sendMessage = useMutation(api.chat.generateResponse).withOptimisticUpdate(
optimisticallySendMessage(api.messages.listThreadMessages)
);
删除消息
await myAgent.deleteMessage(ctx, { messageId });
await myAgent.deleteMessages(ctx, { messageIds });
await myAgent.deleteMessageRange(ctx, { threadId, startOrder, endOrder });
UIMessage 类型
带有 Agent 特定字段的扩展消息:
interface UIMessage {
key: string;
role: "user" | "assistant" | "system";
text: string;
status: "saved" | "streaming" | "finished" | "aborted";
agentName?: string;
_creationTime?: Date;
parts?: MessagePart[];
}
关键原则
- UIMessage 与 MessageDoc:UI 使用 UIMessage,后端使用 MessageDoc
- 消息排序:由 order 和 stepOrder 自动维护
- 乐观更新:在保存前显示消息可提供更好的用户体验
- 在变更中跳过嵌入:在变更中保存时使用
后续步骤
- 参见 streaming 了解实时消息更新
- 参见 files 了解向消息附加媒体
- 参见 threads 了解管理消息容器
评论
支持 Markdown