| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 | 
							- from collections.abc import Generator, Mapping
 
- from typing import Optional, Union
 
- from controllers.service_api.wraps import create_or_update_end_user_for_user_id
 
- from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator
 
- from core.app.apps.agent_chat.app_generator import AgentChatAppGenerator
 
- from core.app.apps.chat.app_generator import ChatAppGenerator
 
- from core.app.apps.completion.app_generator import CompletionAppGenerator
 
- from core.app.apps.workflow.app_generator import WorkflowAppGenerator
 
- from core.app.entities.app_invoke_entities import InvokeFrom
 
- from core.plugin.backwards_invocation.base import BaseBackwardsInvocation
 
- from extensions.ext_database import db
 
- from models.account import Account
 
- from models.model import App, AppMode, EndUser
 
- class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
 
-     @classmethod
 
-     def invoke_app(
 
-         cls,
 
-         app_id: str,
 
-         user_id: str,
 
-         tenant_id: str,
 
-         conversation_id: Optional[str],
 
-         query: Optional[str],
 
-         stream: bool,
 
-         inputs: Mapping,
 
-         files: list[dict],
 
-     ) -> Generator[Mapping | str, None, None] | Mapping:
 
-         """
 
-         invoke app
 
-         """
 
-         app = cls._get_app(app_id, tenant_id)
 
-         if not user_id:
 
-             user = create_or_update_end_user_for_user_id(app)
 
-         else:
 
-             user = cls._get_user(user_id)
 
-         conversation_id = conversation_id or ""
 
-         if app.mode in {AppMode.ADVANCED_CHAT.value, AppMode.AGENT_CHAT.value, AppMode.CHAT.value}:
 
-             if not query:
 
-                 raise ValueError("missing query")
 
-             return cls.invoke_chat_app(app, user, conversation_id, query, stream, inputs, files)
 
-         elif app.mode == AppMode.WORKFLOW.value:
 
-             return cls.invoke_workflow_app(app, user, stream, inputs, files)
 
-         elif app.mode == AppMode.COMPLETION:
 
-             return cls.invoke_completion_app(app, user, stream, inputs, files)
 
-         raise ValueError("unexpected app type")
 
-     @classmethod
 
-     def invoke_chat_app(
 
-         cls,
 
-         app: App,
 
-         user: Account | EndUser,
 
-         conversation_id: str,
 
-         query: str,
 
-         stream: bool,
 
-         inputs: Mapping,
 
-         files: list[dict],
 
-     ) -> Generator[Mapping | str, None, None] | Mapping:
 
-         """
 
-         invoke chat app
 
-         """
 
-         if app.mode == AppMode.ADVANCED_CHAT.value:
 
-             workflow = app.workflow
 
-             if not workflow:
 
-                 raise ValueError("unexpected app type")
 
-             return AdvancedChatAppGenerator().generate(
 
-                 app_model=app,
 
-                 workflow=workflow,
 
-                 user=user,
 
-                 args={
 
-                     "inputs": inputs,
 
-                     "query": query,
 
-                     "files": files,
 
-                     "conversation_id": conversation_id,
 
-                 },
 
-                 invoke_from=InvokeFrom.SERVICE_API,
 
-                 streaming=stream,
 
-             )
 
-         elif app.mode == AppMode.AGENT_CHAT.value:
 
-             return AgentChatAppGenerator().generate(
 
-                 app_model=app,
 
-                 user=user,
 
-                 args={
 
-                     "inputs": inputs,
 
-                     "query": query,
 
-                     "files": files,
 
-                     "conversation_id": conversation_id,
 
-                 },
 
-                 invoke_from=InvokeFrom.SERVICE_API,
 
-                 streaming=stream,
 
-             )
 
-         elif app.mode == AppMode.CHAT.value:
 
-             return ChatAppGenerator().generate(
 
-                 app_model=app,
 
-                 user=user,
 
-                 args={
 
-                     "inputs": inputs,
 
-                     "query": query,
 
-                     "files": files,
 
-                     "conversation_id": conversation_id,
 
-                 },
 
-                 invoke_from=InvokeFrom.SERVICE_API,
 
-                 streaming=stream,
 
-             )
 
-         else:
 
-             raise ValueError("unexpected app type")
 
-     @classmethod
 
-     def invoke_workflow_app(
 
-         cls,
 
-         app: App,
 
-         user: EndUser | Account,
 
-         stream: bool,
 
-         inputs: Mapping,
 
-         files: list[dict],
 
-     ) -> Generator[Mapping | str, None, None] | Mapping:
 
-         """
 
-         invoke workflow app
 
-         """
 
-         workflow = app.workflow
 
-         if not workflow:
 
-             raise ValueError("")
 
-         return WorkflowAppGenerator().generate(
 
-             app_model=app,
 
-             workflow=workflow,
 
-             user=user,
 
-             args={"inputs": inputs, "files": files},
 
-             invoke_from=InvokeFrom.SERVICE_API,
 
-             streaming=stream,
 
-             call_depth=1,
 
-             workflow_thread_pool_id=None,
 
-         )
 
-     @classmethod
 
-     def invoke_completion_app(
 
-         cls,
 
-         app: App,
 
-         user: EndUser | Account,
 
-         stream: bool,
 
-         inputs: Mapping,
 
-         files: list[dict],
 
-     ) -> Generator[Mapping | str, None, None] | Mapping:
 
-         """
 
-         invoke completion app
 
-         """
 
-         return CompletionAppGenerator().generate(
 
-             app_model=app,
 
-             user=user,
 
-             args={"inputs": inputs, "files": files},
 
-             invoke_from=InvokeFrom.SERVICE_API,
 
-             streaming=stream,
 
-         )
 
-     @classmethod
 
-     def _get_user(cls, user_id: str) -> Union[EndUser, Account]:
 
-         """
 
-         get the user by user id
 
-         """
 
-         user = db.session.query(EndUser).filter(EndUser.id == user_id).first()
 
-         if not user:
 
-             user = db.session.query(Account).filter(Account.id == user_id).first()
 
-         if not user:
 
-             raise ValueError("user not found")
 
-         return user
 
-     @classmethod
 
-     def _get_app(cls, app_id: str, tenant_id: str) -> App:
 
-         """
 
-         get app
 
-         """
 
-         try:
 
-             app = db.session.query(App).filter(App.id == app_id).filter(App.tenant_id == tenant_id).first()
 
-         except Exception:
 
-             raise ValueError("app not found")
 
-         if not app:
 
-             raise ValueError("app not found")
 
-         return app
 
 
  |