mirror of
https://github.com/langgenius/dify.git
synced 2026-05-02 00:18:03 +08:00
feat: implement invoke app args
This commit is contained in:
@ -1,7 +1,10 @@
|
||||
from collections.abc import Generator, Mapping
|
||||
from typing import Literal, Union
|
||||
from typing import Optional, Union
|
||||
|
||||
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
|
||||
@ -16,20 +19,29 @@ class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
|
||||
cls, app_id: str,
|
||||
user_id: str,
|
||||
tenant_id: str,
|
||||
query: str,
|
||||
conversation_id: Optional[str],
|
||||
query: Optional[str],
|
||||
stream: bool,
|
||||
inputs: Mapping,
|
||||
files: list[dict],
|
||||
) -> Generator[dict, None, None] | dict:
|
||||
) -> Generator[dict | str, None, None] | dict:
|
||||
"""
|
||||
invoke app
|
||||
"""
|
||||
app = cls._get_app(app_id, tenant_id)
|
||||
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]:
|
||||
return cls.invoke_chat_app(app, user_id, tenant_id, query, inputs, files)
|
||||
if not query:
|
||||
raise ValueError("missing query")
|
||||
|
||||
return cls.invoke_chat_app(app, user, conversation_id, query, stream, inputs, files)
|
||||
elif app.mode in [AppMode.WORKFLOW.value]:
|
||||
return cls.invoke_workflow_app(app, user_id, tenant_id, inputs, files)
|
||||
return cls.invoke_workflow_app(app, user, stream, inputs, files)
|
||||
elif app.mode in [AppMode.COMPLETION]:
|
||||
return cls.invoke_completion_app(app, user_id, tenant_id, inputs, files)
|
||||
return cls.invoke_completion_app(app, user, stream, inputs, files)
|
||||
|
||||
raise ValueError("unexpected app type")
|
||||
|
||||
@ -38,13 +50,12 @@ class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
|
||||
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:
|
||||
) -> Generator[dict | str, None, None] | dict:
|
||||
"""
|
||||
invoke chat app
|
||||
"""
|
||||
@ -53,25 +64,54 @@ class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
|
||||
if not workflow:
|
||||
raise ValueError("unexpected app type")
|
||||
|
||||
generator = AdvancedChatAppGenerator()
|
||||
response = generator.generate(
|
||||
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,
|
||||
stream=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,
|
||||
stream=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,
|
||||
stream=stream
|
||||
)
|
||||
else:
|
||||
raise ValueError("unexpected app type")
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
def invoke_workflow_app(
|
||||
cls,
|
||||
app: App,
|
||||
user_id: str,
|
||||
tenant_id: str,
|
||||
user: EndUser | Account,
|
||||
stream: bool,
|
||||
inputs: Mapping,
|
||||
files: list[dict],
|
||||
):
|
||||
@ -82,33 +122,41 @@ class PluginAppBackwardsInvocation(BaseBackwardsInvocation):
|
||||
if not workflow:
|
||||
raise ValueError("")
|
||||
|
||||
generator = WorkflowAppGenerator()
|
||||
|
||||
result = generator.generate(
|
||||
return WorkflowAppGenerator().generate(
|
||||
app_model=app,
|
||||
workflow=workflow,
|
||||
user=cls._get_user(user_id),
|
||||
user=user,
|
||||
args={
|
||||
'inputs': tool_parameters,
|
||||
'inputs': inputs,
|
||||
'files': files
|
||||
},
|
||||
invoke_from=self.runtime.invoke_from,
|
||||
stream=False,
|
||||
call_depth=self.workflow_call_depth + 1,
|
||||
invoke_from=InvokeFrom.SERVICE_API,
|
||||
stream=stream,
|
||||
call_depth=1,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def invoke_completion_app(
|
||||
cls,
|
||||
app: App,
|
||||
user_id: str,
|
||||
tenant_id: str,
|
||||
user: EndUser | Account,
|
||||
stream: bool,
|
||||
inputs: Mapping,
|
||||
files: list[dict],
|
||||
):
|
||||
"""
|
||||
invoke completion app
|
||||
"""
|
||||
return CompletionAppGenerator().generate(
|
||||
app_model=app,
|
||||
user=user,
|
||||
args={
|
||||
'inputs': inputs,
|
||||
'files': files
|
||||
},
|
||||
invoke_from=InvokeFrom.SERVICE_API,
|
||||
stream=stream,
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _get_user(cls, user_id: str) -> Union[EndUser, Account]:
|
||||
|
||||
@ -6,15 +6,17 @@ from pydantic import BaseModel
|
||||
|
||||
class BaseBackwardsInvocation:
|
||||
@classmethod
|
||||
def convert_to_event_stream(cls, response: Generator[BaseModel | dict, None, None] | BaseModel | dict):
|
||||
def convert_to_event_stream(cls, response: Generator[BaseModel | dict | str, None, None] | BaseModel | dict):
|
||||
if isinstance(response, Generator):
|
||||
for chunk in response:
|
||||
if isinstance(chunk, BaseModel):
|
||||
yield chunk.model_dump_json().encode() + b'\n\n'
|
||||
if isinstance(chunk, str):
|
||||
yield f"event: {chunk}\n\n".encode()
|
||||
else:
|
||||
yield json.dumps(chunk).encode() + b'\n\n'
|
||||
else:
|
||||
if isinstance(response, BaseModel):
|
||||
yield response.model_dump_json().encode() + b'\n\n'
|
||||
else:
|
||||
yield json.dumps(response).encode() + b'\n\n'
|
||||
yield json.dumps(response).encode() + b'\n\n'
|
||||
|
||||
@ -105,3 +105,4 @@ class RequestInvokeApp(BaseModel):
|
||||
conversation_id: Optional[str] = None
|
||||
user: Optional[str] = None
|
||||
files: list[dict] = Field(default_factory=list)
|
||||
stream: bool = Field(default=False)
|
||||
Reference in New Issue
Block a user