Преглед изворни кода

Merge branch 'feature/20250626-add-msg-types' of Server/AgentCoreService into master

fengzhoutian пре 5 дана
родитељ
комит
2baf26ae17
3 измењених фајлова са 35 додато и 17 уклоњено
  1. 10 3
      pqai_agent/agent_service.py
  2. 10 3
      pqai_agent/mq_message.py
  3. 15 11
      pqai_agent/toolkit/message_toolkit.py

+ 10 - 3
pqai_agent/agent_service.py

@@ -358,17 +358,24 @@ class AgentService:
     def send_multimodal_response(self, staff_id, user_id, response: Dict, skip_check=False):
         message_type = response["type"]
         logger.warning(f"staff[{staff_id}] user[{user_id}]: response[{message_type}] {response}")
-        if message_type not in (MessageType.TEXT, MessageType.IMAGE_QW, MessageType.VOICE):
+        if message_type not in (MessageType.TEXT, MessageType.IMAGE_QW, MessageType.VOICE,
+                                MessageType.LINK, MessageType.MINI_PROGRAM):
             logger.error(f"staff[{staff_id}] user[{user_id}]: unsupported message type {message_type}")
             return
         if not skip_check and not self.can_send_to_user(staff_id, user_id):
             return
         current_ts = int(time.time() * 1000)
         self.send_rate_limiter.wait_for_sending(staff_id, response)
+        # FIXME: 小程序相关的字段
         self.send_queue.produce(
-            MqMessage.build(message_type, MessageChannel.CORP_WECHAT,
-                            staff_id, user_id, response["content"], current_ts)
+            MqMessage(type=message_type, channel=MessageChannel.CORP_WECHAT,
+                      sender=staff_id, receiver=user_id, content=response["content"], sendTime=current_ts,
+                      desc=response.get("desc"), title=response.get("title"),
+                      appIconUrl=None, pagePath=response.get("content"),
+                      coverImage=response.get("cover_url"), appOrgId=None,
+                      appId=None)
         )
+        print(self.send_queue.consume())
 
     def _route_to_human_intervention(self, user_id: str, origin_message: MqMessage):
         """路由到人工干预"""

+ 10 - 3
pqai_agent/mq_message.py

@@ -107,6 +107,14 @@ class MqMessage(BaseModel):
      senderUnionId: Optional[str] = None
      receiver: str
      content: Optional[str] = None
+     desc: Optional[str] = None
+     title: Optional[str] = None
+     appIconUrl: Optional[str] = None
+     pagePath: Optional[str] = None
+     coverImage: Optional[str] = None
+     appOrgId: Optional[str] = None
+     appId: Optional[str] = None
+
      # 由于需要和其它语言如Java进行序列化和反序列化交互,因此使用camelCase命名法
      sendTime: int
      refMsgId: Optional[int] = None
@@ -127,9 +135,8 @@ class MqMessage(BaseModel):
          )
 
      def to_json(self):
-         return self.model_dump_json(include={
-             "msgId", "type", "channel", "sender", "senderUnionId",
-             "receiver", "content", "sendTime", "refMsgId"
+         return self.model_dump_json(exclude={
+             "_rmq_message",
          })
 
      @staticmethod

+ 15 - 11
pqai_agent/toolkit/message_toolkit.py

@@ -27,24 +27,28 @@ class MessageToolkit(BaseToolkit):
         """Outputs a multimodal message to the user.
         Message schema:
         {
-            "type": "text|image|gif|video|mini_program",
-            "content": "message content",
-            "title": "only needed if type is video or mini_program",
-            "cover_image": "only needed if type is mini_program",
+            "type": "text|image|gif|video|mini_program|link",
+            "content": "text message content or url of the media",
+            "title": "only needed if type in: video, link, mini_program",
+            "cover_url": "cover image url, only needed if type in: mini_program",
+            "desc": "description, optional if type in: link"
         }
-        if message type is image, gif, video or mini_program, the content should be a URL.
+        if message type is image, gif, video, link or mini_program, the content should be a URL.
 
         Args:
             message (Dict[str, str]): The message to output.
         Returns:
             str: A confirmation message.
         """
-        if message["type"] not in ["text", "image", "gif", "video", "mini_program"]:
-            return f"Invalid message type: {message['type']}"
-        if message["type"] in ("video", "mini_program") and "title" not in message:
-            return "Title is required for video or mini_program messages."
-        if message["type"] == "mini_program" and "cover_image" not in message:
-            return "Cover image is required for mini_program messages."
+        msg_type = message.get("type", "")
+        if msg_type not in ["text", "image", "gif", "video", "mini_program", "link"]:
+            return f"Invalid message type: {msg_type}"
+        if msg_type in ("video", "mini_program", "link") and "title" not in message:
+            return f"Title is required for [{msg_type}] messages."
+        if msg_type in ("mini_program", ) and "cover_url" not in message:
+            return f"Cover image URL is required for [{msg_type}] messages."
+        # if msg_type in ("link", ) and "desc" not in message:
+        #     return f"Description is required for [link] messages."
         logger.info(f"Multimodal message to user: {message}")
         return 'success'