COW chatgpt-on-wechat 项目微信机器人程序运行的语句追踪与事件驱动过程

COW微信机器人项目的运行中我遇到了许多问题,需要理清程序的运行原理和执行过程,下面分享我的总结:

app.py 调用微信渠道 channel.startup() ->
wechat_channel.py 重复运行 itchat.run() -> 修饰函数监听 @itchat.msg_register handler_single_msg handler_group_msg
-> handle_single(msg) handle_group(msg) 列入任务序列 self.produce(context) ->
chat_channel.py threading.Thread(target=self.consume) 定义 produce() -> 取出任务序列 consume() -> self._generate_reply(context) ->
bridge.py 桥接机器人处理程序 fetch_reply_content() -> get_bot(“chat”) -> 创造机器人 create_bot() ->
bot_factory.py 定义 def create_bot(bot_type) ->
chat_gpt_bot.py 调用GPT模型处理函数 ChatGPTBot() -> def reply(self, query, context):

缩进对齐的均为同一程序,运行从上至下执行,每段首为一个程序文件名字,后面为本程序文件调用的函数或定义的函数。

app.py 
start_channel(channel_name) 
def start_channel(channel_name: str):
    channel = channel_factory.create_channel(channel_name)
    PluginManager().load_plugins()    
    channel.startup()

    channel_factory.py 
    def create_channel(channel_type) -> Channel:
        WechatChannel()

    wechat_channel.py
    def startup(self):
        itchat.auto_login()
        itchat.run()

        register.py
        def run(self, debug=True, blockThread=True):
            def reply_fn():
            try:
                while self.alive:
                      self.configured_reply()
        def configured_reply(self):
            ''' determine the type of message and reply if its method is defined
                however, I use a strange way to determine whether a msg is from massive platform
                I haven't found a better solution here
                The main problem I'm worrying about is the mismatching of new friends added on phone
                If you have any good idea, pleeeease report an issue. I will be more than grateful.
            '''
            try:
                # logger.info('msg: %s', msg)
                # print(f"msg: {msg}")
                msg = self.msgList.get(timeout=5)
            except Queue.Empty:
                pass
            else:
                if isinstance(msg['User'], templates.User):
                    replyFn = self.functionDict['FriendChat'].get(msg['Type'])
                if replyFn is None:
                    r = None
                else:
                    try:
                        r = replyFn(msg)
                        if r is not None:
                            self.send(r, msg.get('FromUserName'))
            
            queue.py
            def get(self, block=True, timeout=None):
                item = self._get()
            
            messagequeue.py
            def __getitem__(self, value):
                return super(Message, self).__getitem__(value)

            register.py
            def msg_register(self, msgType, isFriendChat=False, isGroupChat=False, isMpChat=False):
                ''' a decorator constructor
                    return a specific decorator based on information given '''
                if not (isinstance(msgType, list) or isinstance(msgType, tuple)):
                    msgType = [msgType]
                def _msg_register(fn):
                    for _msgType in msgType:
                        if isFriendChat:
                            self.functionDict['FriendChat'][_msgType] = fn
                    return fn
                return _msg_register

            wechat_channel.py            
            @itchat.msg_register([TEXT, VOICE, PICTURE, NOTE, ATTACHMENT, SHARING])
            def handler_single_msg(msg):
                try:
                    cmsg = WechatMessage(msg, False)
                except NotImplementedError as e:
                    logger.debug("[WX]single message {} skipped: {}".format(msg["MsgId"], e))
                    return None
                WechatChannel().handle_single(cmsg)
                return None 
            def handler_single_msg(msg):
                cmsg = WechatMessage(msg, False)
                WechatChannel().handle_single(cmsg)
            class WechatChannel(ChatChannel):
                def handle_single(self, cmsg: ChatMessage):
                    self.produce(context) 
    
            wechat_message.py
            class WechatMessage(ChatMessage):
            def __init__(self, itchat_msg, is_group=False):
                super().__init__(itchat_msg)
                self.msg_id = itchat_msg["MsgId"]
                self.create_time = itchat_msg["CreateTime"]
                self.is_group = is_group
                if itchat_msg["Type"] == TEXT:
                    self.ctype = ContextType.TEXT
                    self.content = itchat_msg["Text"]
                    
                    chat_channel.py
                    class ChatChannel(Channel):
                        def __init__(self):
                            _thread = threading.Thread(target=self.consume)
                        def produce(self, context: Context):
                            self.sessions[session_id][0].put(context)
                        def consume(self):
                            self.sessions[session_id][0].put(context)
                            future: Future = handler_pool.submit(self._handle, context)
                            def _handle(self, context: Context):
                                reply = self._generate_reply(context)
                                reply = self._decorate_reply(context, reply)
                                # reply的发送步骤
                                self._send_reply(context, reply)
                                def _generate_reply(self, context: Context, reply: Reply = Reply()) -> Reply:
                                    reply = super().build_reply_content(context.content, context)
                                    def build_reply_content(self, query, context: Context = None) -> Reply:
                                        return Bridge().fetch_reply_content(query, context)
                 
                                        bridge.py
                                        def fetch_reply_content(self, query, context: Context) -> Reply:
                                            return self.get_bot("chat").reply(query, context)
                                                def get_bot(self, typename):
                                                    self.bots[typename] = create_bot(self.btype[typename])

                                                    bot_factory.py
                                                    def create_bot(bot_type):
                                                        ChatGPTBot()
                                                        OpenAIBot()

                                                        chat_gpt_bot.py
                                                        class ChatGPTBot(Bot, OpenAIImage):
                                                        def __init__(self):
                                                            self.sessions = SessionManager(ChatGPTSession, model=conf().get("model") or "gpt-3.5-turbo")
                                                            self.args = {
                                                                "model": conf().get("model") or "gpt-3.5-turbo",  # 对话模型的名称
                                                                "temperature": conf().get("temperature", 0.9),  # 值在[0,1]之间,越大表示回复越具有不确定性
                                                                # "max_tokens":4096,  # 回复最大的字符数
                                                                "top_p": conf().get("top_p", 1),
                                                                "frequency_penalty": conf().get("frequency_penalty", 0.0),  # [-2,2]之间,该值越大则更倾向于产生不同的内容
                                                                "presence_penalty": conf().get("presence_penalty", 0.0),  # [-2,2]之间,该值越大则更倾向于产生不同的内容
                                                                "request_timeout": conf().get("request_timeout", None),  # 请求超时时间,openai接口默认设置为600,对于难问题一般需要较长时间
                                                                "timeout": conf().get("request_timeout", None),  # 重试超时时间,在这个时间内,将会自动重试
                                                            }
                                                        def reply(self, query, context=None):
                                                            reply_content = self.reply_text(session, api_key, args=new_args)
                                                            self.sessions.session_reply(reply_content["content"], session_id, reply_content["total_tokens"])
                                                            reply = Reply(ReplyType.TEXT, reply_content["content"])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768787.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

