Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хранилище определяет, где живет журнал бесед, сколько загрузится журнал и как надежно можно возобновить сеансы.
Встроенные режимы хранения
Agent Framework поддерживает два регулярных режима хранения:
| Mode | Хранимые данные | Типичное использование |
|---|---|---|
| Состояние локального сеанса | Полная история чата в AgentSession.state (например, через InMemoryHistoryProvider) |
Службы, для которых не требуется сохраняемость бесед на стороне сервера |
| Управляемое службой хранилище | Состояние беседы в службе; AgentSession.service_session_id указывает на него |
Службы с поддержкой собственной постоянной беседы |
Хранилище журнала чата в памяти
Если поставщику не требуется журнал чата на стороне сервера, агент Framework сохраняет журнал локально в сеансе и отправляет соответствующие сообщения на каждом запуске.
AIAgent agent = new OpenAIClient("<your_api_key>")
.GetChatClient(modelName)
.AsAIAgent(instructions: "You are a helpful assistant.", name: "Assistant");
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate.", session));
// Works when in-memory storage is active.
IList<ChatMessage>? messages = session.GetService<IList<ChatMessage>>();
from agent_framework import InMemoryHistoryProvider
from agent_framework.openai import OpenAIChatClient
agent = OpenAIChatClient().as_agent(
name="StorageAgent",
instructions="You are a helpful assistant.",
context_providers=[InMemoryHistoryProvider("memory", load_messages=True)],
)
session = agent.create_session()
await agent.run("Remember that I like Italian food.", session=session)
Уменьшение размера журнала в памяти
Если история становится слишком большой для ограничений модели, примените редуктор.
AIAgent agent = new OpenAIClient("<your_api_key>")
.GetChatClient(modelName)
.AsAIAgent(new ChatClientAgentOptions
{
Name = "Assistant",
ChatOptions = new() { Instructions = "You are a helpful assistant." },
ChatHistoryProviderFactory = (ctx, ct) => new ValueTask<ChatHistoryProvider>(
new InMemoryChatHistoryProvider(
new MessageCountingChatReducer(20),
ctx.SerializedState,
ctx.JsonSerializerOptions,
InMemoryChatHistoryProvider.ChatReducerTriggerEvent.AfterMessageAdded))
});
Замечание
Конфигурация редьюсеров применяется к поставщикам истории в памяти. Для истории, управляемой службой, поведение сокращения зависит от конкретного поставщика или службы.
Управляемое службой хранилище
Когда служба управляет журналом бесед, сеанс сохраняет идентификатор удаленной беседы.
AIAgent agent = new OpenAIClient("<your_api_key>")
.GetOpenAIResponseClient(modelName)
.AsAIAgent(instructions: "You are a helpful assistant.", name: "Assistant");
AgentSession session = await agent.CreateSessionAsync();
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate.", session));
# Rehydrate when the service already has the conversation state.
session = agent.get_session(service_session_id="<service-conversation-id>")
response = await agent.run("Continue this conversation.", session=session)
Шаблон хранилища третьих сторон
Для хранилища истории на базе базы данных/Redis/BLOB реализуйте настраиваемый провайдер истории.
Ключевое руководство.
- Храните сообщения под ключом, привязанным к области сеанса.
- Сохраняйте возвращенный журнал в пределах контекста модели.
- Сохранять специфические для поставщика идентификаторы в
session.state. - В Python
load_messages=Trueдолжен использовать только один поставщик истории.
from agent_framework.openai import OpenAIChatClient
history = DatabaseHistoryProvider(db_client)
agent = OpenAIChatClient().as_agent(
name="StorageAgent",
instructions="You are a helpful assistant.",
context_providers=[history],
)
session = agent.create_session()
await agent.run("Store this conversation.", session=session)
Сохранение сеансов во время перезапуска
Сохраните полный AgentSession, а не только текст сообщения.
JsonElement serialized = agent.SerializeSession(session);
// Store serialized payload in durable storage.
AgentSession resumed = await agent.DeserializeSessionAsync(serialized);
serialized = session.to_dict()
# Store serialized payload in durable storage.
resumed = AgentSession.from_dict(serialized)
Это важно
Относитесь к AgentSession как к непрозрачному объекту состояния и восстанавливайте его с той же конфигурацией агента или поставщика, которая его создала.
Подсказка
Используйте дополнительного поставщика журнала аудита/оценки (load_messages=False, store_context_messages=True), чтобы фиксировать обогащенный контекст и входные/выходные данные, не влияя на загрузку основного журнала.