1. 项目概述:当Dify遇上微信,在iPad上构建你的AI工作流
最近在折腾AI应用开发的朋友,估计都绕不开Dify这个平台。它把大模型应用开发的门槛降得很低,让你能像搭积木一样,通过可视化编排,快速构建出基于GPT、Claude等模型的智能应用。但不知道你有没有遇到过这样的场景:你精心在Dify上搭建了一个智能客服机器人,或者一个文档问答助手,想把它分享给团队或客户试用,却发现分享链路特别长——要么得让他们访问一个独立的网页链接,要么得集成到某个复杂的系统里,体验很割裂。
这个项目AnCool-OvO/dify-on-wechat-ipad就瞄准了这个痛点。它的核心目标非常直接:让你在微信里,就能直接使用你在Dify上创建的AI应用,并且特别优化了在iPad这类大屏设备上的使用体验。简单来说,它是一座桥,一头连着功能强大的Dify AI工作流引擎,另一头连着国民级应用微信。你不再需要说服用户去打开一个新网页、记住一个新网址,他们只需要像平常一样打开微信,就能与你的AI助手对话。
这背后的价值,远不止是“多了一个访问渠道”。微信拥有近乎100%的触达率,这意味着你的AI应用可以无缝融入用户最熟悉的沟通场景。无论是用于内部团队协作的知识库问答,还是面向客户的智能导购,响应速度和易用性都会得到质的提升。而特别强调iPad,则暗示了项目对“生产力场景”的侧重。想象一下,销售人员在拜访客户时,用iPad打开微信,就能快速调用产品知识库查询参数;设计师在评审方案时,能随时通过微信向AI助手提问获取灵感参考。这种“随时在手边、即开即用”的体验,是传统Web端难以比拟的。
所以,这个项目本质上是一个**“Dify应用微信机器人”的实现方案**。它需要解决几个核心问题:如何让微信收到消息后,去触发Dify上对应的AI工作流?如何处理微信和Dify之间完全不同的数据格式和通信协议?又如何将Dify返回的富文本(可能包含图片、文件、复杂格式)适配到微信的消息体系中?接下来,我们就深入拆解这个项目的实现思路与实操细节。
2. 核心架构与方案选型解析
要把Dify的能力塞进微信,可不是简单转发消息那么简单。这背后是一套完整的、需要稳定运行的服务器端程序。我们得先理清整个数据流的脉络。
2.1 整体数据流与角色分工
整个系统的运转,涉及四个关键角色:
- 微信用户:在微信(或企业微信)中发送消息的终端用户。
- 微信官方服务器:接收和发送微信消息的“总机”。
- 本项目服务(
dify-on-wechat-ipad):这是我们需要搭建的核心服务,它扮演着“接线员”和“翻译官”的角色。 - Dify Cloud/API:提供AI能力的工作流引擎,是真正的“大脑”。
数据流转的典型路径是这样的:
- 用户提问:用户在微信聊天窗口输入“帮我总结一下这篇文章的核心观点”,并发送。
- 微信转发:微信服务器将这条消息推送到我们事先配置好的、本项目服务的公网URL(称为“回调URL”)。
- 服务处理:本项目服务接收到微信推送的XML格式消息包,从中解析出用户的文本内容、发送者ID等信息。
- 调用Dify:服务将解析出的用户问题,按照Dify API要求的格式(通常是JSON),携带必要的API Key和应用ID,发送POST请求到Dify的对话API端点。
- Dify思考与回复:Dify平台识别应用ID,执行对应的AI工作流(可能涉及读取知识库、调用模型、进行逻辑判断),生成回答文本。
- 返回结果:Dify将回答通过API返回给本项目服务。
- 格式转换与回复:本项目服务将Dify返回的纯文本或简单Markdown,转换成微信支持的回复消息格式(可能是文本,也可能是图文、文件等),再通过微信提供的客服消息接口或模板消息接口,发送回给发起提问的用户。
- 用户接收:用户在微信中看到AI助手的回复。
从这个流程可以看出,本项目服务的核心职责是协议转换、路由和消息适配。它本身不产生AI能力,而是AI能力的“搬运工”和“包装工”。
2.2 技术栈选型背后的考量
虽然项目仓库AnCool-OvO/dify-on-wechat-ipad可能采用了特定的技术实现(如Python的Flask/FastAPI框架),但我们可以从通用角度分析这类项目的技术选型逻辑。
1. 后端框架:轻量级Web框架是首选
- 为什么是Flask/FastAPI?这类项目本质上是一个HTTP API服务,需要快速处理来自微信的Webhook请求。Flask和FastAPI都以轻量、灵活、易于快速开发著称。FastAPI凭借其自动化的API文档生成(OpenAPI)和更高的异步性能,在近年成为更热门的选择。它内置的依赖注入系统也便于管理配置(如Dify API Key、微信Token)。
- 关键需求:框架需要能方便地解析XML/JSON,处理路由,以及高效地发起对外部API(Dify、微信接口)的HTTP请求。
requests库或异步的httpx、aiohttp是标配。
2. 微信交互方案:公众号 vs. 企业微信 vs. 个人微信这是项目设计中最关键的一环,直接决定了实现难度、功能范围和合规性。
- 微信公众号(服务号/订阅号):这是最官方、最稳定的途径。通过微信公众平台提供的“消息接收与回复”能力,可以可靠地实现自动回复。优点是稳定、合规、功能强大(支持模板消息、菜单等)。缺点是需要企业或组织资质认证服务号才能获得高级接口,且用户必须关注公众号才能交互。
- 企业微信:对于内部工具场景是完美选择。企业微信提供了更丰富的机器人、应用API,权限管理也更清晰。可以将Dify应用作为企业微信的一个“自建应用”接入,员工在内部群聊或单聊中@机器人即可使用。这种方式在企业内部部署中非常流行。
- 个人微信(不推荐):通过模拟微信网页版协议(如itchat、WeChatPYAPI等)来实现。这种方式极度脆弱,容易被微信封禁,且违反微信用户协议,仅能用于个人学习研究,绝对不可用于任何生产环境或商业用途。本项目强调“iPad”使用,很可能倾向于通过公众号H5或企业微信应用这种合规方式在移动端获得良好体验。
3. 部署与运维:让服务7x24小时稳定运行
- 服务器:你需要一台拥有公网IP的云服务器(如腾讯云、阿里云的轻量应用服务器)。微信服务器需要能通过互联网访问到你配置的回调URL。
- 域名与HTTPS:微信要求回调URL必须是HTTPS协议。这意味着你需要一个备案的域名,并为其配置SSL证书(现在Let‘s Encrypt提供免费证书,申请很方便)。
- 进程守护:不能让你的Python脚本在SSH窗口关闭后就停止。需要使用
systemd、supervisor或pm2(如果是Node.js)等工具将服务作为后台守护进程运行。 - 日志与监控:记录所有消息交互日志至关重要,便于调试和排查问题。可以简单写入文件,或集成到更专业的日志系统中。
注意:无论选择哪种微信接入方案,都必须仔细阅读并遵守微信开放平台的开发者协议。任何滥用、骚扰用户或发送违规内容的行为,都会导致接口被封禁。
3. 核心实现细节与实操步骤
理解了架构,我们就可以动手搭建了。这里我将以使用Flask + 微信公众号(服务号)这一经典组合为例,拆解核心实现步骤。你可以根据项目仓库的具体代码进行调整。
3.1 前期准备:配置你的“武器库”
在写一行代码之前,你需要准备好以下“弹药”:
- 一个已认证的微信公众号(服务号):如果没有,可以申请测试号(功能有限但足够开发测试)。
- 一个Dify Cloud账户和应用:在Dify官网创建你的AI工作流应用,并获取其API Key和App ID。
- 一台云服务器:推荐1核2G配置起步,安装好Python 3.8+环境。
- 一个已备案的域名:并解析到你的云服务器IP。
- SSL证书:为你的域名配置好HTTPS。可以使用服务器面板(如宝塔)一键申请,或通过acme.sh脚本申请。
3.2 核心代码拆解:消息的接收、处理与回复
我们创建一个简单的app.py文件作为服务入口。
第一步:验证服务器有效性(GET请求处理)微信在首次配置回调URL时,会发送一个GET请求进行验证。这是你必须正确响应的第一步。
from flask import Flask, request, make_response import hashlib import time app = Flask(__name__) # 配置信息,实际应用中应从环境变量或配置文件中读取 WECHAT_TOKEN = 'your_wechat_token_here' # 在微信公众平台设置的Token @app.route('/wechat', methods=['GET']) def wechat_verify(): """处理微信服务器验证""" signature = request.args.get('signature', '') timestamp = request.args.get('timestamp', '') nonce = request.args.get('nonce', '') echostr = request.args.get('echostr', '') # 1. 将token、timestamp、nonce三个参数进行字典序排序 tmp_list = sorted([WECHAT_TOKEN, timestamp, nonce]) # 2. 将三个参数字符串拼接成一个字符串进行sha1加密 tmp_str = ''.join(tmp_list).encode('utf-8') hash_str = hashlib.sha1(tmp_str).hexdigest() # 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if hash_str == signature: return echostr # 验证成功,原样返回echostr else: return 'Verification Failed', 403第二步:处理用户消息(POST请求处理)验证通过后,微信会将用户消息以XML格式通过POST请求推送到同一个URL。
import xml.etree.ElementTree as ET import requests # Dify配置 DIFY_API_KEY = 'your_dify_api_key' DIFY_APP_ID = 'your_dify_app_id' DIFY_API_URL = 'https://api.dify.ai/v1/chat-messages' # Dify对话API端点 @app.route('/wechat', methods=['POST']) def wechat_message(): """处理微信用户发送的消息""" # 1. 解析微信发来的XML消息 xml_data = request.data xml_recv = ET.fromstring(xml_data) msg_type = xml_recv.find('MsgType').text from_user = xml_recv.find('FromUserName').text to_user = xml_recv.find('ToUserName').text # 2. 目前只处理文本消息 if msg_type == 'text': user_content = xml_recv.find('Content').text # 3. 构建请求Dify API的载荷 dify_payload = { "inputs": {}, "query": user_content, "response_mode": "streaming", # 或 "blocking",根据需求选择 "conversation_id": "", # 如果需要保持会话,需要管理并传入此ID "user": from_user # 用微信用户ID作为Dify端的用户标识 } headers = { "Authorization": f"Bearer {DIFY_API_KEY}", "Content-Type": "application/json" } # 4. 调用Dify API try: # 这里使用streaming模式,需要处理流式响应。为简化示例,先使用blocking模式。 # 实际生产环境,streaming模式能提供更好的用户体验(打字机效果)。 dify_payload["response_mode"] = "blocking" response = requests.post( f"{DIFY_API_URL}?user={from_user}", json=dify_payload, headers=headers, timeout=30 # 设置超时,避免微信等待过久 ) response.raise_for_status() dify_result = response.json() # 5. 从Dify响应中提取AI回复文本 # Dify API返回结构可能因版本略有不同,需根据实际情况调整 ai_reply = dify_result.get('answer', '') or dify_result.get('output', '') if not ai_reply and 'data' in dify_result: # 尝试从data字段中获取 ai_reply = dify_result['data'].get('answer', '') # 6. 如果Dify没有返回有效内容,提供默认回复 if not ai_reply: ai_reply = "我正在思考中,请稍后再试。" except requests.exceptions.RequestException as e: # 网络或API错误处理 app.logger.error(f"调用Dify API失败: {e}") ai_reply = "服务暂时不可用,请稍后再试。" except KeyError as e: # Dify响应格式解析错误 app.logger.error(f"解析Dify响应失败: {e}") ai_reply = "处理回复时出了点问题。" # 7. 将AI回复构造成微信要求的XML格式并返回 reply_xml = f""" <xml> <ToUserName><![CDATA[{from_user}]]></ToUserName> <FromUserName><![CDATA[{to_user}]]></FromUserName> <CreateTime>{int(time.time())}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{ai_reply}]]></Content> </xml> """ return reply_xml else: # 处理其他类型消息(如图片、语音),此处简单回复提示 reply_xml = f""" <xml> <ToUserName><![CDATA[{from_user}]]></ToUserName> <FromUserName><![CDATA[{to_user}]]></FromUserName> <CreateTime>{int(time.time())}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[暂不支持此类型消息,请发送文本内容。]]></Content> </xml> """ return reply_xml第三步:运行服务
# 安装依赖 pip install flask requests # 运行服务(开发环境) export FLASK_APP=app.py flask run --host=0.0.0.0 --port=5000生产环境务必使用gunicorn或uWSGI配合Nginx进行部署。
3.3 微信公众平台配置
代码跑起来后,你需要登录微信公众平台,进行关键配置:
- 进入【开发】->【基本配置】。
- 启用“服务器配置”。
- URL: 填写你的服务器地址,如
https://your-domain.com/wechat。 - Token: 填写代码中定义的
WECHAT_TOKEN,需与代码保持一致。 - EncodingAESKey: 随机生成或点击随机生成。
- 消息加解密方式: 开发测试可选“明文模式”,上线建议用“安全模式”。
- URL: 填写你的服务器地址,如
- 点击“提交”。如果代码正确且服务器可访问,微信会验证通过。
- 在【开发】->【基本配置】中获取你的
AppID和AppSecret(后续如果需要调用更多微信API,如发送模板消息,会用到)。
3.4 针对iPad体验的优化点
项目标题特意提到了“ipad”,这意味着我们需要考虑在平板设备上的使用体验。
- 响应式回复长度:iPad屏幕大,可以显示更长的内容。但微信消息界面仍然有局限。对于Dify返回的长篇大论,可以考虑主动进行分条发送(将长回复拆分成多条连续的消息),或者在Dify工作流中就设计好精简的回复格式。
- 富媒体支持:Dify工作流可以返回图片、文件。在代码中需要增强对
msg_type为image、file等的处理逻辑,当Dify返回图片URL或文件时,通过微信的素材管理接口上传临时素材,然后回复media_id给用户。 - 菜单与H5结合:对于复杂交互,可以配置微信公众号菜单,点击后跳转到一个针对iPad屏幕优化的H5页面。这个H5页面通过JavaScript调用你部署的服务的其他API接口,与Dify交互,实现更丰富的UI,如图表、按钮、表单等。这实现了“轻量聊天入口+重度交互H5”的混合模式,充分发挥iPad大屏优势。
4. 高级功能扩展与深度优化
基础文本问答跑通只是第一步。要让这个机器人真正好用,还需要考虑更多生产级问题。
4.1 会话状态管理与上下文保持
AI对话的魅力在于上下文连贯性。Dify API通过conversation_id来维护会话。在我们的服务中,必须妥善管理这个ID。
- 策略:将
conversation_id与微信用户的OpenID绑定并持久化存储(如Redis、数据库)。 - 实现:用户首次发言时,调用Dify API时不传
conversation_id,Dify会创建一个新的会话并返回新的ID。我们将这个(OpenID, conversation_id)对存储起来。用户下次发言时,先查询存储,如果存在未过期的会话ID,则将其传入Dify API,从而实现多轮对话。 - 会话超时:需要设置合理的会话超时时间(例如30分钟无交互则重置)。可以在存储时记录时间戳,每次查询时检查是否过期。
import redis import json import uuid # 连接Redis r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) SESSION_TTL = 1800 # 会话有效期30分钟 def get_or_create_conversation_id(openid): """获取或创建用户的会话ID""" key = f"dify:conv:{openid}" conv_id = r.get(key) if conv_id: # 每次访问,刷新TTL r.expire(key, SESSION_TTL) return conv_id else: # 创建新的会话,Dify会在首次请求时生成,这里我们先占位,实际ID从Dify响应中获取并更新 new_conv_id = str(uuid.uuid4()) r.setex(key, SESSION_TTL, new_conv_id) return None # 首次返回None,让Dify生成 def update_conversation_id(openid, conv_id_from_dify): """用Dify返回的真实会话ID更新存储""" if conv_id_from_dify: key = f"dify:conv:{openid}" r.setex(key, SESSION_TTL, conv_id_from_dify)在调用Dify API时,使用这个函数管理会话ID。
4.2 处理Dify的流式响应
为了获得更快的首字响应时间和“打字机”效果,Dify API支持流式响应(response_mode: "streaming")。处理流式响应需要用到Server-Sent Events (SSE)。
- 挑战:微信的客服消息接口是同步请求-响应模式,无法直接推送流式内容。一个折中方案是:服务端先立即回复微信一个“正在思考”的提示,然后在后端异步处理Dify的流式响应,并通过微信的“客服消息”接口,将逐段生成的内容分多条消息发送给用户。
- 实现思路:
- 收到用户消息后,立即构造一个XML回复,内容为“正在思考,请稍候...”。
- 在另一个异步任务(如使用Celery或线程池)中,发起对Dify的流式请求。
- 边接收Dify的流式数据块,边通过微信客服消息接口(需要用户的
openid和access_token)发送文本片段。 - 注意控制发送频率,避免消息轰炸。
实操心得:流式响应在微信群聊中体验尤佳,能营造出AI“正在输入”的真实感。但实现复杂度较高,且需注意微信客服消息接口的调用频率限制(默认每分钟最多4500次,但针对同一用户需合理控制)。对于初期项目,使用
blocking模式更简单稳定。
4.3 安全性加固与权限控制
将AI能力开放到微信,安全至关重要。
- IP白名单:在微信公众平台配置服务器IP白名单。在你的服务端,也可以验证请求是否来自微信官方服务器IP(微信会定期更新IP列表)。
- 消息加解密:务必在微信公众平台启用“安全模式”,并在代码中实现消息的加密解密。微信提供了各种语言的加解密库(如Python的
wechatpy),直接使用可以省去很多麻烦。 - 访问频率限制:针对每个
openid,在服务端实现限流(例如每秒最多1次请求),防止恶意刷接口。 - 内容安全审核:Dify本身可能内置了审核,但你也可以在将用户问题转发给Dify之前,或把Dify回复返回给用户之前,接入第三方内容安全API进行双重审核,避免传播违规信息。
- 应用级权限:如果你的Dify应用有不同权限(如有的用户只能问通用问题,有的可以问核心数据),需要在你的服务中维护一个用户-权限映射表,在调用Dify前进行校验。
5. 部署、监控与问题排查实录
让服务稳定跑起来,并知道它什么时候“生病”了,同样重要。
5.1 生产环境部署清单
- 服务器:使用Nginx作为反向代理,处理HTTPS、静态文件和负载均衡(如果你部署了多个服务实例)。
- 进程管理:使用
systemd或supervisor管理你的Flask应用进程,确保崩溃后自动重启。; supervisor 配置示例 (dify-wechat.conf) [program:dify-wechat] command=/path/to/your/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 app:app directory=/path/to/your/project user=www-data autostart=true autorestart=true stderr_logfile=/var/log/dify-wechat/err.log stdout_logfile=/var/log/dify-wechat/out.log - 日志:配置详细的日志记录,至少记录:请求时间、用户OpenID(脱敏处理)、原始消息、Dify请求与响应状态、错误信息。日志是排查问题的生命线。
- 配置管理:切勿将
WECHAT_TOKEN、DIFY_API_KEY等敏感信息硬编码在代码中。使用环境变量或专门的配置文件(如.env),并通过.gitignore确保它们不会被提交到代码仓库。 - 健康检查:编写一个简单的健康检查接口(如
/health),返回服务状态和依赖的Dify API连通性。方便运维监控。
5.2 常见问题与排查技巧
在实际运行中,你肯定会遇到各种问题。下面是一个快速排查指南:
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 微信服务器配置无法提交/验证失败 | 1. 服务器网络不通。 2. URL/Token填写错误。 3. 代码验证逻辑有误。 4. 服务器防火墙/安全组未开放端口。 | 1. 在服务器上用curl或telnet测试你的服务URL是否可从外网访问。2. 核对微信后台填写的Token与代码中 WECHAT_TOKEN是否完全一致(包括大小写)。3. 在代码中打印接收到的参数,核对签名计算过程。 4. 检查云服务器安全组和系统防火墙(如 ufw)是否放行了服务端口(如80/443)。 |
| 用户发消息后无回复 | 1. 服务进程已停止。 2. 代码逻辑错误导致异常退出。 3. 调用Dify API失败。 4. 微信消息格式处理错误。 | 1. 检查进程状态sudo supervisorctl status dify-wechat。2.查看应用错误日志,这是最直接的线索。 3. 在代码中增加try-catch,记录Dify API调用的请求和响应详情。 4. 使用微信公众平台的“接口调试工具”或开发者文档,模拟消息发送,检查你的服务日志。 |
| 回复内容乱码或格式错误 | 1. 字符编码问题。 2. Dify返回内容包含微信不支持的字符或格式。 3. XML构造格式错误。 | 1. 确保代码文件、Flask应用均使用UTF-8编码。在响应头中设置Content-Type: text/xml; charset=utf-8。2. 对Dify返回的文本进行清洗,过滤掉可能破坏XML结构的字符(如 <,&),使用cgi.escape或html.escape进行转义。3. 使用XML解析库(如 lxml)来生成回复XML,比字符串拼接更可靠。 |
| 会话上下文丢失 | 1. 会话ID存储失败或读取失败。 2. 会话超时时间设置过短。 3. 多实例部署时,存储未共享。 | 1. 检查Redis/Database连接是否正常,读写操作是否成功。 2. 根据用户使用习惯调整 SESSION_TTL。3. 如果部署了多个服务实例,必须使用共享存储(如中央Redis),不能使用本地内存。 |
| 响应速度慢 | 1. 服务器性能不足或网络延迟高。 2. Dify API调用慢。 3. 未使用流式响应,用户等待最终生成完毕。 | 1. 监控服务器CPU、内存、网络。 2. 检查Dify服务的状态页或联系服务商。 3. 考虑实现异步响应:先快速回复“已收到”,再后台处理并推送结果。这是提升微信端体验的关键。 |
一个关键的调试技巧:在开发初期,可以使用ngrok或localtunnel这类内网穿透工具,将你本地开发机的服务临时暴露到一个公网域名,用于配置微信回调。这能极大简化调试过程,无需每次修改都部署到服务器。
6. 超越基础:探索更多可能性
当你把基础版本跑通后,可以基于这个框架探索更多有趣的方向,让这个“微信AI助手”变得更强大。
1. 多模态交互升级
- 图片理解:微信用户发送图片,你的服务可以先将图片上传到图床或临时存储,获取URL后,将图片URL作为输入的一部分传给Dify(如果Dify工作流支持视觉模型)。或者,先调用OCR服务识别图中文字,再将文字传给Dify。
- 语音交互:处理微信的语音消息。收到语音后,调用微信的语音识别接口(或腾讯云、阿里云的ASR服务)转为文字,再交由Dify处理。回复时,可以调用TTS服务生成语音,通过微信的语音素材接口回复回去。
2. 与企业微信深度集成如果用于企业内部,企业微信是更优选择。
- 群聊机器人:将服务注册为企业微信的群聊机器人。任何群成员@机器人,都能触发Dify工作流。这对于团队知识库问答、数据查询、流程触发等场景非常有用。
- 侧边栏应用:在企业微信工作台创建一个自定义应用,提供更丰富的H5界面,深度集成Dify能力,实现复杂表单、图表展示等。
3. 工作流触发与自动化Dify的核心是工作流。你可以不局限于问答。
- 定时任务:通过微信接收指令,触发Dify中预设的、可能运行时间较长的自动化工作流(如生成日报、爬取数据、训练模型)。Dify执行完毕后,将结果通过微信模板消息推送给用户。
- 事件驱动:将你的服务作为Zapier/Make或国内类似平台的一个Webhook节点。当其他系统发生事件(如GitHub有新提交、CRM有新客户)时,触发你的服务,进而调用Dify工作流进行处理,最后将结果反馈到微信。
4. 用户体验精细化
- 菜单与快捷指令:配置微信公众号的自定义菜单,菜单点击事件可以触发特定的Dify工作流,或跳转到引导页面。例如,“总结网页”菜单,点击后引导用户输入URL。
- 对话引导:在用户初次关注或发送特定指令(如“帮助”)时,返回一个使用指南卡片,介绍机器人的能力和指令格式。
- 支持Markdown/简单富文本:虽然微信原生消息不支持Markdown,但你可以将Dify返回的Markdown进行简单渲染(如将
**加粗**转换为纯文本突出显示,或将列表项前面加•),提升阅读体验。
这个项目的魅力在于,它打开了一扇门,让你能够将日益强大的AI工作流能力,以最低的摩擦系数,注入到十亿用户每天都在使用的沟通工具里。从简单的问答机器人,到复杂的企业内部自动化枢纽,其想象空间完全取决于你在Dify上构建了什么,以及你如何设计这座“桥”。