Repository navigation
Expand file tree
/
Copy pathserver.py
More file actions
82 lines (69 loc) · 2.42 KB
/
Copy pathserver.py
File metadata and controls
82 lines (69 loc) · 2.42 KB
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
# Code for the local API server that drives the underlying apps
from argparse import Namespace
from pydantic import BaseModel
from fastapi import FastAPI
from pathlib import Path
from pGPT_utils import *
project_path = Path(__file__).parent
app = FastAPI()
class QueryPayload(BaseModel):
query: str
hide_source: bool = False
class IngestionPayload(BaseModel):
source: str
class RunResponse(BaseModel):
status: int
message: str
data: dict | None = None
class ChatCompletionPayload(BaseModel):
model: str
messages: list
temperature: float = 1
top_p: float = 1
n: int = 1
stream: bool = False
stop: str | list | None = None
max_tokens: int | None = None
presence_penalty: float = 0
frequency_penalty: float = 0
logit_bias: dict | None = None
user: str | None = None
class ChatCompletionResponse(BaseModel):
id: str
object: str
created: int
choices: list
usage: dict
def query_messages(messages: list) -> ChatCompletionResponse:
res = {
'id': None,
'object': 'chat.completion',
'created': None,
'choices': [],
'usage': {'prompt_tokens': 0, 'completion_tokens': 0, 'total_tokens': 0}
}
# Only last entry of the messages list is considered query string
query = messages[-1]['content']
query_res = run(Namespace(action="query", query=query, hide_source=True))
res['id'] = query_res['data']['id']
res['created'] = query_res['data']['created']
if query_res['status'] != 0:
res['choices'] = [{'role': "system", 'content': query_res['message']}]
else:
res['choices'] = [{'role': "system", 'content': query_res['data']['answer']}]
return res
@app.get("/")
def read_root():
return {"Swagger": "/docs"}
@app.get("/status/{taskid}")
def get_status(taskid: str) -> RunResponse:
return run(Namespace(action="status", taskid=taskid, tasklist=str(project_path / "tasklist.json")))
@app.post("/ingest")
def ingest(payload: IngestionPayload) -> RunResponse:
return run(Namespace(action="ingest", source=payload.source, tasklist=str(project_path / "tasklist.json")))
@app.post("/query")
def query(payload: QueryPayload) -> RunResponse:
return run(Namespace(action="query", query=payload.query, hide_source=payload.hide_source))
@app.post("/v1/chat/completions")
def chat_completions(payload: ChatCompletionPayload) -> ChatCompletionResponse:
return query_messages(payload.messages)