110 lines
2.9 KiB
Python
110 lines
2.9 KiB
Python
|
|
"""
|
|||
|
|
AI 服务模块
|
|||
|
|
封装 OpenAI API 调用逻辑
|
|||
|
|
"""
|
|||
|
|
from openai import OpenAI
|
|||
|
|
from typing import Optional, List, Dict
|
|||
|
|
from app.config import settings
|
|||
|
|
|
|||
|
|
|
|||
|
|
class AIService:
|
|||
|
|
"""AI 服务类"""
|
|||
|
|
|
|||
|
|
def __init__(self):
|
|||
|
|
"""初始化 OpenAI 客户端"""
|
|||
|
|
self.client = OpenAI(
|
|||
|
|
api_key=settings.openai_api_key,
|
|||
|
|
base_url=settings.openai_base_url
|
|||
|
|
)
|
|||
|
|
self.model = settings.openai_model
|
|||
|
|
|
|||
|
|
async def chat(
|
|||
|
|
self,
|
|||
|
|
message: str,
|
|||
|
|
system_prompt: Optional[str] = None,
|
|||
|
|
history: Optional[List[Dict[str, str]]] = None
|
|||
|
|
) -> str:
|
|||
|
|
"""
|
|||
|
|
与 AI 进行对话
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
message: 用户输入的消息
|
|||
|
|
system_prompt: 系统提示词(可选)
|
|||
|
|
history: 对话历史(可选)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
AI 的回复内容
|
|||
|
|
"""
|
|||
|
|
# 构建消息列表
|
|||
|
|
messages = []
|
|||
|
|
|
|||
|
|
# 添加系统提示
|
|||
|
|
if system_prompt:
|
|||
|
|
messages.append({"role": "system", "content": system_prompt})
|
|||
|
|
|
|||
|
|
# 添加对话历史
|
|||
|
|
if history:
|
|||
|
|
messages.extend(history)
|
|||
|
|
|
|||
|
|
# 添加当前用户消息
|
|||
|
|
messages.append({"role": "user", "content": message})
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 调用 OpenAI API
|
|||
|
|
response = self.client.chat.completions.create(
|
|||
|
|
model=self.model,
|
|||
|
|
messages=messages,
|
|||
|
|
temperature=0.7,
|
|||
|
|
max_tokens=2000
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 返回 AI 回复
|
|||
|
|
return response.choices[0].message.content
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
raise Exception(f"AI 调用失败: {str(e)}")
|
|||
|
|
|
|||
|
|
async def chat_with_tools(
|
|||
|
|
self,
|
|||
|
|
message: str,
|
|||
|
|
tools: List[Dict],
|
|||
|
|
system_prompt: Optional[str] = None
|
|||
|
|
) -> Dict:
|
|||
|
|
"""
|
|||
|
|
使用工具与 AI 进行对话
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
message: 用户输入的消息
|
|||
|
|
tools: 可用工具列表
|
|||
|
|
system_prompt: 系统提示词(可选)
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
包含回复和工具调用信息的字典
|
|||
|
|
"""
|
|||
|
|
messages = []
|
|||
|
|
|
|||
|
|
if system_prompt:
|
|||
|
|
messages.append({"role": "system", "content": system_prompt})
|
|||
|
|
|
|||
|
|
messages.append({"role": "user", "content": message})
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
response = self.client.chat.completions.create(
|
|||
|
|
model=self.model,
|
|||
|
|
messages=messages,
|
|||
|
|
tools=tools,
|
|||
|
|
tool_choice="auto"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
"message": response.choices[0].message,
|
|||
|
|
"finish_reason": response.choices[0].finish_reason
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
raise Exception(f"AI 工具调用失败: {str(e)}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 创建全局 AI 服务实例
|
|||
|
|
ai_service = AIService()
|