208 lines
5.5 KiB
Python
208 lines
5.5 KiB
Python
|
|
"""
|
|||
|
|
资讯子图节点
|
|||
|
|
News Analysis Subgraph Nodes
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from typing import Dict, Any
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
from .state import (
|
|||
|
|
NewsAnalysisState,
|
|||
|
|
NewsAction,
|
|||
|
|
NewsItem,
|
|||
|
|
NewsSource
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def parse_intent(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
解析用户意图节点
|
|||
|
|
确定用户想做什么操作
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "intent_parsing"
|
|||
|
|
|
|||
|
|
query_lower = state.user_query.lower()
|
|||
|
|
|
|||
|
|
# 简单的关键词匹配
|
|||
|
|
if any(keyword in query_lower for keyword in ["资讯", "新闻", "news", "report"]):
|
|||
|
|
state.action = NewsAction.QUERY_NEWS
|
|||
|
|
|
|||
|
|
elif any(keyword in query_lower for keyword in ["分析", "analyze", "url", "链接"]):
|
|||
|
|
state.action = NewsAction.ANALYZE_URL
|
|||
|
|
|
|||
|
|
elif any(keyword in query_lower for keyword in ["关键词", "keyword", "提取"]):
|
|||
|
|
state.action = NewsAction.EXTRACT_KEYWORDS
|
|||
|
|
|
|||
|
|
elif any(keyword in query_lower for keyword in ["报告", "生成", "generate"]):
|
|||
|
|
state.action = NewsAction.GENERATE_REPORT
|
|||
|
|
|
|||
|
|
else:
|
|||
|
|
# 默认查询资讯
|
|||
|
|
state.action = NewsAction.QUERY_NEWS
|
|||
|
|
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def query_news(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
查询资讯节点
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "querying_news"
|
|||
|
|
|
|||
|
|
# TODO: 调用资讯API或爬取
|
|||
|
|
query = state.user_query
|
|||
|
|
|
|||
|
|
# 模拟返回结果
|
|||
|
|
state.news_items = [
|
|||
|
|
NewsItem(
|
|||
|
|
title=f"关于 {query} 的资讯1",
|
|||
|
|
source="Tech News",
|
|||
|
|
summary="这是一条关于人工智能的资讯摘要...",
|
|||
|
|
keywords=[query, "AI", "Technology"]
|
|||
|
|
),
|
|||
|
|
NewsItem(
|
|||
|
|
title=f"关于 {query} 的资讯2",
|
|||
|
|
source="Business Daily",
|
|||
|
|
summary="行业动态:AI在商业中的应用...",
|
|||
|
|
keywords=[query, "Business", "Innovation"]
|
|||
|
|
)
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
state.success = True
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def analyze_url(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
分析资讯URL节点
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "analyzing_url"
|
|||
|
|
|
|||
|
|
# TODO: 调用URL分析API
|
|||
|
|
urls = state.custom_urls or [state.action_params.get("url", "")]
|
|||
|
|
|
|||
|
|
# 模拟返回结果
|
|||
|
|
for url in urls:
|
|||
|
|
if url:
|
|||
|
|
state.news_items.append(
|
|||
|
|
NewsItem(
|
|||
|
|
title=f"分析结果:{url}",
|
|||
|
|
source="URL Analyzer",
|
|||
|
|
summary="已完成对该URL的内容分析...",
|
|||
|
|
keywords=["News", "Analysis"]
|
|||
|
|
)
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
state.success = True
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def extract_keywords(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
提取关键词节点
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "extracting_keywords"
|
|||
|
|
|
|||
|
|
# TODO: 调用关键词提取API
|
|||
|
|
text = state.user_query
|
|||
|
|
|
|||
|
|
# 模拟返回结果
|
|||
|
|
state.extracted_keywords = ["AI", "大模型", "应用场景", "行业趋势"]
|
|||
|
|
|
|||
|
|
state.success = True
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def generate_report(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
生成报告节点
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "generating_report"
|
|||
|
|
|
|||
|
|
# TODO: 生成完整报告
|
|||
|
|
query = state.user_query
|
|||
|
|
|
|||
|
|
report = f"""📊 资讯分析报告
|
|||
|
|
|
|||
|
|
主题:{query}
|
|||
|
|
|
|||
|
|
📋 摘要:
|
|||
|
|
这是一份关于 {query} 的资讯分析综合报告,包含最新行业动态和趋势分析。
|
|||
|
|
|
|||
|
|
🔍 主要发现:
|
|||
|
|
1. AI技术持续快速发展
|
|||
|
|
2. 大模型应用场景不断拓展
|
|||
|
|
3. 行业数字化转型加速
|
|||
|
|
|
|||
|
|
🏷️ 关键词:
|
|||
|
|
- AI
|
|||
|
|
- 大模型
|
|||
|
|
- 数字化转型
|
|||
|
|
- 创新
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
state.report_content = report
|
|||
|
|
state.success = True
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def format_result(state: NewsAnalysisState) -> NewsAnalysisState:
|
|||
|
|
"""
|
|||
|
|
格式化结果节点
|
|||
|
|
"""
|
|||
|
|
state.current_phase = "formatting"
|
|||
|
|
|
|||
|
|
if state.action == NewsAction.QUERY_NEWS and state.news_items:
|
|||
|
|
result = "📰 最新资讯\n\n"
|
|||
|
|
for i, item in enumerate(state.news_items, 1):
|
|||
|
|
result += f"{i}. {item.title}\n"
|
|||
|
|
result += f" 来源:{item.source}\n"
|
|||
|
|
result += f" 摘要:{item.summary}\n\n"
|
|||
|
|
|
|||
|
|
state.final_result = result
|
|||
|
|
|
|||
|
|
elif state.action == NewsAction.ANALYZE_URL and state.news_items:
|
|||
|
|
result = "🔍 资讯分析结果\n\n"
|
|||
|
|
for i, item in enumerate(state.news_items, 1):
|
|||
|
|
result += f"{i}. {item.title}\n"
|
|||
|
|
result += f" {item.summary}\n\n"
|
|||
|
|
|
|||
|
|
state.final_result = result
|
|||
|
|
|
|||
|
|
elif state.action == NewsAction.EXTRACT_KEYWORDS and state.extracted_keywords:
|
|||
|
|
result = "🏷️ 提取的关键词\n\n"
|
|||
|
|
result += ", ".join(state.extracted_keywords)
|
|||
|
|
state.final_result = result
|
|||
|
|
|
|||
|
|
elif state.action == NewsAction.GENERATE_REPORT and state.report_content:
|
|||
|
|
state.final_result = state.report_content
|
|||
|
|
|
|||
|
|
else:
|
|||
|
|
if not state.final_result:
|
|||
|
|
state.final_result = "资讯操作完成"
|
|||
|
|
|
|||
|
|
state.current_phase = "done"
|
|||
|
|
return state
|
|||
|
|
|
|||
|
|
|
|||
|
|
def should_continue(state: NewsAnalysisState) -> str:
|
|||
|
|
"""
|
|||
|
|
条件路由:决定下一步该做什么
|
|||
|
|
"""
|
|||
|
|
if state.error_message:
|
|||
|
|
return "format_result"
|
|||
|
|
|
|||
|
|
# 根据action路由
|
|||
|
|
if state.action == NewsAction.NONE:
|
|||
|
|
return "parse_intent"
|
|||
|
|
elif state.action == NewsAction.QUERY_NEWS:
|
|||
|
|
return "query_news"
|
|||
|
|
elif state.action == NewsAction.ANALYZE_URL:
|
|||
|
|
return "analyze_url"
|
|||
|
|
elif state.action == NewsAction.EXTRACT_KEYWORDS:
|
|||
|
|
return "extract_keywords"
|
|||
|
|
elif state.action == NewsAction.GENERATE_REPORT:
|
|||
|
|
return "generate_report"
|
|||
|
|
else:
|
|||
|
|
return "format_result"
|