上两篇把 Harness 的"成本"和"优化"讲透了;本文落到最后一个关键问题——怎么把它变成全员可用的 AI 助手。答案:把 Harness 暴露成 HTTP 服务,再用企业微信"自建应用"包一层。

数据口径:DeepSeek Harness 官方文档(deepseek-harness.github.io,2026-08 版本);企业微信自建应用接入规范(developer.work.weixin.qq.com,2026-08 修订版)。


一、为什么要把 Harness 接到企微

本机跑 dsh web 只能你自己用,研发同事想用,得逐个开端口、装客户端。把 Harness 接到企微有三个直接收益:

收益 含义
入口统一 员工在企微客户端里 @机器人 即可提问,不必装新软件、不必记端口
权限可控 复用企微通讯录与组织架构,AI 调用范围与可见范围按部门/角色控制
可审计 所有问答经企微后台留痕,合规与排障都有据可查

但要把 Harness "搬进"企微,链路并不直连——Harness 默认只听 127.0.0.1:3080,而企微回调需要公网 HTTPS。所以需要一层桥:一个轻量回调服务,同时连企微和 Harness。

桥接概念示意


二、整体架构:一层桥接,三段链路

[员工手机 / 企微]
       │  ① 提问(加密 XML)
       ▼
[企业微信服务器] ──HTTPS──▶ [Bridge 回调服务]
                              │  ② 鉴权后调 Harness
                              ▼
                         [DeepSeek Harness]
                         (dsh web / OpenAI 兼容端点)
                              │  ③ 返回回答
                              ▼
[企业微信服务器] ──加密回包──▶ [员工手机 / 企微]

三段链路的关键点:

  • ①回调可达:Bridge 必须暴露在公网 HTTPS(企微强制),且 URL 已在自建应用后台登记。
  • ②鉴权 + 协议:Bridge 用企微签名校验验真身份,再把"用户原文"塞给 Harness。
  • ③时延与 5 秒红线:企微5 秒内必须收到响应,否则重试最多 3 次——长任务必须异步化(见第五节)。

三、第一步:建一个企微"自建应用"

去 work.weixin.qq.com/wework_admin/ → "应用管理" → "自建" → 创建一个应用,记下三个值:

字段 在哪里 用途
CorpID 我的企业 → 企业信息 标识企业,全局唯一
CorpSecret 自建应用详情页 换 access_token,保密
AgentID 自建应用详情页 标识"哪一个机器人"

再用这三个值换 token(7200 秒有效,必须缓存,不要每次重取):

curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=YOUR_CORP_ID&corpsecret=YOUR_CORP_SECRET"
# 返回 {"errcode":0,"access_token":"...","expires_in":7200}

接着配"接收消息"回调:

项 要求
URL HTTPS,公网可访问,GET 验签通过 + POST 收消息
Token 自定义字符串,Bridge 侧需一致
EncodingAESKey 43 位,企微用其派生 AES-256-CBC 密钥

四、第二步:把 Harness 暴露成可调用服务

Harness 默认只听 127.0.0.1:3080,对外有三种"调用姿势":

4.1 直接用 Web UI(自用 / 调试)

npx @deepseek-ai/dsh web          # 默认 http://127.0.0.1:3080
npx @deepseek-ai/dsh web --port 8080

只适合本人调试;Bridge 需要 API 接口,不推荐这种姿势。

4.2 走 OpenAI 兼容端点(推荐)

Harness 内置 OpenAI 兼容服务,配置在 $DSH_HOME/settings.yaml(Windows:%USERPROFILE%\.dsh\settings.yaml):

# ~/.dsh/settings.yaml —— 启用 OpenAI 兼容端点(字段名以你本机版本文档为准)
server:
  host: 127.0.0.1
  port: 3080
  openaiCompat:
    enabled: true               # 启用 OpenAI 兼容端点
    basePath: /v1               # POST {basePath}/chat/completions

字段名以官方文档为准:dsh --help 或 deepseek-harness.github.io 的 server 章节会列出你版本的实际键名。配置后重启 dsh web(Ctrl+C 后重跑)才生效。

启用后用标准 OpenAI 协议调:

curl -s http://127.0.0.1:3080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model":"deepseek-v4-flash","messages":[{"role":"user","content":"你好"}]}'

Bridge 用这种方式最干净——鉴权、消息格式、超时都能复用 OpenAI 生态的成熟库。

4.3 headless 模式(一次性任务)

npx @deepseek-ai/dsh --profile headless "总结当前目录的代码"

适合 CI / 定时任务;不适合交互式问答。

企微内与 AI 助手对话


五、第三步:写一个"会说话"的回调 Bridge

Bridge 干三件事:验签 → 调 Harness → 回消息。下面是一个最简 Python 实现(仅示意,生产请加重试 / 幂等 / 日志脱敏):

# bridge.py —— 企业微信 ↔ DeepSeek Harness 最小桥接
import hashlib, time, xmltodict, requests
from flask import Flask, request

