cherry-ai/backend/app/services/assistant_service.py

74 lines
2.9 KiB
Python

# File: backend/app/services/assistant_service.py (新建)
# Description: 管理助手数据的服务 (内存实现)
from typing import Dict, List, Optional
from app.models.pydantic_models import AssistantRead, AssistantCreate, AssistantUpdate
import uuid
# 使用字典作为内存数据库存储助手
# key: assistant_id (str), value: AssistantRead object
assistants_db: Dict[str, AssistantRead] = {}
# 添加默认助手 (确保 ID 与前端 Mock 一致)
default_assistant = AssistantRead(
id='asst-default',
name='默认助手',
description='通用聊天助手',
avatar='🤖',
system_prompt='你是一个乐于助人的 AI 助手。',
model='gpt-3.5-turbo',
temperature=0.7
)
assistants_db[default_assistant.id] = default_assistant
class AssistantService:
"""助手数据的 CRUD 服务"""
def get_assistants(self) -> List[AssistantRead]:
"""获取所有助手"""
return list(assistants_db.values())
def get_assistant(self, assistant_id: str) -> Optional[AssistantRead]:
"""根据 ID 获取单个助手"""
return assistants_db.get(assistant_id)
def create_assistant(self, assistant_data: AssistantCreate) -> AssistantRead:
"""创建新助手"""
new_id = f"asst-{uuid.uuid4()}" # 生成唯一 ID
new_assistant = AssistantRead(id=new_id, **assistant_data.model_dump())
assistants_db[new_id] = new_assistant
print(f"助手已创建: {new_id} - {new_assistant.name}")
return new_assistant
def update_assistant(self, assistant_id: str, assistant_data: AssistantUpdate) -> Optional[AssistantRead]:
"""更新现有助手"""
existing_assistant = assistants_db.get(assistant_id)
if not existing_assistant:
return None
# 使用 Pydantic 的 model_copy 和 update 来更新字段
update_data = assistant_data.model_dump(exclude_unset=True) # 只获取设置了值的字段
if update_data:
updated_assistant = existing_assistant.model_copy(update=update_data)
assistants_db[assistant_id] = updated_assistant
print(f"助手已更新: {assistant_id}")
return updated_assistant
return existing_assistant # 如果没有更新任何字段,返回原始助手
def delete_assistant(self, assistant_id: str) -> bool:
"""删除助手"""
if assistant_id in assistants_db:
# 添加逻辑:不允许删除默认助手
if assistant_id == 'asst-default':
print("尝试删除默认助手 - 操作被阻止")
return False # 或者抛出特定异常
del assistants_db[assistant_id]
print(f"助手已删除: {assistant_id}")
# TODO: 在实际应用中,还需要删除关联的会话和消息
return True
return False
# 创建服务实例
assistant_service_instance = AssistantService()