dify/api/core/plugin/backwards_invocation/base.py

30 lines
1.1 KiB
Python
Raw Normal View History

2024-08-29 20:17:17 +08:00
from collections.abc import Generator
2024-09-26 17:22:39 +08:00
from typing import Generic, Optional, TypeVar
2024-08-29 20:17:17 +08:00
from pydantic import BaseModel
class BaseBackwardsInvocation:
@classmethod
2024-08-29 20:50:36 +08:00
def convert_to_event_stream(cls, response: Generator[BaseModel | dict | str, None, None] | BaseModel | dict):
2024-08-29 20:17:17 +08:00
if isinstance(response, Generator):
2024-09-26 17:22:39 +08:00
try:
for chunk in response:
2024-09-26 17:40:27 +08:00
if isinstance(chunk, BaseModel | dict):
2024-09-26 17:22:39 +08:00
yield BaseBackwardsInvocationResponse(data=chunk).model_dump_json().encode() + b"\n\n"
elif isinstance(chunk, str):
yield f"event: {chunk}\n\n".encode()
except Exception as e:
error_message = BaseBackwardsInvocationResponse(error=str(e)).model_dump_json()
yield f"{error_message}\n\n".encode()
2024-08-29 20:17:17 +08:00
else:
yield BaseBackwardsInvocationResponse(data=response).model_dump_json().encode() + b"\n\n"
2024-09-26 17:22:39 +08:00
2024-09-26 17:40:27 +08:00
T = TypeVar("T", bound=dict | str | bool | int | BaseModel)
2024-09-26 17:22:39 +08:00
class BaseBackwardsInvocationResponse(BaseModel, Generic[T]):
data: Optional[T] = None
error: str = ""