コンテンツにスキップ

メモリ

エージェントはスライディングウィンドウメモリを使用して会話のコンテキストを維持します。システムメッセージは常に保持されます。ウィンドウが満杯になると古いメッセージは削除されます。

[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 kept
const agent = new Agent({
name: "Chat Bot",
instructions: "You are helpful.",
memory: { maxMessages: 100 },
transport: schift.transport,
});
オプションデフォルト説明
maxMessagesnumber50保持する最大メッセージ数
transformContext(messages: ChatMessage[]) => ChatMessage[]各LLM呼び出し前にメッセージを変換

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,
);
},
},
...
});

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;
}

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