fix(kb-deep-analyzer): 修复环境变量传递问题
- generate() 每次调用时重新读取环境变量 - AI 调用方法接受 api_key, model, base_url 参数 - 解决 exec 工具中环境变量未传递的问题
This commit is contained in:
@@ -63,20 +63,26 @@ class SimpleAIClient:
|
|||||||
|
|
||||||
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:
|
# 每次调用时重新读取环境变量,解决 exec 传递问题
|
||||||
|
api_key = os.environ.get("AI_API_KEY", self.api_key)
|
||||||
|
provider = os.environ.get("AI_PROVIDER", self.provider)
|
||||||
|
model = os.environ.get("AI_MODEL", self.model)
|
||||||
|
base_url = os.environ.get("AI_BASE_URL", self.base_url)
|
||||||
|
|
||||||
|
if not api_key:
|
||||||
raise ValueError("AI_API_KEY 未设置,请配置环境变量")
|
raise ValueError("AI_API_KEY 未设置,请配置环境变量")
|
||||||
|
|
||||||
last_error = None
|
last_error = None
|
||||||
for attempt in range(self.max_retries):
|
for attempt in range(self.max_retries):
|
||||||
try:
|
try:
|
||||||
if self.provider == "openai":
|
if provider == "openai":
|
||||||
return self._call_openai(prompt, max_tokens)
|
return self._call_openai(prompt, max_tokens, api_key, model, base_url)
|
||||||
elif self.provider == "zhipu":
|
elif provider == "zhipu":
|
||||||
return self._call_zhipu(prompt, max_tokens)
|
return self._call_zhipu(prompt, max_tokens, api_key, model, base_url)
|
||||||
elif self.provider == "minimax":
|
elif provider == "minimax":
|
||||||
return self._call_minimax(prompt, max_tokens)
|
return self._call_minimax(prompt, max_tokens, api_key, model, base_url)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"不支持的 AI 提供商: {self.provider}")
|
raise ValueError(f"不支持的 AI 提供商: {provider}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
last_error = e
|
last_error = e
|
||||||
if attempt < self.max_retries - 1:
|
if attempt < self.max_retries - 1:
|
||||||
@@ -95,7 +101,7 @@ class SimpleAIClient:
|
|||||||
# 尝试从文本中提取 JSON
|
# 尝试从文本中提取 JSON
|
||||||
return self._parse_json_from_text(response)
|
return self._parse_json_from_text(response)
|
||||||
|
|
||||||
def _call_openai(self, prompt: str, max_tokens: int) -> str:
|
def _call_openai(self, prompt: str, max_tokens: int, api_key: str = None, model: str = None, base_url: str = None) -> str:
|
||||||
"""调用 OpenAI API"""
|
"""调用 OpenAI API"""
|
||||||
import requests
|
import requests
|
||||||
url = f"{self.base_url}/chat/completions" if self.base_url else "https://api.openai.com/v1/chat/completions"
|
url = f"{self.base_url}/chat/completions" if self.base_url else "https://api.openai.com/v1/chat/completions"
|
||||||
@@ -113,9 +119,10 @@ class SimpleAIClient:
|
|||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
response.raise_for_status()
|
||||||
return response.json()['choices'][0]['message']['content']
|
return response.json()['choices'][0]['message']['content']
|
||||||
|
|
||||||
def _call_zhipu(self, prompt: str, max_tokens: int) -> str:
|
def _call_zhipu(self, prompt: str, max_tokens: int, api_key: str = None, model: str = None, base_url: str = None) -> str:
|
||||||
"""调用智谱 AI API - 返回 reasoning_content"""
|
"""调用智谱 AI API - 返回 reasoning_content"""
|
||||||
import requests
|
import requests
|
||||||
base_url = self.base_url or "https://open.bigmodel.cn/api/coding/paas/v4"
|
base_url = self.base_url or "https://open.bigmodel.cn/api/coding/paas/v4"
|
||||||
@@ -130,6 +137,7 @@ class SimpleAIClient:
|
|||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
response.raise_for_status()
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
|
||||||
message = data.get('choices', [{}])[0].get('message', {})
|
message = data.get('choices', [{}])[0].get('message', {})
|
||||||
@@ -173,7 +181,7 @@ class SimpleAIClient:
|
|||||||
|
|
||||||
return {'raw_response': text}
|
return {'raw_response': text}
|
||||||
|
|
||||||
def _call_minimax(self, prompt: str, max_tokens: int) -> str:
|
def _call_minimax(self, prompt: str, max_tokens: int, api_key: str = None, model: str = None, base_url: str = None) -> str:
|
||||||
"""调用 MiniMax API"""
|
"""调用 MiniMax API"""
|
||||||
import requests
|
import requests
|
||||||
url = self.base_url or "https://api.minimaxi.com/anthropic/v1/messages"
|
url = self.base_url or "https://api.minimaxi.com/anthropic/v1/messages"
|
||||||
@@ -191,6 +199,7 @@ class SimpleAIClient:
|
|||||||
|
|
||||||
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
response = requests.post(url, headers=headers, json=payload, timeout=120)
|
||||||
response.raise_for_status()
|
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', []):
|
||||||
if item.get('type') == 'text':
|
if item.get('type') == 'text':
|
||||||
|
|||||||
Reference in New Issue
Block a user