修改ai模块,使用openai代替httpx

This commit is contained in:
Jerry 2025-07-09 16:48:44 +08:00
parent 90f127b5ce
commit adce943152
3 changed files with 51 additions and 54 deletions

View File

@ -9,7 +9,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.11 (AI-powered-switches)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Python 3.13 interpreter library" level="application" /> <orderEntry type="library" name="Python 3.13 interpreter library" level="application" />
</component> </component>

View File

@ -1,53 +1,54 @@
from typing import Dict, Any, Coroutine
from openai import OpenAI
import json import json
import httpx
from typing import Dict, Any
from src.backend.app.utils.exceptions import SiliconFlowAPIException from src.backend.app.utils.exceptions import SiliconFlowAPIException
from openai.types.chat import ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam
from src.backend.app.utils.logger import logger
class AIService: class AIService:
def __init__(self, api_key: str, api_url: str): def __init__(self, api_key: str, api_url: str):
self.api_key = api_key self.api_key = api_key
self.api_url = api_url self.api_url = api_url
self.headers = { self.client = OpenAI(
"Authorization": f"Bearer {self.api_key}", api_key=self.api_key,
"Content-Type": "application/json" base_url=self.api_url
} )
async def parse_command(self, command: str) -> Dict[str, Any]: async def parse_command(self, command: str) -> Any | None:
""" """
调用硅基流动API解析中文命令 调用硅基流动API解析中文命令
""" """
prompt = f""" prompt = """
你是一个网络设备配置专家请将以下中文命令转换为网络设备配置JSON 你是一个网络设备配置专家精通各种类型的路由器的配置,请将以下用户的中文命令转换为网络设备配置JSON
支持的配置包括VLAN端口路由ACL等 但是请注意由于贪婪的人们追求极高的效率所以你必须严格按照 JSON 格式返回数据不要包含任何额外文本或 Markdown 代码块
返回格式必须为JSON包含配置类型和详细参数 返回格式要求
1. 必须包含'type'字段指明配置类型(vlan/interface/acl/route等)
命令{command} 2. 必须包含'commands'字段包含可直接执行的命令列表
3. 其他参数根据配置类型动态添加
4. 不要包含解释性文本步骤说明或注释
示例命令'创建VLAN 100名称为TEST'
示例返回{"type": "vlan", "vlan_id": 100, "name": "TEST", "commands": ["vlan 100", "name TEST"]}
""" """
data = { messages = [
"model": "deepseek-ai/DeepSeek-V3", ChatCompletionSystemMessageParam(role="system", content=prompt),
"prompt": prompt, ChatCompletionUserMessageParam(role="user", content=command)
"max_tokens": 1000, ]
"temperature": 0.3
}
try: try:
async with httpx.AsyncClient() as client: response = self.client.chat.completions.create(
response = await client.post( model="deepseek-ai/DeepSeek-V3",
f"{self.api_url}/chat/completions", messages=messages,
headers=self.headers, temperature=0.3,
json=data, max_tokens=1000,
timeout=30 response_format={"type": "json_object"}
) )
if response.status_code != 200: logger.debug(response)
raise SiliconFlowAPIException(response.text)
result = response.json() config_str = response.choices[0].message.content.strip()
config_str = result["choices"][0]["text"].strip()
# 确保返回的是有效的JSON
try: try:
config = json.loads(config_str) config = json.loads(config_str)
return config return config
@ -57,8 +58,12 @@ class AIService:
config_str = config_str[7:-3].strip() config_str = config_str[7:-3].strip()
return json.loads(config_str) return json.loads(config_str)
raise SiliconFlowAPIException("Invalid JSON format returned from AI") raise SiliconFlowAPIException("Invalid JSON format returned from AI")
except httpx.HTTPError as e: except KeyError:
logger.error(KeyError)
raise SiliconFlowAPIException("errrrrrrro")
except Exception as e:
raise SiliconFlowAPIException( raise SiliconFlowAPIException(
detail=f"API请求失败: {str(e)}", detail=f"API请求失败: {str(e)}",
status_code=e.response.status_code if hasattr(e, "response") else 500 status_code=getattr(e, "status_code", 500)
) )

View File

@ -1,34 +1,26 @@
# 核心依赖 -i https://pypi.tuna.tsinghua.edu.cn/simple
fastapi==0.110.0 fastapi==0.110.0
uvicorn==0.29.0 uvicorn==0.29.0
python-dotenv==1.0.1 python-dotenv==1.0.1
pysnmp
# Pydantic 模型 -i https://pypi.tuna.tsinghua.edu.cn/simple
pydantic==2.6.4 pydantic==2.6.4
pydantic-settings==2.2.1 pydantic-settings==2.2.1
# 网络操作 -i https://pypi.tuna.tsinghua.edu.cn/simple
asyncssh==2.14.2 asyncssh==2.14.2
telnetlib3==2.0.3 telnetlib3==2.0.3
httpx==0.27.0 httpx==0.27.0
python-nmap==0.7.1 python-nmap==0.7.1
# 异步文件操作 -i https://pypi.tuna.tsinghua.edu.cn/simple
aiofiles==23.2.1 aiofiles==23.2.1
# 日志管理 -i https://pypi.tuna.tsinghua.edu.cn/simple
loguru==0.7.2 loguru==0.7.2
# 重试机制 -i https://pypi.tuna.tsinghua.edu.cn/simple
tenacity==8.2.3 tenacity==8.2.3
# 其他工具 -i https://pypi.tuna.tsinghua.edu.cn/simple
asyncio==3.4.3 asyncio==3.4.3
typing_extensions==4.10.0 typing_extensions==4.10.0
#监控依赖 Y
psutil==5.9.8 psutil==5.9.8
matplotlib==3.8.3 matplotlib==3.8.3
sqlalchemy==2.0.28 sqlalchemy==2.0.28
sqlalchemy
openai