news 2026/9/2 7:15:54

使用dify构建微信自动回复Agent

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用dify构建微信自动回复Agent

前言

使用dify、ollama构建微信自动回复。

一、环境介绍

1、微信版本:3.9

2、腾讯服务器4核、8G:安装dify

3、AutoDL:安装ollama、安装qwen2.5:1.5b

4、AutoDL:安装Xinference、bge-large-zh-v1.5、bge-reranker-base

二、dify连接AutoDL安装的大模型

点击右上角我的-设置

在模型供应商-安装大模型供应商下面找到Ollama-点击安装

Ollama配置大模型qwen2.5:1.5b:在ollama右边点击添加模型

三、dify配置bge-large-zh-v1.5、bge-reranker-base

在模型供应商-安装大模型供应商下面找到Xorbits Inference-点击安装

配置:bge-large-zh-v1.5

配置:bge-reranker-base

四、dify创建知识库

1、在AUTODL服务器安装:bge-large-zh-v1.5、bge-reranker-base

2、DIFY创建知识库:知识库-创建知识库-创建空白知识库

3、上次知识内容后,选择:bge-large-zh-v1.5、bge-reranker-base

4、等待知识库创建成功(所有文档右边都打上绿色的勾)

五、dify创建微信回复Agent

1、创建Agent

2、配置Agent

六、微信信息读取与调用Agent回复

1、获取difyAPI

2、配置KEY

3、新建配置文件:.env.wechat

DIFY_BASE_URL = "" DIFY_API_KEY = "" TARGET_CHAT_NAME = "" SELF_SENDER = ""

4、新建header:chat_dify_agent_headers.py

from dotenv import load_dotenv import os load_dotenv(".env.wechat") dify_API_KEY = os.getenv("DIFY_API_KEY") headers = { "Authorization": f"Bearer {dify_API_KEY}", "Content-Type": "application/json" }

5、新建去掉think内容:chat_dify_agent_tags.py

import re def remove_think_tags(text): """ 去除文本中的 <think>...</think> 标签及内容 """ # .*? 表示非贪婪匹配,防止跨越多个标签匹配 pattern = r'<think>.*?</think>' return re.sub(pattern, '', text, flags=re.DOTALL)

6、新建调用dify-Agent:chat_dify_agent.py

import requests import json from dotenv import load_dotenv import os from chat_dify_agent_headers import headers from chat_dify_agent_tags import remove_think_tags load_dotenv(".env.wechat") DIFY_BASE_URL = os.getenv("DIFY_BASE_URL") def dify_agent(query: str, conversation_id: str = None): payload = { "inputs": {}, "query": query, "response_mode": "streaming", "user": "python_user001", } if conversation_id: payload["conversation_id"] = conversation_id resp = requests.post( url=f"{DIFY_BASE_URL}/chat-messages", headers=headers, json=payload, stream=True, timeout=180 ) resp.raise_for_status() answer = "" conv_id = None for line in resp.iter_lines(): if not line: continue raw_text = line.decode("utf-8").removeprefix("data: ") if raw_text.strip() == "[DONE]": break try: event_data = json.loads(raw_text) # 获取会话id if not conv_id and event_data.get("conversation_id"): conv_id = event_data["conversation_id"] # Agent‑V2重点:agent_thought事件保存工具执行结果、回答 if event_data.get("event") == "agent_thought": thought = event_data.get("thought", "") tool = event_data.get("tool", "") tool_input = event_data.get("tool_input","") observation = event_data.get("observation","") # print(f"\n[Agent思考] {thought}") if tool: print(f"[调用工具] {tool} 参数={tool_input} 输出={observation}") answer += thought # 普通message事件 if event_data.get("event") == "message": chunk = event_data.get("answer","") answer += chunk print(chunk, end="") except Exception as e: continue clean_answer = remove_think_tags(answer) print(f"\n[Dify输出] {clean_answer}") return clean_answer, conv_id

7、新建调用微信信息读取回复:we_chat.py

