muryshev's picture
init
57cf043
raw
history blame
4.83 kB
import datetime
import logging
from fastapi import HTTPException
from sqlalchemy.orm import Session
from components.dbo.models.llm_config import LLMConfig as LLMConfigSQL
from schemas.llm_config import LLMConfig as LLMConfigScheme, LLMConfigCreateScheme
logger = logging.getLogger(__name__)
class LLMConfigService:
"""
Сервис для работы с параметрами LLM.
"""
def __init__(self, db: Session):
logger.info("LLMConfigService initializing")
self.db = db
def create(self, config_scheme: LLMConfigCreateScheme):
logger.info("Creating a new config")
with self.db() as session:
new_config: LLMConfigSQL = LLMConfigSQL(**config_scheme.dict())
session.add(new_config)
session.commit()
session.refresh(new_config)
if(new_config.is_default):
self.set_as_default(new_config.id)
return LLMConfigScheme(**new_config.to_dict())
def get_list(self) -> list[LLMConfigScheme]:
with self.db() as session:
configs: list[LLMConfigSQL] = session.query(LLMConfigSQL).all()
return [
LLMConfigScheme(**config.to_dict())
for config in configs
]
def get_by_id(self, id: int) -> LLMConfigScheme:
with self.db() as session:
config: LLMConfigSQL = session.query(LLMConfigSQL).filter(LLMConfigSQL.id == id).first()
if not config:
raise HTTPException(
status_code=400, detail=f"Item with id {id} not found"
)
return LLMConfigScheme(**config.to_dict())
def get_default(self) -> LLMConfigScheme:
with self.db() as session:
config: LLMConfigSQL = session.query(LLMConfigSQL).filter(LLMConfigSQL.is_default).first()
if not config:
# Возвращаем дефолтнейшие параметры в случае, если ничего нет.
# Неочевидно, но в случае факапа всё работать будет.
return LLMConfigScheme(
is_default=True,
model='meta-llama/Llama-3.3-70B-Instruct-Turbo',
temperature=0.14,
top_p=0.95,
min_p=0.05,
frequency_penalty=-0.001,
presence_penalty=1.3,
n_predict=1000,
seed=42,
id=0,
date_created=datetime.datetime.now(datetime.timezone.utc)
)
return LLMConfigScheme(**config.to_dict())
def set_as_default(self, id: int):
logger.info(f"Set default config: {id}")
with self.db() as session:
session.query(LLMConfigSQL).filter(LLMConfigSQL.is_default).update({"is_default": False})
config_new: LLMConfigSQL = session.query(LLMConfigSQL).filter(LLMConfigSQL.id == id).first()
if not config_new:
raise HTTPException(
status_code=400, detail=f"Item with id {id} not found"
)
config_new.is_default = True
session.commit()
def update(self, id: int, new_config: LLMConfigScheme):
logger.info("Updating default config")
with self.db() as session:
config: LLMConfigSQL = session.query(LLMConfigSQL).filter(LLMConfigSQL.id == id).first()
if not config:
raise HTTPException(
status_code=400, detail=f"Item with id {id} not found"
)
update_data = new_config.model_dump(exclude_unset=True)
for key, value in update_data.items():
if hasattr(config, key):
setattr(config, key, value)
session.commit()
if(new_config.is_default):
self.set_as_default(new_config.id)
session.refresh(config)
return config
def delete(self, id: int):
logger.info("Deleting config: {id}")
with self.db() as session:
config_to_del: LLMConfigSQL = session.query(LLMConfigSQL).get(id)
config_default: LLMConfigSQL = session.query(LLMConfigSQL).filter(LLMConfigSQL.is_default).first()
if config_to_del.id == config_default.id:
raise HTTPException(
status_code=400, detail=f"The default config cannot be deleted"
)
session.delete(config_to_del)
session.commit()