mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
71 lines
2.6 KiB
C#
71 lines
2.6 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.Agents.AI.Hosting.OpenAI.Responses.Models;
|
|
using Microsoft.Extensions.AI;
|
|
|
|
namespace Microsoft.Agents.AI.Hosting.OpenAI.Responses;
|
|
|
|
/// <summary>
|
|
/// Response executor that uses an AIAgent to execute responses locally.
|
|
/// This is the default implementation for local execution.
|
|
/// </summary>
|
|
internal sealed class AIAgentResponseExecutor : IResponseExecutor
|
|
{
|
|
private readonly AIAgent _agent;
|
|
|
|
public AIAgentResponseExecutor(AIAgent agent)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(agent);
|
|
this._agent = agent;
|
|
}
|
|
|
|
public ValueTask<ResponseError?> ValidateRequestAsync(
|
|
CreateResponse request,
|
|
CancellationToken cancellationToken = default) => ValueTask.FromResult<ResponseError?>(null);
|
|
|
|
public async IAsyncEnumerable<StreamingResponseEvent> ExecuteAsync(
|
|
AgentInvocationContext context,
|
|
CreateResponse request,
|
|
[EnumeratorCancellation] CancellationToken cancellationToken = default)
|
|
{
|
|
// Create options with properties from the request
|
|
var chatOptions = new ChatOptions
|
|
{
|
|
// Note: We intentionally do NOT set ConversationId on ChatOptions here.
|
|
// The conversation ID from the client request is used by the hosting layer
|
|
// to manage conversation storage, but should not be forwarded to the underlying
|
|
// IChatClient as it has its own concept of conversations (or none at all).
|
|
// ---
|
|
// ConversationId = request.Conversation?.Id,
|
|
|
|
Temperature = (float?)request.Temperature,
|
|
TopP = (float?)request.TopP,
|
|
MaxOutputTokens = request.MaxOutputTokens,
|
|
Instructions = request.Instructions,
|
|
ModelId = request.Model,
|
|
};
|
|
var options = new ChatClientAgentRunOptions(chatOptions);
|
|
|
|
// Convert input to chat messages
|
|
var messages = new List<ChatMessage>();
|
|
|
|
foreach (var inputMessage in request.Input.GetInputMessages())
|
|
{
|
|
messages.Add(inputMessage.ToChatMessage());
|
|
}
|
|
|
|
// Use the extension method to convert streaming updates to streaming response events
|
|
await foreach (var streamingEvent in this._agent.RunStreamingAsync(messages, options: options, cancellationToken: cancellationToken)
|
|
.ToStreamingResponseAsync(request, context, cancellationToken)
|
|
.ConfigureAwait(false))
|
|
{
|
|
yield return streamingEvent;
|
|
}
|
|
}
|
|
}
|