feat(kb-deep-analyzer): 增加超时时间和重试机制
- timeout 从 30s 增加到 120s - 添加重试逻辑,最多重试 3 次 - 避免因网络波动导致的 token 浪费
This commit is contained in:
@@ -59,12 +59,15 @@ class SimpleAIClient:
|
|||||||
self.provider = provider or os.environ.get("AI_PROVIDER", "")
|
self.provider = provider or os.environ.get("AI_PROVIDER", "")
|
||||||
self.model = model or os.environ.get("AI_MODEL", "gpt-4")
|
self.model = model or os.environ.get("AI_MODEL", "gpt-4")
|
||||||
self.base_url = base_url or os.environ.get("AI_BASE_URL", "")
|
self.base_url = base_url or os.environ.get("AI_BASE_URL", "")
|
||||||
|
self.max_retries = 3 # 最大重试次数
|
||||||
|
|
||||||
def generate(self, prompt: str, max_tokens: int = 1000) -> str:
|
def generate(self, prompt: str, max_tokens: int = 1000) -> str:
|
||||||
"""生成文本"""
|
"""生成文本,支持重试"""
|
||||||
if not self.api_key:
|
if not self.api_key:
|
||||||
raise ValueError("AI_API_KEY 未设置,请配置环境变量")
|
raise ValueError("AI_API_KEY 未设置,请配置环境变量")
|
||||||
|
|
||||||
|
last_error = None
|
||||||
|
for attempt in range(self.max_retries):
|
||||||
try:
|
try:
|
||||||
if self.provider == "openai":
|
if self.provider == "openai":
|
||||||
return self._call_openai(prompt, max_tokens)
|
return self._call_openai(prompt, max_tokens)
|
||||||
@@ -75,7 +78,12 @@ class SimpleAIClient:
|
|||||||
else:
|
else:
|
||||||
raise ValueError(f"不支持的 AI 提供商: {self.provider}")
|
raise ValueError(f"不支持的 AI 提供商: {self.provider}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"[AI Client] 调用失败: {e}")
|
last_error = e
|
||||||
|
if attempt < self.max_retries - 1:
|
||||||
|
print(f"[AI Client] 第 {attempt + 1} 次调用失败,{self.max_retries - attempt - 1} 次重试剩余: {e}")
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
print(f"[AI Client] 调用失败,已重试 {self.max_retries} 次: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def generate_json(self, prompt: str) -> Dict[str, Any]:
|
def generate_json(self, prompt: str) -> Dict[str, Any]:
|
||||||
@@ -103,7 +111,7 @@ class SimpleAIClient:
|
|||||||
"messages": [{"role": "user", "content": prompt}]
|
"messages": [{"role": "user", "content": prompt}]
|
||||||
}
|
}
|
||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=30)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
return response.json()['choices'][0]['message']['content']
|
return response.json()['choices'][0]['message']['content']
|
||||||
|
|
||||||
@@ -120,7 +128,7 @@ class SimpleAIClient:
|
|||||||
"max_tokens": max_tokens
|
"max_tokens": max_tokens
|
||||||
}
|
}
|
||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=30)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
|
||||||
@@ -181,7 +189,7 @@ class SimpleAIClient:
|
|||||||
"messages": [{"role": "user", "content": prompt}]
|
"messages": [{"role": "user", "content": prompt}]
|
||||||
}
|
}
|
||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=30)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
data = response.json()
|
data = response.json()
|
||||||
for item in data.get('content', []):
|
for item in data.get('content', []):
|
||||||
|
|||||||
Reference in New Issue
Block a user