Explorar o código

Merge branch 'master' into dev-xym-add-test-task

xueyiming hai 14 horas
pai
achega
f94970d60a

+ 2 - 2
pqai_agent/agents/message_push_agent.py

@@ -5,7 +5,7 @@ from pqai_agent.chat_service import VOLCENGINE_MODEL_DEEPSEEK_V3
 from pqai_agent.logging import logger
 from pqai_agent.toolkit.function_tool import FunctionTool
 from pqai_agent.toolkit.image_describer import ImageDescriber
-from pqai_agent.toolkit.message_notifier import MessageNotifier
+from pqai_agent.toolkit.message_toolit import MessageToolkit
 
 DEFAULT_SYSTEM_PROMPT = '''
 <基本设定>
@@ -128,7 +128,7 @@ class MessagePushAgent(MultiModalChatAgent):
         if tools is None:
             tools = [
                 *ImageDescriber().get_tools(),
-                *MessageNotifier().get_tools()
+                *MessageToolkit().get_tools()
             ]
         super().__init__(model, system_prompt, tools, generate_cfg, max_run_step)
 

+ 2 - 2
pqai_agent/agents/message_reply_agent.py

@@ -5,7 +5,7 @@ from pqai_agent.chat_service import VOLCENGINE_MODEL_DEEPSEEK_V3
 from pqai_agent.logging import logger
 from pqai_agent.toolkit.function_tool import FunctionTool
 from pqai_agent.toolkit.image_describer import ImageDescriber
-from pqai_agent.toolkit.message_notifier import MessageNotifier
+from pqai_agent.toolkit.message_toolit import MessageToolkit
 
 DEFAULT_SYSTEM_PROMPT = '''
 <基本设定>
@@ -94,7 +94,7 @@ class MessageReplyAgent(MultiModalChatAgent):
         if tools is None:
             tools = [
                 *ImageDescriber().get_tools(),
-                *MessageNotifier().get_tools()
+                *MessageToolkit().get_tools()
             ]
         super().__init__(model, system_prompt, tools, generate_cfg, max_run_step)
 

+ 2 - 2
pqai_agent/agents/multimodal_chat_agent.py

@@ -8,7 +8,7 @@ from pqai_agent.logging import logger
 from pqai_agent.mq_message import MessageType
 from pqai_agent.toolkit import get_tool
 from pqai_agent.toolkit.function_tool import FunctionTool
-from pqai_agent.toolkit.message_notifier import MessageNotifier
+from pqai_agent.toolkit.message_toolit import MessageToolkit
 
 
 class MultiModalChatAgent(SimpleOpenAICompatibleChatAgent):
@@ -38,7 +38,7 @@ class MultiModalChatAgent(SimpleOpenAICompatibleChatAgent):
         self.run(query)
         result = []
         for tool_call in self.tool_call_records:
-            if tool_call['name'] == MessageNotifier.output_multimodal_message.__name__:
+            if tool_call['name'] == MessageToolkit.output_multimodal_message.__name__:
                 result.append(tool_call['arguments']['message'])
         return result
 

+ 22 - 0
pqai_agent/clients/hot_topic_client.py

@@ -0,0 +1,22 @@
+import time
+from pqai_agent.toolkit.hot_topic_toolkit import HotTopicToolkit
+
+class HotTopicClient:
+    def __init__(self):
+        self._cache = None
+        self._cache_time = 0
+        self._cache_ttl = 300  # 5分钟
+        self._toolkit = HotTopicToolkit()
+
+    def get_hot_topics(self):
+        now = time.time()
+        if self._cache and (now - self._cache_time) < self._cache_ttl:
+            return self._cache
+        topics = self._toolkit.get_hot_topics()
+        self._cache = topics
+        self._cache_time = now
+        return topics
+
+# 全局可用实例
+hot_topic_client = HotTopicClient()
+

+ 3 - 0
pqai_agent/dialogue_manager.py

@@ -1,6 +1,7 @@
 #! /usr/bin/env python
 # -*- coding: utf-8 -*-
 # vim:fenc=utf-8
+import json
 import random
 from enum import Enum
 from typing import Dict, List, Optional, Tuple, Any
@@ -14,6 +15,7 @@ import cozepy
 from sqlalchemy.orm import sessionmaker, Session
 
 from pqai_agent import configs
+from pqai_agent.clients.hot_topic_client import hot_topic_client
 from pqai_agent.clients.relation_stage_client import RelationStageClient
 from pqai_agent.data_models.agent_push_record import AgentPushRecord
 from pqai_agent.logging import logger
@@ -572,6 +574,7 @@ class DialogueManager:
             "relation_stage": self.relation_stage,
             "formatted_staff_profile": prompt_utils.format_agent_profile_v2(self.staff_profile),
             "formatted_user_profile": prompt_utils.format_user_profile(self.user_profile),