235、二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自…

今天的A股,让人惊愕了,2个耐人寻味的重要信号,有望迎来下一个超级风口!

今天的A股,让人惊愕了,你知道是为什么吗?盘面上出现2个耐人寻味的重要信号,有望迎来下一个超级风口! 1、今天两市低开低走,但大消费劲头十足,连中免这样的大体量都涨停了,另外消费茅…

Rocky Linux 9 系统OpenSSH CVE-2024-6387 漏洞修复

Rocky Linux 9系统 OpenSSH CVE-2024-6387 漏洞修复 1、漏洞修复2、修复思路3、修复方案3.1、方案一3.2、方案二 4、总结5、参考 1、漏洞修复 CVE-2024-6387:regreSSHion:OpenSSH 服务器中的远程代码执行(RCE),至少在…

电脑免费压缩软件app哪个好?Top15压缩软件良心测评,图文详解!

你是否在寻找一款能够帮助你释放电脑存储空间的免费压缩软件app呢?在当今数字化生活中,文件和媒体内容日益增多,而硬盘空间却总是显得不够用。优秀的压缩工具不仅能节省空间,还能提升系统效率,让你的电脑运行更加流畅。…

Linux源码阅读笔记12-RCU案例分析

在之前的文章中我们已经了解了RCU机制的原理和Linux的内核源码,这里我们要根据RCU机制写一个demo来展示他应该如何使用。 RCU机制的原理 RCU(全称为Read-Copy-Update),它记录所有指向共享数据的指针的使用者,当要修改构想数据时&…

DDR3(一)

目录 1 SDRAM1.1 同步动态随机存储器1.2 位宽1.3 SDRAM结构1.4 SDRAM引脚图 2 SDRAM操作指令2.1 读写指令2.2 刷新和预充电2.3 配置模式寄存器2.4 读/写突发2.5 数据屏蔽 SDRAM是DDR3的基础,在学习DDR3之前,我们先来学习一下SDRAM的相关知识。 1 SDRAM …

