瀏覽代碼

Fix/type-error (#11240)

Signed-off-by: -LAN- <laipz8200@outlook.com>
tags/0.13.0
-LAN- 11 月之前
父節點
當前提交
c34bdb74e6
沒有連結到貢獻者的電子郵件帳戶。

+ 4
- 1
api/core/app/app_config/easy_ui_based_app/model_config/manager.py 查看文件

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


@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



+ 12
- 34
api/core/app/apps/advanced_chat/app_generator.py 查看文件

import logging import logging
import threading import threading
import uuid import uuid
from collections.abc import Generator
from typing import Any, Literal, Optional, Union, overload
from collections.abc import Generator, Mapping
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




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,
) -> 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]:
streaming: bool = True,
) -> Mapping[str, Any] | Generator[str, None, None]:
""" """
Generate App response. Generate App response.


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,
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
) -> dict[str, Any] | Generator[str, Any, None]:
self, app_model: App, workflow: Workflow, node_id: str, user: Account, args: dict, streaming: bool = True
) -> Mapping[str, Any] | Generator[str, None, None]:
""" """
Generate App response. Generate App response.


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(
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(
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.



+ 3
- 2
api/core/app/apps/agent_chat/app_config_manager.py 查看文件

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



+ 11
- 29
api/core/app/apps/agent_chat/app_generator.py 查看文件

import logging import logging
import threading import threading
import uuid import uuid
from collections.abc import Generator
from typing import Any, Literal, Union, overload
from collections.abc import Generator, Mapping
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




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,
) -> Generator[dict, 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]]:
streaming: bool = True,
) -> Mapping[str, Any] | Generator[str, None, None]:
""" """
Generate App response. Generate App response.


: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"):


# 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
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,
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)

+ 5
- 3
api/core/app/apps/base_app_generate_response_converter.py 查看文件

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


@classmethod @classmethod
def convert( def convert(
cls, response: Union[AppBlockingResponse, Generator[AppStreamResponse, Any, None]], invoke_from: InvokeFrom
) -> dict[str, Any] | Generator[str, Any, None]:
cls,
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)

+ 3
- 3
api/core/app/apps/chat/app_generator.py 查看文件

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

+ 3
- 3
api/core/app/apps/completion/app_generator.py 查看文件

) -> 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.
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,
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)

+ 20
- 50
api/core/app/apps/workflow/app_generator.py 查看文件

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




class WorkflowAppGenerator(BaseAppGenerator): class WorkflowAppGenerator(BaseAppGenerator):
@overload
def generate(
self,
app_model: App,
workflow: Workflow,
user: Union[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( def generate(
self, self,
*,
app_model: App, app_model: App,
workflow: Workflow, workflow: Workflow,
user: Union[Account, EndUser],
user: 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
), ),
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,
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,
) )


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]:
"""
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
"""
) -> Mapping[str, Any] | Generator[str, None, None]:
# 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,
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
) -> dict[str, Any] | Generator[str, Any, None]:
self,
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.


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(
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(

+ 7
- 10
api/core/app/features/rate_limiting/rate_limit.py 查看文件

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
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):
if isinstance(generator, dict):
def generate(self, generator: Union[Generator[str, None, None], Mapping[str, Any]], request_id: str):
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



+ 4
- 2
api/libs/helper.py 查看文件

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

+ 45
- 24
api/services/app_generate_service.py 查看文件

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(
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
generator=CompletionAppGenerator().generate(
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(
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
),
request_id,
generator=generator,
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(
app_model=app_model, user=user, args=args, invoke_from=invoke_from, stream=streaming
generator=ChatAppGenerator().generate(
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)
generator = WorkflowAppGenerator().generate(
app_model=app_model,
workflow=workflow,
user=user,
args=args,
invoke_from=invoke_from,
streaming=streaming,
call_depth=0,
workflow_thread_pool_id=None,
)
return rate_limit.generate( return rate_limit.generate(
WorkflowAppGenerator().generate(
app_model=app_model,
workflow=workflow,
user=user,
args=args,
invoke_from=invoke_from,
stream=streaming,
),
request_id,
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}")
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…
取消
儲存