TEN Framework 集成钉钉群机器人:dingtalk_bot_tool_python 扩展的配置与 LLM 工具化实战指南
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载本文围绕 TEN Framework 仓库内的 dingtalk_bot_tool_python 扩展 展开讲解如何将钉钉DingTalk群机器人封装为可被 LLM 调用的工具扩展让语音/文本 AI Agent 在对话中自动触发钉钉群消息通知。读完本文你将掌握该扩展的完整配置流程、在voice-assistant示例中的三步集成方法以及其底层基于 HMAC-SHA256 加签与异步工具注册的实现原理。扩展概述dingtalk_bot_tool_python是一个面向 TEN Framework 的 Python 扩展核心能力是让 AI Agent 通过钉钉群自定义机器人 Webhook 向群聊推送文本消息。它不是一个独立的 HTTP 服务而是以LLM 可调用工具LLM Tool的身份注册进 Agent 的工具列表——当用户对话中出现需要通知团队成员的场景时LLM 会自动决策并调用该工具完成消息发送。该扩展的特性包括LLM 工具集成作为 LLM-callable tool支持智能消息发送消息推送向钉钉群聊发送文本消息msgtype: text安全认证支持钉钉机器人的access_token与加签HMAC-SHA256双重校验异步处理基于AsyncLLMToolBaseExtension异步架构非阻塞操作详细日志完整日志输出便于调试与监控。系统要求根据扩展的 manifest.json 与 README运行该扩展需要满足依赖版本要求说明Python 3.8扩展运行语言环境TEN Runtime Python 0.11扩展运行依赖的 TEN 运行时manifest 中声明为ten_runtime_python0.11TEN AI Base 0.7LLM 工具基类与类型定义ten_ai_base0.7钉钉群机器人有效的 Webhook需要已在钉钉群中添加自定义机器人扩展对外部 Python 依赖非常轻量requirements.txt 中仅有requestsrequests用于向钉钉开放平台 API 发送 HTTP POST 请求。安装依赖pip install -r requirements.txt配置扩展获取钉钉机器人凭证在开始配置前需要先完成钉钉侧的准备在钉钉群中添加一个自定义机器人选择「自定义」机器人类型配置安全设置官方建议同时启用「自定义关键词」和「加签」两种方式本扩展原生支持其中的加签校验从机器人 Webhook 地址中提取access_token即https://oapi.dingtalk.com/robot/send?access_tokenxxx中的xxx部分若启用了加签还需获取机器人的secret密钥。配置文件设置编辑扩展包内的 property.json{ access_token: your_dingtalk_access_token_here, secret: your_dingtalk_secret_here }扩展在启动时通过DingTalkBotConfig.create_async(ten_envten_env)加载该配置字段定义位于 extension.pydataclass class DingTalkBotConfig(BaseConfig): Configuration for DingTalk Bot extension access_token: str secret: str 安全提示⚠️ 不要将包含真实凭证的property.json提交到版本控制系统建议使用环境变量或密钥管理服务存储敏感信息。仓库示例中其他扩展普遍采用${env:VAR_NAME}语法注入环境变量如voice-assistant的property.json中api_key: ${env:WEATHERAPI_API_KEY|}可参照该模式管理钉钉凭证。环境变量可选README 提供了环境变量方式作为备选配置入口export DINGTALK_ACCESS_TOKENyour_access_token export DINGTALK_SECRETyour_secret在 voice-assistant 示例中集成钉钉扩展仓库中的 voice-assistant 示例 是一个完整的语音 Agent 应用其main_controlmain_python扩展负责接收各工具扩展通过tool_register命令注册的 LLM 工具。以下三步完成钉钉扩展的接入。说明本文所有路径均以仓库根目录为基准示例应用的实际配置文件位于 ai_agents/agents/examples/voice-assistant/tenapp/manifest.json 与 ai_agents/agents/examples/voice-assistant/tenapp/property.json。步骤 1添加扩展依赖编辑manifest.json在dependencies数组中追加钉钉扩展的本地路径依赖{ dependencies: [ // ... 其他依赖 ... { path: ../../../ten_packages/extension/dingtalk_bot_tool_python } ] }参考位置当前示例的 manifest.json 中weatherapi_tool_python依赖位于约第 157 行可在同类扩展依赖之后添加。安装依赖后需运行task install使新依赖生效。步骤 2添加扩展节点编辑property.json在ten.predefined_graphs[].graph.nodes数组中添加钉钉扩展节点。参考现有工具扩展如weatherapi_tool_python节点位于 nodes 数组中的结构{ type: extension, name: dingtalk_bot_tool_python, addon: dingtalk_bot_tool_python, extension_group: default, property: { access_token: your_dingtalk_access_token_here, secret: your_dingtalk_secret_here } }关键字段说明字段取值说明typeextension节点类型namedingtalk_bot_tool_python节点实例名与 addon 保持一致addondingtalk_bot_tool_python对应 addon 注册名见 addon.py 中register_addon_as_extension(dingtalk_bot_tool_python)extension_groupdefault扩展组与同组工具扩展保持一致property.access_tokenstring必填钉钉机器人 access tokenproperty.secretstring必填钉钉机器人加签密钥步骤 3注册工具到主控制器在property.json的connections部分找到main_control的cmd配置在其tool_register命令的source数组中追加钉钉扩展。当前示例的tool_register连接结构如下weatherapi_tool_python已注册在此基础上追加即可{ extension: main_control, cmd: [ { names: [ tool_register ], source: [ { extension: weatherapi_tool_python }, { extension: dingtalk_bot_tool_python } ] } ] }完整配置示例关键片段将以上改动汇总到property.json的predefined_graphs中{ ten: { predefined_graphs: [ { name: voice_assistant, auto_start: true, graph: { nodes: [ // ... 其他节点agora_rtc, stt, llm, tts 等... // 添加钉钉扩展节点 { type: extension, name: dingtalk_bot_tool_python, addon: dingtalk_bot_tool_python, extension_group: default, property: { access_token: your_dingtalk_access_token_here, secret: your_dingtalk_secret_here } } ], connections: [ { extension: main_control, cmd: [ // 注册工具到主控制器 { names: [tool_register], source: [ {extension: weatherapi_tool_python}, {extension: dingtalk_bot_tool_python} ] } ] } // ... 其他连接配置 ... ] } } ] } }必须修改的文件汇总manifest.json添加扩展路径依赖../../../ten_packages/extension/dingtalk_bot_tool_pythonproperty.json两处修改nodes数组添加钉钉扩展节点配置connections中main_control的tool_registersource添加钉钉扩展。使用效果配置完成后当用户对 AI 助手说话并触发需要发送钉钉通知的场景时LLM 会自动调用钉钉扩展发送消息用户: 帮我通知团队今天下午3点开会 AI: 好的我已经向钉钉群发送了会议通知钉钉群内将收到今天下午3点开会验证配置启动 voice-assistant 应用查看日志确认钉钉扩展已加载并完成工具注册[DingTalkBotExtension] on_start BEGIN [DingTalkBotExtension] Config loaded successfully [DingTalkBotExtension] Tool registration result: ...与 AI 对话触发钉钉消息发送场景验证功能。源码级原理剖析扩展生命周期与工具注册扩展核心类DingTalkBotExtension继承自AsyncLLMToolBaseExtension来自ten_ai_base.llm_tool这是其成为 LLM 工具的关键。完整生命周期在 extension.py 中实现on_init记录初始化日志on_start加载配置 → 校验access_token/secret是否设置只打印长度不泄露明文→ 构造工具元数据 → 通过Cmd.create(tool_register)发送注册命令到main_controlon_stop/on_deinit记录停止与销毁日志。工具元数据定义了唯一的工具名与参数TOOL_NAME send_message TOOL_DESCRIPTION Send a message to DingTalk group chat. Use this when user wants to notify team members or send information to DingTalk.on_start中注册给main_control的元数据使用参数数组格式符合LLMToolMetadata定义并将整个元数据以 JSON 形式挂到tool_register命令的tool属性上与 manifest.json 中声明的cmd_out: tool_register接口tool对象含name、description、parameters数组严格对应。工具调用链路当 LLM 决定调用该工具时main_control会向扩展发送tool_call命令对应 manifest 中cmd_in声明的接口name为必填属性on_cmd收到tool_call从命令属性中读取工具名name与argumentsobject 类型当name send_message时调用run_tool执行实际发送逻辑通过Cmd.create(tool_call_result)返回执行结果content属性携带结果文本给调用方LLM 据此向用户播报发送成功或失败其余命令则回退到基类AsyncLLMToolBaseExtension.on_cmd处理。get_tool_metadata方法extension.py同样以LLMToolMetadata结构暴露工具定义参数contentstring必填为要发送的群消息内容。钉钉消息发送与加签实现run_tool内部调用_send_dingtalk_messageextension.py完成真正的 HTTP 推送其实现要点构造 Webhook URLhttps://oapi.dingtalk.com/robot/send?access_token{access_token}加签若配置了 secret按钉钉官方算法计算签名并拼接到 URLtimestamp str(round(time.time() * 1000)) secret_enc secret.encode(utf-8) string_to_sign {}\n{}.format(timestamp, secret) hmac_code hmac.new(secret_enc, string_to_sign.encode(utf-8), digestmodhashlib.sha256).digest() sign urllib.parse.quote_plus(base64.b64encode(hmac_code)) webhook_url f{webhook_url}timestamp{timestamp}sign{sign}发送文本消息requests.post以 JSON 请求体发送timeout10秒请求头为Content-Type: application/json;charsetutf-8data {msgtype: text, text: {content: content}}结果判定以钉钉返回的errcode 0判定成功否则将errcode/errmsg拼接为错误信息返回给 LLM网络层异常则返回{errcode: -1, errmsg: ...}。消息格式与长度约束扩展固定使用钉钉「文本消息」类型msgtype: text。钉钉开放平台对文本消息的 content 长度限制为不超过 5000 字节超长内容建议在调用前由 LLM 或上层逻辑先行截断/摘要。常见问题排查Q配置后扩展没有加载检查manifest.json中的path是否正确相对路径应从示例应用 tenapp 目录指向ten_packages/extension/dingtalk_bot_tool_python确认已运行task install安装依赖查看启动日志中是否出现[DingTalkBotExtension] on_start BEGIN。Q消息发送失败检查access_token和secret是否正确日志会打印其长度以便核对是否为空查看日志中的errcode与errmsg对照钉钉官方错误码文档定位原因常见如 token 失效、加签时间戳偏差、IP 白名单限制确认钉钉机器人的安全设置与代码加签逻辑匹配本扩展实现的是「加签」方式。Q工具未注册到 LLM检查connections中是否正确添加了钉钉扩展到main_control的tool_registersource 列表确认tool_register命令连接配置正确且扩展与main_control处于同一 graph 内可达。小结dingtalk_bot_tool_python以极低的接入成本单一requests依赖为 TEN Framework 的 AI Agent 提供了钉钉群通知能力。通过理解其「异步工具注册 tool_call命令分发 HMAC-SHA256 加签推送」的实现链路开发者可以在voice-assistant等示例基础上快速扩展出会议提醒、告警通知、任务汇报等各类群消息场景并将相同的「LLM Tool 扩展」模式复用到其他 IM 平台如飞书、企业微信的机器人接入中。进一步阅读源码可参考 extension.py、addon.py 与 manifest.json。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN Framework 钉钉机器人扩展集成指南让 AI 助手通过 LLM 工具向钉钉群推送消息TEN Framework 钉钉机器人扩展集成指南让 AI 助手通过 LLM 工具向钉钉群推送消息 本指南围绕 TEN Framework 开源仓库中的 di人工智能AI Agent多模态语音AI 应用Prometheus告警系统与钉钉机器人Webhook集成实战指南Prometheus告警系统与钉钉机器人Webhook集成实战指南 在现代化监控体系中Prometheus告警系统与钉钉机器人的Webhook集成能够实现告警钉钉告警终极指南ElastAlert群机器人集成与提及功能详解想要实现企业级监控告警的快速推送与精准提醒吗ElastAlert 与钉钉的完美结合让告警管理变得前所未有的简单高效作为一款基于 ElasticSearch告警异常检测上一篇3个核心问题告诉你为什么AnythingLLM是搭建私有AI助手的最佳选择下一篇XUnity.AutoTranslatorUnity游戏实时汉化的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DRF 3.x Format Suffixes 格式后缀使用示例和配置方法

