在调用 /api/resource/ddl/parse 接口时出现超时错误:
message: "API请求失败: HTTPSConnectionPool(host='dashscope.aliyuncs.com', port=443): Read timed out. (read timeout=30)"
将默认超时时间从 30 秒增加到 60 秒,并支持自定义配置:
def __init__(self, api_key=None, timeout=60, max_retries=3):
self.timeout = timeout # 默认60秒
self.max_retries = max_retries # 默认重试3次
新增 _make_llm_request 方法,支持:
requests.Timeout:超时错误,可重试requests.RequestException:网络错误,可重试def _make_llm_request(self, payload, operation_name="LLM请求"):
"""发送LLM请求,支持自动重试"""
for attempt in range(self.max_retries):
try:
if attempt > 0:
wait_time = 2 ** attempt # 指数退避
time.sleep(wait_time)
response = requests.post(
f"{self.base_url}/chat/completions",
headers=self.headers,
json=payload,
timeout=self.timeout
)
response.raise_for_status()
return response.json()
except requests.Timeout as e:
logger.warning(f"{operation_name} 超时: {str(e)}")
except requests.RequestException as e:
logger.warning(f"{operation_name} 失败: {str(e)}")
所有 LLM 调用方法(parse_ddl、parse_db_conn_str、valid_db_conn_str)都使用统一的重试机制:
def parse_ddl(self, sql_content):
result = self._make_llm_request(payload, "DDL解析")
if not result:
return {
"code": 500,
"message": f"API请求失败: 在{self.max_retries}次尝试后仍然失败"
}
# ... 处理成功结果
from app.core.llm.ddl_parser import DDLParser
# 使用默认配置:60秒超时,最多重试3次
parser = DDLParser()
result = parser.parse_ddl(sql_content)
# 针对复杂任务:120秒超时,最多重试5次
parser = DDLParser(timeout=120, max_retries=5)
result = parser.parse_ddl(complex_sql_content)
# 快速失败模式:30秒超时,不重试
parser = DDLParser(timeout=30, max_retries=1)
result = parser.parse_ddl(simple_sql_content)
运行测试脚本验证修复效果:
# 快速测试
python quick_test_ddl.py
# 完整测试(包含超时处理验证)
python test_ddl_timeout_fix.py
app/core/llm/ddl_parser.py:添加超时和重试机制test_ddl_timeout_fix.py:超时和重试测试脚本DDL_PARSER_TIMEOUT_FIX.md:本文档通过增加超时时间、实现自动重试机制和改进错误处理,DDL Parser 的稳定性和可靠性得到显著提升。现在即使在网络不稳定的情况下,也能更好地完成 DDL 解析任务。