+            "hot_topics": json.dumps(hot_topic_client.get_hot_topics(), indent=2, ensure_ascii=False),
             **self.user_profile,
             **legacy_staff_profile
         }

+ 2 - 1
pqai_agent/toolkit/__init__.py

@@ -4,9 +4,10 @@ from typing import Sequence, List
 from pqai_agent.logging import logger
 from pqai_agent.toolkit.tool_registry import ToolRegistry
 from pqai_agent.toolkit.image_describer import ImageDescriber
-from pqai_agent.toolkit.message_notifier import MessageNotifier
+from pqai_agent.toolkit.message_toolit import MessageToolkit
 from pqai_agent.toolkit.pq_video_searcher import PQVideoSearcher
 from pqai_agent.toolkit.search_toolkit import SearchToolkit
+from pqai_agent.toolkit.hot_topic_toolkit import HotTopicToolkit
 
 global_tool_map = ToolRegistry.tool_map
 

+ 40 - 0
pqai_agent/toolkit/hot_topic_toolkit.py

@@ -0,0 +1,40 @@
+from typing import List, Dict, Any
+import requests
+
+from pqai_agent.logging import logger
+from pqai_agent.toolkit.base import BaseToolkit
+from pqai_agent.toolkit.function_tool import FunctionTool
+from pqai_agent.toolkit.tool_registry import register_toolkit
+
+
+@register_toolkit
+class HotTopicToolkit(BaseToolkit):
+    def get_hot_topics(self) -> List[Dict[str, Any]]:
+        """
+        获取热点内容列表
+        Returns:
+            List[Dict[str, Any]]: [{'title': ..., 'url': ...}, ...]
+        """
+        url = "http://ai-wechat-hook-internal.piaoquantv.com/hotTopic/getHotContent"
+        try:
+            resp = requests.get(url, timeout=5)
+            resp.raise_for_status()
+            data = resp.json()
+            if data.get("code") == 0 and data.get("success"):
+                result = []
+                for item in data.get("data", []):
+                    if item.get("title") and item.get("url"):
+                        result.append({
+                            "title": item.get("title"),
+                            "url": item.get("url")
+                        })
+                return result
+            else:
+                logger.error(f"Failed to fetch hot topics: {data.get('msg', 'Unknown error')}")
+                return []
+        except Exception as e:
+            logger.error(f"Error in fetching hot topics: {e}")
+            return []
+
+    def get_tools(self) -> List[FunctionTool]:
+        return [FunctionTool(self.get_hot_topics)]

+ 1 - 1
pqai_agent/toolkit/message_notifier.py → pqai_agent/toolkit/message_toolit.py

@@ -7,7 +7,7 @@ from pqai_agent.toolkit.tool_registry import register_toolkit
 
 
 @register_toolkit
-class MessageNotifier(BaseToolkit):
+class MessageToolkit(BaseToolkit):
     def __init__(self):
         super().__init__()
 

+ 28 - 16
pqai_agent_server/api_server.py

@@ -496,25 +496,37 @@ def delete_native_agent_configuration():
 @app.route("/api/getModuleList", methods=["GET"])
 def get_module_list():
     """
-    获取所有的模块列表
+    获取所有的模块列表,支持分页查询
     :return:
     """
+    page = request.args.get('page', 1)
+    page_size = request.args.get('page_size', 50)
+    try:
+        page = int(page)
+        page_size = int(page_size)
+    except Exception as e:
+        return wrap_response(400, msg="Invalid parameter: {}".format(e))
+
+    offset = (page - 1) * page_size
     with app.session_maker() as session:
-        query = session.query(ServiceModule) \
-            .filter(ServiceModule.is_delete == 0)
-        data = query.all()
-    ret_data = [
-        {
-            'id': module.id,
-            'name': module.name,
-            'display_name': module.display_name,
-            'default_agent_type': module.default_agent_type,
-            'default_agent_id': module.default_agent_id,
-            'create_time': module.create_time.strftime('%Y-%m-%d %H:%M:%S'),
-            'update_time': module.update_time.strftime('%Y-%m-%d %H:%M:%S')
-        }
-        for module in data
-    ]
+        query = session.query(ServiceModule).filter(ServiceModule.is_delete == 0)
+        total = query.count()
+        modules = query.offset(offset).limit(page_size).all()
+    ret_data = {
+        'total': total,
+        'module_list': [
+            {
+                'id': module.id,
+                'name': module.name,
+                'display_name': module.display_name,
+                'default_agent_type': module.default_agent_type,
+                'default_agent_id': module.default_agent_id,
+                'create_time': module.create_time.strftime('%Y-%m-%d %H:%M:%S'),
+                'update_time': module.update_time.strftime('%Y-%m-%d %H:%M:%S')
+            }
+            for module in modules
+        ]
+    }
     return wrap_response(200, data=ret_data)
 
 @app.route("/api/getModuleConfiguration", methods=["GET"])