from wxauto import WeChat from dotenv import load_dotenv import os import time from wechat.chat_dify_agent import dify_agent load_dotenv(".env.wechat") TARGET_CHAT_NAME = os.getenv("TARGET_CHAT_NAME") def we_chat_agent(): wx = WeChat() # 2. 先打开聊天窗口,这是后续操作的基础 wx.ChatWith(TARGET_CHAT_NAME) time.sleep(1.5) # 等待窗口加载 # 3. 添加监听 wx.AddListenChat(who=TARGET_CHAT_NAME, savepic=False) # --- 核心修改:彻底清空历史消息 --- print("🔄 正在丢弃启动瞬间的历史消息...") # 使用一个循环,持续获取消息直到返回为空,确保历史消息被完全清空 while wx.GetListenMessage(): time.sleep(0.1) print("✅ 历史消息已清空,开始监听新消息...") # ----------------------------------- print(f"✅ 微信机器人启动,监听好友:{TARGET_CHAT_NAME}") try: while True: # 【修复点】:在每次循环开始时,先初始化一个空的 reply_text 变量 reply_text = "" msgs_dict = wx.GetListenMessage() # 没有新消息,直接跳过本次循环 if not msgs_dict: time.sleep(0.8) continue # 处理新消息 for chat in msgs_dict: who = chat.who # 只处理目标联系人的消息 if who != TARGET_CHAT_NAME: continue one_msgs = msgs_dict.get(chat) for msg in one_msgs: content = msg.content sender = getattr(msg, 'sender', '未知发送者') print(f"发送者={sender}") if sender == "Self": continue msg_type = msg.type # 过滤掉时间消息、图片、视频等非文本内容 if msg_type == "time" or content.strip() in {"[图片]", "[视频]", "[位置]", "[语音]", "[以下为新消息]"}: continue # 过滤掉空消息 if not content: continue # 【核心修复】:如果收到的内容就是机器人刚刚发出去的回复,直接跳过,防止死循环 # 注意:这里用 strip() 去除首尾换行和空格后再比较,更加严谨 if content.strip() == reply_text.strip(): print(f"⚠️ 检测到自身发出的消息,已忽略:{content[:20]}...") continue print(f"\n📩 收到新消息【{who}】:{content}") # 调用Dify并回复 reply_text, conversation_id = dify_agent(content, conversation_id) print(f"🤖 Agent回复:{reply_text}") if reply_text: try: chat.SendMsg(reply_text) print("✅ 微信消息发送完成") except Exception as send_err: print(f"❌ 发送微信消息失败:{send_err}") # 短暂休眠,避免CPU占用过高 time.sleep(0.8) except KeyboardInterrupt: print("\n🛑 程序手动停止") except Exception as e: print(f"\n[程序异常] {e}")

7、结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 7:14:32

Spring Boot鲜牛奶订购系统:从业务建模到并发控制的全流程实战解析

简介&#xff1a;本资源是一套面向计算机专业本科生毕业设计与课程大作业的SpringBoot实战项目——鲜牛奶订购系统&#xff0c;聚焦JavaWeb开发全流程实践&#xff0c;帮助学生快速完成从选题、设计、编码到部署的完整交付。资源包共848个文件&#xff0c;涵盖125个Java核心业务…

作者头像 李华
网站建设 2026/9/2 7:13:31

ThreadLocal内存泄漏根源剖析:从弱引用原理到线程池实战排查

如果你在面试中被问到“ThreadLocal 为什么会导致内存泄漏&#xff1f;如何避免&#xff1f;”&#xff0c;你会怎么回答&#xff1f;是直接背出“因为 ThreadLocalMap 的 Entry 的 key 是弱引用&#xff0c;value 是强引用&#xff0c;如果线程池中的线程不调用 remove&#x…

作者头像 李华
网站建设 2026/9/2 7:13:19

Cadence 小知识(34)---如何设置Allegro自动添加差分信号回流地孔?

目录 01 | 问题介绍 02 | 适用环境 03 | 操作流程 04 | 操作流程 此文章收录于合集&#xff1a;《Cadence 17.4 常用功能实例》 Cadence 完整操作合集&#xff1a;《Cadence学习笔记终章》 01 | 问题介绍 在高速数字电路设计中&#xff0c;当差分信号打孔换层时&#xff…

作者头像 李华
网站建设 2026/9/2 7:08:06

S变换在电压暂降诊断中的时频精解与MATLAB实战

简介&#xff1a;本资源是一份面向电力系统信号分析初学者与电能质量研究者的MATLAB实践代码&#xff0c;聚焦于利用S变换对电压暂降事件进行多维度特征提取。代码可准确识别暂降起止突变点、量化基频分量的幅值与相位跳变&#xff0c;并同步实现谐波成分检测及各频率点对应的瞬…

作者头像 李华
网站建设 2026/9/2 7:07:46

徐州热水器维修上门-欧米到家不加热不点火漏水故障码专业检修

核心导读徐州热水器出现不加热、不点火、忽冷忽热、出水温度低、漏水、显示故障代码、中途熄火、水压正常但没有热水、反复跳闸、噪音异常等问题&#xff0c;通常需要结合机器类型、使用年限、现场水压、电源、燃气供应以及内部零部件状态综合判断&#xff0c;并不是简单更换一…

作者头像 李华
网站建设 2026/9/2 7:06:43

STM32F103程序加密保护实战:从硬件RDP到软件AES的嵌入式安全方案

简介&#xff1a;本资源是一套面向嵌入式开发初学者与进阶工程师的STM32F103程序加密保护综合实验例程&#xff0c;聚焦固件安全防护实践&#xff0c;涵盖Bootloader定制、Flash写保护配置、AES软件加解密集成及时间戳密钥生成等核心场景&#xff0c;适用于工业控制、物联网终端…

作者头像 李华