BlogAgent 是一个基于 Microsoft Agent Framework 构建的智能博客生成系统,通过多个专业 AI Agent 协作完成从资料收集、博客撰写到质量审查的全流程自动化。系统采用 Blazor Server 架构,提供现代化的 Web 界面,支持全自动和分步两种工作模式。
- 🤖 多Agent协作: 三个专业 Agent (研究员、作家、审查员) 分工协作
- 🔄 智能工作流: 基于 Agent Framework Workflow 的声明式编排
- 🎨 现代化界面: 基于 Ant Design Blazor 的美观 UI
- 📊 实时进度: 支持工作流执行进度实时反馈
- 🔌 MCP协议: 支持 Model Context Protocol 扩展外部工具
- 💾 持久化存储: SQLite 数据库存储任务和内容
- 🌐 内容抓取: 自动从 URL 和文件中提取参考资料
- ✅ 智能提取和整理参考资料
- ✅ 生成结构化摘要 (JSON格式)
- ✅ 支持多种输入源:
- 直接文本输入
- 文档上传 (txt, md, doc, docx, pdf)
- URL链接抓取
- ✅ 自定义工具函数 (字数统计、代码块提取)
- ✅ 基于资料生成高质量技术博客
- ✅ 支持自定义写作风格和目标读者
- ✅ Markdown格式输出
- ✅ 可控制目标字数 (500-10000字)
- ✅ 多维度质量评估:
- 准确性 (40分): 技术内容准确性
- 逻辑性 (30分): 文章结构和逻辑
- 原创性 (20分): 内容创新性
- 规范性 (10分): 格式和排版
- ✅ 详细问题分析和改进建议
- ✅ 综合评分和发布建议
一键完成资料收集 → 博客撰写 → 质量审查全流程,无需人工干预。
每个阶段手动触发,可随时查看和调整中间结果。
- 🔧 MCP工具配置: 动态加载和管理外部工具
- 📈 统计看板: 任务总数、发布数、平均评分、通过率
- 📝 内容编辑: 支持对生成内容进行二次编辑
- 💾 导出功能: 支持导出为 Markdown 文件
- 🔍 详细日志: 完整的执行日志和错误追踪
| 类别 | 技术 | 版本 |
|---|---|---|
| 框架 | .NET | 9.0 |
| UI | Blazor Server | 9.0 |
| 组件库 | Ant Design Blazor | 1.4.0+ |
| AI框架 | Microsoft Agent Framework | 1.0.0-preview |
| AI扩展 | Microsoft.Extensions.AI | 9.10.1-preview |
| 数据库 | SQLite (SqlSugar ORM) | 5.1.4+ |
| 协议 | Model Context Protocol | 0.4.0-preview |
| 文档解析 | PdfPig, DocumentFormat.OpenXml | - |
| Markdown | Markdig | 0.37.0 |
| 日志 | Serilog | 4.1.0+ |
| 重试策略 | Polly | 8.5.2 |
┌─────────────────────────────────────────────────────────────┐
│ Blazor Server UI │
│ (Ant Design Blazor Components + Real-time Updates) │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Business Services Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ BlogService │ │ WebContent │ │ FileContent │ │
│ │ │ │ Service │ │ Service │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Agent Framework Workflow Layer │
│ ┌──────────────────────────────────────────────────┐ │
│ │ BlogAgentWorkflowService │ │
│ │ (AgentWorkflowBuilder + InProcessExecution) │ │
│ └──────┬───────────────────────────────────────────┘ │
│ │ │
│ ┌──────▼────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Researcher │─▶│ Writer │─▶│ Reviewer │ │
│ │ Agent │ │ Agent │ │ Agent │ │
│ │ (Research) │ │ (Write) │ │ (Review) │ │
│ └───────────────┘ └──────────┘ └──────────────┘ │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ Microsoft.Extensions.AI │
│ (IChatClient Abstraction) │
└────────────────────────┬────────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────────┐
│ OpenAI ChatClient │
│ (Compatible with OpenAI/Azure OpenAI/etc) │
└─────────────────────────────────────────────────────────────┘
- .NET 9.0 SDK
- Git
- OpenAI API Key (或兼容的API服务)
git clone https://github.com/xuzeyu91/BlogAgent.git
cd BlogAgent编辑 BlogAgent/appsettings.json:
{
"OpenAI": {
"Key": "your-api-key-here",
"EndPoint": "https://api.antsk.cn/v1",
"ChatModel": "gpt-41",
"EmbeddingModel": "text-embedding-ada-002"
}
}💡 提示: 也支持其他兼容 OpenAI API 的服务
dotnet restoredotnet buildcd BlogAgent
dotnet run应用将在 http://localhost:5000 启动。
# Dockerfile 示例
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["BlogAgent/BlogAgent.csproj", "BlogAgent/"]
COPY ["BlogAgent.Domain/BlogAgent.Domain.csproj", "BlogAgent.Domain/"]
RUN dotnet restore "BlogAgent/BlogAgent.csproj"
COPY . .
WORKDIR "/src/BlogAgent"
RUN dotnet build "BlogAgent.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "BlogAgent.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BlogAgent.dll"]构建和运行:
docker build -t blogagent .
docker run -d -p 5000:80 -e OpenAI__Key=your-key blogagent- 访问
http://localhost:5000/blog/create - 填写博客主题 (必填)
- 选择工作流模式:
- 全自动模式: 一键完成全流程
- 分步模式: 手动控制每个阶段
- 选择输入方式:
- 直接输入文本: 粘贴参考资料
- 上传文档: 支持 txt, md, doc, docx, pdf
- 提供URL: 自动抓取网页内容
- (可选) 设置写作要求:
- 目标字数
- 写作风格
- 目标读者
- 点击 "创建任务并开始"
创建任务后,系统会自动:
- 🔍 资料收集: 整理和分析参考资料
- ✍️ 博客撰写: 生成结构化博客内容
- 📋 质量审查: 多维度评估和打分
- ✅ 自动发布: 达标后自动发布
全程无需人工干预,只需等待完成。
每个阶段手动触发,流程如下:
1. 点击 "执行资料收集阶段"
└─ 查看收集结果
└─ 确认继续 或 重新执行
2. 点击 "执行博客撰写阶段"
└─ 查看博客初稿
└─ 可编辑修改
└─ 确认继续
3. 点击 "执行质量审查阶段"
└─ 查看评分和建议
└─ 决定发布 或 重写
4. 点击 "发布博客"
└─ 保存到数据库
└─ 可导出 Markdown
访问 /blog/list 查看所有任务,支持:
- 按状态筛选
- 查看详情
- 编辑内容
- 删除任务
- 导出Markdown
访问 /blog/detail/{taskId} 查看:
- 任务基本信息
- 资料收集摘要
- 博客完整内容 (Markdown渲染)
- 质量审查报告
- 历史操作记录
访问 /blog/mcp-config 配置外部工具:
- 添加 MCP 工具配置 (JSON)
- 测试连接
- 保存配置
- Agent 自动加载工具
每个 Agent 继承自 BaseAgentService:
public class ResearcherAgent : BaseAgentService
{
protected override string AgentName => "资料收集专家";
protected override string Instructions => "你是一位专业的技术资料研究员...";
protected override AgentType AgentType => AgentType.Researcher;
// 自定义工具
protected override IEnumerable<AITool>? Tools => new[]
{
AIFunctionFactory.Create(CountWordsInText),
AIFunctionFactory.Create(ExtractCodeBlocks)
};
// 结构化输出
protected override ChatResponseFormat? ResponseFormat =>
ChatResponseFormat.ForJsonSchema<ResearchOutput>(schemaName: "ResearchOutput");
}使用 AgentWorkflowBuilder 构建声明式工作流:
// 顺序执行
var workflow = AgentWorkflowBuilder.BuildSequential(
"BlogGenerationWorkflow",
researcherAgent,
writerAgent,
reviewerAgent
);
// 执行工作流
var run = await InProcessExecution.RunAsync(workflow, initialInput);
// 提取输出
var outputEvents = run.OutgoingEvents
.OfType<WorkflowOutputEvent>()
.ToList();Agent 可以调用自定义 C# 函数:
[Description("统计给定文本的字数")]
private static int CountWordsInText(
[Description("要统计的文本内容")] string text)
{
// 中文字符
int chineseCount = text.Count(c => c >= 0x4E00 && c <= 0x9FFF);
// 英文单词
var words = text.Split(new[] { ' ', '\n', '\r', '\t' },
StringSplitOptions.RemoveEmptyEntries);
int englishCount = words.Count(w => w.Any(c => char.IsLetter(c)));
return chineseCount + englishCount;
}使用 JSON Schema 约束 AI 输出格式:
public class ResearchOutput
{
public string TopicAnalysis { get; set; }
public List<KeyPoint> KeyPoints { get; set; }
public List<TechnicalDetail> TechnicalDetails { get; set; }
public List<CodeExample> CodeExamples { get; set; }
public List<string> References { get; set; }
}
// 在 Agent 中配置
protected override ChatResponseFormat? ResponseFormat =>
ChatResponseFormat.ForJsonSchema<ResearchOutput>(
schemaName: "ResearchOutput",
schemaDescription: "研究结果结构"
);欢迎贡献代码、报告问题或提出建议!
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/AmazingFeature - 提交更改:
git commit -m 'Add some AmazingFeature' - 推送到分支:
git push origin feature/AmazingFeature - 提交 Pull Request
- 遵循 C# 编码规范
- 使用有意义的变量和方法名
- 添加必要的注释和文档
- 确保所有测试通过
- 多Agent协作 (Researcher, Writer, Reviewer)
- Agent Framework Workflow 集成
- 全自动和分步两种工作模式
- Web内容抓取和文件内容提取
- MCP协议支持
- 结构化输出 (JSON Schema)
- 自定义工具函数
- 实时进度反馈
- 博客内容二次编辑
- Markdown导出
- 流式输出 (Streaming) - UI实时显示生成过程
- RAG集成 - 从历史博客检索参考
- 可观测性增强 (OpenTelemetry)
- 条件工作流 - 根据评分决定下一步
- 并发工作流 - 多Agent并行执行
- 多Provider支持 (Azure OpenAI, 本地模型)
- Agent评估系统 - 自动评估输出质量
- Prompt自动优化
- 多语言支持
- 云端部署方案
A: 这些警告不影响正常运行,仅在使用 Native AOT 编译时有影响。Blazor Server 应用可以忽略。
A: 在 Workflow.razor 中设置:
private bool useAgentFrameworkWorkflow = false;A: 支持所有兼容 OpenAI API 的服务:
- OpenAI (gpt-4, gpt-4o, gpt-3.5-turbo)
- Azure OpenAI 、Claude等使用new-api等模型网关转发
- 自部署的兼容服务 (如 LocalAI, Ollama)
A: 可以。SqlSugar 支持多种数据库,只需修改配置:
{
"DBConnection": {
"DbType": "MySql",
"ConnectionStrings": "Server=localhost;Database=blogagent;..."
}
}A: 访问 /blog/mcp-config 页面,参考 MCP工具配置文档。
A: 可以尝试:
- 提供更详细的参考资料
- 明确指定写作风格和目标读者
- 使用分步模式,对中间结果进行人工调整
- 调整 Agent 的 Instructions (在对应 Agent 类中)
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
- Microsoft Agent Framework - 强大的 Agent 框架
- Ant Design Blazor - 优秀的 Blazor 组件库
- SqlSugar - 高性能 ORM
- Markdig - Markdown 解析器
- 项目问题: GitHub Issues
- 功能建议: GitHub Discussions
如果这个项目对你有帮助,请给它一个 ⭐️ Star!
Made with ❤️ by BlogAgent Team





