mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-12 13:29:04 +08:00
parent
9601102885
commit
c34bdb74e6
@ -1,3 +1,6 @@
|
|||||||
|
from collections.abc import Mapping
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from core.app.app_config.entities import ModelConfigEntity
|
from core.app.app_config.entities import ModelConfigEntity
|
||||||
from core.model_runtime.entities.model_entities import ModelPropertyKey, ModelType
|
from core.model_runtime.entities.model_entities import ModelPropertyKey, ModelType
|
||||||
from core.model_runtime.model_providers import model_provider_factory
|
from core.model_runtime.model_providers import model_provider_factory
|
||||||
@ -36,7 +39,7 @@ class ModelConfigManager:
|
|||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def validate_and_set_defaults(cls, tenant_id: str, config: dict) -> tuple[dict, list[str]]:
|
def validate_and_set_defaults(cls, tenant_id: str, config: Mapping[str, Any]) -> tuple[dict, list[str]]:
|
||||||
"""
|
"""
|
||||||
Validate and set defaults for model config
|
Validate and set defaults for model config
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@ import contextvars
|
|||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Generator
|
from collections.abc import Generator, Mapping
|
||||||
from typing import Any, Literal, Optional, Union, overload
|
from typing import Any, Optional, Union
|
||||||
|
|
||||||
from flask import Flask, current_app
|
from flask import Flask, current_app
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
@ -33,37 +33,15 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
||||||
@overload
|
|
||||||
def generate(
|
def generate(
|
||||||
self,
|
self,
|
||||||
app_model: App,
|
app_model: App,
|
||||||
workflow: Workflow,
|
workflow: Workflow,
|
||||||
user: Union[Account, EndUser],
|
user: Union[Account, EndUser],
|
||||||
args: dict,
|
args: Mapping[str, Any],
|
||||||
invoke_from: InvokeFrom,
|
invoke_from: InvokeFrom,
|
||||||
stream: Literal[True] = True,
|
streaming: bool = True,
|
||||||
) -> Generator[str, None, None]: ...
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
|
|
||||||
@overload
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
workflow: Workflow,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: dict,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: Literal[False] = False,
|
|
||||||
) -> dict: ...
|
|
||||||
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
workflow: Workflow,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: dict,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: bool = True,
|
|
||||||
) -> dict[str, Any] | Generator[str, Any, None]:
|
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
|
|
||||||
@ -134,7 +112,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
files=file_objs,
|
files=file_objs,
|
||||||
parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL,
|
parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL,
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
extras=extras,
|
extras=extras,
|
||||||
trace_manager=trace_manager,
|
trace_manager=trace_manager,
|
||||||
@ -148,12 +126,12 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
application_generate_entity=application_generate_entity,
|
application_generate_entity=application_generate_entity,
|
||||||
conversation=conversation,
|
conversation=conversation,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
def single_iteration_generate(
|
def single_iteration_generate(
|
||||||
self, app_model: App, workflow: Workflow, node_id: str, user: Account, args: dict, stream: bool = True
|
self, app_model: App, workflow: Workflow, node_id: str, user: Account, args: dict, streaming: bool = True
|
||||||
) -> dict[str, Any] | Generator[str, Any, None]:
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
|
|
||||||
@ -182,7 +160,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
query="",
|
query="",
|
||||||
files=[],
|
files=[],
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=InvokeFrom.DEBUGGER,
|
invoke_from=InvokeFrom.DEBUGGER,
|
||||||
extras={"auto_generate_conversation_name": False},
|
extras={"auto_generate_conversation_name": False},
|
||||||
single_iteration_run=AdvancedChatAppGenerateEntity.SingleIterationRunEntity(
|
single_iteration_run=AdvancedChatAppGenerateEntity.SingleIterationRunEntity(
|
||||||
@ -197,7 +175,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
invoke_from=InvokeFrom.DEBUGGER,
|
invoke_from=InvokeFrom.DEBUGGER,
|
||||||
application_generate_entity=application_generate_entity,
|
application_generate_entity=application_generate_entity,
|
||||||
conversation=None,
|
conversation=None,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _generate(
|
def _generate(
|
||||||
@ -209,7 +187,7 @@ class AdvancedChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
application_generate_entity: AdvancedChatAppGenerateEntity,
|
application_generate_entity: AdvancedChatAppGenerateEntity,
|
||||||
conversation: Optional[Conversation] = None,
|
conversation: Optional[Conversation] = None,
|
||||||
stream: bool = True,
|
stream: bool = True,
|
||||||
) -> dict[str, Any] | Generator[str, Any, None]:
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import uuid
|
import uuid
|
||||||
from typing import Optional
|
from collections.abc import Mapping
|
||||||
|
from typing import Any, Optional
|
||||||
|
|
||||||
from core.agent.entities import AgentEntity
|
from core.agent.entities import AgentEntity
|
||||||
from core.app.app_config.base_app_config_manager import BaseAppConfigManager
|
from core.app.app_config.base_app_config_manager import BaseAppConfigManager
|
||||||
@ -85,7 +86,7 @@ class AgentChatAppConfigManager(BaseAppConfigManager):
|
|||||||
return app_config
|
return app_config
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def config_validate(cls, tenant_id: str, config: dict) -> dict:
|
def config_validate(cls, tenant_id: str, config: Mapping[str, Any]) -> dict:
|
||||||
"""
|
"""
|
||||||
Validate for agent chat app model config
|
Validate for agent chat app model config
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import logging
|
import logging
|
||||||
import threading
|
import threading
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Generator
|
from collections.abc import Generator, Mapping
|
||||||
from typing import Any, Literal, Union, overload
|
from typing import Any, Union
|
||||||
|
|
||||||
from flask import Flask, current_app
|
from flask import Flask, current_app
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
@ -28,34 +28,15 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class AgentChatAppGenerator(MessageBasedAppGenerator):
|
class AgentChatAppGenerator(MessageBasedAppGenerator):
|
||||||
@overload
|
|
||||||
def generate(
|
def generate(
|
||||||
self,
|
self,
|
||||||
|
*,
|
||||||
app_model: App,
|
app_model: App,
|
||||||
user: Union[Account, EndUser],
|
user: Union[Account, EndUser],
|
||||||
args: dict,
|
args: Mapping[str, Any],
|
||||||
invoke_from: InvokeFrom,
|
invoke_from: InvokeFrom,
|
||||||
stream: Literal[True] = True,
|
streaming: bool = True,
|
||||||
) -> Generator[dict, None, None]: ...
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
|
|
||||||
@overload
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: dict,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: Literal[False] = False,
|
|
||||||
) -> dict: ...
|
|
||||||
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: Any,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: bool = True,
|
|
||||||
) -> Union[dict, Generator[dict, None, None]]:
|
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
|
|
||||||
@ -65,7 +46,7 @@ class AgentChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
:param invoke_from: invoke from source
|
:param invoke_from: invoke from source
|
||||||
:param stream: is stream
|
:param stream: is stream
|
||||||
"""
|
"""
|
||||||
if not stream:
|
if not streaming:
|
||||||
raise ValueError("Agent Chat App does not support blocking mode")
|
raise ValueError("Agent Chat App does not support blocking mode")
|
||||||
|
|
||||||
if not args.get("query"):
|
if not args.get("query"):
|
||||||
@ -96,7 +77,8 @@ class AgentChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
|
|
||||||
# validate config
|
# validate config
|
||||||
override_model_config_dict = AgentChatAppConfigManager.config_validate(
|
override_model_config_dict = AgentChatAppConfigManager.config_validate(
|
||||||
tenant_id=app_model.tenant_id, config=args.get("model_config")
|
tenant_id=app_model.tenant_id,
|
||||||
|
config=args["model_config"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# always enable retriever resource in debugger mode
|
# always enable retriever resource in debugger mode
|
||||||
@ -141,7 +123,7 @@ class AgentChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
files=file_objs,
|
files=file_objs,
|
||||||
parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL,
|
parent_message_id=args.get("parent_message_id") if invoke_from != InvokeFrom.SERVICE_API else UUID_NIL,
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
extras=extras,
|
extras=extras,
|
||||||
call_depth=0,
|
call_depth=0,
|
||||||
@ -182,7 +164,7 @@ class AgentChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
conversation=conversation,
|
conversation=conversation,
|
||||||
message=message,
|
message=message,
|
||||||
user=user,
|
user=user,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
return AgentChatAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
return AgentChatAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import logging
|
import logging
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from collections.abc import Generator
|
from collections.abc import Generator, Mapping
|
||||||
from typing import Any, Union
|
from typing import Any, Union
|
||||||
|
|
||||||
from core.app.entities.app_invoke_entities import InvokeFrom
|
from core.app.entities.app_invoke_entities import InvokeFrom
|
||||||
@ -14,8 +14,10 @@ class AppGenerateResponseConverter(ABC):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def convert(
|
def convert(
|
||||||
cls, response: Union[AppBlockingResponse, Generator[AppStreamResponse, Any, None]], invoke_from: InvokeFrom
|
cls,
|
||||||
) -> dict[str, Any] | Generator[str, Any, None]:
|
response: Union[AppBlockingResponse, Generator[AppStreamResponse, Any, None]],
|
||||||
|
invoke_from: InvokeFrom,
|
||||||
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
if invoke_from in {InvokeFrom.DEBUGGER, InvokeFrom.SERVICE_API}:
|
if invoke_from in {InvokeFrom.DEBUGGER, InvokeFrom.SERVICE_API}:
|
||||||
if isinstance(response, AppBlockingResponse):
|
if isinstance(response, AppBlockingResponse):
|
||||||
return cls.convert_blocking_full_response(response)
|
return cls.convert_blocking_full_response(response)
|
||||||
|
@ -55,7 +55,7 @@ class ChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
user: Union[Account, EndUser],
|
user: Union[Account, EndUser],
|
||||||
args: Any,
|
args: Any,
|
||||||
invoke_from: InvokeFrom,
|
invoke_from: InvokeFrom,
|
||||||
stream: bool = True,
|
streaming: bool = True,
|
||||||
) -> Union[dict, Generator[str, None, None]]:
|
) -> Union[dict, Generator[str, None, None]]:
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
@ -142,7 +142,7 @@ class ChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
extras=extras,
|
extras=extras,
|
||||||
trace_manager=trace_manager,
|
trace_manager=trace_manager,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
# init generate records
|
# init generate records
|
||||||
@ -179,7 +179,7 @@ class ChatAppGenerator(MessageBasedAppGenerator):
|
|||||||
conversation=conversation,
|
conversation=conversation,
|
||||||
message=message,
|
message=message,
|
||||||
user=user,
|
user=user,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
return ChatAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
return ChatAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
||||||
|
@ -50,7 +50,7 @@ class CompletionAppGenerator(MessageBasedAppGenerator):
|
|||||||
) -> dict: ...
|
) -> dict: ...
|
||||||
|
|
||||||
def generate(
|
def generate(
|
||||||
self, app_model: App, user: Union[Account, EndUser], args: Any, invoke_from: InvokeFrom, stream: bool = True
|
self, app_model: App, user: Union[Account, EndUser], args: Any, invoke_from: InvokeFrom, streaming: bool = True
|
||||||
) -> Union[dict, Generator[str, None, None]]:
|
) -> Union[dict, Generator[str, None, None]]:
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
@ -119,7 +119,7 @@ class CompletionAppGenerator(MessageBasedAppGenerator):
|
|||||||
query=query,
|
query=query,
|
||||||
files=file_objs,
|
files=file_objs,
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
extras=extras,
|
extras=extras,
|
||||||
trace_manager=trace_manager,
|
trace_manager=trace_manager,
|
||||||
@ -158,7 +158,7 @@ class CompletionAppGenerator(MessageBasedAppGenerator):
|
|||||||
conversation=conversation,
|
conversation=conversation,
|
||||||
message=message,
|
message=message,
|
||||||
user=user,
|
user=user,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
return CompletionAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
return CompletionAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
import threading
|
import threading
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Generator, Mapping, Sequence
|
from collections.abc import Generator, Mapping, Sequence
|
||||||
from typing import Any, Literal, Optional, Union, overload
|
from typing import Any, Optional, Union
|
||||||
|
|
||||||
from flask import Flask, current_app
|
from flask import Flask, current_app
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
@ -30,43 +30,18 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class WorkflowAppGenerator(BaseAppGenerator):
|
class WorkflowAppGenerator(BaseAppGenerator):
|
||||||
@overload
|
|
||||||
def generate(
|
def generate(
|
||||||
self,
|
self,
|
||||||
|
*,
|
||||||
app_model: App,
|
app_model: App,
|
||||||
workflow: Workflow,
|
workflow: Workflow,
|
||||||
user: Union[Account, EndUser],
|
user: Account | EndUser,
|
||||||
args: dict,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: Literal[True] = True,
|
|
||||||
call_depth: int = 0,
|
|
||||||
workflow_thread_pool_id: Optional[str] = None,
|
|
||||||
) -> Generator[str, None, None]: ...
|
|
||||||
|
|
||||||
@overload
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
workflow: Workflow,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: dict,
|
|
||||||
invoke_from: InvokeFrom,
|
|
||||||
stream: Literal[False] = False,
|
|
||||||
call_depth: int = 0,
|
|
||||||
workflow_thread_pool_id: Optional[str] = None,
|
|
||||||
) -> dict: ...
|
|
||||||
|
|
||||||
def generate(
|
|
||||||
self,
|
|
||||||
app_model: App,
|
|
||||||
workflow: Workflow,
|
|
||||||
user: Union[Account, EndUser],
|
|
||||||
args: Mapping[str, Any],
|
args: Mapping[str, Any],
|
||||||
invoke_from: InvokeFrom,
|
invoke_from: InvokeFrom,
|
||||||
stream: bool = True,
|
streaming: bool = True,
|
||||||
call_depth: int = 0,
|
call_depth: int = 0,
|
||||||
workflow_thread_pool_id: Optional[str] = None,
|
workflow_thread_pool_id: Optional[str] = None,
|
||||||
):
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
files: Sequence[Mapping[str, Any]] = args.get("files") or []
|
files: Sequence[Mapping[str, Any]] = args.get("files") or []
|
||||||
|
|
||||||
# parse files
|
# parse files
|
||||||
@ -101,7 +76,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
),
|
),
|
||||||
files=system_files,
|
files=system_files,
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
call_depth=call_depth,
|
call_depth=call_depth,
|
||||||
trace_manager=trace_manager,
|
trace_manager=trace_manager,
|
||||||
@ -115,7 +90,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
user=user,
|
user=user,
|
||||||
application_generate_entity=application_generate_entity,
|
application_generate_entity=application_generate_entity,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
stream=stream,
|
streaming=streaming,
|
||||||
workflow_thread_pool_id=workflow_thread_pool_id,
|
workflow_thread_pool_id=workflow_thread_pool_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -127,20 +102,9 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
user: Union[Account, EndUser],
|
user: Union[Account, EndUser],
|
||||||
application_generate_entity: WorkflowAppGenerateEntity,
|
application_generate_entity: WorkflowAppGenerateEntity,
|
||||||
invoke_from: InvokeFrom,
|
invoke_from: InvokeFrom,
|
||||||
stream: bool = True,
|
streaming: bool = True,
|
||||||
workflow_thread_pool_id: Optional[str] = None,
|
workflow_thread_pool_id: Optional[str] = None,
|
||||||
) -> dict[str, Any] | Generator[str, None, None]:
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
"""
|
|
||||||
Generate App response.
|
|
||||||
|
|
||||||
:param app_model: App
|
|
||||||
:param workflow: Workflow
|
|
||||||
:param user: account or end user
|
|
||||||
:param application_generate_entity: application generate entity
|
|
||||||
:param invoke_from: invoke from source
|
|
||||||
:param stream: is stream
|
|
||||||
:param workflow_thread_pool_id: workflow thread pool id
|
|
||||||
"""
|
|
||||||
# init queue manager
|
# init queue manager
|
||||||
queue_manager = WorkflowAppQueueManager(
|
queue_manager = WorkflowAppQueueManager(
|
||||||
task_id=application_generate_entity.task_id,
|
task_id=application_generate_entity.task_id,
|
||||||
@ -169,14 +133,20 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
workflow=workflow,
|
workflow=workflow,
|
||||||
queue_manager=queue_manager,
|
queue_manager=queue_manager,
|
||||||
user=user,
|
user=user,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
return WorkflowAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
return WorkflowAppGenerateResponseConverter.convert(response=response, invoke_from=invoke_from)
|
||||||
|
|
||||||
def single_iteration_generate(
|
def single_iteration_generate(
|
||||||
self, app_model: App, workflow: Workflow, node_id: str, user: Account, args: dict, stream: bool = True
|
self,
|
||||||
) -> dict[str, Any] | Generator[str, Any, None]:
|
app_model: App,
|
||||||
|
workflow: Workflow,
|
||||||
|
node_id: str,
|
||||||
|
user: Account,
|
||||||
|
args: Mapping[str, Any],
|
||||||
|
streaming: bool = True,
|
||||||
|
) -> Mapping[str, Any] | Generator[str, None, None]:
|
||||||
"""
|
"""
|
||||||
Generate App response.
|
Generate App response.
|
||||||
|
|
||||||
@ -203,7 +173,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
inputs={},
|
inputs={},
|
||||||
files=[],
|
files=[],
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
stream=stream,
|
stream=streaming,
|
||||||
invoke_from=InvokeFrom.DEBUGGER,
|
invoke_from=InvokeFrom.DEBUGGER,
|
||||||
extras={"auto_generate_conversation_name": False},
|
extras={"auto_generate_conversation_name": False},
|
||||||
single_iteration_run=WorkflowAppGenerateEntity.SingleIterationRunEntity(
|
single_iteration_run=WorkflowAppGenerateEntity.SingleIterationRunEntity(
|
||||||
@ -218,7 +188,7 @@ class WorkflowAppGenerator(BaseAppGenerator):
|
|||||||
user=user,
|
user=user,
|
||||||
invoke_from=InvokeFrom.DEBUGGER,
|
invoke_from=InvokeFrom.DEBUGGER,
|
||||||
application_generate_entity=application_generate_entity,
|
application_generate_entity=application_generate_entity,
|
||||||
stream=stream,
|
streaming=streaming,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _generate_worker(
|
def _generate_worker(
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Generator
|
from collections.abc import Generator, Mapping
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from typing import Optional, Union
|
from typing import Any, Optional, Union
|
||||||
|
|
||||||
from core.errors.error import AppInvokeQuotaExceededError
|
from core.errors.error import AppInvokeQuotaExceededError
|
||||||
from extensions.ext_redis import redis_client
|
from extensions.ext_redis import redis_client
|
||||||
@ -88,19 +88,16 @@ class RateLimit:
|
|||||||
def gen_request_key() -> str:
|
def gen_request_key() -> str:
|
||||||
return str(uuid.uuid4())
|
return str(uuid.uuid4())
|
||||||
|
|
||||||
def generate(self, generator: Union[Generator, callable, dict], request_id: str):
|
def generate(self, generator: Union[Generator[str, None, None], Mapping[str, Any]], request_id: str):
|
||||||
if isinstance(generator, dict):
|
if isinstance(generator, Mapping):
|
||||||
return generator
|
return generator
|
||||||
else:
|
else:
|
||||||
return RateLimitGenerator(self, generator, request_id)
|
return RateLimitGenerator(rate_limit=self, generator=generator, request_id=request_id)
|
||||||
|
|
||||||
|
|
||||||
class RateLimitGenerator:
|
class RateLimitGenerator:
|
||||||
def __init__(self, rate_limit: RateLimit, generator: Union[Generator, callable], request_id: str):
|
def __init__(self, rate_limit: RateLimit, generator: Generator[str, None, None], request_id: str):
|
||||||
self.rate_limit = rate_limit
|
self.rate_limit = rate_limit
|
||||||
if callable(generator):
|
|
||||||
self.generator = generator()
|
|
||||||
else:
|
|
||||||
self.generator = generator
|
self.generator = generator
|
||||||
self.request_id = request_id
|
self.request_id = request_id
|
||||||
self.closed = False
|
self.closed = False
|
||||||
|
@ -6,7 +6,7 @@ import string
|
|||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
import uuid
|
import uuid
|
||||||
from collections.abc import Generator
|
from collections.abc import Generator, Mapping
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
from typing import Any, Optional, Union
|
from typing import Any, Optional, Union
|
||||||
@ -180,7 +180,9 @@ def generate_text_hash(text: str) -> str:
|
|||||||
return sha256(hash_text.encode()).hexdigest()
|
return sha256(hash_text.encode()).hexdigest()
|
||||||
|
|
||||||
|
|
||||||
def compact_generate_response(response: Union[dict, RateLimitGenerator]) -> Response:
|
def compact_generate_response(
|
||||||
|
response: Union[Mapping[str, Any], RateLimitGenerator, Generator[str, None, None]],
|
||||||
|
) -> Response:
|
||||||
if isinstance(response, dict):
|
if isinstance(response, dict):
|
||||||
return Response(response=json.dumps(response), status=200, mimetype="application/json")
|
return Response(response=json.dumps(response), status=200, mimetype="application/json")
|
||||||
else:
|
else:
|
||||||
|
@ -43,50 +43,66 @@ class AppGenerateService:
|
|||||||
request_id = rate_limit.enter(request_id)
|
request_id = rate_limit.enter(request_id)
|
||||||
if app_model.mode == AppMode.COMPLETION.value:
|
if app_model.mode == AppMode.COMPLETION.value:
|
||||||
return rate_limit.generate(
|
return rate_limit.generate(
|
||||||
CompletionAppGenerator().generate(
|
generator=CompletionAppGenerator().generate(
|
||||||
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
|
app_model=app_model,
|
||||||
|
user=user,
|
||||||
|
args=args,
|
||||||
|
invoke_from=invoke_from,
|
||||||
|
streaming=streaming,
|
||||||
),
|
),
|
||||||
request_id,
|
request_id=request_id,
|
||||||
)
|
)
|
||||||
elif app_model.mode == AppMode.AGENT_CHAT.value or app_model.is_agent:
|
elif app_model.mode == AppMode.AGENT_CHAT.value or app_model.is_agent:
|
||||||
|
generator = AgentChatAppGenerator().generate(
|
||||||
|
app_model=app_model,
|
||||||
|
user=user,
|
||||||
|
args=args,
|
||||||
|
invoke_from=invoke_from,
|
||||||
|
streaming=streaming,
|
||||||
|
)
|
||||||
return rate_limit.generate(
|
return rate_limit.generate(
|
||||||
AgentChatAppGenerator().generate(
|
generator=generator,
|
||||||
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
|
request_id=request_id,
|
||||||
),
|
|
||||||
request_id,
|
|
||||||
)
|
)
|
||||||
elif app_model.mode == AppMode.CHAT.value:
|
elif app_model.mode == AppMode.CHAT.value:
|
||||||
return rate_limit.generate(
|
return rate_limit.generate(
|
||||||
ChatAppGenerator().generate(
|
generator=ChatAppGenerator().generate(
|
||||||
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
|
app_model=app_model,
|
||||||
|
user=user,
|
||||||
|
args=args,
|
||||||
|
invoke_from=invoke_from,
|
||||||
|
streaming=streaming,
|
||||||
),
|
),
|
||||||
request_id,
|
request_id=request_id,
|
||||||
)
|
)
|
||||||
elif app_model.mode == AppMode.ADVANCED_CHAT.value:
|
elif app_model.mode == AppMode.ADVANCED_CHAT.value:
|
||||||
workflow = cls._get_workflow(app_model, invoke_from)
|
workflow = cls._get_workflow(app_model, invoke_from)
|
||||||
return rate_limit.generate(
|
return rate_limit.generate(
|
||||||
AdvancedChatAppGenerator().generate(
|
generator=AdvancedChatAppGenerator().generate(
|
||||||
app_model=app_model,
|
app_model=app_model,
|
||||||
workflow=workflow,
|
workflow=workflow,
|
||||||
user=user,
|
user=user,
|
||||||
args=args,
|
args=args,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
stream=streaming,
|
streaming=streaming,
|
||||||
),
|
),
|
||||||
request_id,
|
request_id=request_id,
|
||||||
)
|
)
|
||||||
elif app_model.mode == AppMode.WORKFLOW.value:
|
elif app_model.mode == AppMode.WORKFLOW.value:
|
||||||
workflow = cls._get_workflow(app_model, invoke_from)
|
workflow = cls._get_workflow(app_model, invoke_from)
|
||||||
return rate_limit.generate(
|
generator = WorkflowAppGenerator().generate(
|
||||||
WorkflowAppGenerator().generate(
|
|
||||||
app_model=app_model,
|
app_model=app_model,
|
||||||
workflow=workflow,
|
workflow=workflow,
|
||||||
user=user,
|
user=user,
|
||||||
args=args,
|
args=args,
|
||||||
invoke_from=invoke_from,
|
invoke_from=invoke_from,
|
||||||
stream=streaming,
|
streaming=streaming,
|
||||||
),
|
call_depth=0,
|
||||||
request_id,
|
workflow_thread_pool_id=None,
|
||||||
|
)
|
||||||
|
return rate_limit.generate(
|
||||||
|
generator=generator,
|
||||||
|
request_id=request_id,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Invalid app mode {app_model.mode}")
|
raise ValueError(f"Invalid app mode {app_model.mode}")
|
||||||
@ -108,12 +124,17 @@ class AppGenerateService:
|
|||||||
if app_model.mode == AppMode.ADVANCED_CHAT.value:
|
if app_model.mode == AppMode.ADVANCED_CHAT.value:
|
||||||
workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
|
workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
|
||||||
return AdvancedChatAppGenerator().single_iteration_generate(
|
return AdvancedChatAppGenerator().single_iteration_generate(
|
||||||
app_model=app_model, workflow=workflow, node_id=node_id, user=user, args=args, stream=streaming
|
app_model=app_model,
|
||||||
|
workflow=workflow,
|
||||||
|
node_id=node_id,
|
||||||
|
user=user,
|
||||||
|
args=args,
|
||||||
|
streaming=streaming,
|
||||||
)
|
)
|
||||||
elif app_model.mode == AppMode.WORKFLOW.value:
|
elif app_model.mode == AppMode.WORKFLOW.value:
|
||||||
workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
|
workflow = cls._get_workflow(app_model, InvokeFrom.DEBUGGER)
|
||||||
return WorkflowAppGenerator().single_iteration_generate(
|
return WorkflowAppGenerator().single_iteration_generate(
|
||||||
app_model=app_model, workflow=workflow, node_id=node_id, user=user, args=args, stream=streaming
|
app_model=app_model, workflow=workflow, node_id=node_id, user=user, args=args, streaming=streaming
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Invalid app mode {app_model.mode}")
|
raise ValueError(f"Invalid app mode {app_model.mode}")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user