ValkeyChatHistoryProvider在 Valkey 列表中保留.NET代理对话历史记录。 它适用于 Valkey 和兼容的 Redis OSS 服务器,而无需搜索模块。
此集成使用聊天存储模式:它重新加载确切的消息,而不是提取或检索语义记忆。
此集成存储完整脚本;它不会提取语义记忆或提供矢量检索。
安装软件包
dotnet add package Microsoft.Agents.AI.Valkey --prerelease
dotnet add package Valkey.Glide
配置持久历史记录
创建 Valkey 连接,在状态初始值设定项中选择一个会话密钥,并通过附加提供程序 ChatHistoryProvider。
var endpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT") ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("FOUNDRY_MODEL") ?? "gpt-5.4-mini";
var valkeyConnection = Environment.GetEnvironmentVariable("VALKEY_CONNECTION") ?? "localhost:6379";
var connection = await ConnectionMultiplexer.ConnectAsync(valkeyConnection);
Console.WriteLine("=== ValkeyChatHistoryProvider — Persistent Chat History ===\n");
var historyProvider = new ValkeyChatHistoryProvider(
connection,
_ => new ValkeyChatHistoryProvider.State($"sample-{Guid.NewGuid():N}"),
new ValkeyChatHistoryProviderOptions
{
KeyPrefix = "sample_chat",
MaxMessages = 20
});
AIAgent historyAgent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(new ChatClientAgentOptions()
{
ChatOptions = new() { ModelId = deploymentName, Instructions = "You are a helpful assistant that remembers our conversation." },
ChatHistoryProvider = historyProvider
});
AgentSession session1 = await historyAgent.CreateSessionAsync();
Console.WriteLine(await historyAgent.RunAsync("Hello! My name is Alex and I'm a software engineer.", session1));
Console.WriteLine(await historyAgent.RunAsync("I'm working on a project using Valkey for caching.", session1));
Console.WriteLine(await historyAgent.RunAsync("What do you remember about me?", session1));
var messageCount = await historyProvider.GetMessageCountAsync(session1);
Console.WriteLine($"\n Stored {messageCount} messages in Valkey.\n");
KeyPrefix 分隔应用程序数据并 MaxMessages 绑定保留的脚本。 在重启后必须恢复历史记录时,请使用应用程序拥有的稳定聊天 ID。
生产注意事项
- 使用加密连接、经过身份验证的用户和网络隔离。
- 定义符合持久性要求的持久性和逐出策略。
- 将会话标识符存储在受信任的服务器端状态中,并在加载历史记录之前验证所有权。
- 当租户隔离需要时,请使用单独的密钥前缀或部署。