mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
* .NET: [BREAKING] Add session statebag to use for state storage instead of inside providers (#3737) * Add a StateBag to AgentSession and pass Agent and AgentSession to AIContextProvider and ChatHistoryProviders * Convert all AIContextProviders to use the statebag * Update InMemoryChatHistoryProvider to use StateBag * Update Comsos and Workflow ChatHistoryProviders * Update 3rd party chat history storage sample. * Remove serialize method from providers * Replacing provider factories with properties * Remove Providers from Session and flatten state bag serialization * Update samples to use getservice on agent * Updated additional session types to serialize statebag * Fix regression * Address PR comments * Address PR comments. * Fix formatting * Fix unit tests * Remove InMemoryAgentSession since it is not required anymore. * Address PR comments * Convert sessions for A2AAgent, ChatClientAgent, CopilotStudioAgent and GithubCopilotAgent to use regular json serialization. * Fix durable agent session jso usgae * Add jso to InMemory and Workflow ChatHistoryProviders * Update InMemoryChatHistoryProvider to use an options class for it's many optional settings. * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Address PR feedback * Fix verification bug. * Improve state bag thread safety * Address PR comments and fix unit tests * Address PR comments * Fix unit test --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add a public StateKey property to providers (#3810) * .NET: [BREAKING] Update providers in such a way that they can participate in a pipeline (#3846) * Make providers pipeline capable * Fix unit tests * Move source stamping to providers from base class * Also update samples. * Address PR comments * Rename AsAgentRequestMessageSourcedMessage to WithAgentRequestMessageSource * .NET: [BREAKING] Add consistent message filtering to all providers. (#3851) * Add consistent message filtering to all providers. * Remove old chat history filtering classes * Fix merge issues * Fix unit test * Enforce non-nullable property * Fix merging bug and make troubleshooting source info easier by adding tostring implementation * .NET: [BREAKING] Add support for multiple AIContextProviders on a ChatClientAgent (#3863) * Add support for multiple AIContextProviders on a ChatClientAgent * Address PR comments and fix tests * Address PR comments. * .NET: [BREAKING]Delay AIContext Materialization until the end of the pipeline is reached. (#3883) * Delay AIContext Materialization until the end of the pipeline is reached. * Address PR comments. * Address PR comments * Modify InvokedContext to be immutable (#3888) * .NET: Address Feedback on StateBag feature branch PR (#3910) * Address Feedback on statebag feature branch PR * Update dotnet/src/Microsoft.Agents.AI.DurableTask/CHANGELOG.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Address PR comments --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
115 lines
6.5 KiB
C#
115 lines
6.5 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System;
|
|
using System.Diagnostics.CodeAnalysis;
|
|
using Azure.Core;
|
|
using Microsoft.Azure.Cosmos;
|
|
|
|
namespace Microsoft.Agents.AI;
|
|
|
|
/// <summary>
|
|
/// Provides extension methods for integrating Cosmos DB chat message storage with the Agent Framework.
|
|
/// </summary>
|
|
public static class CosmosDBChatExtensions
|
|
{
|
|
private static readonly Func<AgentSession?, CosmosChatHistoryProvider.State> s_defaultStateInitializer =
|
|
_ => new CosmosChatHistoryProvider.State(Guid.NewGuid().ToString("N"));
|
|
|
|
/// <summary>
|
|
/// Configures the agent to use Cosmos DB for message storage with connection string authentication.
|
|
/// </summary>
|
|
/// <param name="options">The chat client agent options to configure.</param>
|
|
/// <param name="connectionString">The Cosmos DB connection string.</param>
|
|
/// <param name="databaseId">The identifier of the Cosmos DB database.</param>
|
|
/// <param name="containerId">The identifier of the Cosmos DB container.</param>
|
|
/// <param name="stateInitializer">An optional delegate that initializes the provider state on the first invocation, providing the conversation routing info (conversationId, tenantId, userId). When not provided, a new conversation ID is generated automatically.</param>
|
|
/// <returns>The configured <see cref="ChatClientAgentOptions"/>.</returns>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="options"/> is null.</exception>
|
|
/// <exception cref="ArgumentException">Thrown when any string parameter is null or whitespace.</exception>
|
|
[RequiresUnreferencedCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with trimming.")]
|
|
[RequiresDynamicCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with NativeAOT.")]
|
|
public static ChatClientAgentOptions WithCosmosDBChatHistoryProvider(
|
|
this ChatClientAgentOptions options,
|
|
string connectionString,
|
|
string databaseId,
|
|
string containerId,
|
|
Func<AgentSession?, CosmosChatHistoryProvider.State>? stateInitializer = null)
|
|
{
|
|
if (options is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(options));
|
|
}
|
|
|
|
options.ChatHistoryProvider =
|
|
new CosmosChatHistoryProvider(connectionString, databaseId, containerId, stateInitializer ?? s_defaultStateInitializer);
|
|
return options;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configures the agent to use Cosmos DB for message storage with managed identity authentication.
|
|
/// </summary>
|
|
/// <param name="options">The chat client agent options to configure.</param>
|
|
/// <param name="accountEndpoint">The Cosmos DB account endpoint URI.</param>
|
|
/// <param name="databaseId">The identifier of the Cosmos DB database.</param>
|
|
/// <param name="containerId">The identifier of the Cosmos DB container.</param>
|
|
/// <param name="tokenCredential">The TokenCredential to use for authentication (e.g., DefaultAzureCredential, ManagedIdentityCredential).</param>
|
|
/// <param name="stateInitializer">An optional delegate that initializes the provider state on the first invocation, providing the conversation routing info (conversationId, tenantId, userId). When not provided, a new conversation ID is generated automatically.</param>
|
|
/// <returns>The configured <see cref="ChatClientAgentOptions"/>.</returns>
|
|
/// <exception cref="ArgumentNullException">Thrown when <paramref name="options"/> or <paramref name="tokenCredential"/> is null.</exception>
|
|
/// <exception cref="ArgumentException">Thrown when any string parameter is null or whitespace.</exception>
|
|
[RequiresUnreferencedCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with trimming.")]
|
|
[RequiresDynamicCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with NativeAOT.")]
|
|
public static ChatClientAgentOptions WithCosmosDBChatHistoryProviderUsingManagedIdentity(
|
|
this ChatClientAgentOptions options,
|
|
string accountEndpoint,
|
|
string databaseId,
|
|
string containerId,
|
|
TokenCredential tokenCredential,
|
|
Func<AgentSession?, CosmosChatHistoryProvider.State>? stateInitializer = null)
|
|
{
|
|
if (options is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(options));
|
|
}
|
|
|
|
if (tokenCredential is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(tokenCredential));
|
|
}
|
|
|
|
options.ChatHistoryProvider =
|
|
new CosmosChatHistoryProvider(accountEndpoint, tokenCredential, databaseId, containerId, stateInitializer ?? s_defaultStateInitializer);
|
|
return options;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configures the agent to use Cosmos DB for message storage with an existing <see cref="CosmosClient"/>.
|
|
/// </summary>
|
|
/// <param name="options">The chat client agent options to configure.</param>
|
|
/// <param name="cosmosClient">The <see cref="CosmosClient"/> instance to use for Cosmos DB operations.</param>
|
|
/// <param name="databaseId">The identifier of the Cosmos DB database.</param>
|
|
/// <param name="containerId">The identifier of the Cosmos DB container.</param>
|
|
/// <param name="stateInitializer">An optional delegate that initializes the provider state on the first invocation, providing the conversation routing info (conversationId, tenantId, userId). When not provided, a new conversation ID is generated automatically.</param>
|
|
/// <returns>The configured <see cref="ChatClientAgentOptions"/>.</returns>
|
|
/// <exception cref="ArgumentNullException">Thrown when any required parameter is null.</exception>
|
|
/// <exception cref="ArgumentException">Thrown when any string parameter is null or whitespace.</exception>
|
|
[RequiresUnreferencedCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with trimming.")]
|
|
[RequiresDynamicCode("The CosmosChatHistoryProvider uses JSON serialization which is incompatible with NativeAOT.")]
|
|
public static ChatClientAgentOptions WithCosmosDBChatHistoryProvider(
|
|
this ChatClientAgentOptions options,
|
|
CosmosClient cosmosClient,
|
|
string databaseId,
|
|
string containerId,
|
|
Func<AgentSession?, CosmosChatHistoryProvider.State>? stateInitializer = null)
|
|
{
|
|
if (options is null)
|
|
{
|
|
throw new ArgumentNullException(nameof(options));
|
|
}
|
|
|
|
options.ChatHistoryProvider =
|
|
new CosmosChatHistoryProvider(cosmosClient, databaseId, containerId, stateInitializer ?? s_defaultStateInitializer);
|
|
return options;
|
|
}
|
|
}
|