refactor: 整理文件夹结构,修复 create_serde 导入问题
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 6m50s
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 6m50s
- 移动 main_graph/tools/ 到 deprecated/main_graph_tools/(旧架构工具) - 移动 rag_initializer.py 和 retry_utils.py 到 core/ - 清理 main_graph/nodes/ 里的旧节点到 deprecated/ - 修复 backend.py 中 create_serde 导入问题
This commit is contained in:
10
backend/app/deprecated/main_graph_tools/__init__.py
Normal file
10
backend/app/deprecated/main_graph_tools/__init__.py
Normal file
@@ -0,0 +1,10 @@
|
||||
"""主图工具"""
|
||||
from .graph_tools import AVAILABLE_TOOLS, TOOLS_BY_NAME
|
||||
from .subgraph_tools import SUBGRAPH_TOOLS, SUBGRAPH_TOOLS_BY_NAME
|
||||
|
||||
__all__ = [
|
||||
"AVAILABLE_TOOLS",
|
||||
"TOOLS_BY_NAME",
|
||||
"SUBGRAPH_TOOLS",
|
||||
"SUBGRAPH_TOOLS_BY_NAME",
|
||||
]
|
||||
55
backend/app/deprecated/main_graph_tools/common_tools.py
Normal file
55
backend/app/deprecated/main_graph_tools/common_tools.py
Normal file
@@ -0,0 +1,55 @@
|
||||
"""
|
||||
公共工具模块 - 联网搜索、可视化图表等公共功能
|
||||
Common Tools Module - Web search, visualization, etc.
|
||||
"""
|
||||
|
||||
from langchain_core.tools import tool
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@tool
|
||||
def web_search_tool(query: str, max_results: int = 5) -> str:
|
||||
"""
|
||||
联网搜索工具 - 无需 API Key,使用 DuckDuckGo 免费搜索
|
||||
|
||||
Args:
|
||||
query: 搜索关键词或问题
|
||||
max_results: 返回结果数量,默认 5 条
|
||||
|
||||
Returns:
|
||||
格式化的搜索结果,包含引用溯源
|
||||
"""
|
||||
try:
|
||||
from backend.app.core import web_search
|
||||
return web_search(query, max_results)
|
||||
except Exception as e:
|
||||
return f"联网搜索出错:{str(e)}"
|
||||
|
||||
|
||||
@tool
|
||||
def generate_chart_tool(data_text: str, chart_type: str = "bar") -> str:
|
||||
"""
|
||||
可视化图表工具 - 生成 Mermaid 格式图表
|
||||
|
||||
Args:
|
||||
data_text: 图表数据文本,格式:标题,标签1:值1,标签2:值2,...
|
||||
示例:月度销售额,1月:100,2月:150,3月:200
|
||||
chart_type: 图表类型,可选:bar(柱状图)、line(折线图)、pie(饼图)
|
||||
|
||||
Returns:
|
||||
格式化的图表输出(Mermaid 格式)
|
||||
"""
|
||||
try:
|
||||
from backend.app.core import generate_chart
|
||||
return generate_chart(data_text, chart_type)
|
||||
except Exception as e:
|
||||
return f"生成图表出错:{str(e)}\n\n请使用格式:标题,标签1:值1,标签2:值2,..."
|
||||
|
||||
|
||||
# 公共工具列表
|
||||
COMMON_TOOLS = [
|
||||
web_search_tool,
|
||||
generate_chart_tool
|
||||
]
|
||||
|
||||
COMMON_TOOLS_BY_NAME = {tool.name: tool for tool in COMMON_TOOLS}
|
||||
25
backend/app/deprecated/main_graph_tools/graph_tools.py
Normal file
25
backend/app/deprecated/main_graph_tools/graph_tools.py
Normal file
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
工具定义模块 - 子图工具 + RAG 工具 + 公共工具
|
||||
Subgraph Tools + RAG Tools + Common Tools
|
||||
"""
|
||||
|
||||
# 子图工具
|
||||
from .subgraph_tools import (
|
||||
SUBGRAPH_TOOLS,
|
||||
SUBGRAPH_TOOLS_BY_NAME,
|
||||
dictionary_tool,
|
||||
news_analysis_tool,
|
||||
contact_tool
|
||||
)
|
||||
|
||||
# 公共工具
|
||||
from .common_tools import (
|
||||
COMMON_TOOLS,
|
||||
COMMON_TOOLS_BY_NAME,
|
||||
web_search_tool,
|
||||
generate_chart_tool
|
||||
)
|
||||
|
||||
# 工具列表和映射(全局常量)
|
||||
AVAILABLE_TOOLS = SUBGRAPH_TOOLS.copy() + COMMON_TOOLS.copy()
|
||||
TOOLS_BY_NAME = {**SUBGRAPH_TOOLS_BY_NAME, **COMMON_TOOLS_BY_NAME}
|
||||
193
backend/app/deprecated/main_graph_tools/subgraph_tools.py
Normal file
193
backend/app/deprecated/main_graph_tools/subgraph_tools.py
Normal file
@@ -0,0 +1,193 @@
|
||||
"""
|
||||
子图工具模块 - 将三个子图包装成 LangChain 工具
|
||||
Subgraph Tools Module - Wrap three subgraphs as LangChain tools
|
||||
"""
|
||||
|
||||
from langchain_core.tools import tool
|
||||
from typing import Optional
|
||||
|
||||
|
||||
# ============== 词典子图工具 ==============
|
||||
@tool
|
||||
def dictionary_tool(query: str, action: Optional[str] = None) -> str:
|
||||
"""
|
||||
词典/翻译工具 - 查询单词、翻译文本、提取术语、获取每日一词
|
||||
|
||||
Args:
|
||||
query: 用户查询内容(单词、句子、文本等)
|
||||
action: 可选,指定操作类型("query" 查询单词,"translate" 翻译,
|
||||
"extract" 提取术语,"daily" 每日一词,不指定则自动识别)
|
||||
|
||||
Returns:
|
||||
格式化的结果文本
|
||||
"""
|
||||
try:
|
||||
from backend.app.subgraphs.dictionary import (
|
||||
DictionaryState,
|
||||
DictionaryAction,
|
||||
parse_intent,
|
||||
format_result
|
||||
)
|
||||
from backend.app.subgraphs.dictionary.nodes import (
|
||||
query_word, translate_text, extract_terms, get_daily_word
|
||||
)
|
||||
|
||||
# 创建初始状态
|
||||
state = DictionaryState(user_query=query, user_id="default")
|
||||
|
||||
# 处理 action
|
||||
if action == "query":
|
||||
state.action = DictionaryAction.QUERY
|
||||
state.action_params = {"word": query}
|
||||
state = query_word(state)
|
||||
elif action == "translate":
|
||||
state.action = DictionaryAction.TRANSLATE
|
||||
state.source_text = query
|
||||
state = translate_text(state)
|
||||
elif action == "daily":
|
||||
state.action = DictionaryAction.DAILY_WORD
|
||||
state = get_daily_word(state)
|
||||
elif action == "extract":
|
||||
state.action = DictionaryAction.EXTRACT
|
||||
state.action_params = {"text": query}
|
||||
state = extract_terms(state)
|
||||
else:
|
||||
# 自动解析意图
|
||||
state = parse_intent(state)
|
||||
if state.action == DictionaryAction.QUERY:
|
||||
state = query_word(state)
|
||||
elif state.action == DictionaryAction.TRANSLATE:
|
||||
state = translate_text(state)
|
||||
elif state.action == DictionaryAction.DAILY_WORD:
|
||||
state = get_daily_word(state)
|
||||
elif state.action == DictionaryAction.EXTRACT:
|
||||
state = extract_terms(state)
|
||||
|
||||
# 格式化结果
|
||||
state = format_result(state)
|
||||
|
||||
return state.final_result or "操作完成"
|
||||
|
||||
except Exception as e:
|
||||
return f"词典工具执行出错:{str(e)}"
|
||||
|
||||
|
||||
# ============== 资讯分析子图工具 ==============
|
||||
@tool
|
||||
def news_analysis_tool(query: str, action: Optional[str] = None) -> str:
|
||||
"""
|
||||
资讯分析工具 - 查询新闻、分析URL、提取关键词、生成报告
|
||||
|
||||
Args:
|
||||
query: 用户查询内容(关键词、URL、文本等)
|
||||
action: 可选,指定操作类型("query" 查询新闻,"analyze" 分析URL,
|
||||
"keywords" 提取关键词,"report" 生成报告,不指定则自动识别)
|
||||
|
||||
Returns:
|
||||
格式化的结果文本
|
||||
"""
|
||||
try:
|
||||
from backend.app.subgraphs.news_analysis import (
|
||||
NewsAnalysisState,
|
||||
NewsAction,
|
||||
parse_intent,
|
||||
format_result
|
||||
)
|
||||
from backend.app.subgraphs.news_analysis.nodes import (
|
||||
query_news, analyze_url, extract_keywords, generate_report
|
||||
)
|
||||
|
||||
# 创建初始状态
|
||||
state = NewsAnalysisState(user_query=query, user_id="default")
|
||||
|
||||
# 处理 action
|
||||
if action == "query":
|
||||
state.action = NewsAction.QUERY_NEWS
|
||||
state = query_news(state)
|
||||
elif action == "analyze":
|
||||
state.action = NewsAction.ANALYZE_URL
|
||||
state.custom_urls = [query]
|
||||
state = analyze_url(state)
|
||||
elif action == "keywords":
|
||||
state.action = NewsAction.EXTRACT_KEYWORDS
|
||||
state = extract_keywords(state)
|
||||
elif action == "report":
|
||||
state.action = NewsAction.GENERATE_REPORT
|
||||
state = generate_report(state)
|
||||
else:
|
||||
# 自动解析意图
|
||||
state = parse_intent(state)
|
||||
if state.action == NewsAction.QUERY_NEWS:
|
||||
state = query_news(state)
|
||||
elif state.action == NewsAction.ANALYZE_URL:
|
||||
state.custom_urls = [query]
|
||||
state = analyze_url(state)
|
||||
elif state.action == NewsAction.EXTRACT_KEYWORDS:
|
||||
state = extract_keywords(state)
|
||||
elif state.action == NewsAction.GENERATE_REPORT:
|
||||
state = generate_report(state)
|
||||
|
||||
# 格式化结果
|
||||
state = format_result(state)
|
||||
|
||||
return state.final_result or "操作完成"
|
||||
|
||||
except Exception as e:
|
||||
return f"资讯分析工具执行出错:{str(e)}"
|
||||
|
||||
|
||||
# ============== 通讯录子图工具 ==============
|
||||
@tool
|
||||
def contact_tool(query: str, action: Optional[str] = None) -> str:
|
||||
"""
|
||||
通讯录工具 - 查询联系人、添加联系人、管理通讯录
|
||||
|
||||
Args:
|
||||
query: 用户查询内容(姓名、电话、信息等)
|
||||
action: 可选,指定操作类型(不指定则自动识别)
|
||||
|
||||
Returns:
|
||||
格式化的结果文本
|
||||
"""
|
||||
try:
|
||||
from backend.app.subgraphs.contact import (
|
||||
ContactState,
|
||||
ContactAction,
|
||||
parse_intent,
|
||||
format_result
|
||||
)
|
||||
from backend.app.subgraphs.contact.nodes import (
|
||||
query_contact, add_contact, list_contacts
|
||||
)
|
||||
|
||||
# 创建初始状态
|
||||
state = ContactState(user_query=query, user_id="default")
|
||||
|
||||
# 自动解析意图
|
||||
state = parse_intent(state)
|
||||
|
||||
# 根据解析结果执行操作
|
||||
if state.action == ContactAction.QUERY:
|
||||
state = query_contact(state)
|
||||
elif state.action == ContactAction.ADD:
|
||||
state = add_contact(state)
|
||||
elif state.action == ContactAction.LIST:
|
||||
state = list_contacts(state)
|
||||
|
||||
# 格式化结果
|
||||
state = format_result(state)
|
||||
|
||||
return state.final_result or "操作完成"
|
||||
|
||||
except Exception as e:
|
||||
return f"通讯录工具执行出错:{str(e)}"
|
||||
|
||||
|
||||
# ============== 工具列表 ==============
|
||||
SUBGRAPH_TOOLS = [
|
||||
dictionary_tool,
|
||||
news_analysis_tool,
|
||||
contact_tool
|
||||
]
|
||||
|
||||
SUBGRAPH_TOOLS_BY_NAME = {tool.name: tool for tool in SUBGRAPH_TOOLS}
|
||||
Reference in New Issue
Block a user