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