app.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. from collections.abc import Generator, Mapping
  2. from typing import Literal, Union
  3. from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator
  4. from core.app.apps.workflow.app_generator import WorkflowAppGenerator
  5. from core.app.entities.app_invoke_entities import InvokeFrom
  6. from core.plugin.backwards_invocation.base import BaseBackwardsInvocation
  7. from extensions.ext_database import db
  8. from models.account import Account
  9. from models.model import App, AppMode, EndUser
  10. class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
  11. @classmethod
  12. def invoke_app(
  13. cls, app_id: str,
  14. user_id: str,
  15. tenant_id: str,
  16. query: str,
  17. inputs: Mapping,
  18. files: list[dict],
  19. ) -> Generator[dict, None, None] | dict:
  20. """
  21. invoke app
  22. """
  23. app = cls._get_app(app_id, tenant_id)
  24. if app.mode in [AppMode.ADVANCED_CHAT.value, AppMode.AGENT_CHAT.value, AppMode.CHAT.value]:
  25. return cls.invoke_chat_app(app, user_id, tenant_id, query, inputs, files)
  26. elif app.mode in [AppMode.WORKFLOW.value]:
  27. return cls.invoke_workflow_app(app, user_id, tenant_id, inputs, files)
  28. elif app.mode in [AppMode.COMPLETION]:
  29. return cls.invoke_completion_app(app, user_id, tenant_id, inputs, files)
  30. raise ValueError("unexpected app type")
  31. @classmethod
  32. def invoke_chat_app(
  33. cls,
  34. app: App,
  35. user: Account | EndUser,
  36. tenant_id: str,
  37. conversation_id: str,
  38. query: str,
  39. stream: bool,
  40. inputs: Mapping,
  41. files: list[dict],
  42. ) -> Generator[dict, None, None] | dict:
  43. """
  44. invoke chat app
  45. """
  46. if app.mode == AppMode.ADVANCED_CHAT.value:
  47. workflow = app.workflow
  48. if not workflow:
  49. raise ValueError("unexpected app type")
  50. generator = AdvancedChatAppGenerator()
  51. response = generator.generate(
  52. app_model=app,
  53. workflow=workflow,
  54. user=user,
  55. args={
  56. },
  57. invoke_from=InvokeFrom.SERVICE_API,
  58. stream=stream
  59. )
  60. @classmethod
  61. def invoke_workflow_app(
  62. cls,
  63. app: App,
  64. user_id: str,
  65. tenant_id: str,
  66. inputs: Mapping,
  67. files: list[dict],
  68. ):
  69. """
  70. invoke workflow app
  71. """
  72. workflow = app.workflow
  73. if not workflow:
  74. raise ValueError("")
  75. generator = WorkflowAppGenerator()
  76. result = generator.generate(
  77. app_model=app,
  78. workflow=workflow,
  79. user=cls._get_user(user_id),
  80. args={
  81. 'inputs': tool_parameters,
  82. 'files': files
  83. },
  84. invoke_from=self.runtime.invoke_from,
  85. stream=False,
  86. call_depth=self.workflow_call_depth + 1,
  87. )
  88. @classmethod
  89. def invoke_completion_app(
  90. cls,
  91. app: App,
  92. user_id: str,
  93. tenant_id: str,
  94. inputs: Mapping,
  95. files: list[dict],
  96. ):
  97. """
  98. invoke completion app
  99. """
  100. @classmethod
  101. def _get_user(cls, user_id: str) -> Union[EndUser, Account]:
  102. """
  103. get the user by user id
  104. """
  105. user = db.session.query(EndUser).filter(EndUser.id == user_id).first()
  106. if not user:
  107. user = db.session.query(Account).filter(Account.id == user_id).first()
  108. if not user:
  109. raise ValueError('user not found')
  110. return user
  111. @classmethod
  112. def _get_app(cls, app_id: str, tenant_id: str) -> App:
  113. """
  114. get app
  115. """
  116. app = db.session.query(App). \
  117. filter(App.id == app_id). \
  118. filter(App.tenant_id == tenant_id). \
  119. first()
  120. if not app:
  121. raise ValueError("app not found")
  122. return app