ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

不用写繁琐前端!用 Dify / Coze 配合微信 API 极简构建微信 AI 助手

不用写繁琐前端!用 Dify / Coze 配合微信 API 极简构建微信 AI 助手

想快速让微信上有个能聊的 AI 助手,自己搭一套对话管理、prompt 配置、知识库太折腾。Dify 和 Coze 这类平台把这些都做好了,你只需要做两件事:把微信消息转成它们认识的格式、把它们的回复发回微信。

一、桥接模式:微信 API 是接入层,Dify/Coze 是编排层

整个架构是两层:微信 API 负责收发消息,Dify/Coze 负责对话编排、prompt、知识库和 AI 调用。中间加一层薄桥,把两边的消息格式互相转一下。

桥接层做三件事:接收微信回调 → 转成 Dify/Coze 的请求格式 → 把回复转成微信消息发回去。整个桥接层可以是一个简单的 Flask/FastAPI 服务,几十行代码够跑通。

二、Dify 侧的接入

Dify 提供了 chat-messages 接口——POST 一段用户消息进去,它返回 AI 的回复。调用方式很简单:传 query(用户说的话)、user(用户标识,用来保持上下文),拿到 answer 字段就是回复内容。

Dify 的上下文保持靠 user 字段——同一个 user ID 的对话会自动串起来。所以桥接层要做的就是把微信的 wxid 原样传给 user 字段,上下文就自然保持住了。

三、Coze 侧的接入

Coze 的 bot 有 Webhook 回调能力,触发方式更灵活——可以传固定触发词、也可以传完整对话。Coze 侧只要把 bot 配好(prompt、知识库、插件),桥接层就只要做格式转换和转发。

四、桥接层的几个细节

第一,回调超时。Dify/Coze 的对话生成也要几秒,和直接调 GPT 一样——微信回调里只做转发入队,等 AI 回复了再异步发回微信。

第二,消息聚合。用户在微信里连发三条,桥接层要合并成一条再发出去,不然 AI 收到三条碎片消息答不完整。做法是 1 秒窗口合并。

第三,内容截断。AI 回复可能很长,超过微信单条消息上限。桥接层做截断,或者拆成多条发送,每条之间留 3 秒。

桥接层对照

组件

做什么

关键点

常见坑

消息转发

微信→Dify/Coze

wxid 原样传 user

上下文断了

回复回传

Dify/Coze→微信

先 ACK 再异步

回调超时

消息合并

连发多条合成一条

1 秒窗口

AI 答不完整

内容截断

AI 回复超长处理

拆多条+留间隔

消息被截断

桥接层实现

import queue, time from flask import Flask, request import requests app = Flask(__name__) inbox = queue.Queue() BUFFERS = {} # wxid -> (content, expire_at) WINDOW = 1.5 # 消息合并窗口(秒) # Dify/Coze API 地址和密钥 DIFFY_API = "https://api.dify/v1" DIFFY_KEY = "app-xxx" COZE_API = "https://api.coze.cn/v1" COZE_TOKEN = "xxx" @app.route("/hook", methods=["POST"]) def wechat_callback(): data = request.get_json(force=True) or {} wxid = data.get("from") content = data.get("content", "") # 1. 消息合并:1.5 秒窗口内合并 buf = BUFFERS.get(wxid) now = time.time() if buf and now < buf[1]: BUFFERS[wxid] = (buf[0] + content, buf[1]) else: BUFFERS[wxid] = (content, now + WINDOW) # 2. 立即 ACK,异步处理 inbox.put({"wxid": wxid, "mid": data.get("msg_id")}) return {"code": 0} def worker(): while True: event = inbox.get() wxid = event["wxid"] # 取合并后的内容 buf = BUFFERS.get(wxid) if not buf: continue content, expire = buf if time.time() > expire: continue # 清缓冲 if BUFFERS.get(wxid) == buf: del BUFFERS[wxid] # 3. 调 Dify(或 Coze) try: resp = requests.post( f"{DIFFY_API}/chat-messages", headers={"Authorization": f"Bearer {DIFFY_KEY}"}, json={"query": content, "user": wxid}, timeout=30).json() reply = resp.get("answer", "")[:500] except Exception as e: reply = f"抱歉,我这边出了点问题" # 4. 发回微信 requests.post( f"{WECHAT_API}/send", json={"wxid": wxid, "content": reply}, headers={"Authorization": TOKEN}, timeout=15) time.sleep(3) import threading threading.Thread(target=worker, daemon=True).start()

落地建议

桥接层做薄——只做三件事:消息格式转换、异步队列入队、回复转发。对话管理和 AI 调用全交给 Dify/Coze,不要自己写。上下文保持靠 wxid 原样传给 Dify/Coze 的 user 字段,自然就串起来了。回调里只做入队立即 ACK,AI 生成放 worker 异步处理。连发多条消息 1-2 秒窗口合并再发。微信侧的消息接口由Eyun这类个人微信API平台 提供,桥接层在自建服务实现,具体字段以平台开发文档为准。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进