75 lines
2.3 KiB
C#
75 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text.Json;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace AxCopilot.Services.Agent;
|
|
|
|
public class MathTool : IAgentTool
|
|
{
|
|
public string Name => "math_eval";
|
|
|
|
public string Description => "Evaluate a mathematical expression and return the result. Supports: +, -, *, /, %, parentheses, and common math operations. Use for calculations, unit conversions, and numeric analysis.";
|
|
|
|
public ToolParameterSchema Parameters
|
|
{
|
|
get
|
|
{
|
|
ToolParameterSchema obj = new ToolParameterSchema
|
|
{
|
|
Properties = new Dictionary<string, ToolProperty>
|
|
{
|
|
["expression"] = new ToolProperty
|
|
{
|
|
Type = "string",
|
|
Description = "Mathematical expression to evaluate (e.g. '(100 * 1.08) / 3')"
|
|
},
|
|
["precision"] = new ToolProperty
|
|
{
|
|
Type = "integer",
|
|
Description = "Decimal places for rounding (default: 6)"
|
|
}
|
|
}
|
|
};
|
|
int num = 1;
|
|
List<string> list = new List<string>(num);
|
|
CollectionsMarshal.SetCount(list, num);
|
|
CollectionsMarshal.AsSpan(list)[0] = "expression";
|
|
obj.Required = list;
|
|
return obj;
|
|
}
|
|
}
|
|
|
|
public Task<ToolResult> ExecuteAsync(JsonElement args, AgentContext context, CancellationToken ct = default(CancellationToken))
|
|
{
|
|
string text = args.GetProperty("expression").GetString() ?? "";
|
|
JsonElement value;
|
|
int digits = (args.TryGetProperty("precision", out value) ? value.GetInt32() : 6);
|
|
if (string.IsNullOrWhiteSpace(text))
|
|
{
|
|
return Task.FromResult(ToolResult.Fail("수식이 비어 있습니다."));
|
|
}
|
|
try
|
|
{
|
|
string text2 = text.Replace("^", " ").Replace("Math.", "").Replace("System.", "");
|
|
if (Regex.IsMatch(text2, "[a-zA-Z]{3,}"))
|
|
{
|
|
return Task.FromResult(ToolResult.Fail("함수 호출은 지원하지 않습니다. 기본 사칙연산만 가능합니다."));
|
|
}
|
|
DataTable dataTable = new DataTable();
|
|
object value2 = dataTable.Compute(text2, null);
|
|
double value3 = Convert.ToDouble(value2);
|
|
double value4 = Math.Round(value3, digits);
|
|
return Task.FromResult(ToolResult.Ok($"Expression: {text}\nResult: {value4}"));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
return Task.FromResult(ToolResult.Fail("수식 평가 오류: " + ex.Message));
|
|
}
|
|
}
|
|
}
|