t28.dev

Mastra の AI Agent にユーザーを区別させる (1)

2025/7/5
Tech

Fairy (AI エージェント) を作るメモまとめ > Mastra の AI Agent にユーザーを区別させる (1)


この記事タイトルにおける (1) とは「調べた結果一旦諦めて、目処が立ったら (2) の記事を書こう」という意味です。

Mastra のメモリを使って会話情報を Cloudflare D1 に保存するようにしたが、「その Fairy との会話がどのユーザーと行われたか」を識別する仕組みがまだない。 Fairy が「貴方様の唯一にして最高のアシスタント」と自称するからには、発言者が誰かを認識して、適切な応答をして欲しい。

Mastra の memory が保存する情報

Mastra は会話の履歴をスレッドで整理する。 履歴の実態は MastraStorage (実装) が保存するmastra_messages テーブル のレコード。

messages テーブル:

カラム名制約説明
iduuidv4PRIMARYKEY NOT NULLメッセージの一意識別子(形式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
thread_iduuidv4FK → threads.id NOT NULL親スレッドの参照
resourceIduuidv4CAN BE NULLこのメッセージを所有するリソースのID
contenttextNOT NULLV2形式のメッセージコンテンツのJSON。例:{ format: 2, parts: […] }
roletextNOT NULLuser | assistant の列挙型
createdAttimestampNOT NULLスレッドメッセージの順序付けに使用

履歴の識別に Mastra は threadIdresourceId を使う 1ので、この仕組みを活用して「どこで、だれが発言したか」を保存したい。

  • threadId: 特定の会話ID(例:support_123)。
  • resourceId: 各スレッドを所有するユーザーまたはエンティティID(例:user_123、org_456)。

ref: https://mastra.ai/ja/docs/memory/overview#memory-threads

…が、そのままだと難しい。 threadId は名前の通りスレッドの識別子を入れるので、チャットではそのスレッド、 LINE のメッセージならトーク画面の識別子 (グループやユーザーの ID) を「どこで」の情報として入れられる。 一方、resourceId には「誰が」の情報を入れたいところだが、スレッドは特定のリソースに紐づいていることが必要なので発言者の識別子を入れることが出来ない。 つまり、👇️ のようなテーブルの使い方が出来ない。

idthread_idroleresourceId
eac0c7e6-…xxxuseruser-1
63d9bc1f-…xxxassistantfairy
71c2c9dd-…xxxuseruser-2

ドキュメントを読む限りは、ユーザーの識別子を入れるカラムだが、playground のコードを見る限りは、agent の識別子を入れることも mastra のお作法上…あり?に見えなくもない。 (意味のある識別子とは思えないけれど…)

OpenAI Chat completion の name プロパティ

OpenAI の Chat Completions API には messages.name というプロパティがあって、会話の参加者を区別することが出来る。 一方、Responses API には (多分…) ない。 AI SDK の generateText() にも同様のパラメーターはないので、生成 AI に依存するのは危ないかも…。

Footnotes

  1. 逆に threadIdresourceId を設定しないと、Mastra はメモリを使用しない