// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; namespace Microsoft.Agents.AI; internal sealed class TestAIAgent : AIAgent { public Func? NameFunc; public Func? DescriptionFunc; public Func DeserializeSessionFunc = delegate { throw new NotSupportedException(); }; public Func GetNewSessionFunc = delegate { throw new NotSupportedException(); }; public Func, AgentSession?, AgentRunOptions?, CancellationToken, Task> RunAsyncFunc = delegate { throw new NotSupportedException(); }; public Func, AgentSession?, AgentRunOptions?, CancellationToken, IAsyncEnumerable> RunStreamingAsyncFunc = delegate { throw new NotSupportedException(); }; public Func? GetServiceFunc; public override string? Name => this.NameFunc?.Invoke() ?? base.Name; public override string? Description => this.DescriptionFunc?.Invoke() ?? base.Description; public override ValueTask DeserializeSessionAsync(JsonElement serializedSession, JsonSerializerOptions? jsonSerializerOptions = null, CancellationToken cancellationToken = default) => new(this.DeserializeSessionFunc(serializedSession, jsonSerializerOptions)); public override ValueTask GetNewSessionAsync(CancellationToken cancellationToken = default) => new(this.GetNewSessionFunc()); protected override Task RunCoreAsync(IEnumerable messages, AgentSession? session = null, AgentRunOptions? options = null, CancellationToken cancellationToken = default) => this.RunAsyncFunc(messages, session, options, cancellationToken); protected override IAsyncEnumerable RunCoreStreamingAsync(IEnumerable messages, AgentSession? session = null, AgentRunOptions? options = null, CancellationToken cancellationToken = default) => this.RunStreamingAsyncFunc(messages, session, options, cancellationToken); public override object? GetService(Type serviceType, object? serviceKey = null) => this.GetServiceFunc is { } func ? func(serviceType, serviceKey) : base.GetService(serviceType, serviceKey); }