using System.Text.Json;
using NewLife.Studio.AI.Models;
namespace NewLife.Studio.AI.ToolCalling;
/// <summary>工具注册中心</summary>
public class ToolRegistry
{
private readonly Dictionary<string, ToolHandler> _handlers = new();
/// <summary>注册工具</summary>
public void Register(string name, string description, object? parameters, Func<string, Task<string>> handler)
{
_handlers[name] = new ToolHandler
{
Definition = new ToolDefinition
{
Function = new FunctionDef
{
Name = name,
Description = description,
Parameters = parameters
}
},
Handler = handler
};
}
/// <summary>获取所有工具定义</summary>
public List<ToolDefinition> GetAllDefinitions()
{
return _handlers.Values.Select(h => h.Definition).ToList();
}
/// <summary>执行工具</summary>
public async Task<ToolResult> ExecuteAsync(ToolCall toolCall)
{
if (!_handlers.TryGetValue(toolCall.Function.Name, out var handler))
{
return new ToolResult
{
ToolCallId = toolCall.Id,
Error = $"Unknown tool: {toolCall.Function.Name}"
};
}
try
{
var output = await handler.Handler(toolCall.Function.Arguments);
return new ToolResult
{
ToolCallId = toolCall.Id,
Output = output
};
}
catch (Exception ex)
{
return new ToolResult
{
ToolCallId = toolCall.Id,
Error = ex.Message
};
}
}
private class ToolHandler
{
public required ToolDefinition Definition { get; init; }
public required Func<string, Task<string>> Handler { get; init; }
}
}
|