49 lines
1.9 KiB
C#
49 lines
1.9 KiB
C#
using MAF1.Tools;
|
|
using MAF1.Utils;
|
|
using Microsoft.Agents.AI;
|
|
using Microsoft.Extensions.AI;
|
|
|
|
namespace MAF1.Agents.Weather;
|
|
|
|
/// <summary>
|
|
/// 「按城市查天气」Agent。真正的 HTTP 查询在 WeatherTools.GetWeather,模型只负责决定调几次工具并写成中文摘要。
|
|
/// </summary>
|
|
public static class WeatherAgent
|
|
{
|
|
/// <summary>创建带 GetWeather 工具的 Agent。instructions 要求每个城市都调工具,禁止编造气温。</summary>
|
|
public static AIAgent Create(AgentFactory factory, WeatherTools weatherTools)
|
|
{
|
|
return factory.CreateAgent(
|
|
name: "WeatherAgent",
|
|
instructions:
|
|
"""
|
|
你负责查询天气。用户给出的每个城市都必须调用一次 GetWeather,不要编造天气。
|
|
用中文汇总所有城市的天气。
|
|
""",
|
|
tools: [AIFunctionFactory.Create(weatherTools.GetWeather)]);
|
|
}
|
|
|
|
/// <summary>需要上游把 cities 连到本节点。空列表直接抛错,避免无意义地打 LLM。</summary>
|
|
public static async Task<AgentStepResult> RunAsync(
|
|
AIAgent agent,
|
|
IReadOnlyDictionary<string, object?> inputs,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
List<string> cities = AgentInputs.ReadStringList(inputs, "cities");
|
|
if (cities.Count == 0)
|
|
{
|
|
throw new InvalidOperationException("输入 cities 为空。请把上一节点的 cities 连到本节点的 cities。");
|
|
}
|
|
|
|
AgentResponse response = await agent.RunAsync(
|
|
$"请查询这些城市的天气:{string.Join("、", cities)}",
|
|
cancellationToken: cancellationToken);
|
|
return new AgentStepResult
|
|
{
|
|
Message = response.Text,
|
|
Inputs = new Dictionary<string, object?> { ["cities"] = cities },
|
|
Outputs = new Dictionary<string, object?> { ["summary"] = response.Text },
|
|
};
|
|
}
|
|
}
|