ai-demo/app/services/ai_service.py

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()