钉钉思考中图标显示 — 修复文档

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.yamlplatforms.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. 如何验证

在钉钉里发一条消息,观察:

  1. 用户消息下方出现 🤔Thinking 表情(表示机器人收到并在处理)

  2. 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)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