mcpField
C
Convex Agents Messages

Convex Agents Messages

github.com/sstobo開発24197 回インストール40 週間前に更新
リポジトリ

Convex Agents Messages について

Convex Agents のメッセージを扱う開発者向けのスキルです。スレッド履歴の保存と取得、メッセージ表示、更新管理を扱います。

主な機能

  1. 01スレッドメッセージのページ取得
  2. 02React でのメッセージ表示
  3. 03メッセージの手動保存
  4. 04楽観的 UI 更新の適用
  5. 05個別または範囲指定での削除

活用シーン

  1. 01ユーザーへの会話履歴の表示
  2. 02応答生成前のユーザーメッセージ保存
  3. 03保存前にメッセージを即時表示
  4. 04表示する履歴からツールメッセージを除外

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/sstobo/convex-skills --skill convex-agents-messages

インストール後、Claude Code で/convex-agents-messagesを入力して読み込まれたか確認します。

詳細

目的

メッセージは、会話スレッド内の個々のやり取りを表します。このスキルでは、メッセージの保存、取得、表示、管理について説明します。

このスキルを使用する場面

  • 会話履歴をユーザーに表示する
  • 応答を生成する前にユーザーメッセージを保存する
  • UI に楽観的なメッセージ更新を実装する
  • リッチな書式設定に UIMessages を使用する
  • 表示する履歴からツールメッセージを除外する

メッセージを取得する

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 型

エージェント固有のフィールドを含む拡張メッセージです:

interface UIMessage {
  key: string;
  role: "user" | "assistant" | "system";
  text: string;
  status: "saved" | "streaming" | "finished" | "aborted";
  agentName?: string;
  _creationTime?: Date;
  parts?: MessagePart[];
}

主な原則

  • UIMessages と MessageDocs:UI には UIMessages を、バックエンドには MessageDocs を使用します
  • メッセージの順序:order と stepOrder によって自動的に維持されます
  • 楽観的な更新:保存前にメッセージを表示することで UX が向上します
  • ミューテーションでの埋め込みのスキップ:ミューテーションで保存する際に使用します

次のステップ

  • リアルタイムのメッセージ更新についてはストリーミングを参照してください
  • メッセージへのメディアの添付についてはファイルを参照してください
  • メッセージコンテナの管理についてはスレッドを参照してください

コメント