LuBan.AIAgent
2026.10.9.1
dotnet add package LuBan.AIAgent --version 2026.10.9.1
NuGet\Install-Package LuBan.AIAgent -Version 2026.10.9.1
<PackageReference Include="LuBan.AIAgent" Version="2026.10.9.1" />
<PackageVersion Include="LuBan.AIAgent" Version="2026.10.9.1" />
<PackageReference Include="LuBan.AIAgent" />
paket add LuBan.AIAgent --version 2026.10.9.1
#r "nuget: LuBan.AIAgent, 2026.10.9.1"
#:package LuBan.AIAgent@2026.10.9.1
#addin nuget:?package=LuBan.AIAgent&version=2026.10.9.1
#tool nuget:?package=LuBan.AIAgent&version=2026.10.9.1
English | 中文
LuBan.AIAgent
作者: yswenli | 联系邮箱: yswenli@outlook.com | 代码仓库: https://github.com/yswenli/luban-framework
基于 Microsoft Agent Framework 的 AI Agent 库,让大模型具备思考、规划、调用工具和自主执行的能力。
Related Projects: LuBan.Framework | LuBan.DI | LuBan.AIFlow | LuBan.Web.Core
为什么需要它?
- 想让 LLM 调用工具完成任务,但 MCP / Function Calling 的实现细节令人头疼?
- Skill 管理、工具注册、会话持久化各自需要单独实现,维护成本高?
- 模型 Provider 切换困难——从 Provider A 换到 Provider B 需要重写大量代码?
- 缺少中间件机制——日志、策略控制、权限拦截难以扩展?
LuBan.AIAgent 提供完整的 AI Agent 基础设施,从 Agent 运行时、多模型路由、技能系统、工具系统、会话存储到中间件管道——开箱即用。
快速预览
// 注册服务
services.AddSingleton<IChatClient>(sp => CreateChatClient());
services.AddLuBanAgent(configuration);
// 创建 Agent
var factory = serviceProvider.GetRequiredService<ILuBanAgentFactory>();
var agent = await factory.CreateAsync(
systemPrompt: "你是一个浏览器自动化助手",
toolGroups: new[] { "browser" });
// 执行任务
var response = await agent.RunAsync("打开百度并搜索 LuBan Framework");
Console.WriteLine(response.Text);
技术栈
| 组件 | 说明 |
|---|---|
| Microsoft.Agents.AI.Foundry | Agent 运行时框架 |
| Microsoft.Extensions.AI | 统一聊天客户端抽象 |
| Microsoft.Playwright | 浏览器自动化引擎 |
| LuBan.DI | 依赖注入集成 |
| LuBan.Common | 基础接口与工具定义 |
安装
dotnet add package LuBan.AIAgent
安装 Playwright 浏览器(使用浏览器工具时需要):
npx playwright@1.61.0 install chromium
功能总览
核心引擎
| 组件 | 说明 |
|---|---|
LuBanAgent |
Agent 实例,封装 ChatClientAgent,支持同步/流式运行 |
ILuBanAgentFactory / LuBanAgentFactory |
Agent 工厂,按配置创建 Agent 并注入工具 |
IAppConfigReader |
应用配置只读接口 |
IProviderRouter |
Provider 路由接口 |
TextUtils |
文本处理工具 |
WildcardMatcher |
通配符匹配 |
SkillMdParser |
SKILL.md 解析器 |
组件注册表架构
Skills、MCPs、Rules 采用统一的三级优先级注册表模式:
| 优先级 | 来源 | 行为 |
|---|---|---|
| 最高 | 硬编码(DI 注册) | 始终存在,可通过 DisabledBuiltin 配置禁用 |
| 中 | 工作区文件 | 添加新项,同名项被忽略 |
| 最低 | config.json | 添加新项,同名项被忽略 |
加载时机:
- 启动时:加载硬编码组件 + config.json 全局配置
- 工作区切换时:加载工作区文件,自动合并
工作区目录结构:
.luban-agent/
├── skills/ # 工作区级 Skill
│ └── my-skill/
│ └── SKILL.md
├── mcps/ # 工作区级 MCP 服务器
│ └── my-mcp.json
└── rules/ # 工作区级规则
└── my-rule.json
工具系统
| 组件 | 说明 |
|---|---|
ILuBanToolPlugin |
工具插件接口,定义工具分组和提供工具函数 |
ToolPluginRegistry |
工具插件注册表,管理插件的启用/禁用和分组筛选 |
ToolAttribute |
工具标注特性 |
内置工具
| 工具组 | 分组名 | 核心能力 |
|---|---|---|
| 浏览器工具 | browser |
导航、点击、输入、截图、获取内容、等待元素、获取 URL(基于 Playwright) |
| 文件系统工具 | filesystem |
读取文件、写入文件、列出目录、删除文件、删除目录、搜索文件(glob)、内容搜索(regex)、创建目录、复制文件、移动文件、获取文件信息,支持 AllowedRoots 安全限制 |
| 脚本执行工具 | script |
执行 Shell(运行环境自适应)、Lua(内嵌沙箱,无外部解释器依赖)、Python 脚本 |
| Web 工具 | web |
发送 HTTP 请求获取网页内容 |
| 语义检索工具 | retrieval |
索引本地代码/文档,按语义搜索相关片段 |
| 上下文压缩工具 | context |
压缩当前会话的对话历史,释放 token 预算(LLM 可见、可主动调用) |
| 本地记忆工具 | localmemory |
长期记忆的存储、查询和管理 |
| Wiki 知识库工具 | wiki |
读取/写入/删除 wiki 页面、向量搜索、健康检查(opt-in,需在 ToolGroups 中显式点名) |
脚本执行说明:Shell 工具会自动探测运行环境(Windows 优先
pwsh>powershell>cmd,类 Unix 优先bash>sh),并按解释器自动适配参数风格与引用方式,执行结果中回传实际使用的shell/shellPath/platform。Lua 工具基于内嵌 MoonSharp 软沙箱执行,无需外部lua解释器,沙箱不具备文件系统与系统命令能力,结果通过
LLM Wiki 知识库(opt-in)
wiki 是 opt-in 工具组:ToolGroups 为 null(表示全部)时不包含本组,只有在 ToolGroups 中显式点名 "wiki" 时才注入。
| 工具 | 说明 | 需要确认 |
|---|---|---|
ReadIndexAsync |
读取 index.md,了解已有页面清单 |
否 |
ReadPageAsync |
读取指定页面正文(相对 wiki 根的路径) | 否 |
SavePageAsync |
写入/更新页面,自动维护 index.md、log.md 与向量索引 |
是 |
DeletePageAsync |
删除页面,同步移除 index 条目与向量索引 | 是 |
SearchAsync |
在 wiki 中做向量搜索,可回落到 raw 工作区文件 | 否 |
LintAsync |
检查孤儿页、死链、未收录、来源缺失、来源过期 | 否 |
目录布局:
wiki/
├── SCHEMA.md # 维护规范(承载 LLM 创作约定)
├── index.md # 页面清单(由服务维护,勿手写)
├── log.md # 变更日志(由服务维护,勿手写)
├── overview.md # 总览
├── sources/ # 来源摘要,一源一页
├── entities/ # 实体
├── concepts/ # 概念
└── queries/ # 问答沉淀
frontmatter 约定:每个页面以 YAML frontmatter 开头,包含 title、type(source | entity | concept | overview | query)、tags、sources(相对工作区根的来源路径)、created、updated。
源格式支持:
| 扩展名 | 处理方式 |
|---|---|
.txt .log .ini .cfg .toml .properties |
纯文本直读 |
.md .markdown |
Markdown 解析 |
.json .jsonc .jsonl .ndjson |
JSON 美化 / 分行美化 |
.csv .tsv |
分隔符表格解析 |
.xml .xaml .svg |
XML 结构化提取 |
.html .htm |
正则去标签降级为纯文本(不引入 HtmlAgilityPack,不保证完整 Markdown 结构) |
.xlsx |
完整支持(按 sheet 读取,MiniExcel;表头按列序号读取,空白表头回落为「列A」,缺失表头不会丢列) |
.xls |
不支持:MiniExcel 无 BIFF 支持,已不再注册该扩展名(不会被索引,避免必然失败) |
| 其他未注册扩展名 | 内容为文本时回落纯文本直读;检测到二进制(含 NUL 字节)则拒绝提取并抛出 NotSupportedException,避免乱码进入上下文 |
表格单元格内的 | 会转义为 \|,换行转为 <br>,保证生成的 Markdown 表格不被破坏。
配置(LuBanAgent:Tools:Wiki):Enabled(默认 true)、TopK(默认 8)、IncludeRawDefault(默认 false)、MaxResultChars(默认 8000)。
后台索引与工作区显式指定:
IRetrievalService.IndexDirectoryAsync(path, glob, force, IProgress<IndexProgress>? progress, cancellationToken, workspaceId):索引过程不再占用方法级写锁(写锁仅包裹存储写入),嵌入调用串行化(内部信号量),并通过IndexProgress上报IndexStage.Scanning / Embedding / Deleting / Done,调用方可放到后台任务执行并展示进度。- 检索与 wiki 的全部方法新增可选参数
string? workspaceId = null:显式指定目标工作区(由IWikiContext.WorkspaceRootFor(workspaceId)解析根目录),不传时沿用IWikiContext.WorkspaceRoot。 - 语义搜索改为在全部候选(不再抽样)上计算余弦相似度,并以
Score降序、ChunkId升序排序,保证同分结果可复现。 - 破坏性变更:
IVectorStore的 8 个方法均新增string? workspaceId = null,IRetrievalService.IndexDirectoryAsync第 4 个参数由force之后的布尔/无变为IProgress<IndexProgress>?。自定义实现者需同步签名(不传workspaceId时行为保持为默认工作区)。 - 索引文件白名单(行为变更):
ChunkerFactory.ShouldIndex只按扩展名判断,白名单 = 各ICodeChunker已注册扩展名 +.txt/.csv/.tsv/.log/.properties/.xlsx;.xlsx在读取时经ExcelExtractor(MiniExcel)提取为 Markdown 后再切块/嵌入(提取结果为「## sheet 名+ markdown 表格」,按 sheet 分节切块,语言标识excel);无专用切块器的纯文本(.txt/.csv/.tsv/.log/.properties)走滑动窗口兜底。白名单之外的扩展名(.docx/.pdf/.ps1/.exe等)与无扩展名文件一律不索引;单文件索引IndexFileAsync同样受白名单与大小上限约束。白名单内但内容含 NUL 字节或全空白的内容在读取阶段跳过。扫描阶段不再预读文件内容(二进制判断移到读取阶段),并剪枝排除目录(.git/bin/obj/node_modules/dist/packages/.vs/.idea/target)与重解析点,避免在云盘/网络目录上因文件水合与杀软扫描长时间卡顿。 ChunkerFactory.EnumerateFiles(root, pattern)为公开的逐层安全枚举(剪枝排除目录与重解析点、单层不可访问时跳过该层、跨 pattern 去重),索引、wiki 页面枚举(WikiService.EnumeratePages)与 CLI/桌面端预扫共用,保证各处统计口径一致。- 表格提取上限与截断告警:
ExcelExtractor.ExtractAsync(filePath, maxChars, cancellationToken)可指定单文件字符上限;索引侧使用ExcelExtractor.IndexingMaxChars(200 万字符,远宽于摄入侧的TextExtractor.MaxChars= 20 万),超出时截断并写入IndexReport.Warnings(不再静默丢数据)。提取在线程池执行,等待期间可响应取消。 IndexDirectoryAsync在枚举阶段即按目录上报IndexStage.Scanning(IndexProgress.CurrentFile为当前目录,Total为已发现的可索引文件数),调用方无需额外预扫即可显示「正在扫描:<目录>(已发现 N 个)…」。
Skill 系统
| 组件 | 说明 |
|---|---|
ISkill |
Skill 接口定义,包含 PromptTemplate 属性用于对话内激活 |
SkillBase |
Skill 基类,提供日志、状态更新、Agent 调用等通用功能 |
SkillRegistry |
Skill 注册表,管理内置、文件级和自定义 Skill |
SkillLoader |
Skill 文件加载器,从 SKILL.md 文件加载 Skill 定义 |
FileSkill |
文件级 Skill 适配器,将 SKILL.md 文件包装为 ISkill |
CustomSkill |
自定义 Skill 适配器,将 CustomSkillConfig 包装为 ISkill |
内置 Skill
| Skill ID | 名称 | 分类 | 说明 |
|---|---|---|---|
brainstorming |
头脑风暴 | creative | 实现功能前探索需求和设计 |
code-review |
代码审查 | development | 审查代码、发现问题、提供改进建议 |
documentation |
文档生成 | productivity | 生成代码注释、README、API 文档等 |
code-refactor |
代码重构 | development | 重构代码,提升代码质量 |
test-generation |
测试生成 | development | 自动生成单元测试 |
code-explain |
代码解释 | development | 解释复杂代码逻辑 |
debug-assistant |
调试助手 | development | 辅助调试问题 |
git-commit |
Git 提交 | productivity | 生成规范的 Git 提交信息 |
find-skills |
技能发现 | meta | 自动发现和推荐合适的技能 |
agents-md-generator |
Agents.md 规约生成器 | productivity | 生成工作区 AGENTS.md 元描述文档 |
文件化 Skill
支持通过 SKILL.md 文件定义自定义 Skill,兼容 OpenCode 格式:
---
name: my-skill
description: "技能描述"
category: custom
---
# Skill 指令内容
这里是 Skill 的提示词模板...
存储位置(按优先级):
- 项目级:
<workspace>/.luban-agent/skills/<skill-id>/SKILL.md - 用户级:
%LocalAppData%/LuBan/AIAgent/skills/<skill-id>/SKILL.md
优先级:硬编码(DI)> 工作区文件 > config.json
Rule 系统
| 组件 | 说明 |
|---|---|
IRule |
规则接口,定义执行条件和行为 |
RuleBase |
规则基类 |
RuleEngine |
规则引擎,按优先级评估规则 |
ContextInjectBuilder |
上下文注入构建器,把规则引擎产出的 Inject 文本装配为可注入对话/系统提示词的上下文 |
PathAccessRule |
内置路径访问规则,限制文件系统访问范围 |
MCP 系统
| 组件 | 说明 |
|---|---|
IMCPClient |
MCP 客户端接口,与 MCP 服务器交互 |
StdioMCPClient |
基于 stdio JSON-RPC 的外部 MCP 客户端 |
MCPRegistry |
MCP 注册表,管理内置和外部客户端 |
MCPToolPlugin |
MCP 工具插件,将 MCP 工具暴露给 Agent |
FileSystemMCPClient |
内置文件系统 MCP 客户端 |
会话系统
| 组件 | 说明 |
|---|---|
ISessionManager |
会话管理接口,支持创建、切换、清除会话 |
SessionChatHistoryProvider |
会话历史提供者,自动持久化对话历史 |
SessionOptions |
会话配置,支持压缩阈值设置 |
附件系统
| 组件 | 说明 |
|---|---|
IAttachmentProcessor |
附件处理器接口,判定可支持类型/媒体类型并按需生成缩略图 |
DefaultAttachmentProcessor |
默认实现:图片(PNG/JPEG/GIF/WebP/BMP/TIFF/HEIC)与文本文件;图片解码校验并缩放,文本读取内容 |
AttachmentInfo |
附件元数据(文件名、MIME、大小、类型、源路径) |
AttachmentKind |
附件类型枚举(Image / Text) |
ProcessedAttachment |
处理结果(元数据 + 文本内容 / 缩略图路径 + 像素尺寸) |
AttachmentMessageBuilder |
把附件装配为 ChatMessage(图片 → base64 DataContent;≤50KB 文本内联;>50KB 仅注入路径指引) |
AttachmentRecord |
会话持久化记录(仅存路径与元数据,不存 base64),供历史回放重建 |
规则拦截
| 组件 | 说明 |
|---|---|
RuleCheckedAIFunction |
规则检查装饰器,工具执行前自动拦截检查 |
CustomRule |
自定义规则适配器,支持通配符匹配 |
安全与确认
| 组件 | 说明 |
|---|---|
ToolConfirmationService |
工具执行确认服务,危险操作前要求用户确认 |
PathGuard |
路径安全守卫,防止越权访问 |
RuleEngine |
规则引擎,工具执行前进行权限检查和参数修改 |
多 Agent 编排系统
主 Agent 解析复合任务 → 拆解 DAG 任务图谱 → 分发 SubAgent 执行(串行 / 并行混合编排)。
| 组件 | 说明 |
|---|---|
IOrchestrator / Orchestrator |
编排器入口,串联规划、调度与结果聚合 |
ITaskPlanner |
任务规划器接口,将自然语言任务转换为 TaskGraph |
LlmTaskPlanner |
基于 LLM 的规划器,通过提示词引导模型生成 DAG |
GraphPlanStore |
任务图谱暂存(plan_task 生成、run_orchestration 取用),带 TTL 与容量淘汰 |
IOrchestrationProgressSink |
编排进度出口,默认 no-op,宿主可注册实现(如 TUI 实时渲染) |
DagScheduler |
DAG 调度器,基于拓扑分层实现同层并行、跨层串行 |
SubAgentFactory |
SubAgent 工厂,封装 LuBanAgentFactory 的子 Agent 创建 |
SubAgentRoleRegistry |
SubAgent 角色注册表,管理内置角色与自定义角色 |
SubAgentRole |
SubAgent 角色定义,包含名称、系统提示词模板、默认工具组 |
ContextStore |
跨节点上下文存储,按图谱 ID 隔离,线程安全 |
TaskGraph / TaskNode |
DAG 数据模型,支持依赖声明、占位符引用、关键节点、角色指定;TaskGraph.SharedContext 承载工作区记忆/规则上下文 |
SubAgentSpec |
SubAgent 规格(提示词、工具组、工作区根等),其 SharedContext 会追加到子代理系统提示词 |
OrchestrationToolPlugin |
工具插件,将编排能力暴露给主 Agent 自动调用 |
OrchestrationProgress / OrchestrationProgressContent |
编排进度事件与流式内容载体(AIContent),供 UI 在规划/节点执行期间实时渲染 |
ReflectionResult / ReplanContext |
动态重规划数据模型,关键节点失败后 LLM 分析并生成修正图谱 |
使用指南
1. 配置与注册
{
"LuBanAgent": {
"DefaultModel": "openai:gpt-4o",
"SystemPrompt": "你是一个智能助手。",
"MaxToolLoopIterations": 10,
"Session": {
"CompactTargetMessages": 20,
"CompactThreshold": 10
}
}
}
// 注册服务
services.AddSingleton<IAppConfigReader>(myConfigManager);
services.AddSingleton<IProviderRouter>(myProviderRouter);
services.AddLuBanAgent(configuration);
2. 多模型路由
// 使用 provider:model 格式路由到不同模型
// IProviderRouter 根据 ModelId 中的 provider 前缀自动分发
var agent = await factory.CreateAsync(modelName: "qwen:qwen-plus");
// 切换 Provider 只需更改前缀
var agent2 = await factory.CreateAsync(modelName: "openai:gpt-4o");
3. 工具注册与使用
// 创建 Agent 时指定工具组
var agent = await factory.CreateAsync(
toolGroups: new[] { "browser", "filesystem" });
// Agent 自动选择并调用工具
var response = await agent.RunAsync("列出 src 目录下所有 .cs 文件并统计代码行数");
// 流式运行
await foreach (var update in agent.RunStreamingAsync("帮我分析这段代码"))
{
Console.Write(update.Text);
}
4. Skill 管理
// 获取 Skill 注册表
var skillRegistry = serviceProvider.GetRequiredService<SkillRegistry>();
// 列出所有 Skill
var skills = skillRegistry.GetAll();
// 执行 Skill
var context = new SkillContext
{
Agent = agent,
UpdateStatus = status => Console.WriteLine($"状态: {status}")
};
var result = await skillRegistry.Get("brainstorming")
.ExecuteAsync(context, "我想实现一个用户登录功能");
5. 自定义工具插件
public class MyToolPlugin : ILuBanToolPlugin
{
public string GroupName => "my-tools";
public string? Description => "自定义工具集";
public IReadOnlyList<AIFunction> GetTools(IServiceProvider sp, ToolGroupOptions? toolsOptions = null)
{
// 返回自定义工具函数
return new List<AIFunction> { /* ... */ };
}
public bool IsEnabled(LuBanAgentOptions options) => true;
}
// 注册
services.AddSingleton<ILuBanToolPlugin, MyToolPlugin>();
6. 自定义 Skill
方式一:文件化 Skill(推荐)
在项目级或用户级目录创建 SKILL.md 文件:
# 项目级目录
<workspace>/.luban-agent/skills/my-skill/SKILL.md
# 用户级目录
%LocalAppData%/LuBan/AIAgent/skills/my-skill/SKILL.md
SKILL.md 格式:
---
name: my-translator
description: "将文本翻译成英文"
category: custom
---
# 翻译助手
请将用户提供的内容翻译成英文。
## 要求
- 保持原文的语气和风格
- 使用地道的英文表达
方式二:代码定义 Skill
public class MyCustomSkill : SkillBase
{
public override string Id => "my-custom-skill";
public override string Name => "我的自定义 Skill";
public override string Description => "自定义 Skill 示例";
public override string Category => "custom";
public override string? PromptTemplate => "自定义提示词模板...";
public override async Task<SkillResult> ExecuteAsync(SkillContext context, string input)
{
UpdateStatus(context, "正在处理...");
var result = await CallAgentAsync(context, input);
return SkillResult.Ok(result ?? "");
}
}
// 注册
services.AddSingleton<ISkill, MyCustomSkill>();
7. 自定义规则
public class MyRule : RuleBase
{
public override string Id => "my-rule";
public override string Name => "我的规则";
public override int Priority => 50;
public override bool IsApplicable(RuleContext context)
=> context.ActionType == "file-write";
public override Task<RuleResult> ExecuteAsync(RuleContext context)
{
var path = context.Arguments.GetValueOrDefault("path")?.ToString();
if (path?.Contains("secret") == true)
return Task.FromResult(RuleResult.DenyResult("禁止访问包含 secret 的路径"));
return Task.FromResult(RuleResult.AllowResult());
}
}
// 注册
services.AddSingleton<IRule, MyRule>();
8. 外部插件加载
{
"LuBanAgent": {
"ExternalPlugins": ["MyCompany.AgentPlugins", "ThirdParty.Tools"]
}
}
通过配置 ExternalPlugins 指定程序集名称,框架会自动扫描并注册其中实现了 ILuBanToolPlugin 的类型。
9. 多 Agent 任务编排
{
"LuBanAgent": {
"Orchestration": {
"Enabled": true,
"PlannerReasoningEffort": "none",
"MaxNodes": 10,
"MaxParallelism": 5,
"DefaultNodeTimeoutSeconds": 0,
"MaxReplanAttempts": 3,
"ReflectionTimeoutSeconds": 0,
"DefaultToolGroups": []
}
}
}
Enabled:启用后向模型暴露两个编排工具——plan_task(由模型自行判定复合任务并生成任务图谱)与run_orchestration(按plan_task返回的graphId执行)。是否编排完全交由模型决策,框架不再做启发式或自动判定。- 规划固定使用 LLM 规划器;
PlannerModel为null时继承主模型,PlannerReasoningEffort建议设为none以关闭推理模型的思考输出、显著缩短规划耗时。
SubAgent 角色系统:规划器可为每个节点指定角色(analyst/researcher/coder/writer),角色提供专业系统提示词和默认工具组。内置 4 个角色,支持通过工作区扩展自定义角色。
工作区编排扩展
进入 /agi 工作区时自动加载以下目录:
.luban-agent/roles/*.json:自定义 SubAgent 角色,同名覆盖内置角色。格式:{ "name": "...", "systemPromptTemplate": "... {prompt} ...", "defaultToolGroups": [...] }。
多模型路由
注册 IProviderRouter 后,TaskNode.ModelName(格式 provider:model)与 OrchestrationOptions.PlannerModel 会路由到对应 Provider;路由失败自动回退默认模型并记录警告。未注册路由时行为不变。
编排判定
是否编排完全由模型决定:框架向模型暴露 plan_task 与 run_orchestration 两个工具,模型自行判断输入是否为复合任务并生成/执行图谱,框架不再做启发式预过滤或自动判定。
动态重规划:当关键节点失败导致整体状态为 failed 时,编排器自动触发反思阶段:
- 反思:LLM 分析失败节点及其直接依赖的输出,判断是否可修复
- 重规划:LLM 生成修正节点(
fix_{attempt}_前缀);指向已成功节点的依赖会被解析并内联为 prompt 文本,避免引用不在修正图谱中的节点 - 重试:执行修正图谱,最多尝试
MaxReplanAttempts次(默认 3)
// 直接调用编排器
var orchestrator = serviceProvider.GetRequiredService<IOrchestrator>();
var result = await orchestrator.RunAsync("调研 LuBan 框架并生成对比报告");
Console.WriteLine($"整体状态: {result.OverallStatus}");
Console.WriteLine($"重规划次数: {result.ReplanningAttempts}");
Console.WriteLine($"最终输出:\n{result.FinalOutput}");
// 带进度回调执行(不丢最终结果):规划/节点级事件实时回调,返回值仍是完整编排结果
var result2 = await orchestrator.RunAsync(
graph,
onProgress: p => Console.WriteLine($"{p.EventType}: {p.Message}"),
cancellationToken: default);
编排由模型调用 plan_task / run_orchestration 两个工具触发,执行发生在工具调用内部,
进度不再随对话流产出。框架通过 IOrchestrationProgressSink(默认注册 no-op 实现)广播
OrchestrationProgress(EventType / NodeId / Message / NodeResult / Activity / ElapsedMs),
宿主可注册自定义 Sink(如 CLI 的 TuiOrchestrationProgressSink)在规划与节点执行期间逐条渲染进度。
进度事件类型包含:PlanningStarted、PlanningCompleted、NodeStarted、NodeCompleted、
NodeFailed、NodeSkipped(关键前驱失败导致后继被跳过,逐节点上报)、ReflectionStarted、
NodeActivity(节点内部思考/工具调用明细)。
编排执行流程:
- 规划阶段:
ITaskPlanner将自然语言任务拆解为 DAG 任务图谱(模板优先,LLM 回退) - 校验阶段:
TaskGraph.Validate检查无环、依赖存在、无重复 ID - 调度阶段:
DagScheduler基于 Kahn 拓扑排序分层执行,同层节点并行 - 上下文传递:节点 prompt 中的
{dep:xxx}占位符由ContextStore替换为前驱输出 - 错误处理:关键节点失败时跳过后继节点;非关键节点失败时继续执行
- 结果聚合:终点节点(无后继)的输出聚合为
FinalOutput
记忆上下文注入:编排入口(Orchestrator.ExecuteGraphAsync)会通过 ContextInjectBuilder 构建工作区长期记忆与规则上下文,
一次性写入 TaskGraph.SharedContext(仅填充一次,重规划生成的修正图谱继承同一份),再由 SubAgentFactory 追加到每个
SubAgent 的系统提示词,使子代理与主 Agent 对话共享同一份工作区记忆。常规对话路径则由 SessionChatHistoryProvider
直接把召回结果作为 System 消息注入,两条路径共用同一个 ContextInjectBuilder。
关键概念:
- 关键节点(
IsCritical = true):失败时阻止后继节点执行,整体状态为failed - 非关键节点:失败时后继节点继续执行,整体状态为
partial - 占位符:
{dep:节点id}引用前驱节点输出,运行时自动替换 - 并行度:
MaxParallelism限制同层最大并行节点数,0 表示不限制 - 共享上下文(
SharedContext):工作区记忆/规则上下文,由编排入口构建并注入所有子代理
10. 错误处理与自动重试
框架对所有 LLM/API 调用做统一错误分类(结构化优先:HTTP 状态码 + error.code),最终失败抛出 AgentApiException,宿主渲染 Error.FriendlyMessage 即可:
| 类别 | 典型错误 | 是否自动重试 |
|---|---|---|
| 认证/权限/余额 | 401 / 402 / 403 | 否,终止并提示 |
| 模型不存在 | 404 / 410 | 否,终止并给出排查清单 |
| 参数错误 / 上下文超长 / 能力不支持 | 400 / 413 / 422 | 否,终止并提示 |
| 内容风控 | content_filter |
否,终止并建议改措辞 |
| 限流 | 429 rate_limit_exceeded |
是(默认 3 次尝试,1s/2s 指数退避 + 抖动,遵循 Retry-After,单次等待上限 30s) |
| 服务端错误 / 网络错误 / 超时 | 5xx / DNS/TLS / 超时 | 是(同上) |
| 配额耗尽 | 429 insufficient_quota |
否,终止并在文案中带上服务端给出的重置时间 |
| 流式中断 | 已输出内容后连接断开 | 否,保留已输出并提示响应中断 |
配置(appsettings.json 的 LuBanAgent 节):
"ApiRetry": {
"Enabled": true,
"MaxAttempts": 3,
"BaseDelayMs": 1000,
"BackoffFactor": 2,
"MaxDelayMs": 30000
}
重试进度回调(由宿主在启动时设置,回调在调用线程执行):
options.Value.OnApiRetry = notice =>
Console.WriteLine($"{notice.Category} 将在 {notice.Delay.TotalSeconds:F0}s 后重试(第 {notice.Attempt} 次)");
说明:
- 流式调用仅在首个 token 产出前重试;已产出内容后中断不会重试,避免内容重复。
- 容错中间件包裹在
FunctionInvokingChatClient之内,每个工具轮次的 API 调用独立重试。 - OpenAI SDK 的内置重试(
ClientRetryPolicy.Default,默认再重试 3 次)已在宿主侧禁用,重试次数与进度提示以本配置为准。 - 编排规划期的可识别 API 故障不再静默降级为常规对话,而是按分类结果透出。
- 会话摘要压缩失败会降级为「跳过压缩」继续对话,不再打断主对话。
11. 工具确认与终止语义
- 拒绝即终止:用户在工具确认中选择「拒绝」时,宿主立即终止当前对话回合(保留已输出内容)。CLI 与 Codex 均显示「已拒绝,本轮终止」;CLI 被拒工具块显示「已被用户拒绝」,Codex 确认卡显示「已拒绝」、工具卡显示框架中性结果「工具调用被拒绝或已取消」。
- 等待无限期:工具确认与工作区授权均无限期等待用户响应,无超时兜底;Esc 可随时取消本轮(CLI 显示「任务已取消」,Codex 显示「已取消」)。
- 子代理代确认:编排子代理不会向用户弹确认;其工具调用在需要人工确认时,由主代码按「本轮已允许集合」代判——命中放行,否则返回子代理专用拒绝结果(不代表用户拒绝)。
- 本轮允许集合:
ToolConfirmationContext.AllowedThisTurn不再公开;宿主使用AllowThisTurn(toolName)写入、框架使用IsAllowedThisTurn(toolName)读取。 - 子代理等待无限期:
Orchestration.DefaultNodeTimeoutSeconds与ReflectionTimeoutSeconds默认 0(无限期);显式配置大于 0 时才限时,节点仍可用TimeoutSeconds单独覆盖。 - 规划不再「长时间无响应」:
Orchestration.PlannerReasoningEffort控制规划/反思调用的推理强度,推理模型(如 glm-5)默认开思考时会在规划阶段输出大量 reasoning 内容,单次规划耗时可达 1 分钟以上;建议设为"none"关闭(默认null表示不传递该参数,兼容不支持reasoning_effort的非推理模型)。
支持的 AI Provider
| Provider | 显示名称 | 支持的模型 |
|---|---|---|
| openai | OpenAI | gpt-4.1, gpt-4o, gpt-4-turbo, o1, o3-mini 等 |
| azure | Azure OpenAI | gpt-4o, gpt-4-turbo, gpt-35-turbo 等 |
| deepseek | DeepSeek | deepseek-chat, deepseek-coder, deepseek-reasoner |
| kimi | Kimi | k3, k3-256k, kimi-for-coding, kimi-for-coding-highspeed |
| glm | 智谱 GLM | glm-4-plus, glm-4-air, glm-4-flash 等 |
| qwen | 通义千问 | qwen-turbo, qwen-plus, qwen-max 等 |
| doubao | 豆包 | doubao-pro-4k, doubao-pro-32k, doubao-lite-4k 等 |
| claude | Claude | claude-3-5-sonnet, claude-3-5-haiku, claude-3-opus 等 |
| gemini | Google Gemini | gemini-2.0-flash, gemini-1.5-pro, gemini-1.5-flash 等 |
| ollama | Ollama (本地) | llama3.1, llama3.2, qwen2.5, deepseek-coder-v2 等 |
| ernie | 百度文心一言 | ernie-4.0-turbo-8k, ernie-4.0-8k 等 |
| minimax | MiniMax | abab6.5s-chat, abab6.5-chat 等 |
| hunyuan | 腾讯混元 | hunyuan-pro, hunyuan-standard 等 |
| mimo | 小米 MiMo | mimo-v1, mimo-v1-32k 等 |
| xai | xAI Grok | grok-2, grok-2-mini, grok-beta |
| qianfan | 百度智能云千帆 | ernie-4.0-8k, ernie-speed-128k 等 |
| tencent-ti | 腾讯云 TI 平台 | hunyuan-pro, hunyuan-standard 等 |
| huawei-pangu | 华为云盘古 | pangu-7b, pangu-13b, pangu-52b |
| bedrock | AWS Bedrock | anthropic.claude-3-sonnet 等 |
| openrouter | OpenRouter | openai/gpt-4o, anthropic/claude-3.5-sonnet 等 |
项目结构
LuBan.AIAgent/
├── Abstractions/
│ ├── ILuBanToolPlugin.cs # 工具插件接口
│ ├── ToolPluginRegistry.cs # 插件注册表
│ ├── ToolConfirmationService.cs # 工具执行确认服务
│ ├── ToolAttribute.cs # 工具标注特性
│ ├── ToolResult.cs # 工具结果
│ └── IIdentifiable.cs # 可标识组件接口
├── Configuration/
│ ├── IAppConfigReader.cs # 应用配置只读接口
│ ├── IProviderRouter.cs # Provider 路由接口
│ ├── CustomSkillConfig.cs # 自定义 Skill 配置
│ ├── CustomRuleConfig.cs # 自定义规则配置
│ ├── McpServerConfig.cs # 外部 MCP 服务器配置
│ ├── LuBanAgentOptions.cs # Agent 配置选项
│ ├── BrowserToolOptions.cs # 浏览器工具选项
│ ├── FileSystemToolOptions.cs # 文件系统工具选项
│ ├── ScriptToolOptions.cs # 脚本工具选项
│ ├── WebToolOptions.cs # Web 工具选项
│ ├── RetrievalToolOptions.cs # 检索工具选项
│ ├── LocalMemoryOptions.cs # 本地记忆选项
│ ├── ModelEndpointOptions.cs # 模型端点选项
│ ├── OrchestrationOptions.cs # 编排选项
│ ├── WikiToolOptions.cs # Wiki 工具选项
│ └── ToolGroupOptions.cs # 工具组配置
├── Infrastructure/
│ ├── PlaywrightSession.cs # Playwright 会话管理
│ ├── ProcessRunner.cs # 进程执行器
│ ├── LuaScriptRunner.cs # 内嵌 MoonSharp Lua 沙箱执行器
│ ├── ShellEnvironmentDetector.cs # Shell 运行环境探测与命令构造
│ └── PathGuard.cs # 路径安全守卫
├── Tools/
│ ├── Browser/BrowserToolPlugin.cs # 浏览器工具
│ ├── FileSystem/FileSystemToolPlugin.cs # 文件系统工具
│ ├── Script/ScriptToolPlugin.cs # 脚本执行工具
│ ├── Web/WebToolPlugin.cs # Web 工具
│ ├── Context/
│ │ └── CompactContextToolPlugin.cs # 上下文压缩工具
│ ├── LocalMemory/LocalMemoryToolPlugin.cs # 本地记忆工具
│ ├── Retrieval/RetrievalToolPlugin.cs # 语义检索工具
│ ├── Wiki/ # LLM Wiki 知识库工具
│ │ ├── WikiToolPlugin.cs # wiki 工具插件(opt-in)
│ │ └── WikiToolGroup.cs # wiki 工具实现
│ └── Orchestration/ # 编排工具
│ ├── OrchestrationToolPlugin.cs # 编排工具插件
│ └── OrchestrationToolGroup.cs # 编排工具组
├── Skills/
│ ├── ISkill.cs # Skill 接口(含 PromptTemplate)
│ ├── SkillBase.cs # Skill 基类
│ ├── SkillRegistry.cs # Skill 注册表(合并多来源)
│ ├── SkillLoader.cs # SKILL.md 文件加载器
│ ├── SkillMdParser.cs # SKILL.md 解析器
│ ├── FileSkill.cs # 文件级 Skill 适配器
│ ├── CustomSkill.cs # 自定义 Skill 适配器
│ └── BuiltIn/
│ ├── BrainstormingSkill.cs # 头脑风暴
│ ├── CodeReviewSkill.cs # 代码审查
│ ├── DocumentationSkill.cs # 文档生成
│ ├── CodeRefactorSkill.cs # 代码重构
│ ├── TestGenerationSkill.cs # 测试生成
│ ├── CodeExplainSkill.cs # 代码解释
│ ├── DebugAssistantSkill.cs # 调试助手
│ ├── GitCommitSkill.cs # Git 提交
│ └── FindSkillsSkill.cs # 技能发现
├── Rules/
│ ├── IRule.cs # 规则接口
│ ├── RuleBase.cs # 规则基类
│ ├── RuleEngine.cs # 规则引擎
│ ├── RuleCheckedAIFunction.cs # 规则检查装饰器
│ ├── CustomRule.cs # 自定义规则适配器
│ └── BuiltIn/
│ └── PathAccessRule.cs # 路径访问规则
├── MCP/
│ ├── IMCPClient.cs # MCP 客户端接口
│ ├── StdioMCPClient.cs # stdio JSON-RPC 客户端
│ ├── MCPRegistry.cs # MCP 注册表
│ ├── MCPToolPlugin.cs # MCP 工具插件
│ └── BuiltIn/
│ └── FileSystemMCPClient.cs # 文件系统 MCP 客户端
├── Attachments/
│ ├── IAttachmentProcessor.cs # 附件处理器接口
│ ├── DefaultAttachmentProcessor.cs # 默认实现(图片/文本)
│ ├── AttachmentInfo.cs # 附件元数据
│ ├── AttachmentKind.cs # 附件类型枚举
│ ├── ProcessedAttachment.cs # 处理结果
│ └── AttachmentMessageBuilder.cs # 附件 → ChatMessage 装配
├── Sessions/
│ ├── ISessionManager.cs # 会话管理接口
│ ├── AttachmentRecord.cs # 附件持久化记录
│ └── SessionChatHistoryProvider.cs # 会话历史提供者
├── Retrieval/
│ ├── IRetrievalService.cs # 语义检索接口
│ ├── RetrievalService.cs # 检索服务实现
│ ├── IndexProgress.cs # 索引进度模型(阶段/已完成/总数/当前文件)
│ └── Chunkers/ # 代码切块器
├── Wiki/ # LLM Wiki 知识库服务
│ ├── IWikiService.cs # wiki 服务接口
│ ├── IWikiContext.cs # 工作区上下文接口
│ ├── WikiService.cs # wiki 服务实现(index/log/索引维护)
│ ├── WikiDefaults.cs # 默认 schema 文案
│ ├── WikiFrontmatter.cs # YAML frontmatter 解析/渲染
│ ├── WikiPageSerializer.cs # 页面序列化
│ ├── WikiSlug.cs # 文件名 slug 生成
│ ├── Models.cs # 页面/索引/lint 模型
│ └── Extractors/ # 源文件提取器(txt/md/json/csv/xml/html/xlsx)
├── Utils/Text/
│ ├── TextUtils.cs # 文本处理工具
│ ├── NGramExtractor.cs # N-Gram 提取器
│ └── WildcardMatcher.cs # 通配符匹配
├── LocalMemory/
│ ├── ILocalMemoryService.cs # 本地记忆服务接口
│ ├── ILocalMemoryStore.cs # 本地记忆存储接口
│ ├── IWorkspaceContextProvider.cs # 工作区上下文提供者接口
│ ├── LocalMemoryService.cs # 本地记忆服务
│ ├── MemoryCategories.cs # 记忆分类
│ └── MemoryEntry.cs # 记忆条目模型
├── Orchestration/ # 多 Agent 编排子系统
│ ├── IOrchestrator.cs # 编排器接口
│ ├── Orchestrator.cs # 编排器默认实现
│ ├── DagScheduler.cs # DAG 调度器(拓扑分层并行)
│ ├── SubAgentFactory.cs # SubAgent 工厂
│ ├── SubAgentRoleRegistry.cs # SubAgent 角色注册表
│ ├── ContextStore.cs # 跨节点上下文存储
│ ├── Models/ # 数据模型
│ │ ├── TaskGraph.cs # 任务图谱
│ │ ├── TaskNode.cs # 任务节点
│ │ ├── TaskNodeStatus.cs # 节点状态枚举
│ │ ├── SubAgentSpec.cs # SubAgent 规格
│ │ ├── SubAgentRole.cs # SubAgent 角色定义
│ │ ├── NodeResult.cs # 节点结果
│ │ ├── OrchestrationResult.cs # 编排结果
│ │ ├── OrchestrationProgress.cs # 进度事件
│ │ ├── ProgressEventType.cs # 进度事件类型
│ │ └── ReflectionResult.cs # 反思结果与重规划上下文
│ ├── Planner/ # 任务规划器
│ │ ├── ITaskPlanner.cs # 规划器接口
│ │ └── LlmTaskPlanner.cs # LLM 规划器
│ ├── GraphPlanStore.cs # 任务图谱暂存
│ ├── IOrchestrationProgressSink.cs # 编排进度出口
│ └── Exceptions/ # 异常定义
│ ├── TaskPlanningException.cs # 规划异常
│ └── NodeExecutionException.cs # 节点执行异常
├── LuBanAgent.cs # Agent 实例
├── LuBanAgentFactory.cs # Agent 工厂
├── LuBanAgentExtensions.cs # DI 扩展方法
├── SanitizingChatClient.cs # 聊天客户端消毒器
├── AIFunctionFactoryHelper.cs # AI 函数工厂辅助类
└── ILuBanAgentFactory.cs # Agent 工厂接口
小贴士
- 模型路由使用
provider:model格式,新增 Provider 只需通过IAppConfigReader/ 宿主实现添加 - 10 大内置工具组覆盖浏览器自动化、文件操作、脚本执行、Web 请求、语义检索、上下文压缩、本地记忆、MCP、多 Agent 编排、LLM Wiki 知识库(opt-in)
ToolConfirmationService对写入、删除、执行等危险操作自动要求用户确认FileSystemToolOptions.AllowedRoots限制文件访问范围,防止 Agent 越权操作- 会话历史自动持久化,支持长对话压缩(SummarizingChatReducer),上下文永不丢失;启动对话时显示最近历史,快速了解上下文
- 自定义 Skill/Rule/MCP 持久化,配置保存到本地文件,重启后自动加载
- 文件化 Skill:支持通过 SKILL.md 文件定义 Skill,兼容 OpenCode 格式,项目级/用户级目录自动加载
- 规则拦截在工具执行前自动检查,支持 deny/allow/modify
- MCP 工具集成,外部 MCP 服务器工具自动暴露给 Agent
- 通过
ExternalPlugins配置可热加载外部工具插件程序集 - 结合 LuBan.AIFlow 可对接 RagFlow / Dify / Coze 等 AI 平台
- 多 Agent 编排:复合任务自动拆解为 DAG,SubAgent 串行/并行混合执行,支持关键节点失败跳过、超时控制、上下文传递
- 附件支持:
IAttachmentProcessor统一处理图片与文本文件;图片本地缩放后以 base64DataContent发送,大文本仅注入路径指引;会话仅持久化路径与元数据
许可证
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- LuBan.Common (>= 2026.10.9.1)
- LuBan.DI (>= 2026.10.9.1)
- LuBan.Threading (>= 2026.10.9.1)
- Microsoft.Agents.AI.Foundry (>= 1.5.0)
- Microsoft.Extensions.AI (>= 10.10.0)
- Microsoft.Extensions.AI.OpenAI (>= 10.10.1)
- Microsoft.Playwright (>= 1.63.0)
- MiniExcel (>= 1.46.0)
- MoonSharp (>= 2.0.0)
- SixLabors.ImageSharp (>= 4.1.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2026.10.9.1 | 29 | 10/9/2026 |
| 2026.10.8.1 | 38 | 10/8/2026 |
| 2026.9.22.1 | 106 | 9/22/2026 |
| 2026.9.21.1 | 107 | 9/21/2026 |
| 2026.9.20.1 | 110 | 9/20/2026 |
| 2026.9.18.1 | 100 | 9/18/2026 |
| 2026.9.16.1 | 112 | 9/16/2026 |
| 2026.9.11.1 | 117 | 9/11/2026 |
| 2026.9.10.2 | 111 | 9/10/2026 |
| 2026.9.10.1 | 112 | 9/10/2026 |
| 2026.9.8.2 | 119 | 9/8/2026 |
| 2026.9.8.1 | 122 | 9/8/2026 |
| 2026.9.7.1 | 117 | 9/7/2026 |
| 2026.9.4.2 | 115 | 9/4/2026 |
| 2026.9.4.1 | 121 | 9/4/2026 |
| 2026.9.3.2 | 108 | 9/3/2026 |
| 2026.9.3.1 | 105 | 9/3/2026 |
| 2026.9.2.2 | 113 | 9/2/2026 |
| 2026.9.2.1 | 126 | 9/2/2026 |
| 2026.8.271 | 122 | 8/27/2026 |