### What problem does this PR solve? #2088 ### Type of change - [x] New Feature (non-breaking change which adds functionality)tags/v0.11.0
| continue | continue | ||||
| if m["role"] == "assistant" and not msg: | if m["role"] == "assistant" and not msg: | ||||
| continue | continue | ||||
| msg.append({"role": m["role"], "content": m["content"]}) | |||||
| msg.append(m) | |||||
| if not msg[-1].get("id"): msg[-1]["id"] = get_uuid() | |||||
| message_id = msg[-1]["id"] | |||||
| def fillin_conv(ans): | def fillin_conv(ans): | ||||
| nonlocal conv | |||||
| nonlocal conv, message_id | |||||
| if not conv.reference: | if not conv.reference: | ||||
| conv.reference.append(ans["reference"]) | conv.reference.append(ans["reference"]) | ||||
| else: | else: | ||||
| conv.reference[-1] = ans["reference"] | conv.reference[-1] = ans["reference"] | ||||
| conv.message[-1] = {"role": "assistant", "content": ans["answer"]} | |||||
| conv.message[-1] = {"role": "assistant", "content": ans["answer"], "id": message_id} | |||||
| def rename_field(ans): | def rename_field(ans): | ||||
| reference = ans['reference'] | reference = ans['reference'] | ||||
| if not conv.reference: | if not conv.reference: | ||||
| conv.reference = [] | conv.reference = [] | ||||
| conv.message.append({"role": "assistant", "content": ""}) | |||||
| conv.message.append({"role": "assistant", "content": "", "id": message_id}) | |||||
| conv.reference.append({"chunks": [], "doc_aggs": []}) | conv.reference.append({"chunks": [], "doc_aggs": []}) | ||||
| final_ans = {"reference": [], "content": ""} | final_ans = {"reference": [], "content": ""} | ||||
| yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, | yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, | ||||
| ensure_ascii=False) + "\n\n" | ensure_ascii=False) + "\n\n" | ||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"]}) | |||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | |||||
| if final_ans.get("reference"): | if final_ans.get("reference"): | ||||
| canvas.reference.append(final_ans["reference"]) | canvas.reference.append(final_ans["reference"]) | ||||
| cvs.dsl = json.loads(str(canvas)) | cvs.dsl = json.loads(str(canvas)) | ||||
| return resp | return resp | ||||
| final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" | final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" | ||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"]}) | |||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | |||||
| if final_ans.get("reference"): | if final_ans.get("reference"): | ||||
| canvas.reference.append(final_ans["reference"]) | canvas.reference.append(final_ans["reference"]) | ||||
| cvs.dsl = json.loads(str(canvas)) | cvs.dsl = json.loads(str(canvas)) | ||||
| if not conv.reference: | if not conv.reference: | ||||
| conv.reference = [] | conv.reference = [] | ||||
| conv.message.append({"role": "assistant", "content": ""}) | |||||
| conv.message.append({"role": "assistant", "content": "", "id": message_id}) | |||||
| conv.reference.append({"chunks": [], "doc_aggs": []}) | conv.reference.append({"chunks": [], "doc_aggs": []}) | ||||
| def stream(): | def stream(): |
| cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) | cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) | ||||
| final_ans = {"reference": [], "content": ""} | final_ans = {"reference": [], "content": ""} | ||||
| message_id = get_uuid() | |||||
| try: | try: | ||||
| canvas = Canvas(cvs.dsl, current_user.id) | canvas = Canvas(cvs.dsl, current_user.id) | ||||
| if "message" in req: | if "message" in req: | ||||
| canvas.messages.append({"role": "user", "content": req["message"]}) | |||||
| canvas.messages.append({"role": "user", "content": req["message"], "id": message_id}) | |||||
| canvas.add_user_input(req["message"]) | canvas.add_user_input(req["message"]) | ||||
| answer = canvas.run(stream=stream) | answer = canvas.run(stream=stream) | ||||
| print(canvas) | print(canvas) | ||||
| ans = {"answer": ans["content"], "reference": ans.get("reference", [])} | ans = {"answer": ans["content"], "reference": ans.get("reference", [])} | ||||
| yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" | yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) + "\n\n" | ||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"]}) | |||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | |||||
| if final_ans.get("reference"): | if final_ans.get("reference"): | ||||
| canvas.reference.append(final_ans["reference"]) | canvas.reference.append(final_ans["reference"]) | ||||
| cvs.dsl = json.loads(str(canvas)) | cvs.dsl = json.loads(str(canvas)) | ||||
| return resp | return resp | ||||
| final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" | final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" | ||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"]}) | |||||
| canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | |||||
| if final_ans.get("reference"): | if final_ans.get("reference"): | ||||
| canvas.reference.append(final_ans["reference"]) | canvas.reference.append(final_ans["reference"]) | ||||
| cvs.dsl = json.loads(str(canvas)) | cvs.dsl = json.loads(str(canvas)) |
| continue | continue | ||||
| if m["role"] == "assistant" and not msg: | if m["role"] == "assistant" and not msg: | ||||
| continue | continue | ||||
| msg.append({"role": m["role"], "content": m["content"]}) | |||||
| if "doc_ids" in m: | |||||
| msg[-1]["doc_ids"] = m["doc_ids"] | |||||
| msg.append(m) | |||||
| message_id = msg[-1].get("id") | |||||
| try: | try: | ||||
| e, conv = ConversationService.get_by_id(req["conversation_id"]) | e, conv = ConversationService.get_by_id(req["conversation_id"]) | ||||
| if not e: | if not e: | ||||
| if not conv.reference: | if not conv.reference: | ||||
| conv.reference = [] | conv.reference = [] | ||||
| conv.message.append({"role": "assistant", "content": ""}) | |||||
| conv.message.append({"role": "assistant", "content": "", "id": message_id}) | |||||
| conv.reference.append({"chunks": [], "doc_aggs": []}) | conv.reference.append({"chunks": [], "doc_aggs": []}) | ||||
| def fillin_conv(ans): | def fillin_conv(ans): | ||||
| nonlocal conv | |||||
| nonlocal conv, message_id | |||||
| if not conv.reference: | if not conv.reference: | ||||
| conv.reference.append(ans["reference"]) | conv.reference.append(ans["reference"]) | ||||
| else: conv.reference[-1] = ans["reference"] | else: conv.reference[-1] = ans["reference"] | ||||
| conv.message[-1] = {"role": "assistant", "content": ans["answer"]} | |||||
| conv.message[-1] = {"role": "assistant", "content": ans["answer"], "id": message_id} | |||||
| def stream(): | def stream(): | ||||
| nonlocal dia, msg, req, conv | nonlocal dia, msg, req, conv | ||||
| except Exception as e: | except Exception as e: | ||||
| return server_error_response(e) | return server_error_response(e) | ||||
| @manager.route('/delete_msg', methods=['POST']) | |||||
| @login_required | |||||
| @validate_request("conversation_id", "message_id") | |||||
| def completion(): | |||||
| req = request.json | |||||
| e, conv = ConversationService.get_by_id(req["conversation_id"]) | |||||
| if not e: | |||||
| return get_data_error_result(retmsg="Conversation not found!") | |||||
| conv = conv.to_dict() | |||||
| for i, msg in enumerate(conv["message"]): | |||||
| if req["message_id"] != msg.get("id", ""): | |||||
| continue | |||||
| assert conv["message"][i+1]["id"] == req["message_id"] | |||||
| conv["message"].pop(i) | |||||
| conv["message"].pop(i) | |||||
| conv["reference"].pop(i) | |||||
| break | |||||
| ConversationService.update_by_id(conv["id"], conv) | |||||
| return get_json_result(data=conv) |