20
20
21
21
from api .db import StatusEnum
22
22
from api .db .services .dialog_service import DialogService , ConversationService , chat
23
- from api .settings import RetCode
24
23
from api .utils import get_uuid
25
- from api .utils .api_utils import get_data_error_result
26
- from api .utils .api_utils import get_json_result , token_required
24
+ from api .utils .api_utils import get_error_data_result
25
+ from api .utils .api_utils import get_result , token_required
27
26
28
-
29
- @manager .route ('/save' , methods = ['POST' ])
27
+ @manager .route ('/chat/<chat_id>/session' , methods = ['POST' ])
30
28
@token_required
31
- def set_conversation (tenant_id ):
29
+ def create (tenant_id , chat_id ):
32
30
req = request .json
33
- conv_id = req .get ("id" )
34
- if "assistant_id" in req :
35
- req ["dialog_id" ] = req .pop ("assistant_id" )
36
- if "id" in req :
37
- del req ["id" ]
38
- conv = ConversationService .query (id = conv_id )
39
- if not conv :
40
- return get_data_error_result (retmsg = "Session does not exist" )
41
- if not DialogService .query (id = conv [0 ].dialog_id , tenant_id = tenant_id , status = StatusEnum .VALID .value ):
42
- return get_data_error_result (retmsg = "You do not own the session" )
43
- if req .get ("dialog_id" ):
44
- dia = DialogService .query (tenant_id = tenant_id , id = req ["dialog_id" ], status = StatusEnum .VALID .value )
45
- if not dia :
46
- return get_data_error_result (retmsg = "You do not own the assistant" )
47
- if "dialog_id" in req and not req .get ("dialog_id" ):
48
- return get_data_error_result (retmsg = "assistant_id can not be empty." )
49
- if "message" in req :
50
- return get_data_error_result (retmsg = "message can not be change" )
51
- if "reference" in req :
52
- return get_data_error_result (retmsg = "reference can not be change" )
53
- if "name" in req and not req .get ("name" ):
54
- return get_data_error_result (retmsg = "name can not be empty." )
55
- if not ConversationService .update_by_id (conv_id , req ):
56
- return get_data_error_result (retmsg = "Session updates error" )
57
- return get_json_result (data = True )
58
-
59
- if not req .get ("dialog_id" ):
60
- return get_data_error_result (retmsg = "assistant_id is required." )
31
+ req ["dialog_id" ] = chat_id
61
32
dia = DialogService .query (tenant_id = tenant_id , id = req ["dialog_id" ], status = StatusEnum .VALID .value )
62
33
if not dia :
63
- return get_data_error_result (retmsg = "You do not own the assistant" )
34
+ return get_error_data_result (retmsg = "You do not own the assistant" )
64
35
conv = {
65
36
"id" : get_uuid (),
66
37
"dialog_id" : req ["dialog_id" ],
67
38
"name" : req .get ("name" , "New session" ),
68
39
"message" : [{"role" : "assistant" , "content" : "Hi! I am your assistant,can I help you?" }]
69
40
}
70
41
if not conv .get ("name" ):
71
- return get_data_error_result (retmsg = "name can not be empty." )
42
+ return get_error_data_result (retmsg = "Name can not be empty." )
72
43
ConversationService .save (** conv )
73
44
e , conv = ConversationService .get_by_id (conv ["id" ])
74
45
if not e :
75
- return get_data_error_result (retmsg = "Fail to new session!" )
46
+ return get_error_data_result (retmsg = "Fail to create a session!" )
76
47
conv = conv .to_dict ()
77
48
conv ['messages' ] = conv .pop ("message" )
78
- conv ["assistant_id " ] = conv .pop ("dialog_id" )
49
+ conv ["chat_id " ] = conv .pop ("dialog_id" )
79
50
del conv ["reference" ]
80
- return get_json_result (data = conv )
51
+ return get_result (data = conv )
81
52
82
-
83
- @manager .route ('/completion' , methods = ['POST' ])
53
+ @manager .route ('/chat/<chat_id>/session/<session_id>' , methods = ['PUT' ])
84
54
@token_required
85
- def completion (tenant_id ):
55
+ def update (tenant_id ,chat_id ,session_id ):
56
+ req = request .json
57
+ if "dialog_id" in req and req .get ("dialog_id" ) != chat_id :
58
+ return get_error_data_result (retmsg = "Can't change chat_id" )
59
+ if "chat_id" in req and req .get ("chat_id" ) != chat_id :
60
+ return get_error_data_result (retmsg = "Can't change chat_id" )
61
+ req ["dialog_id" ] = chat_id
62
+ conv_id = session_id
63
+ conv = ConversationService .query (id = conv_id ,dialog_id = chat_id )
64
+ if not conv :
65
+ return get_error_data_result (retmsg = "Session does not exist" )
66
+ if not DialogService .query (id = chat_id , tenant_id = tenant_id , status = StatusEnum .VALID .value ):
67
+ return get_error_data_result (retmsg = "You do not own the session" )
68
+ if "message" in req or "messages" in req :
69
+ return get_error_data_result (retmsg = "Message can not be change" )
70
+ if "reference" in req :
71
+ return get_error_data_result (retmsg = "Reference can not be change" )
72
+ if "name" in req and not req .get ("name" ):
73
+ return get_error_data_result (retmsg = "Name can not be empty." )
74
+ if not ConversationService .update_by_id (conv_id , req ):
75
+ return get_error_data_result (retmsg = "Session updates error" )
76
+ return get_result ()
77
+
78
+
79
+ @manager .route ('/chat/<chat_id>/session/<session_id>/completion' , methods = ['POST' ])
80
+ @token_required
81
+ def completion (tenant_id ,chat_id ,session_id ):
86
82
req = request .json
87
83
# req = {"conversation_id": "9aaaca4c11d311efa461fa163e197198", "messages": [
88
84
# {"role": "user", "content": "上海有吗?"}
89
85
# ]}
90
- if "session_id" not in req :
91
- return get_data_error_result (retmsg = "session_id is required " )
92
- conv = ConversationService .query (id = req [ " session_id" ] )
86
+ if not req . get ( "question" ) :
87
+ return get_error_data_result (retmsg = "Please input your question. " )
88
+ conv = ConversationService .query (id = session_id , dialog_id = chat_id )
93
89
if not conv :
94
- return get_data_error_result (retmsg = "Session does not exist" )
90
+ return get_error_data_result (retmsg = "Session does not exist" )
95
91
conv = conv [0 ]
96
- if not DialogService .query (id = conv . dialog_id , tenant_id = tenant_id , status = StatusEnum .VALID .value ):
97
- return get_data_error_result (retmsg = "You do not own the session" )
92
+ if not DialogService .query (id = chat_id , tenant_id = tenant_id , status = StatusEnum .VALID .value ):
93
+ return get_error_data_result (retmsg = "You do not own the session" )
98
94
msg = []
99
95
question = {
100
96
"content" : req .get ("question" ),
@@ -108,7 +104,6 @@ def completion(tenant_id):
108
104
msg .append (m )
109
105
message_id = msg [- 1 ].get ("id" )
110
106
e , dia = DialogService .get_by_id (conv .dialog_id )
111
- del req ["session_id" ]
112
107
113
108
if not conv .reference :
114
109
conv .reference = []
@@ -130,13 +125,13 @@ def stream():
130
125
try :
131
126
for ans in chat (dia , msg , ** req ):
132
127
fillin_conv (ans )
133
- yield "data:" + json .dumps ({"retcode " : 0 , "retmsg" : "" , "data" : ans }, ensure_ascii = False ) + "\n \n "
128
+ yield "data:" + json .dumps ({"code " : 0 , "data" : ans }, ensure_ascii = False ) + "\n \n "
134
129
ConversationService .update_by_id (conv .id , conv .to_dict ())
135
130
except Exception as e :
136
- yield "data:" + json .dumps ({"retcode " : 500 , "retmsg " : str (e ),
131
+ yield "data:" + json .dumps ({"code " : 500 , "message " : str (e ),
137
132
"data" : {"answer" : "**ERROR**: " + str (e ), "reference" : []}},
138
133
ensure_ascii = False ) + "\n \n "
139
- yield "data:" + json .dumps ({"retcode " : 0 , "retmsg" : "" , "data" : True }, ensure_ascii = False ) + "\n \n "
134
+ yield "data:" + json .dumps ({"code " : 0 , "data" : True }, ensure_ascii = False ) + "\n \n "
140
135
141
136
if req .get ("stream" , True ):
142
137
resp = Response (stream (), mimetype = "text/event-stream" )
@@ -153,73 +148,31 @@ def stream():
153
148
fillin_conv (ans )
154
149
ConversationService .update_by_id (conv .id , conv .to_dict ())
155
150
break
156
- return get_json_result (data = answer )
157
-
151
+ return get_result (data = answer )
158
152
159
- @manager .route ('/get ' , methods = ['GET' ])
153
+ @manager .route ('/chat/<chat_id>/session ' , methods = ['GET' ])
160
154
@token_required
161
- def get (tenant_id ):
162
- req = request .args
163
- if "id" not in req :
164
- return get_data_error_result (retmsg = "id is required" )
165
- conv_id = req ["id" ]
166
- conv = ConversationService .query (id = conv_id )
167
- if not conv :
168
- return get_data_error_result (retmsg = "Session does not exist" )
169
- if not DialogService .query (id = conv [0 ].dialog_id , tenant_id = tenant_id , status = StatusEnum .VALID .value ):
170
- return get_data_error_result (retmsg = "You do not own the session" )
171
- if "assistant_id" in req :
172
- if req ["assistant_id" ] != conv [0 ].dialog_id :
173
- return get_data_error_result (retmsg = "The session doesn't belong to the assistant" )
174
- conv = conv [0 ].to_dict ()
175
- conv ['messages' ] = conv .pop ("message" )
176
- conv ["assistant_id" ] = conv .pop ("dialog_id" )
177
- if conv ["reference" ]:
178
- messages = conv ["messages" ]
179
- message_num = 0
180
- chunk_num = 0
181
- while message_num < len (messages ):
182
- if message_num != 0 and messages [message_num ]["role" ] != "user" :
183
- chunk_list = []
184
- if "chunks" in conv ["reference" ][chunk_num ]:
185
- chunks = conv ["reference" ][chunk_num ]["chunks" ]
186
- for chunk in chunks :
187
- new_chunk = {
188
- "id" : chunk ["chunk_id" ],
189
- "content" : chunk ["content_with_weight" ],
190
- "document_id" : chunk ["doc_id" ],
191
- "document_name" : chunk ["docnm_kwd" ],
192
- "knowledgebase_id" : chunk ["kb_id" ],
193
- "image_id" : chunk ["img_id" ],
194
- "similarity" : chunk ["similarity" ],
195
- "vector_similarity" : chunk ["vector_similarity" ],
196
- "term_similarity" : chunk ["term_similarity" ],
197
- "positions" : chunk ["positions" ],
198
- }
199
- chunk_list .append (new_chunk )
200
- chunk_num += 1
201
- messages [message_num ]["reference" ] = chunk_list
202
- message_num += 1
203
- del conv ["reference" ]
204
- return get_json_result (data = conv )
205
-
206
-
207
- @manager .route ('/list' , methods = ["GET" ])
208
- @token_required
209
- def list (tenant_id ):
210
- assistant_id = request .args ["assistant_id" ]
211
- if not DialogService .query (tenant_id = tenant_id , id = assistant_id , status = StatusEnum .VALID .value ):
212
- return get_json_result (
213
- data = False , retmsg = f"You don't own the assistant." ,
214
- retcode = RetCode .OPERATING_ERROR )
215
- convs = ConversationService .query (
216
- dialog_id = assistant_id ,
217
- order_by = ConversationService .model .create_time ,
218
- reverse = True )
219
- convs = [d .to_dict () for d in convs ]
155
+ def list (chat_id ,tenant_id ):
156
+ if not DialogService .query (tenant_id = tenant_id , id = chat_id , status = StatusEnum .VALID .value ):
157
+ return get_error_data_result (retmsg = f"You don't own the assistant { chat_id } ." )
158
+ id = request .args .get ("id" )
159
+ name = request .args .get ("name" )
160
+ session = ConversationService .query (id = id ,name = name ,dialog_id = chat_id )
161
+ if not session :
162
+ return get_error_data_result (retmsg = "The session doesn't exist" )
163
+ page_number = int (request .args .get ("page" , 1 ))
164
+ items_per_page = int (request .args .get ("page_size" , 1024 ))
165
+ orderby = request .args .get ("orderby" , "create_time" )
166
+ if request .args .get ("desc" ) == "False" :
167
+ desc = False
168
+ else :
169
+ desc = True
170
+ convs = ConversationService .get_list (chat_id ,page_number ,items_per_page ,orderby ,desc ,id ,name )
171
+ if not convs :
172
+ return get_result (data = [])
220
173
for conv in convs :
221
174
conv ['messages' ] = conv .pop ("message" )
222
- conv ["assistant_id " ] = conv .pop ("dialog_id" )
175
+ conv ["chat " ] = conv .pop ("dialog_id" )
223
176
if conv ["reference" ]:
224
177
messages = conv ["messages" ]
225
178
message_num = 0
@@ -247,20 +200,19 @@ def list(tenant_id):
247
200
messages [message_num ]["reference" ] = chunk_list
248
201
message_num += 1
249
202
del conv ["reference" ]
250
- return get_json_result (data = convs )
203
+ return get_result (data = convs )
251
204
252
-
253
- @manager .route ('/delete' , methods = ["DELETE" ])
205
+ @manager .route ('/chat/<chat_id>/session' , methods = ["DELETE" ])
254
206
@token_required
255
- def delete (tenant_id ):
256
- id = request . args . get ( "id" )
257
- if not id :
258
- return get_data_error_result ( retmsg = "`id` is required in deleting operation " )
259
- conv = ConversationService . query ( id = id )
260
- if not conv :
261
- return get_data_error_result ( retmsg = "Session doesn't exist" )
262
- conv = conv [ 0 ]
263
- if not DialogService . query ( id = conv . dialog_id , tenant_id = tenant_id , status = StatusEnum . VALID . value ) :
264
- return get_data_error_result (retmsg = "You don 't own the session" )
265
- ConversationService .delete_by_id (id )
266
- return get_json_result ( data = True )
207
+ def delete (tenant_id , chat_id ):
208
+ if not DialogService . query ( id = chat_id , tenant_id = tenant_id , status = StatusEnum . VALID . value ):
209
+ return get_error_data_result ( retmsg = "You don't own the chat" )
210
+ ids = request . json . get ( "ids " )
211
+ if not ids :
212
+ return get_error_data_result ( retmsg = "`ids` is required in deleting operation" )
213
+ for id in ids :
214
+ conv = ConversationService . query ( id = id , dialog_id = chat_id )
215
+ if not conv :
216
+ return get_error_data_result (retmsg = "The chat doesn 't own the session" )
217
+ ConversationService .delete_by_id (id )
218
+ return get_result ( )
0 commit comments