Hermes_agent 0.13.0 钉钉没有思考动画显示的问题解决
钉钉思考中图标显示 — 修复文档
1. 这是什么
安装了 alibabacloud_dingtalk Python 包,让钉钉机器人在收到消息后显示 🤔Thinking 思考中 表情,回复完成后变成 ✅Done 完成 表情。
用户不再傻等不知道是卡了还是在处理。
2. 修复前 vs 修复后
修复前
用户发消息 → 没有任何反馈 → 等 10-30 秒 → 突然弹出回复
用户不知道机器人收到消息没、是在处理还是卡死了。
修复后
用户发消息 → 🤔Thinking 表情立刻出现 → 处理中... → 回复送达 → 表情变成 ✅Done
3. 为什么之前不工作
Hermes v0.13.0 的钉钉适配器 dingtalk.py 里已经写了表情反应的代码:
# 文件:/usr/local/lib/hermes-agent/gateway/platforms/dingtalk.py # 第 1270 行 —— _send_emotion() 方法 # 这个方法负责在用户消息上添加/移除表情符号 async def _send_emotion(self, open_msg_id, open_conversation_id, emoji_name, *, recall=False): """Add or recall an emoji reaction on a message.""" # ⚠️ 关键!这一行检查 _robot_sdk 是否已初始化 if not self._robot_sdk or not open_msg_id or not open_conversation_id: return # ← 如果 SDK 没初始化,直接返回,什么都不做 # ... 后面是真正的表情发送逻辑 ...
表情反应的完整流程在代码里早就写好了:
# 收到用户消息时 → 发送 🤔Thinking # 文件:dingtalk.py 第 ~1510 行 if msg_id and conversation_id: self._adapter._spawn_bg( self._adapter._send_emotion( msg_id, conversation_id, "🤔Thinking", recall=False, ) ) # 回复完成时 → 撤回 🤔Thinking → 发送 ✅Done # 文件:dingtalk.py 第 ~523 行 def _fire_done_reaction(self, chat_id: str): """Swap 🤔Thinking → 🥳Done on the original user message.""" # 先撤回 🤔Thinking(recall=True) await self._send_emotion(msg_id, conversation_id, "🤔Thinking", recall=True) # 再发送 🥳Done(recall=False) await self._send_emotion(msg_id, conversation_id, "🥳Done", recall=False)
但 _robot_sdk 是在 connect() 方法里初始化的:
# 文件:dingtalk.py 第 ~255 行
elif CARD_SDK_AVAILABLE:
# Initialize robot SDK even without card template (for media download)
sdk_config = open_api_models.Config()
sdk_config.protocol = "https"
sdk_config.region_id = "central"
self._robot_sdk = dingtalk_robot_client.Client(sdk_config)
logger.info("[%s] Robot SDK initialized (media download)", self.name)
而 CARD_SDK_AVAILABLE 这个变量取决于包能不能导入:
# 文件:dingtalk.py 第 67-88 行 try: from alibabacloud_dingtalk.card_1_0 import client as dingtalk_card_client, ... from alibabacloud_dingtalk.robot_1_0 import client as dingtalk_robot_client, ... CARD_SDK_AVAILABLE = True # ← 导入成功 = True except ImportError: CARD_SDK_AVAILABLE = False # ← 导入失败 = False,后面所有逻辑全跳过 dingtalk_robot_client = None dingtalk_robot_models = None ...
根因一句话: 代码逻辑都在,但因为服务器缺少 alibabacloud_dingtalk 这个 Python 包,CARD_SDK_AVAILABLE = False → _robot_sdk = None → _send_emotion() 每次都在第一行就 return 了,表情从来没发出去过。
4. 修复内容
唯一的操作:安装 Python 包
/usr/local/lib/hermes-agent/venv/bin/pip install alibabacloud_dingtalk
没有修改任何代码。 代码从一开始就支持这个功能,只是依赖包没装。
新安装的包清单
| 包名 | 版本 | 说明 |
|---|---|---|
alibabacloud_dingtalk |
2.2.45 | 钉钉机器人 SDK(主体) |
alibabacloud-tea-openapi |
0.4.4 | 阿里云 OpenAPI 基础库 |
alibabacloud-tea |
0.4.3 | 阿里云 Tea 框架 |
alibabacloud-tea-util |
0.3.14 | Tea 工具库 |
alibabacloud-gateway-dingtalk |
1.0.2 | 钉钉网关 |
alibabacloud-gateway-spi |
0.0.3 | 网关 SPI |
alibabacloud-openapi-util |
0.2.4 | OpenAPI 工具 |
alibabacloud-credentials |
1.0.8 | 凭证管理 |
alibabacloud-credentials-api |
1.0.0 | 凭证 API |
alibabacloud-endpoint-util |
0.0.4 | 端点工具 |
darabonba-core |
1.0.5 | 阿里云核心库 |
APScheduler |
3.11.2 | 定时任务(依赖) |
aiofiles |
24.1.0 | 异步文件(依赖) |
cryptography |
46.0.7 | 加密库(依赖,版本从 48.0.0 降级) |
tzlocal |
5.3.1 | 时区处理(依赖) |
5. 装了这个包还带来了哪些额外好处
5.1 文件下载码解析更可靠
之前在 dingtalk.py 里我们用纯 HTTP API 手动调钉钉的下载接口(_resolve_download_code_http 方法)。现在 Robot SDK 可用后,_resolve_media_codes 优先用 SDK 调 robot_message_file_download_with_options_async(),更稳定、有重试、有错误处理。
5.2 AI Card 流式输出(待配置)
如果将来在钉钉开发者后台创建了 AI Card 模板并填入 card_template_id,就能实现:
-
AI 回复逐字输出(打字机效果)
-
实时看到处理进度
-
每条消息带有卡片样式
配置方式:在 config.yaml 的 platforms.dingtalk.extra 下加 card_template_id: "你的模板ID"。
6. 被激活的代码路径一览
安装这个包之后,dingtalk.py 中以下代码从"死代码"变成了"活代码":
| 代码位置 | 功能 | 之前 | 之后 |
|---|---|---|---|
connect() 第 255 行 |
Robot SDK 初始化 | 跳过(CARD_SDK_AVAILABLE=False) |
执行,初始化 _robot_sdk |
_send_emotion() 第 1270 行 |
发送/撤回表情 | 第一行 return(_robot_sdk=None) |
正常执行 |
process() 第 1510 行 |
收到消息时发送 🤔Thinking | 调用但无效 | 正常显示 |
_fire_done_reaction() 第 523 行 |
回复完成时切换 ✅Done | 调用但无效 | 正常显示 |
_send_emotion emoji swap 第 541 行 |
撤回 🤔→ 发送 🥳 | 调用但无效 | 正常工作 |
_resolve_media_codes() |
文件下载码解析 | 用 HTTP 备用方案 | 用 SDK(更可靠) |
edit_message() 第 1177 行 |
AI Card 流式更新 | 报错(SDK 为空) | 仍不可用(需 card_template_id) |
7. 文件清单
钉钉思考图标的显示/ ├── README.md ← 你正在看的这个文件 └── 修改前/ └── (无文件,纯包依赖问题)
涉及的服务器文件
| 文件完整路径 | 修改类型 | 说明 |
|---|---|---|
/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/alibabacloud_dingtalk/ |
新增目录 | 钉钉 SDK 安装位置 |
/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/alibabacloud_tea_openapi/ |
新增目录 | Tea OpenAPI |
/usr/local/lib/hermes-agent/venv/lib/python3.11/site-packages/darabonba/ |
新增目录 | 阿里云核心库 |
| (14 个包) | 新增 | 完整的依赖列表见第 4 节 |
/usr/local/lib/hermes-agent/gateway/platforms/dingtalk.py |
无修改 | 代码没动,只是依赖满足了 |
8. 如何验证
在钉钉里发一条消息,观察:
-
用户消息下方出现 🤔Thinking 表情(表示机器人收到并在处理)
-
AI 回复到达后,表情变成 🥳Done(表示处理完成)
注意: 如果 AI 回复非常快(<1秒),表情变化可能看不出来。可以试试发"写一个 Python 冒泡排序的代码"这种需要稍长思考时间的问题。
9. 如何部署到新服务器
# 1. 连上服务器 ssh -i sshdev.pem root@<IP> # 2. 安装钉钉 SDK /usr/local/lib/hermes-agent/venv/bin/pip install alibabacloud_dingtalk # 3. 重启 Gateway systemctl restart hermes-gateway # 4. 确认 Robot SDK 初始化成功 grep "Robot SDK initialized" /root/.hermes/logs/agent.log # 应该看到: [Dingtalk] Robot SDK initialized (media download)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)