Spaces:
Running
Running
| from datetime import datetime, timezone | |
| from enum import Enum | |
| from pathlib import Path | |
| from typing import Any | |
| from uuid import UUID | |
| from pydantic import ( | |
| BaseModel, | |
| ConfigDict, | |
| Field, | |
| field_serializer, | |
| field_validator, | |
| model_serializer, | |
| ) | |
| from langflow.graph.schema import RunOutputs | |
| from langflow.graph.utils import serialize_field | |
| from langflow.schema import dotdict | |
| from langflow.schema.graph import Tweaks | |
| from langflow.schema.schema import InputType, OutputType, OutputValue | |
| from langflow.services.database.models.api_key.model import ApiKeyRead | |
| from langflow.services.database.models.base import orjson_dumps | |
| from langflow.services.database.models.flow import FlowCreate, FlowRead | |
| from langflow.services.database.models.user import UserRead | |
| from langflow.services.settings.feature_flags import FeatureFlags | |
| from langflow.services.tracing.schema import Log | |
| from langflow.utils.util_strings import truncate_long_strings | |
| class BuildStatus(Enum): | |
| """Status of the build.""" | |
| SUCCESS = "success" | |
| FAILURE = "failure" | |
| STARTED = "started" | |
| IN_PROGRESS = "in_progress" | |
| class TweaksRequest(BaseModel): | |
| tweaks: dict[str, dict[str, Any]] | None = Field(default_factory=dict) | |
| class UpdateTemplateRequest(BaseModel): | |
| template: dict | |
| class TaskResponse(BaseModel): | |
| """Task response schema.""" | |
| id: str | None = Field(None) | |
| href: str | None = Field(None) | |
| class ProcessResponse(BaseModel): | |
| """Process response schema.""" | |
| result: Any | |
| status: str | None = None | |
| task: TaskResponse | None = None | |
| session_id: str | None = None | |
| backend: str | None = None | |
| class RunResponse(BaseModel): | |
| """Run response schema.""" | |
| outputs: list[RunOutputs] | None = [] | |
| session_id: str | None = None | |
| def serialize(self): | |
| # Serialize all the outputs if they are base models | |
| serialized = {"session_id": self.session_id, "outputs": []} | |
| if self.outputs: | |
| serialized_outputs = [] | |
| for output in self.outputs: | |
| if isinstance(output, BaseModel) and not isinstance(output, RunOutputs): | |
| serialized_outputs.append(output.model_dump(exclude_none=True)) | |
| else: | |
| serialized_outputs.append(output) | |
| serialized["outputs"] = serialized_outputs | |
| return serialized | |
| class PreloadResponse(BaseModel): | |
| """Preload response schema.""" | |
| session_id: str | None = None | |
| is_clear: bool | None = None | |
| class TaskStatusResponse(BaseModel): | |
| """Task status response schema.""" | |
| status: str | |
| result: Any | None = None | |
| class ChatMessage(BaseModel): | |
| """Chat message schema.""" | |
| is_bot: bool = False | |
| message: str | None | dict = None | |
| chat_key: str | None = Field(None, serialization_alias="chatKey") | |
| type: str = "human" | |
| class ChatResponse(ChatMessage): | |
| """Chat response schema.""" | |
| intermediate_steps: str | |
| type: str | |
| is_bot: bool = True | |
| files: list = [] | |
| def validate_message_type(cls, v): | |
| if v not in {"start", "stream", "end", "error", "info", "file"}: | |
| msg = "type must be start, stream, end, error, info, or file" | |
| raise ValueError(msg) | |
| return v | |
| class PromptResponse(ChatMessage): | |
| """Prompt response schema.""" | |
| prompt: str | |
| type: str = "prompt" | |
| is_bot: bool = True | |
| class FileResponse(ChatMessage): | |
| """File response schema.""" | |
| data: Any = None | |
| data_type: str | |
| type: str = "file" | |
| is_bot: bool = True | |
| def validate_data_type(cls, v): | |
| if v not in {"image", "csv"}: | |
| msg = "data_type must be image or csv" | |
| raise ValueError(msg) | |
| return v | |
| class FlowListCreate(BaseModel): | |
| flows: list[FlowCreate] | |
| class FlowListIds(BaseModel): | |
| flow_ids: list[str] | |
| class FlowListRead(BaseModel): | |
| flows: list[FlowRead] | |
| class FlowListReadWithFolderName(BaseModel): | |
| flows: list[FlowRead] | |
| folder_name: str | |
| description: str | |
| class InitResponse(BaseModel): | |
| flow_id: str = Field(serialization_alias="flowId") | |
| class BuiltResponse(BaseModel): | |
| built: bool | |
| class UploadFileResponse(BaseModel): | |
| """Upload file response schema.""" | |
| flow_id: str = Field(serialization_alias="flowId") | |
| file_path: Path | |
| class StreamData(BaseModel): | |
| event: str | |
| data: dict | |
| def __str__(self) -> str: | |
| return f"event: {self.event}\ndata: {orjson_dumps(self.data, indent_2=False)}\n\n" | |
| class CustomComponentRequest(BaseModel): | |
| model_config = ConfigDict(arbitrary_types_allowed=True) | |
| code: str | |
| frontend_node: dict | None = None | |
| class CustomComponentResponse(BaseModel): | |
| data: dict | |
| type: str | |
| class UpdateCustomComponentRequest(CustomComponentRequest): | |
| field: str | |
| field_value: str | int | float | bool | dict | list | None = None | |
| template: dict | |
| tool_mode: bool = False | |
| def get_template(self): | |
| return dotdict(self.template) | |
| class CustomComponentResponseError(BaseModel): | |
| detail: str | |
| traceback: str | |
| class ComponentListCreate(BaseModel): | |
| flows: list[FlowCreate] | |
| class ComponentListRead(BaseModel): | |
| flows: list[FlowRead] | |
| class UsersResponse(BaseModel): | |
| total_count: int | |
| users: list[UserRead] | |
| class ApiKeyResponse(BaseModel): | |
| id: str | |
| api_key: str | |
| name: str | |
| created_at: str | |
| last_used_at: str | |
| class ApiKeysResponse(BaseModel): | |
| total_count: int | |
| user_id: UUID | |
| api_keys: list[ApiKeyRead] | |
| class CreateApiKeyRequest(BaseModel): | |
| name: str | |
| class Token(BaseModel): | |
| access_token: str | |
| refresh_token: str | |
| token_type: str | |
| class ApiKeyCreateRequest(BaseModel): | |
| api_key: str | |
| class VerticesOrderResponse(BaseModel): | |
| ids: list[str] | |
| run_id: UUID | |
| vertices_to_run: list[str] | |
| class ResultDataResponse(BaseModel): | |
| results: Any | None = Field(default_factory=dict) | |
| outputs: dict[str, OutputValue] = Field(default_factory=dict) | |
| logs: dict[str, list[Log]] = Field(default_factory=dict) | |
| message: Any | None = Field(default_factory=dict) | |
| artifacts: Any | None = Field(default_factory=dict) | |
| timedelta: float | None = None | |
| duration: str | None = None | |
| used_frozen_result: bool | None = False | |
| def serialize_results(cls, v): | |
| if isinstance(v, dict): | |
| return {key: serialize_field(val) for key, val in v.items()} | |
| return serialize_field(v) | |
| class VertexBuildResponse(BaseModel): | |
| id: str | None = None | |
| inactivated_vertices: list[str] | None = None | |
| next_vertices_ids: list[str] | None = None | |
| top_level_vertices: list[str] | None = None | |
| valid: bool | |
| params: Any | None = Field(default_factory=dict) | |
| """JSON string of the params.""" | |
| data: ResultDataResponse | |
| """Mapping of vertex ids to result dict containing the param name and result value.""" | |
| timestamp: datetime | None = Field(default_factory=lambda: datetime.now(timezone.utc)) | |
| """Timestamp of the build.""" | |
| def serialize_data(self, data: ResultDataResponse) -> dict: | |
| data_dict = data.model_dump() if isinstance(data, BaseModel) else data | |
| return truncate_long_strings(data_dict) | |
| class VerticesBuiltResponse(BaseModel): | |
| vertices: list[VertexBuildResponse] | |
| class InputValueRequest(BaseModel): | |
| components: list[str] | None = [] | |
| input_value: str | None = None | |
| session: str | None = None | |
| type: InputType | None = Field( | |
| "any", | |
| description="Defines on which components the input value should be applied. " | |
| "'any' applies to all input components.", | |
| ) | |
| # add an example | |
| model_config = ConfigDict( | |
| json_schema_extra={ | |
| "examples": [ | |
| { | |
| "components": ["components_id", "Component Name"], | |
| "input_value": "input_value", | |
| "session": "session_id", | |
| }, | |
| {"components": ["Component Name"], "input_value": "input_value"}, | |
| {"input_value": "input_value"}, | |
| { | |
| "components": ["Component Name"], | |
| "input_value": "input_value", | |
| "session": "session_id", | |
| }, | |
| {"input_value": "input_value", "session": "session_id"}, | |
| {"type": "chat", "input_value": "input_value"}, | |
| {"type": "json", "input_value": '{"key": "value"}'}, | |
| ] | |
| }, | |
| extra="forbid", | |
| ) | |
| class SimplifiedAPIRequest(BaseModel): | |
| input_value: str | None = Field(default=None, description="The input value") | |
| input_type: InputType | None = Field(default="chat", description="The input type") | |
| output_type: OutputType | None = Field(default="chat", description="The output type") | |
| output_component: str | None = Field( | |
| default="", | |
| description="If there are multiple output components, you can specify the component to get the output from.", | |
| ) | |
| tweaks: Tweaks | None = Field(default=None, description="The tweaks") | |
| session_id: str | None = Field(default=None, description="The session id") | |
| # (alias) type ReactFlowJsonObject<NodeData = any, EdgeData = any> = { | |
| # nodes: Node<NodeData>[]; | |
| # edges: Edge<EdgeData>[]; | |
| # viewport: Viewport; | |
| # } | |
| # import ReactFlowJsonObject | |
| class FlowDataRequest(BaseModel): | |
| nodes: list[dict] | |
| edges: list[dict] | |
| viewport: dict | None = None | |
| class ConfigResponse(BaseModel): | |
| feature_flags: FeatureFlags | |
| frontend_timeout: int | |
| auto_saving: bool | |
| auto_saving_interval: int | |
| health_check_max_retries: int | |
| max_file_size_upload: int | |