chat.py 1.95 KB
Newer Older
chenxl's avatar
chenxl committed
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
from typing import List, Optional
from enum import Enum

from pydantic import BaseModel

from ktransformers.server.schemas.base import Object

class Role(Enum):
    system = 'system'
    user = 'user'
    assistant = 'assistant'
    tool = 'tool'
    function = 'function'


class Message(BaseModel):
    content: str
    role:Role
    name: Optional[str] = None
    def to_tokenizer_message(self):
        return {'content':self.content,'role':self.role.value}


class ChatCompletionCreate(BaseModel):
    messages: List[Message]
    model : str
    stream : bool = False
lazymio's avatar
lazymio committed
28
29
30
    temperature: Optional[float]
    top_p: Optional[float]
    repetition_penalty: Optional[float]
chenxl's avatar
chenxl committed
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

    def get_tokenizer_messages(self):
        return [m.to_tokenizer_message() for m in self.messages]

class FinishReason(Enum):
    stop = 'stop'
    length = 'length'

class Choice(BaseModel):
    index: int
    message: Message
    logprobs: Optional[str] = None
    finish_reason: FinishReason = None

class DeltaChoice(BaseModel):
    index: int
    delta: Message
    logprobs: Optional[str] = None
    finish_reason: FinishReason = None


class Usage(BaseModel):
    completion_tokens:int
    prompt_tokens:int
    total_tokens:int


class ChatCompletionBase(Object):
    created:int
    model:str = 'not implmented'
    system_fingerprint:str = 'not implmented'
    usage: Optional[Usage] = None

class ChatCompletionObject(ChatCompletionBase):
    choices:List[Choice] = []

    def append_token(self,token:str):
        if len(self.choices) == 0:
            self.choices.append(Choice(index=0,message=Message(content='',role=Role.assistant)))
        self.choices[0].message.content += token

class ChatCompletionChunk(ChatCompletionBase):
    choices:List[DeltaChoice] = []

    def set_token(self,token:str):
        self.choices = [
            DeltaChoice(index=0,delta=Message(content=token,role=Role.assistant))
        ]

    def to_stream_reply(self):
        return f"data:{self.model_dump_json()}\n\n"