.NET AI 实战篇:基于 Microsoft Agent Framework 集成钉钉机器⼈与云效项⽬管理
.NET AI 实战篇:基于 Microsoft Agent Framework 集成钉钉机器⼈与云效项⽬管理
前言
完整代码已经开源,搜索 Sky.DingTalk.AI 即可找到,欢迎 Star 和交流。
https://github.com/SkyChenSky/Sky.DingTalk.AI
不知道大家有没有类似的经历:业务群里,业务同事跟 QA、产品围绕一个问题来回沟通,几轮下来结论清晰了——这是个 Bug,要排期修;或者这是个新需求,要立项评估。讨论的热乎劲儿刚过,接下来却是谁都不爱干的一步:有人得把这几屏聊天记录消化掉,打开云效(或者Oncs)、选项目、选类型、把讨论提炼成标题和描述、指派负责人……讨论越充分,搬运越痛苦。
我们团队的日常沟通都在钉钉,项目管理的云效,中间隔着一层「手工搬运」。这活儿机械、重复、还容易漏字段。于是我最初的目标很朴素:讨论定论后,在群里 @机器人 说一句话,它就帮我把工作项建好,顺便把��址发回来。 正好最近 Microsoft Agent Framework(Microsoft.Agents.AI)GA 了,配合 .NET 10 一拍即合,这两天把这个 Demo 拉通了。
但做着做着你会发现,「把口语落成结构化工作项」这个环节一旦打通,它就不只是一个省事的建单工具——它是整条 AI 研发流水线的第一个闸口。工作项是研发过程的结构化锚点,它后面还可以挂一整串 Agent:
- Bug 建完只是开始:Agent 根据工作项所属项目拉取代码仓库,让 AI 扫描相关模块,把「疑似出问题的文件、最近的变更记录」贴回工作项描述——开发还没打开 IDE,排查线索已经就位;
- 需求立项即预估:结合历史相似需求做影响面分析,给出改动范围和涉及模块,辅助排期决策;
- 订单(数据)查找:根据同事给的订单号,通过MCP由AI进行整理
用一张图表达这个愿景——本文打通的是第一环,后面的 Agent 都挂在「工作项」这个锚点上:
当信息能够在钉钉、云效、代码库之间自动流动,人就从「搬运工」退回到「决策者」的位置。 这篇文章先把这条流水线的第一环打通:从前期准备、钉钉机器人接入、AI Agent 集成,到云效 API 的封装,最后三者串起来跑通——后面那些宏大叙事,都建立在今天这块地基上。
先看最终效果,在钉钉群里 @机器人:


@云效助手 下单页在 iOS 上白屏了,项目是商城,严重的话帮我建个缺陷,给陈珙
机器人回复:
创建成功,工作项地址:https://devops.aliyun.com/projex/project/xxx/bug/xxxx
是不是有点意思?下面开工。
目的与作用
先明确目标,避免自嗨式开发。这个 Agent 要解决的核心问题是:
把群里口语化的反馈,自动落地成云效里结构化的工作项。
拆开来看,它干了三件事:
- 听懂人话:群消息是口语化的(「白屏了」「帮我建个缺陷」),AI 负责提取出结构化信息——项目名、类型(Bug/需求/任务)、标题、负责人、描述。
- 会干活:AI 不是只会聊天,它通过 Function Calling(工具调用)直接操作云效 API——查项目、查成员、建工作项、查列表。
- 有上下文:同一个群是多轮会话。你没说清是哪个项目时它会追问一句,你补一句「商城」,它就能接着上文的语境继续把工作项建好,而不是每次都从头再来。
整体架构非常朴素:
技术选型三件套:
- Jusoft.DingtalkStream:钉钉官方 Stream 模式的 .NET 社区封装,免去自建 WebSocket 和暴露公网回调地址
- Microsoft.Agents.AI:微软新出的 Agent 框架,
ChatClientAgent+ 工具注册,几行代码就有一个能调工具的 Agent - Sikiro.YunXiao:自己封装的云效 OpenAPI 客户端类库(独立项目,可复用)
前期准备:AI、钉钉、云效的配置获取
这一章没什么技术含量,但不做后面全卡。三家的「钥匙」都要先拿到手。
2.1 AI 接口(DeepSeek 为例)#
Agent 的大脑需要一个 OpenAI 兼容的 Chat Completions 接口,并且必须支持工具调用(Function Calling),这是整个方案的地基。
以 DeepSeek 为例:
- 到开放平台注册并充值,创建一个 API Key(
sk-开头) - 记下三样东西:
ApiKey、Endpoint(https://api.deepseek.com)、Model(如deepseek-chat)
智谱、通义、Kimi 等国产模型都提供 OpenAI 兼容接口,换模型只改配置就行,这也是后面用
Microsoft.Extensions.AI.OpenAI抽象的好处。
2.2 钉钉应用(Stream 模式机器人)#
传统钉钉机器人要走 HTTP 回调,需要有公网地址,内网开发很痛苦。Stream 模式通过 WebSocket 长连接反向连接钉钉服务端,本地就能调试,这也是选 Jusoft.DingtalkStream 的原因。
- 到钉钉开放平台创建一个企业内部应用
- 在「应用能力」里添加「机器人」
- 消息接收模式选择 Stream 模式
- 拿到应用的
ClientId和ClientSecret(应用凭证页面) - 发布应用,在群里把机器人添加进来



2.3 云效(阿里云 Yunxiao)#
云效 Projex 的 OpenAPI 有两种认证方式,这里有个坑,后面封装时会展开:
| 方案 | 凭证 | 网关 | 特点 |
|---|---|---|---|
| 方案一 AK | AccessKeyId / Secret | devops.cn-hangzhou.aliyuncs.com | 阿里云 V2.0 签名,老版 ROA 接口居多 |
| 方案二 PAT | 个人访问令牌 | openapi-rdc.aliyuncs.com | x-yunxiao-token 请求头,无需签名,oapi/v1 新接口 |
个人推荐 PAT 方案:在云效「个人设置 → 个人访问令牌」页面直接生成,不用折腾阿里云主账号 AK,而且新接口(工作项类型、字段定义、极简创建)都在 oapi/v1 下。
还需要记下 OrganizationId(组织 ID):打开云效任意页面,URL 里 organizations/{这串就是}/ 的那段。


2.4 配置外置#
三家的凭证全部放进 appsettings.json,不进源码:
{
"DingTalk": {
"ClientId": "dingxxxxxxxx",
"ClientSecret": "xxxxxxxx"
},
"Ai": {
"ApiKey": "sk-xxxxxxxx",
"Endpoint": "https://api.deepseek.com",
"Model": "deepseek-chat"
},
"Yunxiao": {
"OrganizationId": "xxxxxxxx",
"PersonalAccessToken": "pt-xxxxxxxx"
}
}评论