feat: 初始提交
This commit is contained in:
41
backend/app/services/llm_config_service.py
Normal file
41
backend/app/services/llm_config_service.py
Normal file
@@ -0,0 +1,41 @@
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from ..models import LLMConfig
|
||||
from ..repositories.llm_config_repository import LLMConfigRepository
|
||||
from ..schemas.llm_config import LLMConfigCreate, LLMConfigRead
|
||||
|
||||
|
||||
class LLMConfigService:
|
||||
"""用户自定义 LLM 配置服务。"""
|
||||
|
||||
def __init__(self, session: AsyncSession):
|
||||
self.session = session
|
||||
self.repo = LLMConfigRepository(session)
|
||||
|
||||
async def upsert_config(self, user_id: int, payload: LLMConfigCreate) -> LLMConfigRead:
|
||||
instance = await self.repo.get_by_user(user_id)
|
||||
data = payload.model_dump(exclude_unset=True)
|
||||
if "llm_provider_url" in data and data["llm_provider_url"] is not None:
|
||||
# HttpUrl 类型在 sqlite 中无法直接写入,需要提前转为字符串
|
||||
data["llm_provider_url"] = str(data["llm_provider_url"])
|
||||
if instance:
|
||||
await self.repo.update_fields(instance, **data)
|
||||
else:
|
||||
instance = LLMConfig(user_id=user_id, **data)
|
||||
await self.repo.add(instance)
|
||||
await self.session.commit()
|
||||
return LLMConfigRead.model_validate(instance)
|
||||
|
||||
async def get_config(self, user_id: int) -> Optional[LLMConfigRead]:
|
||||
instance = await self.repo.get_by_user(user_id)
|
||||
return LLMConfigRead.model_validate(instance) if instance else None
|
||||
|
||||
async def delete_config(self, user_id: int) -> bool:
|
||||
instance = await self.repo.get_by_user(user_id)
|
||||
if not instance:
|
||||
return False
|
||||
await self.repo.delete(instance)
|
||||
await self.session.commit()
|
||||
return True
|
||||
Reference in New Issue
Block a user