DRF 3.x Format Suffixes 格式后缀使用示例和配置方法

在现代Web开发中,API已经成为了核心架构的一部分。Django Rest Framework(简称DRF)是Python中一个强大且广泛使用的库,帮助开发者快速构建高效且灵活的API。在API开发中,如何支持客户端使用不同的响应格式是一项重要的需求。为了满足这一需求,DRF引入了格式后缀机制,通过…

2026/9/24 16:00:08 阅读更多 →
FW系列:炒菜机什么时候下料,该由温度说了算

FW系列:炒菜机什么时候下料,该由温度说了算

爆香要油温到位,收汁要水分收得住,青菜要断生即出。这些判断在厨师手里靠眼睛和声音,在炒菜机里只能靠数据。数据给得对不对,直接决定这道菜是做出来的,还是照做出来的。锅的难处在于它不停:一边被加热&…

2026/9/24 16:00:08 阅读更多 →
Semi Design VideoPlayer 视频播放器组件实战指南:从基础播放到清晰度切换与原生能力控制

Semi Design VideoPlayer 视频播放器组件实战指南:从基础播放到清晰度切换与原生能力控制

Semi Design VideoPlayer 视频播放器组件实战指南:从基础播放到清晰度切换与原生能力控制 【免费下载链接】semi-design 🚀A modern, comprehensive, flexible design system and React UI library, AI-friendly built-in.🎨Provide 3000 Des…

