mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
3ef67eff10
* Refactor ChatMessageStore methods to be similar to AIContextProvider * Fix file encoding * Ensure that AIContextProvider messages area also persisted. * Update formatting and seal context classes * Improve formatting * Remove optional messages from constructor and add unit test * Add ChatMessageStore filtering via a decorator * Update sample and cosmos message store to store AIContextProvider messages in right order. Fix unit tests. * Update Workflowmessage store to use aicontext provider messages. * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com> * Improve xml docs messaging * Address code review comments. * Also notify message store on failure --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: SergeyMenshykh <68852919+SergeyMenshykh@users.noreply.github.com>
85 lines
2.5 KiB
C#
85 lines
2.5 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text.Json;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Extensions.AI;
|
|
using Microsoft.Shared.Diagnostics;
|
|
|
|
namespace Microsoft.Agents.AI.Workflows;
|
|
|
|
internal sealed class WorkflowMessageStore : ChatMessageStore
|
|
{
|
|
private int _bookmark;
|
|
private readonly List<ChatMessage> _chatMessages = [];
|
|
|
|
public WorkflowMessageStore()
|
|
{
|
|
}
|
|
|
|
public WorkflowMessageStore(StoreState state)
|
|
{
|
|
this.ImportStoreState(Throw.IfNull(state));
|
|
}
|
|
|
|
private void ImportStoreState(StoreState state, bool clearMessages = false)
|
|
{
|
|
if (clearMessages)
|
|
{
|
|
this._chatMessages.Clear();
|
|
}
|
|
|
|
if (state?.Messages is not null)
|
|
{
|
|
this._chatMessages.AddRange(state.Messages);
|
|
}
|
|
this._bookmark = state?.Bookmark ?? 0;
|
|
}
|
|
|
|
internal sealed class StoreState
|
|
{
|
|
public int Bookmark { get; set; }
|
|
public IList<ChatMessage> Messages { get; set; } = [];
|
|
}
|
|
|
|
internal void AddMessages(params IEnumerable<ChatMessage> messages) => this._chatMessages.AddRange(messages);
|
|
|
|
public override ValueTask<IEnumerable<ChatMessage>> InvokingAsync(InvokingContext context, CancellationToken cancellationToken = default)
|
|
=> new(this._chatMessages.AsReadOnly());
|
|
|
|
public override ValueTask InvokedAsync(InvokedContext context, CancellationToken cancellationToken = default)
|
|
{
|
|
if (context.InvokeException is not null)
|
|
{
|
|
return default;
|
|
}
|
|
|
|
var allNewMessages = context.RequestMessages.Concat(context.AIContextProviderMessages ?? []).Concat(context.ResponseMessages ?? []);
|
|
this._chatMessages.AddRange(allNewMessages);
|
|
|
|
return default;
|
|
}
|
|
|
|
public IEnumerable<ChatMessage> GetFromBookmark()
|
|
{
|
|
for (int i = this._bookmark; i < this._chatMessages.Count; i++)
|
|
{
|
|
yield return this._chatMessages[i];
|
|
}
|
|
}
|
|
|
|
public void UpdateBookmark() => this._bookmark = this._chatMessages.Count;
|
|
|
|
public override JsonElement Serialize(JsonSerializerOptions? jsonSerializerOptions = null)
|
|
{
|
|
StoreState state = this.ExportStoreState();
|
|
|
|
return JsonSerializer.SerializeToElement(state,
|
|
WorkflowsJsonUtilities.DefaultOptions.GetTypeInfo(typeof(StoreState)));
|
|
}
|
|
|
|
internal StoreState ExportStoreState() => new() { Bookmark = this._bookmark, Messages = this._chatMessages };
|
|
}
|