跳转到正文

AI Genius — 第 5 季第 2 集

🔥 Agent HQ:使用 GitHub Copilot SDK 构建零售分析助手

课程说明

Agent 在聊天窗口中的表现令人印象深刻,但真正的价值体现在将其嵌入团队已经在使用的应用程序中。本课程基于 GitHub Copilot SDK 构建零售交易分析助手:使用 .NET 10 API 通过 SSE 流式传输模型响应,由 Blazor 前端实时呈现,并配备治理基础设施(自定义 Agent、挂钩、审计跟踪和代码扫描),从而能够安全交付。

课程幻灯片

请参阅 docs/ —“三个星期一”的叙事内容位于 Slide1.pngSlide3.png

🧠 学习成果

完成本课程后,你将能够:

  • 将 GitHub Copilot SDK 运行时嵌入 ASP.NET Core 应用程序
  • 通过服务器发送事件(SSE),逐词元将模型响应流式传输到浏览器
  • 在运行时发现可用模型,而不是硬编码可能过时的列表
  • 将企业治理能力(自定义 Agent、挂钩、审计日志和代码扫描)应用于 AI 辅助开发

💬 使用 Copilot 持续学习

尝试使用以下提示词与 GitHub Copilot 交互,探索本课程涉及的主题。在 VS Code 中打开 Copilot Chat(Windows/Linux 使用 Ctrl+Alt+I,Mac 使用 Cmd+Shift+I),粘贴提示词,看看能学到什么。还可以尝试连接 Microsoft Learn MCP Server,获取最新的官方文档。

可以从这些提示词开始,也可以编写自己的提示词!

  • 我可以使用 GitHub Copilot SDK 构建什么?
  • 如何在 ASP.NET Core 中通过服务器发送事件流式传输 Copilot SDK 响应?
  • 如何列出已登录 Copilot 帐户可用的模型?
  • 如何为 Copilot SDK 设置身份验证?
  • 什么是 Copilot 挂钩?如何使用它们强制实施安全门禁?

📚 资源与后续步骤

资源 说明
GitHub Copilot SDK 仓库 适用于所有受支持语言的 SDK
Copilot SDK 入门 构建你的第一个 Copilot 驱动应用
Awesome Copilot 自定义 Agent、指令、技能、挂钩、工作流和插件
GitHub Copilot 文档 官方产品文档

🌟 Microsoft Learn MCP Server

Microsoft Learn MCP Server 可让 AI Agent 直接访问 Microsoft 官方文档,为本课程涉及的产品和服务提供有据可查且最新的答案。

VS Code — 此仓库已包含 .vscode/mcp.json,因此打开该文件夹时,服务器即已配置完毕。

GitHub Copilot CLI — 运行以下命令,将 Learn MCP Server 安装为插件:

/plugin install microsoftdocs/mcp

如需了解更多信息、查看其他客户端或提交问题,请访问 Learn MCP Server 仓库


✨ 此演示展示的内容

功能 你将看到的内容
多模型 AI 聊天 从 Copilot CLI 实时获取模型列表,始终保持最新
零售分析领域 交易数据、客户细分和细分预测
实时流式传输 逐词元 SSE 响应与批量渲染
企业治理 审计跟踪、策略挂钩、安全门禁和代码扫描

🛠️ 技术栈

同一应用提供两种实现,请选择你偏好的语言。两条学习路径讲授相同的 SDK 概念,并公开完全一致的 HTTP 契约。

组件 .NET 路径 Python 路径
运行时 .NET 10 LTS Python 3.11+ (uv)
AI SDK GitHub Copilot SDK v1.0.9 github-copilot-sdk v1.0.9
后端 ASP.NET Core Web API FastAPI
前端 Blazor WebAssembly 静态 HTML + 原生 JS
数据库 SQLite + EF Core SQLite + SQLModel
模型数据访问 MCP (ModelContextProtocol) MCP (mcp)
测试 xUnit (26) pytest (30)
代码检查 Roslyn 分析器 Ruff
端口 5050 API / 5051 UI 5070 (API + UI)
共享项 技术
CI/CD GitHub Actions
安全 CodeQL、自定义 Agent

🚀 快速开始