2026/9/24 15:59:08 阅读更多 →

最新新闻

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南

如何快速接入支付宝支付?alipay_sdk_cj仓颉原生SDK完全指南 【免费下载链接】alipay_sdk_cj AliPay Sdk for 仓颉 支付宝接口后端sdk,方便cangjie开发者快速接入支付宝的支付接口(目前只支持最广泛使用的商户直接接入模式,只支持最…

2026/9/24 16:36:43 阅读更多 →
Spring注解--@Async异步执行的方法

Spring注解--@Async异步执行的方法

原文网址:Spring注解--Async异步执行的方法-CSDN博客 简介 本文介绍Spring的Async的用法。Async是用来异步执行任务的。 基础代码 正常情况下,执行两个任务是这样的: Controller package com.knife.example.controller;import io.swagg…

2026/9/24 16:36:43 阅读更多 →
幂等,kafka,mysql,kafka,redis,linux,bean声明周期,spring启动,AQS,位运算模运算,sql取每个班级的前3名,各种文件流,nginx, aop,分库分表

幂等,kafka,mysql,kafka,redis,linux,bean声明周期,spring启动,AQS,位运算模运算,sql取每个班级的前3名,各种文件流,nginx, aop,分库分表

1,幂等 幂等在接口、消息队列 和防抖中都有见到,所以也是经常被问到的 最长用、也是最通用的方法就是给消息加个唯一标识,然后在消费端 加上业务判断,到缓存或者数据库中查询是否已经存在这个标识,存在说明已经消费过了,就跳过。否则就消费,并保存到缓存或数据库中。…

2026/9/24 16:36:43 阅读更多 →
16-U-Boot环境变量系统

16-U-Boot环境变量系统

文章目录 一、概述 二、形象比喻:办公室的白板和档案柜 三、环境变量工作流程 四、核心环境变量详解 4.1 启动控制类 4.2 内核加载地址类 4.3 bootargs -- 内核命令行参数 4.4 网络配置类 4.5 分区和启动路径类 五、环境变量操作命令 六、环境变量存储机制 6.1 RK3506 的存储配…

2026/9/24 16:36:43 阅读更多 →
Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报

Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报

Open-Meteo 免费天气预報 API:无需 API 密钥获取 16 天逐小时预报 【免费下载链接】open-meteo Free Weather Forecast API for non-commercial use 项目地址: https://gitcode.com/GitHub_Trending/op/open-meteo 给应用加一个天气页面,或者做研…

2026/9/24 16:36:43 阅读更多 →
AI Agent 脚手架系统架构设计:基于 Spring AI + Google ADK 的三层架构与技术选型实践

AI Agent 脚手架系统架构设计:基于 Spring AI + Google ADK 的三层架构与技术选型实践

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、…

2026/9/24 16:35:42 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →