Spaces:
Sleeping
Sleeping
File size: 4,825 Bytes
57cf043 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
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()
|