mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-05-07 03:32:18 +08:00
83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
"""
|
|
Message sending channel abstract class
|
|
"""
|
|
|
|
from bridge.bridge import Bridge
|
|
from bridge.context import Context
|
|
from bridge.reply import *
|
|
from common.log import logger
|
|
from config import conf
|
|
|
|
|
|
class Channel(object):
|
|
channel_type = ""
|
|
NOT_SUPPORT_REPLYTYPE = [ReplyType.VOICE, ReplyType.IMAGE]
|
|
|
|
def startup(self):
|
|
"""
|
|
init channel
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
def stop(self):
|
|
"""
|
|
stop channel gracefully, called before restart
|
|
"""
|
|
pass
|
|
|
|
def handle_text(self, msg):
|
|
"""
|
|
process received msg
|
|
:param msg: message object
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
# 统一的发送函数,每个Channel自行实现,根据reply的type字段发送不同类型的消息
|
|
def send(self, reply: Reply, context: Context):
|
|
"""
|
|
send message to user
|
|
:param msg: message content
|
|
:param receiver: receiver channel account
|
|
:return:
|
|
"""
|
|
raise NotImplementedError
|
|
|
|
def build_reply_content(self, query, context: Context = None) -> Reply:
|
|
"""
|
|
Build reply content, using agent if enabled in config
|
|
"""
|
|
# Check if agent mode is enabled
|
|
use_agent = conf().get("agent", False)
|
|
|
|
if use_agent:
|
|
try:
|
|
logger.info("[Channel] Using agent mode")
|
|
|
|
# Add channel_type to context if not present
|
|
if context and "channel_type" not in context:
|
|
context["channel_type"] = self.channel_type
|
|
|
|
# Read on_event callback injected by the channel (e.g. web SSE)
|
|
on_event = context.get("on_event") if context else None
|
|
|
|
# Use agent bridge to handle the query
|
|
return Bridge().fetch_agent_reply(
|
|
query=query,
|
|
context=context,
|
|
on_event=on_event,
|
|
clear_history=False
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"[Channel] Agent mode failed, fallback to normal mode: {e}")
|
|
# Fallback to normal mode if agent fails
|
|
return Bridge().fetch_reply_content(query, context)
|
|
else:
|
|
# Normal mode
|
|
return Bridge().fetch_reply_content(query, context)
|
|
|
|
def build_voice_to_text(self, voice_file) -> Reply:
|
|
return Bridge().fetch_voice_to_text(voice_file)
|
|
|
|
def build_text_to_voice(self, text) -> Reply:
|
|
return Bridge().fetch_text_to_voice(text)
|