Mastra の AI Agent にユーザーを区別させる (1)
Fairy (AI エージェント) を作るメモまとめ > Mastra の AI Agent にユーザーを区別させる (1)
この記事タイトルにおける (1) とは「調べた結果一旦諦めて、目処が立ったら (2) の記事を書こう」という意味です。
Mastra のメモリを使って会話情報を Cloudflare D1 に保存するようにしたが、「その Fairy との会話がどのユーザーと行われたか」を識別する仕組みがまだない。 Fairy が「貴方様の唯一にして最高のアシスタント」と自称するからには、発言者が誰かを認識して、適切な応答をして欲しい。

Mastra の memory が保存する情報
Mastra は会話の履歴をスレッドで整理する。
履歴の実態は MastraStorage (実装) が保存するmastra_messages テーブル のレコード。
messages テーブル:
| カラム名 | 型 | 制約 | 説明 |
|---|---|---|---|
| id | uuidv4 | PRIMARYKEY NOT NULL | メッセージの一意識別子(形式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) |
| thread_id | uuidv4 | FK → threads.id NOT NULL | 親スレッドの参照 |
| resourceId | uuidv4 | CAN BE NULL | このメッセージを所有するリソースのID |
| content | text | NOT NULL | V2形式のメッセージコンテンツのJSON。例:{ format: 2, parts: […] } |
| role | text | NOT NULL | user | assistant の列挙型 |
| createdAt | timestamp | NOT NULL | スレッドメッセージの順序付けに使用 |
履歴の識別に Mastra は threadId と resourceId を使う 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 には「誰が」の情報を入れたいところだが、スレッドは特定のリソースに紐づいていることが必要なので発言者の識別子を入れることが出来ない。
つまり、👇️ のようなテーブルの使い方が出来ない。
| id | thread_id | role | resourceId |
|---|---|---|---|
| eac0c7e6-… | xxx | user | user-1 |
| 63d9bc1f-… | xxx | assistant | fairy |
| 71c2c9dd-… | xxx | user | user-2 |
ドキュメントを読む限りは、ユーザーの識別子を入れるカラムだが、playground のコードを見る限りは、agent の識別子を入れることも mastra のお作法上…あり?に見えなくもない。 (意味のある識別子とは思えないけれど…)
OpenAI Chat completion の name プロパティ
OpenAI の Chat Completions API には messages.name というプロパティがあって、会話の参加者を区別することが出来る。
一方、Responses API には (多分…) ない。
AI SDK の generateText() にも同様のパラメーターはないので、生成 AI に依存するのは危ないかも…。
Footnotes
-
逆に
threadIdとresourceIdを設定しないと、Mastra はメモリを使用しない ↩