2026-04-25 18:47:09 +08:00
|
|
|
|
"""
|
2026-05-03 12:36:12 +08:00
|
|
|
|
资讯子图API调用工具(使用MCP统一接口)
|
2026-04-25 18:47:09 +08:00
|
|
|
|
"""
|
|
|
|
|
|
from typing import Dict, Any, Optional, List
|
|
|
|
|
|
import random
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
from ...mcp.mcp_manager import mcp_manager
|
|
|
|
|
|
from ...mcp.adapters import NewsAdapter
|
|
|
|
|
|
|
2026-04-25 18:47:09 +08:00
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class NewsAPIClient:
|
|
|
|
|
|
"""
|
2026-05-03 12:36:12 +08:00
|
|
|
|
资讯API客户端 - 使用MCP统一接口
|
|
|
|
|
|
|
|
|
|
|
|
保持向后兼容,内部使用MCP适配器
|
2026-04-25 18:47:09 +08:00
|
|
|
|
"""
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
# 保留配置字段用于向后兼容
|
2026-04-25 18:47:09 +08:00
|
|
|
|
newsapi_key: Optional[str] = None
|
2026-04-27 17:37:07 +08:00
|
|
|
|
news_repository: Optional[Any] = None
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
def __post_init__(self):
|
2026-05-05 23:17:00 +08:00
|
|
|
|
"""初始化后设置(延迟初始化标志)"""
|
|
|
|
|
|
self._mcp_initialized = False # 延迟初始化标志
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
async def _init_mcp(self):
|
2026-05-05 23:17:00 +08:00
|
|
|
|
"""初始化MCP系统(延迟初始化)"""
|
|
|
|
|
|
if self._mcp_initialized:
|
|
|
|
|
|
return # 已初始化,跳过
|
2026-05-03 12:36:12 +08:00
|
|
|
|
if not mcp_manager.get_adapter("news"):
|
|
|
|
|
|
mcp_manager.register_adapter(
|
|
|
|
|
|
NewsAdapter(news_repo=self.news_repository)
|
2026-04-27 17:37:07 +08:00
|
|
|
|
)
|
2026-05-03 12:36:12 +08:00
|
|
|
|
await mcp_manager.initialize()
|
2026-05-05 23:17:00 +08:00
|
|
|
|
self._mcp_initialized = True
|
2026-05-03 12:36:12 +08:00
|
|
|
|
|
|
|
|
|
|
async def query_news(
|
|
|
|
|
|
self,
|
|
|
|
|
|
user_id: str = "default",
|
|
|
|
|
|
query: str = "",
|
|
|
|
|
|
use_cache: bool = True
|
|
|
|
|
|
) -> List[Dict[str, Any]]:
|
|
|
|
|
|
"""查询新闻(统一入口)"""
|
|
|
|
|
|
await self._init_mcp()
|
|
|
|
|
|
result = await mcp_manager.execute(
|
|
|
|
|
|
"news", "query_news",
|
|
|
|
|
|
user_id=user_id, query=query, use_cache=use_cache
|
|
|
|
|
|
)
|
|
|
|
|
|
if result.success:
|
|
|
|
|
|
return result.data
|
|
|
|
|
|
return self.query_news_mock(query)
|
2026-04-27 17:37:07 +08:00
|
|
|
|
|
2026-04-25 18:47:09 +08:00
|
|
|
|
def query_news_mock(self, query: str) -> List[Dict[str, Any]]:
|
2026-05-03 12:36:12 +08:00
|
|
|
|
"""模拟查询(保留用于向后兼容)"""
|
2026-04-25 18:47:09 +08:00
|
|
|
|
mock_news = [
|
|
|
|
|
|
{
|
|
|
|
|
|
"title": "OpenAI发布GPT-5:智能再升级",
|
|
|
|
|
|
"source": "Tech News",
|
|
|
|
|
|
"summary": "最新消息,OpenAI刚刚发布了GPT-5模型,智能水平再次取得重大突破...",
|
|
|
|
|
|
"keywords": ["AI", "GPT-5", "OpenAI"],
|
|
|
|
|
|
"author": "AI Team",
|
|
|
|
|
|
"published_at": datetime.now().isoformat()
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
"title": "大模型在医疗领域的应用",
|
|
|
|
|
|
"source": "Health Tech",
|
|
|
|
|
|
"summary": "大模型AI技术正在医疗领域展现巨大潜力,从辅助诊断到药物研发...",
|
|
|
|
|
|
"keywords": ["医疗", "大模型", "应用"],
|
|
|
|
|
|
"author": "Medical Team",
|
|
|
|
|
|
"published_at": datetime.now().isoformat()
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
results = []
|
|
|
|
|
|
query_lower = query.lower()
|
|
|
|
|
|
for news in mock_news:
|
|
|
|
|
|
if (query_lower in news["title"].lower() or
|
2026-05-03 12:36:12 +08:00
|
|
|
|
query_lower in news["summary"].lower() or
|
2026-04-25 18:47:09 +08:00
|
|
|
|
any(keyword.lower() in query_lower for keyword in news["keywords"])):
|
|
|
|
|
|
results.append(news)
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
return results if results else mock_news[:2]
|
2026-04-25 18:47:09 +08:00
|
|
|
|
|
|
|
|
|
|
def analyze_url_mock(self, url: str) -> Dict[str, Any]:
|
2026-05-03 12:36:12 +08:00
|
|
|
|
"""模拟URL分析(保留用于向后兼容)"""
|
2026-04-25 18:47:09 +08:00
|
|
|
|
return {
|
|
|
|
|
|
"title": f"分析结果:{url}",
|
|
|
|
|
|
"source": "URL Analyzer",
|
|
|
|
|
|
"summary": "已完成对该URL的内容分析,包含文章摘要和情感倾向判断...",
|
2026-05-03 12:36:12 +08:00
|
|
|
|
"keywords": ["News", "Analysis"]
|
2026-04-25 18:47:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
def extract_keywords_mock(self, text: str) -> List[str]:
|
2026-05-03 12:36:12 +08:00
|
|
|
|
"""模拟关键词提取(保留用于向后兼容)"""
|
|
|
|
|
|
keywords = ["AI", "大模型", "应用场景", "行业趋势", "创新", "技术"]
|
|
|
|
|
|
result = [k for k in keywords if k.lower() in text.lower()]
|
|
|
|
|
|
return result if result else keywords[:4]
|
2026-04-25 18:47:09 +08:00
|
|
|
|
|
|
|
|
|
|
def generate_report_mock(self, query: str) -> str:
|
2026-05-03 12:36:12 +08:00
|
|
|
|
"""模拟报告生成(保留用于向后兼容)"""
|
|
|
|
|
|
return f"""═══════════════════════════════════════════
|
2026-04-25 18:47:09 +08:00
|
|
|
|
📊 资讯分析报告
|
|
|
|
|
|
═══════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
|
|
主题:{query}
|
|
|
|
|
|
|
|
|
|
|
|
📋 摘要:
|
2026-05-03 12:36:12 +08:00
|
|
|
|
这是关于 {query} 的资讯分析综合报告。
|
2026-04-25 18:47:09 +08:00
|
|
|
|
|
|
|
|
|
|
🔍 主要发现:
|
|
|
|
|
|
1. AI技术持续快速发展
|
|
|
|
|
|
2. 大模型应用场景不断拓展
|
|
|
|
|
|
3. 行业数字化转型加速
|
|
|
|
|
|
|
|
|
|
|
|
🏷️ 关键词:
|
|
|
|
|
|
- AI
|
|
|
|
|
|
- 大模型
|
|
|
|
|
|
- 数字化转型
|
|
|
|
|
|
|
|
|
|
|
|
═══════════════════════════════════════════
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-05-03 12:36:12 +08:00
|
|
|
|
# 全局单例(保持向后兼容)
|
2026-04-25 18:47:09 +08:00
|
|
|
|
news_api = NewsAPIClient()
|