mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
* Python: .NET Samples - Restructure and Improve Samples (Feature Branch) (#4091) * Moved by agent (#4094) * Fix readme links * .NET Samples - Create `04-hosting` learning path step (#4098) * Agent move * Agent reorderd * Remove A2A section from README Removed A2A section from the Getting Started README. * Agent fixed links * Fix broken sample links in durable-agents README (#4101) * Initial plan * Fix broken internal links in documentation Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Revert template link changes; keep only durable-agents README fix Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * .NET Samples - Create `03-workflows` learning path step (#4102) * Fix solution project path * Python: Fix broken markdown links to repo resources (outside /docs) (#4105) * Initial plan * Fix broken markdown links to repo resources Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Update README to rename .NET Workflows Samples section --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * .NET Samples - Create `02-agents` learning path step (#4107) * .NET: Fix broken relative link in GroupChatToolApproval README (#4108) * Initial plan * Fix broken link in GroupChatToolApproval README Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Update labeler configuration for workflow samples * .NET - Reorder Agents samples to start from Step01 instead of Step04 (#4110) * Fix solution * Resolve new sample paths * Move new AgentSkills and AgentWithMemory_Step04 samples * Fix link * Fix readme path * fix: update stale dotnet/samples/Durable path reference in AGENTS.md Co-authored-by: crickman <66376200+crickman@users.noreply.github.com> * Moved new sample * Update solution * Resolve merge (new sample) * Sync to new sample - FoundryAgents_Step21_BingCustomSearch * Updated README * .NET Samples - Configuration Naming Update (#4149) * .NET: Restore AzureFunctions index parity with ConsoleApps under DurableAgents samples (#4221) * Clean-up `05_host_your_agent` * Config setting consistency * Refine samples * AGENTS.md * Move new samples * Re-order samples * Move new project and fixup solution * Fixup model config * Fix up new UT project --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
67 lines
3.7 KiB
C#
67 lines
3.7 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
// This sample shows how to use a chat history reducer to keep the context within model size limits.
|
|
// Any implementation of Microsoft.Extensions.AI.IChatReducer can be used to customize how the chat history is reduced.
|
|
// NOTE: this feature is only supported where the chat history is stored locally, such as with OpenAI Chat Completion.
|
|
// Where the chat history is stored server side, such as with Azure Foundry Agents, the service must manage the chat history size.
|
|
|
|
using Azure.AI.OpenAI;
|
|
using Azure.Identity;
|
|
using Microsoft.Agents.AI;
|
|
using Microsoft.Extensions.AI;
|
|
using OpenAI.Chat;
|
|
using ChatMessage = Microsoft.Extensions.AI.ChatMessage;
|
|
|
|
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
|
|
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
|
|
|
|
// Construct the agent, and provide a factory to create an in-memory chat message store with a reducer that keeps only the last 2 non-system messages.
|
|
// WARNING: DefaultAzureCredential is convenient for development but requires careful consideration in production.
|
|
// In production, consider using a specific credential (e.g., ManagedIdentityCredential) to avoid
|
|
// latency issues, unintended credential probing, and potential security risks from fallback mechanisms.
|
|
AIAgent agent = new AzureOpenAIClient(
|
|
new Uri(endpoint),
|
|
new DefaultAzureCredential())
|
|
.GetChatClient(deploymentName)
|
|
.AsAIAgent(new ChatClientAgentOptions
|
|
{
|
|
ChatOptions = new() { Instructions = "You are good at telling jokes." },
|
|
Name = "Joker",
|
|
ChatHistoryProvider = new InMemoryChatHistoryProvider(new() { ChatReducer = new MessageCountingChatReducer(2) })
|
|
});
|
|
|
|
AgentSession session = await agent.CreateSessionAsync();
|
|
|
|
// Invoke the agent and output the text result.
|
|
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate.", session));
|
|
|
|
// Get the chat history to see how many messages are stored.
|
|
// We can use the ChatHistoryProvider, that is also used by the agent, to read the
|
|
// chat history from the session state, and see how the reducer is affecting the stored messages.
|
|
// Here we expect to see 2 messages, the original user message and the agent response message.
|
|
var provider = agent.GetService<InMemoryChatHistoryProvider>();
|
|
List<ChatMessage>? chatHistory = provider?.GetMessages(session);
|
|
Console.WriteLine($"\nChat history has {chatHistory?.Count} messages.\n");
|
|
|
|
// Invoke the agent a few more times.
|
|
Console.WriteLine(await agent.RunAsync("Tell me a joke about a robot.", session));
|
|
|
|
// Now we expect to see 4 messages in the chat history, 2 input and 2 output.
|
|
// While the target number of messages is 2, the default time for the InMemoryChatHistoryProvider
|
|
// to trigger the reducer is just before messages are contributed to a new agent run.
|
|
// So at this time, we have not yet triggered the reducer for the most recently added messages,
|
|
// and they are still in the chat history.
|
|
chatHistory = provider?.GetMessages(session);
|
|
Console.WriteLine($"\nChat history has {chatHistory?.Count} messages.\n");
|
|
|
|
Console.WriteLine(await agent.RunAsync("Tell me a joke about a lemur.", session));
|
|
chatHistory = provider?.GetMessages(session);
|
|
Console.WriteLine($"\nChat history has {chatHistory?.Count} messages.\n");
|
|
|
|
// At this point, the chat history has exceeded the limit and the original message will not exist anymore,
|
|
// so asking a follow up question about it may not work as expected.
|
|
Console.WriteLine(await agent.RunAsync("What was the first joke I asked you to tell again?", session));
|
|
|
|
chatHistory = provider?.GetMessages(session);
|
|
Console.WriteLine($"\nChat history has {chatHistory?.Count} messages.\n");
|