feat: implement invoke app args

This commit is contained in:
Yeuoly
2024-08-29 20:50:36 +08:00
parent 41ed2e0cc2
commit 12ea085e22
5 changed files with 99 additions and 82 deletions

View File

@ -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]:

View File

@ -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'

View File

@ -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)