CORP_ID       = "wx..."          # CorpID
AGENT_ID      = "1000002"         # AgentID
TOKEN         = "yourToken"      # 自定义 Token(与企微后台一致)
AES_KEY       = "43-chars..."    # EncodingAESKey(43 位)
HARNESS_URL   = "http://127.0.0.1:3080/v1/chat/completions"
HARNESS_MODEL = "deepseek-v4-flash"

app = Flask(__name__)

def verify_url() -> bool:
    """GET 验签:企微用 SHA1(token, timestamp, nonce, echostr) 校验"""
    params = request.args
    sig = sorted([TOKEN, params["timestamp"], params["nonce"], params["echostr"]])
    return hashlib.sha1("".join(sig).encode()).hexdigest() == params["msg_signature"]

@app.route("/wecom", methods=["GET", "POST"])
def wecom():
    if request.method == "GET":
        # 企微首次配置回调时验证 URL
        return request.args["echostr"] if verify_url() else "fail"

    # POST:解密 XML → 调 Harness → 被动回复(5 秒内!)
    data = xmltodict.parse(request.data)["xml"]
    user_msg = data["Content"]
    # 真实环境需用 AES-256-CBC 解密;这里跳过明文示例

    r = requests.post(HARNESS_URL, json={
        "model": HARNESS_MODEL,
        "messages": [{"role": "user", "content": user_msg}],
    }, timeout=4).json()   # ← 留 1 秒给企微回包

    reply = r["choices"][0]["message"]["content"]

    return f"""<xml>
<ToUserName>{data['FromUserName']}</ToUserName>
<FromUserName>{CORP_ID}</FromUserName>
<CreateTime>{int(time.time())}</CreateTime>
<MsgType>text</MsgType>
<Content>{reply}</Content>
</xml>"""

if __name__ == "__main__":
    # 公网 HTTPS:生产用 Nginx + 正式证书;adhoc 仅用于本机自测
    app.run(host="0.0.0.0", port=8443, ssl_context="adhoc")

5 秒红线:上面 timeout=4 是关键——Harness 思考 / 检索可能 10 秒+,超时就让企微重试,结果可能错位。生产做法:先 ACK 一句"正在处理…",把任务丢进队列,5 秒内回包 "";任务跑完用 POST /cgi-bin/message/send 主动推送(异步模板消息 / 文本卡片)。

异步化的取舍:简单问答走同步(5 秒内回完);长任务(写报告、查代码)走异步(先回"处理中" + 任务 ID,跑完推送卡片消息)。两种都保留,体验最好。


六、第四步:部署拓扑怎么选

部署方式 优点 缺点 适用
Harness + Bridge 同机内网 简单、低延迟、零暴露 Bridge 需反向代理到公网 中小团队首选
Harness 内网 + Bridge 公网 隔离更好 Bridge 调 Harness 要走内网穿透或专线 合规要求高
Harness + Bridge 都上云 易扩缩容 模型费用 + 云费用双计 大规模 / 多分支

选哪种,关键看安全要求与费用敏感度。弱电类项目通常数据敏感,Harness 一定留内网,只把 Bridge 暴露到公网。


七、两个安全红线

安全防护示意

  1. Harness 不直连公网:只让 Bridge 在内网调它;dsh web 监听 127.0.0.1(默认就是)。baseURL 与 apiKey 走环境变量,绝不写进代码或 Git。
  2. Bridge 校验每条入站:企微签名 + AES-256-CBC 解密 + 白名单 CorpID / AgentID 缺一不可。别图省事关掉验签——那是唯一的信任锚点。

八、落地检查清单

  • [ ] 企微后台建好自建应用,记下 CorpID / CorpSecret / AgentID
  • [ ] gettoken 已实现并缓存(7200s),不要每次重取
  • [ ] Harness 启用 OpenAI 兼容端点(openaiCompat.enabled: true 字段名以官方文档为准)
  • [ ] Bridge 公网 HTTPS + 域名证书 + GET 验签通过
  • [ ] AES-256-CBC 解密逻辑 + 被动回复加密回包
  • [ ] 同步路径 timeout ≤ 4s;长任务改异步 + message/send 主动推送
  • [ ] 全部密钥走环境变量 / 密钥管理服务,不进代码与 Git
  • [ ] 日志脱敏(不打印用户原文、token、corpid)

九、下一步:从"能聊天"到"能办事"

能把 Harness 接到企微,只是"全员能用 AI 助手"的起点。下一步是让它能办事:接企业内部知识库(让答案带出处)、接工单系统(让 AI 自动开单)、接审批(让 AI 拟稿、人审)。这些我们后面一篇一篇拆。


莱驰云AI实战课堂。让 AI 从"开发者玩具"变成"全员工具",第一步是把入口放到每个人都已经打开的 App 里。数据以 DeepSeek Harness 与企业微信官方文档与你本人控制台为准。