Linkora v0.7.0:分身开始看得见群里发生的事
前几版都在修「答得好不好」。这一版换了个方向:修「看得见看不见」。钉钉的 CLI 升到 v1.0.63 之后,我拿真实群聊把它的能力重新过了一遍,发现 Linkora 里有几处设计是照着旧版 CLI 的认知写下的——包括一条被我自己信了好几年的错误判断。于是有了这一版:内置工具 38 → 47,意图分类 39 → 41。
本文要点
- 话题(Thread)从「能回复但读不到历史」变成能读能答——这条纠正的是一条错误判断
- 群成员枚举修好了:此前工具声称返回成员,实际一个都没返回
- 新接入两个域:钉钉日志(日报周报)、企业语义检索
- 补齐三处业务缺口:审批表单字段配置、待办闭环、日程协调(冲突 / 空闲 / 推荐时间)
- 媒体下载迁到安全 Shortcut,保留四项安全属性
纠偏 1:话题不是「不支持」,是「只做了一半」
Linkora 里一直写着「钉钉不支持话题内回复」。这句话是错的。v1.0.63 实测下来,真实情况是——
- 能回复:话题内发消息,完全支持。
- 读不到:话题里的历史消息,此前拿不到。
这是个典型的「不对称」:能写不能读。后果很具体——同事在话题里把一个方案讨论了三轮,你进去问「这个方案谁提的」,分身只看得见群里那句「开个话题聊一下」,看不见话题里的内容,自然答不上来。
v0.7.0 补上了读的那一半:新增话题上下文拉取,按时间合并、去重后并入主回复上下文。现在分身在话题里能顺着上下文回答,而不是只看见一句话就失忆。
纠偏 2:「已返回成员列表」,实际一个成员都没有
会话信息工具此前会明确报告「已返回成员列表」,返回的却是空数组。群成员是 cid... 形式的会话 ID,查成员时必须走 ID 直通;而群成员枚举接口的 --group 参数走的是语义解析(传群名 / 关键词),把已保存的会话 ID 传过去反而报「解析失败」。这类坑不实测根本想不到——参数名字一样,语义完全相反。
现在改成:优先用会话内联返回的成员信息,拿不到时才走群成员枚举接口,并把「ID 直通 vs 语义解析」这条规则固化在适配器层,避免下次再踩。
新接入:钉钉日志与企业语义检索
钉钉日志(日报 / 周报)
能列出我收到和发出的日志、读取单份日志的完整正文、搜索本单位的填报模板。日志正文是嵌套的 JSON 字符串,解析后原样保留语义——不然「本周进展」会被拆成一堆无上下文的碎片。
企业语义检索
一次跨类型语义检索企业内部内容:文档、消息、日程、待办、听记、日志、邮件,一次覆盖多个来源。还能按行为类型追溯——「我发给谁了什么」「谁发给我的」「我创建过哪些」。
这里有个细节值得一说:检索结果里会保留「仅摘要片段」和「语义候选」两个证据标记。不保留的话,分身会把一个降级的摘要结果当成完整命中来汇报,那比查不到更糟。
补齐:三个此前只能「半个」回答的业务问题
| 能力 | 此前 | 现在 |
|---|---|---|
| 审批表单 | 只能看到表单名 | 能看字段级配置(字段名 / 组件类型 / 必填 / 选项),还能按字段名反查——「哪些表单含『项目』字段」直接能答 |
| 待办 | 只能创建 | 能查我的待办清单、标记完成(写操作需二次确认) |
| 日程 | 只能列日程 | 能查冲突、找空闲时段、给多人推荐共同开会时间 |
「找大家都有空的时间」这个场景,之前只能靠人肉在日历里划。现在直接问,分身会查冲突、算空闲,再按姓名解析参会人给出建议时间。
顺手修的:媒体下载走安全通道
下载改走 dws 的安全 Shortcut 接口,四项安全属性全部保留——拒绝绝对路径、拒绝 .. 逃逸、原子落盘、默认不覆盖。调用方需要重下同名文件时显式开启覆盖,不给这个开关的默认行为是不覆盖。
一个刻意的决定:有些新能力不接
dws v1.0.63 一共 26 个服务域,全接进来并不划算。评估后明确不采纳的有:
- 邮件:需要独立授权,且与企业内容检索高度重叠。
- 动态 schema:dws 能导出 1495 个工具的元数据,但那意味着工具清单要改成运行时动态生成——这是架构级改造,不该塞进一个版本。
- 与会中能力、无权限域:拿不到就是拿不到,不做假承诺。
另外记了一条铁律:适配器层绝不传输出改写类全局 flag。实测发现 --fields 只在顶层投影,传 --fields name,conversationId 时 +chat-list 返回 {} 而且不报错;--jq 表达式写错返回 null 加 exit 0,也没有错误信号。这种「静默返回空」的 flag 传到适配器里就是数据丢失的温床。
升级注意
无数据迁移、无破坏性变更。但新增 9 个工具需要显式加入 tools.available 白名单才会对 LLM 可见:
schedule_meeting list_todos complete_todo
approval_get_form_schema
list_reports get_report_detail list_report_templates
search_enterprise_content search_enterprise_behavior
仓库里的 config.yaml.example 已含全部 47 项,照抄即可。新增的 9 个工具全部依赖 dws 专属能力,飞书与企微暂不可用(企微会明确回报不支持,而不是静默失败)。
验证
ruff 全路径通过;pyright 用钉版(1.1.414)跑出零错误,与基线一致;check_deps.py --strict 零告警;裸异常基线未新增(仍为 638)。新增 6 个测试文件覆盖本版全部新能力(报告 35 例、语义检索 28 例、日程待办 18 例、群成员 16 例、资源下载 8 例、话题上下文 14 例),全量逐文件回归通过。
延伸阅读
- 完整变更日志(CHANGELOG)——本次全部变更条目
- GitHub Release v0.7.0
- 项目源码——GitHub