// Copyright (c) Microsoft. All rights reserved. using System; using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.AI; using Microsoft.Shared.DiagnosticIds; using Microsoft.Shared.Diagnostics; namespace Microsoft.Agents.AI; /// /// A skill script backed by a delegate. /// [Experimental(DiagnosticIds.Experiments.AgentsAIExperiments)] internal sealed class AgentInlineSkillScript : AgentSkillScript { private readonly AIFunction _function; /// /// Initializes a new instance of the class from a delegate. /// The delegate's parameters and return type are automatically marshaled via . /// /// The script name. /// A method to execute when the script is invoked. Parameters are automatically deserialized from JSON. /// An optional description of the script. /// /// Optional used to marshal the delegate's parameters and return value. /// When , is used. /// public AgentInlineSkillScript(string name, Delegate method, string? description = null, JsonSerializerOptions? serializerOptions = null) : base(Throw.IfNullOrWhitespace(name), description) { Throw.IfNull(method); var options = new AIFunctionFactoryOptions { Name = this.Name, SerializerOptions = serializerOptions }; this._function = AIFunctionFactory.Create(method, options); } /// /// Initializes a new instance of the class from a . /// The method's parameters and return type are automatically marshaled via . /// /// The script name. /// The method to execute when the script is invoked. /// The target instance for instance methods, or for static methods. /// An optional description of the script. /// /// Optional used to marshal the method's parameters and return value. /// When , is used. /// public AgentInlineSkillScript(string name, MethodInfo method, object? target, string? description = null, JsonSerializerOptions? serializerOptions = null) : base(Throw.IfNullOrWhitespace(name), description) { Throw.IfNull(method); var options = new AIFunctionFactoryOptions { Name = this.Name, SerializerOptions = serializerOptions }; this._function = AIFunctionFactory.Create(method, target, options); } /// /// Gets the JSON schema describing the parameters accepted by this script, or if not available. /// public override JsonElement? ParametersSchema => this._function.JsonSchema; /// public override async Task RunAsync(AgentSkill skill, AIFunctionArguments arguments, CancellationToken cancellationToken = default) { return await this._function.InvokeAsync(arguments, cancellationToken).ConfigureAwait(false); } }