diff --git a/apps/entities/flow.py b/apps/entities/flow.py index 109c9e07f5101985b82926505df8083fbed7ac1e..1920fbb27d6c8302d73dc9de0c4fecca29aaca36 100644 --- a/apps/entities/flow.py +++ b/apps/entities/flow.py @@ -1,89 +1,66 @@ -"""Flow和Service等外置配置数据结构 +"""App、Flow和Service等外置配置数据结构 Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. """ -import uuid from typing import Any, Optional from pydantic import BaseModel, Field from apps.entities.enum_var import ( AppPermissionType, - CallType, MetadataType, + EdgeType, ) -class Step(BaseModel): - """Flow中Step的数据""" +class NodePos(BaseModel): + """节点在画布上的位置""" - name: str - confirm: bool = False - call_type: str - params: dict[str, Any] = {} - next: Optional[str] = None + x: int = Field(description="节点在画布上的X坐标") + y: int = Field(description="节点在画布上的Y坐标") +class Edge(BaseModel): + """Flow中Edge的数据""" -class NextFlow(BaseModel): - """Flow中“下一步”的数据格式""" + id: str = Field(description="边的ID") + edge_from: str = Field(description="边的来源节点ID", alias="from") + edge_to: str = Field(description="边的目标节点ID", alias="to") + edge_type: Optional[EdgeType] = Field(description="边的类型", alias="type") - id: str - plugin: Optional[str] = None - question: Optional[str] = None +class Node(BaseModel): + """Flow中Node的数据""" -class Flow(BaseModel): - """Flow(工作流)的数据格式""" - - on_error: Optional[Step] = Step( - name="error", - call_type="llm", - params={ - "user_prompt": "当前工具执行发生错误,原始错误信息为:{data}. 请向用户展示错误信息,并给出可能的解决方案。\n\n背景信息:{context}", - }, - ) - steps: dict[str, Step] - next_flow: Optional[list[NextFlow]] = None + id: str = Field(description="节点的ID;与NodePool中的ID对应") + name: str = Field(description="节点名称") + description: str = Field(description="节点描述") + pos: NodePos = Field(description="节点在画布上的位置", default=NodePos(x=0, y=0)) + params: dict[str, Any] = Field(description="用户手动指定的节点参数", default={}) -class StepPool(BaseModel): - """Step信息 - - collection: step_pool - """ - - id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") - name: str - description: str - - -class FlowPool(BaseModel): - """Flow信息 +class NextFlow(BaseModel): + """Flow中“下一步”的数据格式""" - collection: flow_pool - """ + flow_id: str + question: Optional[str] = None - id: str = Field(default_factory=lambda: str(uuid.uuid4()), alias="_id") - name: str - description: str - data: Flow +class FlowError(BaseModel): + """Flow的错误处理节点""" -class CallMetadata(BaseModel): - """Call工具信息 + use_llm: bool = Field(description="是否使用LLM处理错误") + output_format: Optional[str] = Field(description="错误处理节点的输出格式") - key: call - """ - id: str = Field(alias="_id", description="Call的ID", default_factory=lambda: str(uuid.uuid4())) - type: CallType = Field(description="Call的类型") - name: str = Field(description="Call的名称") - description: str = Field(description="Call的描述") - path: str = Field(description=""" - Call的路径。 - 当为系统Call时,路径就是ID,例如:“LLM”; - 当为Python Call时,要加上Service名称,例如 “tune::call.tune.CheckSystem” - """) +class Flow(BaseModel): + """Flow(工作流)的数据格式""" + + name: str = Field(description="Flow的名称") + description: str = Field(description="Flow的描述") + on_error: FlowError = FlowError(use_llm=True) + nodes: list[Node] = Field(description="节点列表", default=[]) + edges: list[Edge] = Field(description="边列表", default=[]) + next_flow: Optional[list[NextFlow]] = None class MetadataBase(BaseModel): @@ -167,31 +144,6 @@ class ServiceApiSpec(BaseModel): path: str = Field(description="OpenAPI文件路径") hash: str = Field(description="OpenAPI文件的hash值") - -class Service(BaseModel): - """外部服务信息 - - collection: service - """ - - metadata: ServiceMetadata - name: str - description: str - dir_path: str - - -class App(BaseModel): - """应用信息 - - collection: app - """ - - metadata: AppMetadata - name: str - description: str - dir_path: str - - class PositionItem(BaseModel): """请求/响应中的前端相对位置变量类""" x:float diff --git a/apps/entities/pool.py b/apps/entities/pool.py new file mode 100644 index 0000000000000000000000000000000000000000..e5386276bb47904136f227e9e2d0712c761f0c5f --- /dev/null +++ b/apps/entities/pool.py @@ -0,0 +1,75 @@ +"""App和Service等数据库内数据结构 + +Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. +""" +from typing import Any, Optional +from pydantic import BaseModel, Field + +from datetime import datetime, timezone + +from apps.entities.enum_var import CallType + + +class PoolBase(BaseModel): + """Pool的基础信息""" + + id: str + name: str + description: str + created_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) + + +class ServiceApiInfo(BaseModel): + """外部服务API信息""" + + filename: str = Field(description="OpenAPI文件名") + description: str = Field(description="OpenAPI中关于API的Summary") + path: str = Field(description="OpenAPI文件路径") + + +class ServicePool(PoolBase): + """外部服务信息 + + collection: service + """ + + author: str + api: list[ServiceApiInfo] = Field(description="API信息列表", default=[]) + hashes: dict[str, str] = Field(description="关联文件的hash值;Service作为整体更新或删除", default={}) + + +class NodePool(PoolBase): + """Node信息 + + collection: node + 注: + 1. 基类Call的ID,即meta_call,可以为None,表示该Node是系统Node + 2. 路径的格式: + 1. 系统Node的路径格式样例:“LLM” + 2. Python Node的路径格式样例:“tune::call.tune.CheckSystem” + """ + + type: CallType = Field(description="Call的类型") + meta_call: Optional[str] = Field(description="基类Call的ID", default=None) + input_schema: dict[str, Any] = Field(description="输入参数的schema", default={}) + output_schema: dict[str, Any] = Field(description="输出参数的schema", default={}) + params: dict[str, Any] = Field(description="参数", default={}) + path: str = Field(description="Node的路径;包括Node的作用域等") + + +class AppFlow(PoolBase): + """Flow的元数据;会被存储在App下面""" + + enabled: bool = Field(description="是否启用", default=True) + path: str = Field(description="Flow的路径") + + +class AppPool(PoolBase): + """应用信息 + + collection: app + """ + + author: str + flows: list[AppFlow] = Field(description="Flow列表", default=[]) + hashes: dict[str, str] = Field(description="关联文件的hash值", default={})