lidp
commited on
Commit
·
96bea9f
1
Parent(s):
1de5cd5
Support agent for aibot (#2609)
Browse files### What problem does this PR solve?
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- api/apps/api_app.py +72 -9
api/apps/api_app.py
CHANGED
|
@@ -679,8 +679,79 @@ def completion_faq():
|
|
| 679 |
|
| 680 |
msg = []
|
| 681 |
msg.append({"role": "user", "content": req["word"]})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 682 |
|
| 683 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 684 |
conv.message.append(msg[-1])
|
| 685 |
e, dia = DialogService.get_by_id(conv.dialog_id)
|
| 686 |
if not e:
|
|
@@ -689,17 +760,9 @@ def completion_faq():
|
|
| 689 |
|
| 690 |
if not conv.reference:
|
| 691 |
conv.reference = []
|
| 692 |
-
conv.message.append({"role": "assistant", "content": ""})
|
| 693 |
conv.reference.append({"chunks": [], "doc_aggs": []})
|
| 694 |
|
| 695 |
-
def fillin_conv(ans):
|
| 696 |
-
nonlocal conv
|
| 697 |
-
if not conv.reference:
|
| 698 |
-
conv.reference.append(ans["reference"])
|
| 699 |
-
else:
|
| 700 |
-
conv.reference[-1] = ans["reference"]
|
| 701 |
-
conv.message[-1] = {"role": "assistant", "content": ans["answer"]}
|
| 702 |
-
|
| 703 |
data_type_picture = {
|
| 704 |
"type": 3,
|
| 705 |
"url": "base64 content"
|
|
|
|
| 679 |
|
| 680 |
msg = []
|
| 681 |
msg.append({"role": "user", "content": req["word"]})
|
| 682 |
+
if not msg[-1].get("id"): msg[-1]["id"] = get_uuid()
|
| 683 |
+
message_id = msg[-1]["id"]
|
| 684 |
+
|
| 685 |
+
def fillin_conv(ans):
|
| 686 |
+
nonlocal conv, message_id
|
| 687 |
+
if not conv.reference:
|
| 688 |
+
conv.reference.append(ans["reference"])
|
| 689 |
+
else:
|
| 690 |
+
conv.reference[-1] = ans["reference"]
|
| 691 |
+
conv.message[-1] = {"role": "assistant", "content": ans["answer"], "id": message_id}
|
| 692 |
+
ans["id"] = message_id
|
| 693 |
|
| 694 |
try:
|
| 695 |
+
if conv.source == "agent":
|
| 696 |
+
conv.message.append(msg[-1])
|
| 697 |
+
e, cvs = UserCanvasService.get_by_id(conv.dialog_id)
|
| 698 |
+
if not e:
|
| 699 |
+
return server_error_response("canvas not found.")
|
| 700 |
+
|
| 701 |
+
if not isinstance(cvs.dsl, str):
|
| 702 |
+
cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False)
|
| 703 |
+
|
| 704 |
+
if not conv.reference:
|
| 705 |
+
conv.reference = []
|
| 706 |
+
conv.message.append({"role": "assistant", "content": "", "id": message_id})
|
| 707 |
+
conv.reference.append({"chunks": [], "doc_aggs": []})
|
| 708 |
+
|
| 709 |
+
final_ans = {"reference": [], "doc_aggs": []}
|
| 710 |
+
canvas = Canvas(cvs.dsl, objs[0].tenant_id)
|
| 711 |
+
|
| 712 |
+
canvas.messages.append(msg[-1])
|
| 713 |
+
canvas.add_user_input(msg[-1]["content"])
|
| 714 |
+
answer = canvas.run(stream=False)
|
| 715 |
+
|
| 716 |
+
assert answer is not None, "Nothing. Is it over?"
|
| 717 |
+
|
| 718 |
+
data_type_picture = {
|
| 719 |
+
"type": 3,
|
| 720 |
+
"url": "base64 content"
|
| 721 |
+
}
|
| 722 |
+
data = [
|
| 723 |
+
{
|
| 724 |
+
"type": 1,
|
| 725 |
+
"content": ""
|
| 726 |
+
}
|
| 727 |
+
]
|
| 728 |
+
final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else ""
|
| 729 |
+
canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id})
|
| 730 |
+
if final_ans.get("reference"):
|
| 731 |
+
canvas.reference.append(final_ans["reference"])
|
| 732 |
+
cvs.dsl = json.loads(str(canvas))
|
| 733 |
+
|
| 734 |
+
ans = {"answer": final_ans["content"], "reference": final_ans.get("reference", [])}
|
| 735 |
+
data[0]["content"] += re.sub(r'##\d\$\$', '', ans["answer"])
|
| 736 |
+
fillin_conv(ans)
|
| 737 |
+
API4ConversationService.append_message(conv.id, conv.to_dict())
|
| 738 |
+
|
| 739 |
+
chunk_idxs = [int(match[2]) for match in re.findall(r'##\d\$\$', ans["answer"])]
|
| 740 |
+
for chunk_idx in chunk_idxs[:1]:
|
| 741 |
+
if ans["reference"]["chunks"][chunk_idx]["img_id"]:
|
| 742 |
+
try:
|
| 743 |
+
bkt, nm = ans["reference"]["chunks"][chunk_idx]["img_id"].split("-")
|
| 744 |
+
response = STORAGE_IMPL.get(bkt, nm)
|
| 745 |
+
data_type_picture["url"] = base64.b64encode(response).decode('utf-8')
|
| 746 |
+
data.append(data_type_picture)
|
| 747 |
+
break
|
| 748 |
+
except Exception as e:
|
| 749 |
+
return server_error_response(e)
|
| 750 |
+
|
| 751 |
+
response = {"code": 200, "msg": "success", "data": data}
|
| 752 |
+
return response
|
| 753 |
+
|
| 754 |
+
# ******************For dialog******************
|
| 755 |
conv.message.append(msg[-1])
|
| 756 |
e, dia = DialogService.get_by_id(conv.dialog_id)
|
| 757 |
if not e:
|
|
|
|
| 760 |
|
| 761 |
if not conv.reference:
|
| 762 |
conv.reference = []
|
| 763 |
+
conv.message.append({"role": "assistant", "content": "", "id": message_id})
|
| 764 |
conv.reference.append({"chunks": [], "doc_aggs": []})
|
| 765 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 766 |
data_type_picture = {
|
| 767 |
"type": 3,
|
| 768 |
"url": "base64 content"
|