公网IP变更自动微信通知与远程执行命令的C++开源软件

基本功能 智能公网IP变更监测与微信通知 一旦检测到公网IP地址发生变更,系统将自动通过预设的QQ邮箱(该邮箱与微信绑定,实现微信通知)发送新IP地址通知。同时,软件会即时更新本地配置文件中的IP地址及变更时间&#…

vscode插件的开发过程记录(一)

前言 本文是关于visual studio code软件上自定义插件的开发记录,将从头记录本人开发的过程,虽然网上也有很多文章,但个人在实践的过程还是会遇到不一样的问题,所以记录下来,以便于后期参考。 前期准备: 1、…

Xilinx FPGA:vivado实现乒乓缓存

一、项目要求 1、用两个伪双端口的RAM实现缓存 2、先写buffer1,再写buffer2 ,在读buffer1的同时写buffer2,在读buffer2的同时写buffer1。 3、写端口50M时钟,写入16个8bit 的数据,读出时钟25M,读出8个16…

William Yang:从区块链先锋到艺术平台创始人

在区块链技术和加密货币市场飞速发展的今天,William Yang无疑是这一领域的佼佼者。他不仅在学术和媒体领域取得了显著成就,更在创业之路上不断探索,成为了业内知名的KOL(关键意见领袖)。今天,我们有幸采访到…

视频监控汇聚和融合平台的特点、功能、接入方式、应用场景

目录 一、产品概述 二、主要特点 1、多协议支持 2、高度集成与兼容性 3、高性能与可扩展性 4、智能化分析 5、安全可靠 三、功能概述 1. 视频接入与汇聚 2. 视频存储与回放 3. 实时监控与预警 4. 信息共享与联动 5. 远程管理与控制 四、接入方式 1、直接接入 2…

使用CubeIDE调试项目现stm32 no source available for “main() at 0x800337c:

使用CubeIDE调试项目现stm32 no source available for "main() at 0x800337c: 问题描述 使用CubeIDE编译工程代码和下载都没有任何问题,点击Debug调试工程时,出现stm32 no source available for "main() at 0x800337c 原因分析&a…

[leetcode hot 150]第四百五十二题,用最少数量的箭引爆气球

题目: 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。…

快速入门FreeRTOS心得(正点原子学习版)

对于FreeROTS,我第一反应想到的就是通信里的TDM(时分多址)。不同任务给予分配不同的时间间隔,也就是任务之间在每个timeslot都在来回切换。 这里有重要的一点,就是中断要短小,优先级是自高到底进行打断。 …

204.贪心算法:分发饼干(力扣)

以下来源于代码随想录 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {// 对孩子的胃口进行排序sort(g.begin(), g.end());// 对饼干的尺寸进行排序sort(s.begin(), s.end());int index s.size() - 1; // 从最大的饼…

大数据招商的应用场景及实施路径有哪些?

当下&#xff0c;我国已经进入数字经济与实体经济融合发展的新阶段&#xff0c;数字技术和数字化转型落地日臻成熟&#xff0c;数据要素价值释放深入到了我国各个领域的发展&#xff0c;招商引资也不例外&#xff0c;在传统招商模式效果日渐甚微的大环境下&#xff0c;大数据招…

面试题 4:阐述以下方法 @classmethod, @staticmethod, @property?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

数据大小端问题

文章目录 大小端前言函数引用(接下来使用此函数对高低位进行切换)先看截取的对于大小端的定义大小端数据的直观理解[重点] 对uchar数组进行取操作定义一个uint8_t的数组观察起内部内存尝试使用uint32_t 每次区 1、2、3、4byte数据 提升经过上面的介绍一定对大小端有了一定的了解…

2.3 主程序和外部IO交互 (文件映射方式)----IO Server实现

2.3 主程序和外部IO交互 &#xff08;文件映射方式&#xff09;----IO Server C实现 效果显示 1 内存共享概念 基本原理&#xff1a;以页面为单位&#xff0c;将一个普通文件映射到内存中&#xff0c;达到共享内存和节约内存的目的&#xff0c;通常在需要对文件进行频繁读写时…

基于OpenMV识别数字及程序说明

OpenMV简介 OpenMV是一个开源、低成本且功能强大的机器视觉模块。它基于STM32F427CPU&#xff0c;集成了OV7725摄像头芯片&#xff0c;能在小巧的硬件模块上&#xff0c;用C语言高效地实现核心机器视觉算法&#xff0c;并提供了Python编程接口&#xff0c;使得图像处理的复杂度…