メモリ
メモリの仕組み
Section titled “メモリの仕組み”エージェントはスライディングウィンドウメモリを使用して会話のコンテキストを維持します。システムメッセージは常に保持されます。ウィンドウが満杯になると古いメッセージは削除されます。
[system] Always preserved[user] message 1 <- may be dropped if window full[assistant] reply 1 <- may be dropped if window full...[user] latest <- always kept[assistant] latest <- always keptconst agent = new Agent({ name: "Chat Bot", instructions: "You are helpful.", memory: { maxMessages: 100 }, transport: schift.transport,});| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
maxMessages | number | 50 | 保持する最大メッセージ数 |
transformContext | (messages: ChatMessage[]) => ChatMessage[] | — | 各LLM呼び出し前にメッセージを変換 |
コンテキスト変換
Section titled “コンテキスト変換”transformContextを使用して、メッセージがLLMに送信される前に変更します。これは、古いメッセージを要約したり、コンテキストを注入したり、フィルタリングしたりするのに便利です。
const agent = new Agent({ memory: { maxMessages: 100, transformContext: (messages) => { // トークンを節約するために長いツール結果を切り詰める return messages.map((m) => m.role === "tool" && m.content.length > 2000 ? { ...m, content: m.content.slice(0, 2000) + "..." } : m, ); }, }, ...});デフォルトでステートレス
Section titled “デフォルトでステートレス”各agent.run()呼び出しは新しいメモリを作成します。システムメッセージとユーザー入力は自動的に追加されます。
マルチターンの会話では、会話の状態を外部で管理します。
// シンプルなマルチターンパターンconst messages: string[] = [];
async function chat(userMessage: string) { messages.push(userMessage); const result = await agent.run(messages.join("\n---\n")); return result.output;}メモリとツール呼び出し
Section titled “メモリとツール呼び出し”ReActループ中に、ツール呼び出しとその結果はメモリに保存され、LLMが以前のツール出力を参照できるようになります。
[system] instructions[user] "What's the weather?"[assistant] [Tool call: get_weather({"city": "Seoul"})][tool] {"temperature": 22}[assistant] "It's 22C in Seoul." <- final answer