先决条件

运行项目 — .NET

dotnet restore src/AgentOrchestrator/AgentHQDemo.slnx
dotnet build   src/AgentOrchestrator/AgentHQDemo.slnx

# Terminal 1 — API (SQLite DB auto-created and seeded on first run)
dotnet run --project src/AgentOrchestrator/AgentHQDemo.Api --urls "http://localhost:5050"

# Terminal 2 — Blazor UI
dotnet run --project src/AgentOrchestrator/AgentHQDemo.Web --urls "http://localhost:5051"

然后打开 http://localhost:5051。API 在 5050 端口运行。

运行项目 — Python

cd src/AgentOrchestrator-python
uv sync

# One server for both the API and the UI
uv run uvicorn app.main:app --port 5070

然后打开 http://localhost:5070

两套技术栈特意使用不同端口,因此可以同时运行。

GitHub Codespaces

  1. 单击 Code在 main 分支上创建 codespace
  2. 等待环境设置完成(约 2 分钟)
  3. 运行你所选学习路径对应的命令

Copilot CLI 二进制文件

Copilot SDK 会在构建期间从 registry.npmjs.org 下载匹配的 CLI 二进制文件。如果该注册表不可访问(例如使用企业代理或计算机处于脱机状态),构建将失败并显示 MSB3923Directory.Build.props 会在检测到全局安装的 Copilot CLI 时复用它,从而规避此问题:

npm install -g @github/copilot

如有需要,可覆盖或禁用此检测:

dotnet build -p:CopilotCliBinaryPath=/path/to/copilot   # use a specific binary
dotnet build -p:CopilotUseLocalCli=false                # always download

📡 API 端点

端点 方法 说明
/api/chat/stream POST 流式聊天(SSE)
/api/chat/models GET 可用 AI 模型(从 Copilot CLI 实时获取)
/api/chat/health GET 运行状况检查
/api/transactions GET/POST 列出或添加交易
/api/transactions/{id} GET/DELETE 按 ID 获取交易
/api/segments GET 客户细分
/api/segments/{id} GET 细分详情
/api/segments/predict/{customerId} GET 预测客户细分

调用示例

# Stream a chat response
curl -N -X POST http://localhost:5050/api/chat/stream \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Which segment has the lowest retention?", "model": "claude-haiku-4.5"}'

# List transactions (10 seed records)
curl http://localhost:5050/api/transactions

# Predict customer segment
curl http://localhost:5050/api/segments/predict/C003
# → {"customerId":"C003","predictedSegment":"High Value","confidence":0.89,...}

🎯 可用模型

模型选择器在运行时通过 GET /api/chat/models 填充;该端点会询问 Copilot CLI,确定已登录帐户实际可用的模型。具体列表因帐户而异,并会随时间变化;示例包括 claude-haiku-4.5(默认)、autoclaude-sonnet-*claude-opus-*gpt-5.*gemini-*

如果 API 无法访问 Copilot CLI,API 和界面都会回退到一个精简的静态目录,以确保演示仍能正常呈现。

🏗️ 架构

graph TB
    subgraph "Frontend — Port 5051"
        UI[Blazor WebAssembly<br/>Batched Rendering]
    end

    subgraph "Backend — Port 5050"
        API[ASP.NET Core API]
        Chat[ChatController<br/>SSE Streaming]
        Txn[TransactionsController]
        Seg[SegmentsController]
        SDK[Copilot SDK<br/>Connection Recovery]
        SVC[RetailAnalyticsService]
        DB[(SQLite<br/>Auto-seeded)]
    end

    UI -->|SSE Stream| Chat
    UI -->|REST| Txn
    UI -->|REST| Seg
    Chat --> SDK
    Txn --> SVC
    Seg --> SVC
    SVC --> DB
    SDK --> Models[Claude / GPT / Gemini]

📂 项目结构

