新增能力包手册
本手册详细说明如何在 Tether 代码库中新建一组符合规范的能力程序集。遵循本规范建立的包可无缝接入 Tether 的 YAML 加载器、依赖注入图与生命周期管理系统。
目录与项目规划
假设我们要新增一项名为 Database 的能力,标准的项目结构如下:
src/
├── Tether.Database/ # Seam:纯接口与数据模型(零依赖)
│ └── Tether.Database.csproj
├── Tether.Database.Local/ # Provider:本地/默认实现(依赖 Cordis + Tether.Database)
│ └── Tether.Database.Local.csproj
└── Tether.Database.Tools/ # Tools:大模型工具暴露(依赖 Contracts + Cordis + Tether.Database)
└── Tether.Database.Tools.csproj
tests/
└── Tether.Database.Tests/ # 单元测试(镜像对应)
└── Tether.Database.Tests.csproj
1. 创建 Seam 程序集
编辑 src/Tether.Database/Tether.Database.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
</Project>
硬约束:零引用
Seam 程序集禁止添加任何 ProjectReference(连 Cordis 都不允许引用)。它只负责定义数据传输对象(DTO)和接口契约。
2. 创建 Provider 程序集
编辑 src/Tether.Database.Local/Tether.Database.Local.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Cordis\Cordis.csproj" />
<ProjectReference Include="..\Tether.Database\Tether.Database.csproj" />
<ProjectReference Include="..\Tether.Invariants\Tether.Invariants.csproj" />
</ItemGroup>
</Project>
编写插件挂载类:
using Cordis;
namespace Tether.Database.Local;
public sealed class DatabaseLocalPlugin : Plugin
{
protected override void Apply(Context context)
{
IDatabaseService service = new LocalDatabaseService();
context.Provide(service);
}
}
3. 创建 Tools 程序集
编辑 src/Tether.Database.Tools/Tether.Database.Tools.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Cordis\Cordis.csproj" />
<ProjectReference Include="..\Tether.Core.Contracts\Tether.Core.Contracts.csproj" />
<ProjectReference Include="..\Tether.Database\Tether.Database.csproj" />
<ProjectReference Include="..\Tether.Invariants\Tether.Invariants.csproj" />
</ItemGroup>
</Project>
编写 Tool 注册插件(使用 [Inject] 声明依赖):
using Cordis;
using Microsoft.Extensions.AI;
using Tether.Core;
namespace Tether.Database.Tools;
[Inject(typeof(IDatabaseService))]
[Inject(typeof(IToolRegistry))]
public sealed class DatabaseToolsPlugin : Plugin
{
protected override void Apply(Context context)
{
var db = context.Require<IDatabaseService>();
var tools = context.Require<IToolRegistry>();
var queryTool = AIFunctionFactory.Create(
(string sql) => db.ExecuteQueryAsync(sql),
name: "db_query",
description: "执行只读 SQL 查询并返回结果表");
context.Effect(tools.Register(queryTool).Dispose);
}
}
4. 添加到解决方案并运行测试
在根目录下将新建的项目加入解决方案:
dotnet sln Tether.slnx add src/Tether.Database/Tether.Database.csproj
dotnet sln Tether.slnx add src/Tether.Database.Local/Tether.Database.Local.csproj
dotnet sln Tether.slnx add src/Tether.Database.Tools/Tether.Database.Tools.csproj
dotnet sln Tether.slnx add tests/Tether.Database.Tests/Tether.Database.Tests.csproj
# 运行构建与全量测试
dotnet test Tether.slnx
质量与工程检查清单
- Seam 程序集保持零项目依赖。
- 异步接口一律返回
ValueTask或ValueTask<T>。 - 每一个公开的 API 都包含清晰的 XML 注释。
- 通过
tools.Register拿到的IDisposable都以context.Effect(registration.Dispose)挂上作用域(context.Provide返回的服务注册本身已绑定作用域,不需要再挂)。 - 测试项目镜像对应并在
dotnet test中全部通过。