Address code review comments: improve code organization and use modern asyncio

Co-authored-by: jxxghp <51039935+jxxghp@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2026-01-23 15:22:45 +00:00
co-authored by jxxghp
parent ca18705d88
commit eca339d107
+29 -14
View File
@@ -1,15 +1,20 @@
"""搜索网络内容工具""" """搜索网络内容工具"""
import asyncio
import json import json
import re import re
from typing import Optional, Type from typing import Optional, Type
from duckduckgo_search import DDGS
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from app.agent.tools.base import MoviePilotTool from app.agent.tools.base import MoviePilotTool
from app.core.config import settings from app.core.config import settings
from app.log import logger from app.log import logger
# 搜索超时时间(秒)
SEARCH_TIMEOUT = 20
class SearchWebInput(BaseModel): class SearchWebInput(BaseModel):
"""搜索网络内容工具的输入参数模型""" """搜索网络内容工具的输入参数模型"""
@@ -63,6 +68,25 @@ class SearchWebTool(MoviePilotTool):
logger.error(f"搜索网络内容失败: {e}", exc_info=True) logger.error(f"搜索网络内容失败: {e}", exc_info=True)
return error_message return error_message
@staticmethod
def _get_proxy_url(proxy_setting) -> Optional[str]:
"""
从代理设置中提取代理URL
Args:
proxy_setting: 代理设置,可以是字符串或字典
Returns:
代理URL字符串,如果没有配置则返回None
"""
if not proxy_setting:
return None
if isinstance(proxy_setting, dict):
return proxy_setting.get('http') or proxy_setting.get('https')
return proxy_setting
@staticmethod @staticmethod
async def _search_duckduckgo(query: str, max_results: int) -> list: async def _search_duckduckgo(query: str, max_results: int) -> list:
""" """
@@ -76,27 +100,18 @@ class SearchWebTool(MoviePilotTool):
搜索结果列表 搜索结果列表
""" """
try: try:
from duckduckgo_search import DDGS
import asyncio
# duckduckgo-search 是同步库,需要在 executor 中运行 # duckduckgo-search 是同步库,需要在 executor 中运行
def sync_search(): def sync_search():
results = [] results = []
try: try:
# 使用代理(如果配置了) # 使用代理(如果配置了)
ddgs_kwargs = {} ddgs_kwargs = {}
if settings.PROXY: proxy_url = SearchWebTool._get_proxy_url(settings.PROXY)
# duckduckgo-search 支持代理配置 if proxy_url:
if isinstance(settings.PROXY, dict): ddgs_kwargs['proxy'] = proxy_url
proxy_url = settings.PROXY.get('http') or settings.PROXY.get('https')
else:
proxy_url = settings.PROXY
if proxy_url:
ddgs_kwargs['proxy'] = proxy_url
# 设置超时 # 设置超时
ddgs_kwargs['timeout'] = 20 ddgs_kwargs['timeout'] = SEARCH_TIMEOUT
with DDGS(**ddgs_kwargs) as ddgs: with DDGS(**ddgs_kwargs) as ddgs:
# 使用 text 方法进行搜索 # 使用 text 方法进行搜索
@@ -120,7 +135,7 @@ class SearchWebTool(MoviePilotTool):
return results return results
# 在线程池中运行同步搜索 # 在线程池中运行同步搜索
loop = asyncio.get_event_loop() loop = asyncio.get_running_loop()
results = await loop.run_in_executor(None, sync_search) results = await loop.run_in_executor(None, sync_search)
return results return results