Files
ailine/backend/app/subgraphs/news_analysis/api_client.py

129 lines
4.5 KiB
Python
Raw Normal View History

"""
资讯子图API调用工具使用MCP统一接口
"""
from typing import Dict, Any, Optional, List
import random
from datetime import datetime
from dataclasses import dataclass
from ...mcp.mcp_manager import mcp_manager
from ...mcp.adapters import NewsAdapter
@dataclass
class NewsAPIClient:
"""
资讯API客户端 - 使用MCP统一接口
保持向后兼容内部使用MCP适配器
"""
# 保留配置字段用于向后兼容
newsapi_key: Optional[str] = None
news_repository: Optional[Any] = None
def __post_init__(self):
2026-05-05 23:17:00 +08:00
"""初始化后设置(延迟初始化标志)"""
self._mcp_initialized = False # 延迟初始化标志
async def _init_mcp(self):
2026-05-05 23:17:00 +08:00
"""初始化MCP系统延迟初始化"""
if self._mcp_initialized:
return # 已初始化,跳过
if not mcp_manager.get_adapter("news"):
mcp_manager.register_adapter(
NewsAdapter(news_repo=self.news_repository)
)
await mcp_manager.initialize()
2026-05-05 23:17:00 +08:00
self._mcp_initialized = True
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)
def query_news_mock(self, query: str) -> List[Dict[str, Any]]:
"""模拟查询(保留用于向后兼容)"""
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
query_lower in news["summary"].lower() or
any(keyword.lower() in query_lower for keyword in news["keywords"])):
results.append(news)
return results if results else mock_news[:2]
def analyze_url_mock(self, url: str) -> Dict[str, Any]:
"""模拟URL分析保留用于向后兼容"""
return {
"title": f"分析结果:{url}",
"source": "URL Analyzer",
"summary": "已完成对该URL的内容分析包含文章摘要和情感倾向判断...",
"keywords": ["News", "Analysis"]
}
def extract_keywords_mock(self, text: str) -> List[str]:
"""模拟关键词提取(保留用于向后兼容)"""
keywords = ["AI", "大模型", "应用场景", "行业趋势", "创新", "技术"]
result = [k for k in keywords if k.lower() in text.lower()]
return result if result else keywords[:4]
def generate_report_mock(self, query: str) -> str:
"""模拟报告生成(保留用于向后兼容)"""
return f"""═══════════════════════════════════════════
📊 资讯分析报告
主题{query}
📋 摘要
这是关于 {query} 的资讯分析综合报告
🔍 主要发现
1. AI技术持续快速发展
2. 大模型应用场景不断拓展
3. 行业数字化转型加速
🏷 关键词
- AI
- 大模型
- 数字化转型
"""
# 全局单例(保持向后兼容)
news_api = NewsAPIClient()