Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

canvas_app.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #
  2. # Copyright 2024 The InfiniFlow Authors. All Rights Reserved.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. #
  16. import json
  17. from functools import partial
  18. from flask import request, Response
  19. from flask_login import login_required, current_user
  20. from api.db.services.canvas_service import CanvasTemplateService, UserCanvasService
  21. from api.utils import get_uuid
  22. from api.utils.api_utils import get_json_result, server_error_response, validate_request
  23. from graph.canvas import Canvas
  24. @manager.route('/templates', methods=['GET'])
  25. @login_required
  26. def templates():
  27. return get_json_result(data=[c.to_dict() for c in CanvasTemplateService.get_all()])
  28. @manager.route('/list', methods=['GET'])
  29. @login_required
  30. def canvas_list():
  31. return get_json_result(data=[c.to_dict() for c in UserCanvasService.query(user_id=current_user.id)])
  32. @manager.route('/rm', methods=['POST'])
  33. @validate_request("canvas_ids")
  34. @login_required
  35. def rm():
  36. for i in request.json["canvas_ids"]:
  37. UserCanvasService.delete_by_id(i)
  38. return get_json_result(data=True)
  39. @manager.route('/set', methods=['POST'])
  40. @validate_request("dsl", "title")
  41. @login_required
  42. def save():
  43. req = request.json
  44. req["user_id"] = current_user.id
  45. if not isinstance(req["dsl"], str):req["dsl"] = json.dumps(req["dsl"], ensure_ascii=False)
  46. req["dsl"] = json.loads(req["dsl"])
  47. if "id" not in req:
  48. if UserCanvasService.query(user_id=current_user.id, title=req["title"].strip()):
  49. return server_error_response(ValueError("Duplicated title."))
  50. req["id"] = get_uuid()
  51. if not UserCanvasService.save(**req):
  52. return server_error_response("Fail to save canvas.")
  53. else:
  54. UserCanvasService.update_by_id(req["id"], req)
  55. return get_json_result(data=req)
  56. @manager.route('/get/<canvas_id>', methods=['GET'])
  57. @login_required
  58. def get(canvas_id):
  59. e, c = UserCanvasService.get_by_id(canvas_id)
  60. if not e:
  61. return server_error_response("canvas not found.")
  62. return get_json_result(data=c.to_dict())
  63. @manager.route('/completion', methods=['POST'])
  64. @validate_request("id")
  65. @login_required
  66. def run():
  67. req = request.json
  68. stream = req.get("stream", True)
  69. e, cvs = UserCanvasService.get_by_id(req["id"])
  70. if not e:
  71. return server_error_response("canvas not found.")
  72. if not isinstance(cvs.dsl, str):
  73. cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False)
  74. final_ans = {"reference": [], "content": ""}
  75. try:
  76. canvas = Canvas(cvs.dsl, current_user.id)
  77. print(canvas)
  78. if "message" in req:
  79. canvas.messages.append({"role": "user", "content": req["message"]})
  80. canvas.add_user_input(req["message"])
  81. answer = canvas.run(stream=stream)
  82. except Exception as e:
  83. return server_error_response(e)
  84. if stream:
  85. assert isinstance(answer, partial)
  86. def sse():
  87. nonlocal answer, cvs
  88. try:
  89. for ans in answer():
  90. for k in ans.keys():
  91. final_ans[k] = ans[k]
  92. ans = {"answer": ans["content"], "reference": ans.get("reference", [])}
  93. yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": ans}, ensure_ascii=False) +"\n\n"
  94. canvas.messages.append({"role": "assistant", "content": final_ans["content"]})
  95. if "reference" in final_ans:
  96. canvas.reference.append(final_ans["reference"])
  97. cvs.dsl = json.loads(str(canvas))
  98. UserCanvasService.update_by_id(req["id"], cvs.to_dict())
  99. except Exception as e:
  100. yield "data:" + json.dumps({"retcode": 500, "retmsg": str(e),
  101. "data": {"answer": "**ERROR**: " + str(e), "reference": []}},
  102. ensure_ascii=False) + "\n\n"
  103. yield "data:" + json.dumps({"retcode": 0, "retmsg": "", "data": True}, ensure_ascii=False) + "\n\n"
  104. resp = Response(sse(), mimetype="text/event-stream")
  105. resp.headers.add_header("Cache-control", "no-cache")
  106. resp.headers.add_header("Connection", "keep-alive")
  107. resp.headers.add_header("X-Accel-Buffering", "no")
  108. resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8")
  109. return resp
  110. canvas.messages.append({"role": "assistant", "content": final_ans["content"]})
  111. if "reference" in final_ans:
  112. canvas.reference.append(final_ans["reference"])
  113. cvs.dsl = json.loads(str(canvas))
  114. UserCanvasService.update_by_id(req["id"], cvs.to_dict())
  115. return get_json_result(data=req["dsl"])
  116. @manager.route('/reset', methods=['POST'])
  117. @validate_request("canvas_id")
  118. @login_required
  119. def reset():
  120. req = request.json
  121. try:
  122. user_canvas = UserCanvasService.get_by_id(req["canvas_id"])
  123. canvas = Canvas(req["dsl"], current_user.id)
  124. canvas.reset()
  125. req["dsl"] = json.loads(str(canvas))
  126. UserCanvasService.update_by_id(req["canvas_id"], dsl=req["dsl"])
  127. return get_json_result(data=req["dsl"])
  128. except Exception as e:
  129. return server_error_response(e)