ストリーミング構造化ワーキングメモリ
この例では、最小限のコンテキストでも構造化ワーキングメモリ(スキーマベース)を使用してToDoリストを維持するエージェントの作成方法を示します。Markdownベースのバージョンについては、高度なワーキングメモリの例を参照してください。
セットアップ
構造化されたワーキングメモリを持つエージェントの作成方法を詳しく見ていきましょう。タスクをJSONオブジェクトとして記憶するTodoリストマネージャーを構築します。
1. 構造化メモリのセットアップ
短いコンテキストウィンドウでメモリシステムを設定し、TodoリストのZodスキーマを提供します。永続化のために、@mastra/libsql
のようなストレージプロバイダーを設定できます:
import { Memory } from "@mastra/memory";
import { LibSQLStore } from "@mastra/libsql";
import { z } from "zod";
// Define the schema for the todo list
const todoListSchema = z.object({
items: z.array(
z.object({
description: z.string(),
due: z.string().optional(),
started: z.string().optional(),
status: z.enum(["active", "completed"]).default("active"),
})
),
});
const memory = new Memory({
options: {
lastMessages: 1,
workingMemory: {
enabled: true,
schema: todoListSchema,
},
},
storage: new LibSQLStore({
url: "file:../mastra.db",
}),
});
2. Todoリストエージェントの作成
この構造化メモリを使用するエージェントを作成します。指示では、エージェントがスキーマに一致するJSONオブジェクトとしてTodoリストを維持するようにガイドする必要があります。
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
const todoAgent = new Agent({
name: "TODO Agent",
instructions:
"You are a helpful todolist AI agent. Maintain the user's todo list as a JSON object according to the provided schema. Each item should include a description, status (active/completed), and optional due/started dates. When the user adds, completes, or updates a task, update the JSON accordingly. Always show the current todo list at the start of the chat.",
model: openai("gpt-4o-mini"),
memory,
});
注意: workingMemory.schema
が設定されている場合、構造化ワーキングメモリの使用方法についてエージェントに指示するデフォルトのシステムプロンプトが自動的に注入されます。必要に応じて、このプロンプトを上書きまたは拡張できます。
使用例
エージェントのレスポンスには、更新されたJSONを含む<working_memory>{...}</working_memory>
タグが含まれます。これを処理する2つの方法を見てみましょう:
基本的な使用方法
シンプルなケースでは、maskStreamTags
を使用してワーキングメモリの更新をユーザーから隠すことができます:
import { randomUUID } from "crypto";
import { maskStreamTags } from "@mastra/core/utils";
// 会話を開始
const threadId = randomUUID();
const resourceId = "SOME_USER_ID";
// 新しいtodoアイテムを追加
const response = await todoAgent.stream(
"Add a task: Build a new feature for our app. It should take about 2 hours and needs to be done by next Friday.",
{
threadId,
resourceId,
},
);
// ストリームを処理し、ワーキングメモリの更新を隠す
for await (const chunk of maskStreamTags(
response.textStream,
"working_memory",
)) {
process.stdout.write(chunk);
}
UIフィードバック付きの高度な使用方法
より良いユーザーエクスペリエンスのために、ワーキングメモリが更新されている間にローディング状態を表示できます:
// UIフィードバックを提供するためのライフサイクルフックを追加
const maskedStream = maskStreamTags(response.textStream, "working_memory", {
// working_memoryタグが開始されたときに呼び出される
onStart: () => showLoadingSpinner("Updating todo list..."),
// working_memoryタグが終了したときに呼び出される
onEnd: () => hideLoadingSpinner(),
// マスクされたコンテンツと共に呼び出される
onMask: (chunk) => console.debug("Updated todo list:", chunk),
});
// マスクされたストリームを処理
for await (const chunk of maskedStream) {
process.stdout.write(chunk);
}
例: 構造化ワーキングメモリの状態
複数回のやり取りの後、ワーキングメモリは次のようになる可能性があります:
{
"items": [
{
"description": "Buy groceries",
"due": "2025-07-01",
"started": "2025-06-24",
"status": "active"
},
{
"description": "Finish project report",
"due": "2025-07-05",
"status": "completed"
}
]
}
エージェントはこのリストをJSON形式で直接参照または更新でき、会話を通じて構造化された型安全なメモリ保持を確保します。
この例では以下を実演しています:
- Zodスキーマを使用した構造化ワーキングメモリによるメモリシステムの設定
- JSONオブジェクトとしてTodoリストを管理するエージェントの作成
maskStreamTags
を使用してメモリ更新をユーザーから隠す- ライフサイクルフックを使用したメモリ更新中のUI読み込み状態の提供
- 短いコンテキストウィンドウでも永続的で構造化されたメモリの維持
コンテキスト内にメッセージが1つしかない場合(lastMessages: 1
)でも、エージェントは構造化ワーキングメモリ内で完全なTodoリストを維持します。エージェントが応答するたびにJSONオブジェクトを更新し、やり取り全体を通じて永続性を確保します。
他のメモリタイプやストレージオプションを含むエージェントメモリの詳細については、メモリドキュメントを参照してください。