| 
					
				 | 
			
			
				@@ -0,0 +1,141 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from collections.abc import Generator, Mapping 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from typing import Literal, Union 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from core.app.apps.advanced_chat.app_generator import AdvancedChatAppGenerator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+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, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        inputs: Mapping, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        files: list[dict],  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> Generator[dict, None, None] | dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        invoke app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app = cls._get_app(app_id, tenant_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if app.mode in [AppMode.ADVANCED_CHAT.value, AppMode.AGENT_CHAT.value, AppMode.CHAT.value]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return cls.invoke_chat_app(app, user_id, tenant_id, query, inputs, files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif app.mode in [AppMode.WORKFLOW.value]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return cls.invoke_workflow_app(app, user_id, tenant_id, inputs, files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elif app.mode in [AppMode.COMPLETION]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return cls.invoke_completion_app(app, user_id, tenant_id, inputs, files) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise ValueError("unexpected app type") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def invoke_chat_app( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cls,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app: App, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user: Account | EndUser,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tenant_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        conversation_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        query: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        stream: bool, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        inputs: Mapping, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        files: list[dict],  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ) -> Generator[dict, None, None] | dict: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        invoke chat app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if app.mode == AppMode.ADVANCED_CHAT.value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            workflow = app.workflow 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if not workflow: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise ValueError("unexpected app type") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            generator = AdvancedChatAppGenerator() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            response = generator.generate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                app_model=app,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                workflow=workflow,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                user=user,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                args={ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                invoke_from=InvokeFrom.SERVICE_API, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                stream=stream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def invoke_workflow_app( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cls,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app: App, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user_id: str,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tenant_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        inputs: Mapping, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        files: list[dict],  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        invoke workflow app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        workflow = app.workflow 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not workflow: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            raise ValueError("") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        generator = WorkflowAppGenerator() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        result = generator.generate( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            app_model=app,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            workflow=workflow,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            user=cls._get_user(user_id),  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            args={ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                'inputs': tool_parameters, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                'files': files 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            },  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            invoke_from=self.runtime.invoke_from, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            stream=False, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            call_depth=self.workflow_call_depth + 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @classmethod 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def invoke_completion_app( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cls,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app: App, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user_id: str,  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tenant_id: str, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        inputs: Mapping, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        files: list[dict],  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        invoke completion app 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @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 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        app = db.session.query(App). \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter(App.id == app_id). \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            filter(App.tenant_id == tenant_id). \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            first() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if not app: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            raise ValueError("app not found") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return app 
			 |