Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

generator.py 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. from collections.abc import Sequence
  2. from flask_login import current_user
  3. from flask_restx import Resource, reqparse
  4. from controllers.console import api
  5. from controllers.console.app.error import (
  6. CompletionRequestError,
  7. ProviderModelCurrentlyNotSupportError,
  8. ProviderNotInitializeError,
  9. ProviderQuotaExceededError,
  10. )
  11. from controllers.console.wraps import account_initialization_required, setup_required
  12. from core.errors.error import ModelCurrentlyNotSupportError, ProviderTokenNotInitError, QuotaExceededError
  13. from core.helper.code_executor.javascript.javascript_code_provider import JavascriptCodeProvider
  14. from core.helper.code_executor.python3.python3_code_provider import Python3CodeProvider
  15. from core.llm_generator.llm_generator import LLMGenerator
  16. from core.model_runtime.errors.invoke import InvokeError
  17. from libs.login import login_required
  18. class RuleGenerateApi(Resource):
  19. @setup_required
  20. @login_required
  21. @account_initialization_required
  22. def post(self):
  23. parser = reqparse.RequestParser()
  24. parser.add_argument("instruction", type=str, required=True, nullable=False, location="json")
  25. parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json")
  26. parser.add_argument("no_variable", type=bool, required=True, default=False, location="json")
  27. args = parser.parse_args()
  28. account = current_user
  29. try:
  30. rules = LLMGenerator.generate_rule_config(
  31. tenant_id=account.current_tenant_id,
  32. instruction=args["instruction"],
  33. model_config=args["model_config"],
  34. no_variable=args["no_variable"],
  35. )
  36. except ProviderTokenNotInitError as ex:
  37. raise ProviderNotInitializeError(ex.description)
  38. except QuotaExceededError:
  39. raise ProviderQuotaExceededError()
  40. except ModelCurrentlyNotSupportError:
  41. raise ProviderModelCurrentlyNotSupportError()
  42. except InvokeError as e:
  43. raise CompletionRequestError(e.description)
  44. return rules
  45. class RuleCodeGenerateApi(Resource):
  46. @setup_required
  47. @login_required
  48. @account_initialization_required
  49. def post(self):
  50. parser = reqparse.RequestParser()
  51. parser.add_argument("instruction", type=str, required=True, nullable=False, location="json")
  52. parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json")
  53. parser.add_argument("no_variable", type=bool, required=True, default=False, location="json")
  54. parser.add_argument("code_language", type=str, required=False, default="javascript", location="json")
  55. args = parser.parse_args()
  56. account = current_user
  57. try:
  58. code_result = LLMGenerator.generate_code(
  59. tenant_id=account.current_tenant_id,
  60. instruction=args["instruction"],
  61. model_config=args["model_config"],
  62. code_language=args["code_language"],
  63. )
  64. except ProviderTokenNotInitError as ex:
  65. raise ProviderNotInitializeError(ex.description)
  66. except QuotaExceededError:
  67. raise ProviderQuotaExceededError()
  68. except ModelCurrentlyNotSupportError:
  69. raise ProviderModelCurrentlyNotSupportError()
  70. except InvokeError as e:
  71. raise CompletionRequestError(e.description)
  72. return code_result
  73. class RuleStructuredOutputGenerateApi(Resource):
  74. @setup_required
  75. @login_required
  76. @account_initialization_required
  77. def post(self):
  78. parser = reqparse.RequestParser()
  79. parser.add_argument("instruction", type=str, required=True, nullable=False, location="json")
  80. parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json")
  81. args = parser.parse_args()
  82. account = current_user
  83. try:
  84. structured_output = LLMGenerator.generate_structured_output(
  85. tenant_id=account.current_tenant_id,
  86. instruction=args["instruction"],
  87. model_config=args["model_config"],
  88. )
  89. except ProviderTokenNotInitError as ex:
  90. raise ProviderNotInitializeError(ex.description)
  91. except QuotaExceededError:
  92. raise ProviderQuotaExceededError()
  93. except ModelCurrentlyNotSupportError:
  94. raise ProviderModelCurrentlyNotSupportError()
  95. except InvokeError as e:
  96. raise CompletionRequestError(e.description)
  97. return structured_output
  98. class InstructionGenerateApi(Resource):
  99. @setup_required
  100. @login_required
  101. @account_initialization_required
  102. def post(self):
  103. parser = reqparse.RequestParser()
  104. parser.add_argument("flow_id", type=str, required=True, default="", location="json")
  105. parser.add_argument("node_id", type=str, required=False, default="", location="json")
  106. parser.add_argument("current", type=str, required=False, default="", location="json")
  107. parser.add_argument("language", type=str, required=False, default="javascript", location="json")
  108. parser.add_argument("instruction", type=str, required=True, nullable=False, location="json")
  109. parser.add_argument("model_config", type=dict, required=True, nullable=False, location="json")
  110. parser.add_argument("ideal_output", type=str, required=False, default="", location="json")
  111. args = parser.parse_args()
  112. code_template = (
  113. Python3CodeProvider.get_default_code()
  114. if args["language"] == "python"
  115. else (JavascriptCodeProvider.get_default_code())
  116. if args["language"] == "javascript"
  117. else ""
  118. )
  119. try:
  120. # Generate from nothing for a workflow node
  121. if (args["current"] == code_template or args["current"] == "") and args["node_id"] != "":
  122. from models import App, db
  123. from services.workflow_service import WorkflowService
  124. app = db.session.query(App).where(App.id == args["flow_id"]).first()
  125. if not app:
  126. return {"error": f"app {args['flow_id']} not found"}, 400
  127. workflow = WorkflowService().get_draft_workflow(app_model=app)
  128. if not workflow:
  129. return {"error": f"workflow {args['flow_id']} not found"}, 400
  130. nodes: Sequence = workflow.graph_dict["nodes"]
  131. node = [node for node in nodes if node["id"] == args["node_id"]]
  132. if len(node) == 0:
  133. return {"error": f"node {args['node_id']} not found"}, 400
  134. node_type = node[0]["data"]["type"]
  135. match node_type:
  136. case "llm":
  137. return LLMGenerator.generate_rule_config(
  138. current_user.current_tenant_id,
  139. instruction=args["instruction"],
  140. model_config=args["model_config"],
  141. no_variable=True,
  142. )
  143. case "agent":
  144. return LLMGenerator.generate_rule_config(
  145. current_user.current_tenant_id,
  146. instruction=args["instruction"],
  147. model_config=args["model_config"],
  148. no_variable=True,
  149. )
  150. case "code":
  151. return LLMGenerator.generate_code(
  152. tenant_id=current_user.current_tenant_id,
  153. instruction=args["instruction"],
  154. model_config=args["model_config"],
  155. code_language=args["language"],
  156. )
  157. case _:
  158. return {"error": f"invalid node type: {node_type}"}
  159. if args["node_id"] == "" and args["current"] != "": # For legacy app without a workflow
  160. return LLMGenerator.instruction_modify_legacy(
  161. tenant_id=current_user.current_tenant_id,
  162. flow_id=args["flow_id"],
  163. current=args["current"],
  164. instruction=args["instruction"],
  165. model_config=args["model_config"],
  166. ideal_output=args["ideal_output"],
  167. )
  168. if args["node_id"] != "" and args["current"] != "": # For workflow node
  169. return LLMGenerator.instruction_modify_workflow(
  170. tenant_id=current_user.current_tenant_id,
  171. flow_id=args["flow_id"],
  172. node_id=args["node_id"],
  173. current=args["current"],
  174. instruction=args["instruction"],
  175. model_config=args["model_config"],
  176. ideal_output=args["ideal_output"],
  177. )
  178. return {"error": "incompatible parameters"}, 400
  179. except ProviderTokenNotInitError as ex:
  180. raise ProviderNotInitializeError(ex.description)
  181. except QuotaExceededError:
  182. raise ProviderQuotaExceededError()
  183. except ModelCurrentlyNotSupportError:
  184. raise ProviderModelCurrentlyNotSupportError()
  185. except InvokeError as e:
  186. raise CompletionRequestError(e.description)
  187. class InstructionGenerationTemplateApi(Resource):
  188. @setup_required
  189. @login_required
  190. @account_initialization_required
  191. def post(self) -> dict:
  192. parser = reqparse.RequestParser()
  193. parser.add_argument("type", type=str, required=True, default=False, location="json")
  194. args = parser.parse_args()
  195. match args["type"]:
  196. case "prompt":
  197. from core.llm_generator.prompts import INSTRUCTION_GENERATE_TEMPLATE_PROMPT
  198. return {"data": INSTRUCTION_GENERATE_TEMPLATE_PROMPT}
  199. case "code":
  200. from core.llm_generator.prompts import INSTRUCTION_GENERATE_TEMPLATE_CODE
  201. return {"data": INSTRUCTION_GENERATE_TEMPLATE_CODE}
  202. case _:
  203. raise ValueError(f"Invalid type: {args['type']}")
  204. api.add_resource(RuleGenerateApi, "/rule-generate")
  205. api.add_resource(RuleCodeGenerateApi, "/rule-code-generate")
  206. api.add_resource(RuleStructuredOutputGenerateApi, "/rule-structured-output-generate")
  207. api.add_resource(InstructionGenerateApi, "/instruction-generate")
  208. api.add_resource(InstructionGenerationTemplateApi, "/instruction-generate/template")