feat: 将插件 stdin 协议定为 v1,并按声明注入凭据

进程外插件改为只读环境变量和自身配置,避免读宿主 appsettings;宿主按 plugin.json 声明注入 LLM / OpenWeather 等凭据。
This commit is contained in:
2026-09-11 10:46:52 +08:00
parent d1b979f2db
commit b631acd42e
22 changed files with 377 additions and 95 deletions
+9 -2
View File
@@ -1,4 +1,5 @@
// 进程外 Weather 插件。同样只做 stdio 适配,天气实现仍在 MAF1.Core。
// 进程外 Weather 插件。stdio 适配 + 复用 MAF1.Core 的 WeatherAgent
// LLM / OpenWeather Key 只来自宿主注入的环境变量;天气站点配置读本插件目录的 appsettings.json。
using MAF1.Agents.Weather;
using MAF1.PluginContract;
using MAF1.Tools;
@@ -8,9 +9,15 @@ using Microsoft.Extensions.Configuration;
PluginRequest request = await PluginStdio.ReadRequestAsync();
PluginStdio.ApplyCredentialsToEnvironment(request.Credentials);
IConfiguration config = PluginStdio.LoadHostConfiguration();
IConfiguration config = PluginStdio.LoadPluginConfiguration();
AgentFactory factory = new(AgentFactory.Load(config));
WeatherOptions weatherOptions = config.GetSection("Weather").Get<WeatherOptions>() ?? new WeatherOptions();
string? openWeatherKey = Environment.GetEnvironmentVariable("OPENWEATHER_API_KEY");
if (!string.IsNullOrWhiteSpace(openWeatherKey))
{
weatherOptions.OpenWeather.ApiKey = openWeatherKey;
}
using HttpClient http = WeatherTools.CreateHttpClient();
var result = await WeatherAgent.RunAsync(
WeatherAgent.Create(factory, new WeatherTools(weatherOptions, http)),
+5 -3
View File
@@ -1,12 +1,14 @@
# Weather 插件
独立进程。启动命令只看 `plugin.json``launch`
独立进程。启动命令只看 `plugin.json``launch``protocolVersion` 为 1。
## 输入 / 输出
- 输入 `cities`(字符串数组,与代码、清单同名)
- 输出 `summary`
## 凭据
## 凭据与配置
LLM 的 endpoint / apiKey 由宿主注入,不出现在流程图端口上。天气 HTTP 配置走宿主 `appsettings.json`(通过环境变量 `MAF1_CONTENT_ROOT` 定位)。
- LLM:宿主注入 `OPENAI_*`,以及 stdin `credentials.llm`
- OpenWeather(可选):宿主凭据类型 `openweather`,注入 `OPENWEATHER_API_KEY`。默认 Provider 是免费的 Wttr,不需要这个 Key
- 天气 URL / 语言:读**本插件目录**的 `appsettings.json`,不读宿主配置
+3
View File
@@ -15,6 +15,9 @@
<None Update="plugin.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="README.md">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
+13
View File
@@ -0,0 +1,13 @@
{
"Weather": {
"Provider": "Wttr",
"Language": "zh",
"Wttr": {
"UrlTemplate": "https://wttr.in/{location}?lang={lang}&format=3"
},
"OpenWeather": {
"UrlTemplate": "https://api.openweathermap.org/data/2.5/weather?q={location}&appid={apiKey}&units=metric&lang={lang}",
"ApiKey": ""
}
}
}
+7
View File
@@ -3,6 +3,7 @@
"name": "WeatherAgent",
"description": "按城市列表查询天气并汇总。",
"version": "1.0.0",
"protocolVersion": 1,
"timeoutSeconds": 180,
"launch": {
"command": "dotnet",
@@ -14,6 +15,12 @@
"type": "openai-compatible",
"required": true,
"description": "由宿主注入 OpenAI 兼容的 endpoint / apiKey / model,不要写进本文件。"
},
{
"name": "weather",
"type": "openweather",
"required": false,
"description": "仅当本插件 appsettings.json 的 Weather:Provider 为 OpenWeather 时需要。Wttr 免费接口不用填。"
}
],
"inputs": [