.
├── .devcontainer/              # Codespaces configuration
├── .github/
│   ├── agents/                 # Custom Copilot agents
│   ├── hooks/                  # Governance + audit hooks
│   ├── prompts/                # Reusable prompts
│   ├── skills/                 # Copilot skills
│   ├── workflows/              # CI, CodeQL, setup
│   ├── copilot-instructions.md # Coding standards for all agents
│   └── copilot-review-instructions.md
├── .vscode/mcp.json            # MS Learn MCP server
├── docs/                       # Labs, walkthroughs, and reference material
├── img/                        # Session branding
├── src/
│   ├── AgentOrchestrator/          # .NET implementation
│   │   ├── AgentHQDemo.Api/        # Web API — chat, transactions, segments
│   │   ├── AgentHQDemo.McpServer/  # Read-only MCP server over retail.db
│   │   ├── AgentHQDemo.Web/        # Blazor WebAssembly UI
│   │   ├── samples/SdkLabs/        # Runnable lab samples
│   │   ├── tests/                  # xUnit tests (26)
│   │   └── AgentHQDemo.slnx        # Solution
│   └── AgentOrchestrator-python/   # Python implementation
│       ├── app/                    # FastAPI — routers, services, models, UI
│       ├── mcp_server/             # Read-only MCP server over retail.db
│       ├── sdk_labs/               # Runnable lab samples
│       ├── tests/                  # pytest tests (30)
│       └── pyproject.toml          # uv project
├── AGENTS.md                   # Guidelines for AI agents
└── Directory.Build.props       # Copilot CLI resolution

🗄️ 种子数据

首次启动时会自动创建 SQLite 数据库,其中包含 10 条交易,涵盖 5 位客户(C001–C005)、4 个类别和 4 家门店,此外还包括:

细分 客户数 平均消费额 留存率
高价值 150 $850 92%
常规 3,200 $180 78%
有流失风险 890 $95 45%
新客户 420 $120 65%

🤖 自定义 Agent

Agent 用途 专长
dotnet-reviewer .NET 代码审查 安全性、性能和最佳实践
security-scanner 漏洞检测 OWASP 十大风险、注入风险
pr-summary PR 文档 上下文感知说明

📋 演示材料

完整文档位于 docs/,并按学习路径分组:

学习路径 实验 演示
.NET 七个 Copilot SDK 实验(约 2 小时)— 从 实验 01 代码导览,介绍 src/AgentOrchestrator/ 中的代码
Python 相同的七个实验 — 从 实验 01 代码导览,介绍 src/AgentOrchestrator-python/ 中的代码

请选择 一条 学习路径,而不是两条都做;它们讲授相同的内容。

不属于任一语言路径的内容均位于 专题

分组 内容
参考资料 架构自定义 Agent挂钩技能故障排除
扩展实践 两条路径共享的 Copilot CLI 实验 — 自定义 Agent治理挂钩

🔐 安全说明

此演示 有意 包含存在缺陷的代码模式,以便在代码审查和静态分析演示期间现场发现这些问题:

缺陷 .NET Python
N+1 查询(性能审查) GetTransactionsWithSegmentsAsync get_transactions_with_segments
缺少 null 检查(静态分析) GetTransactionAsync get_transaction
缺少输入验证(安全审查) AddTransactionAsync add_transaction
硬编码阈值(代码异味) PredictSegmentAsync predict_segment

两种实现都包含相同的四项缺陷,因此同一份答案适用于任一学习路径。

相比之下,聊天功能的数据库访问 并不是 上述缺陷之一。两条路径都通过只读 MCP 服务器向模型公开 retail.dbAgentHQDemo.McpServer / mcp_server/),该服务器使用 Mode=ReadOnly 打开 SQLite,并发布五个特定领域工具,而不是通用查询工具。REST API 仍保留直接 ORM 访问权限;MCP 面向模型,并非用于应用程序访问自己的数据库。

解决这些问题之前,请勿用于生产环境。 请参阅 SECURITY.md

CodeQL 说明: 仓库为私有仓库时会跳过分析,因为代码扫描需要 GitHub Advanced Security。如果仓库转为公开,分析会自动运行;也可以设置仓库变量 ENABLE_CODEQL=true

🤝 参与贡献

请参阅 AGENTS.md 了解仓库指南, CODE_OF_CONDUCT.md 了解社区规范,以及 SUPPORT.md 了解如何获取帮助。

📄 许可证


使用 GitHub Copilot SDK 以 ❤️ 构建