diff --git a/apps/entities/collection.py b/apps/entities/collection.py index 7a0cd31c594bc28e95b21fa3dc770789c05811bd..9b1e08ed784e9abc3015d1db6ee30ce05515a44a 100644 --- a/apps/entities/collection.py +++ b/apps/entities/collection.py @@ -172,3 +172,27 @@ class Domain(BaseModel): name: str definition: str updated_at: float = Field(default_factory=lambda: round(datetime.now(tz=timezone.utc).timestamp(), 3)) +class NodeMetaData(BaseModel): + """节点元数据""" + pass +class ServiceNodeMetaDatas(BaseModel): + """节点原数据""" + pass +class Position(BaseModel): + """前端相对位置""" + pass +class Flow(BaseModel): + """流的拓扑数据""" + pass +class Branch(BaseModel): + """节点分支信息""" + pass +class Dependency(BaseModel): + """节点伴生关系""" + pass +class Node(BaseModel): + """流拓扑中的节点数据""" + pass +class Edge(BaseModel): + """流拓扑中的边信息""" + pass diff --git a/apps/entities/flow.py b/apps/entities/flow.py index 85aa23ca585ef9a398f702d52784f8a518ee4b32..109c9e07f5101985b82926505df8083fbed7ac1e 100644 --- a/apps/entities/flow.py +++ b/apps/entities/flow.py @@ -190,3 +190,46 @@ class App(BaseModel): name: str description: str dir_path: str + + +class PositionItem(BaseModel): + """请求/响应中的前端相对位置变量类""" + x:float + y:float +class FlowItem(BaseModel): + """请求/响应中的流变量类""" + flow_id:str=Optional[Field](alias="flowId") + name:str + description:str + enable:bool + created_at: str= Field(alias="createdAt") +class BranchItem(BaseModel): + """请求/响应中的节点分支变量类""" + branch_id:str=Field(alias="branchId") + type:str + description:str +class DependencyItem(BaseModel): + """请求/响应中的节点依赖变量类""" + node_id:str=Field(alias="nodeId") + type:str +class NodeItem(BaseModel): + """请求/响应中的节点变量类""" + node_id:str=Field(alias="nodeId") + api_id:str=Field(alias="apiId") + name:str + type:str + description:str + enable:str + branches:list[BranchItem] + depedency:DependencyItem + position:PositionItem + editable:bool + created_at: str= Field(alias="createdAt") +class EdgeItem(BaseModel): + """请求/响应中的边变量类""" + egde_id:str=Field(alias="edgeId") + source_node:str=Field(alias="sourceNode") + target_node:str=Field(alias="targetNode") + type:str + branch_id:str=Field(alias="branchId") + created_at: str= Field(alias="createdAt") \ No newline at end of file diff --git a/apps/entities/request_data.py b/apps/entities/request_data.py index b97cbf5bf727064ef944761bbfdaf8f90d4a9907..10bc63d6c2cf3e747ecab770da7f8d2166201c1e 100644 --- a/apps/entities/request_data.py +++ b/apps/entities/request_data.py @@ -7,7 +7,7 @@ from typing import Optional from pydantic import BaseModel, Field from apps.entities.task import RequestDataPlugin - +from apps.entities.flow import PositionItem,FlowItem,NodeItem,EdgeItem class RequestDataFeatures(BaseModel): """POST /api/chat的features字段数据""" @@ -99,3 +99,14 @@ class PostKnowledgeIDData(BaseModel): """添加知识库""" kb_id: str + +class PutFlowReq(BaseModel): + """创建/修改流拓扑结构""" + flow_id:Optional[str]=Field(alias="flowId") + flow:FlowItem + nodes:list[NodeItem] + edges:list[EdgeItem] + focus_point:PositionItem=Field(alias="focusPoint") +class PutNodeParameterReq: + """修改节点的参数""" + content:str \ No newline at end of file diff --git a/apps/entities/response_data.py b/apps/entities/response_data.py index 2534def02fdac0e183b66376189fe98ee3620eed..515a6f6a39c85f7503fbd8554028312a665d3d52 100644 --- a/apps/entities/response_data.py +++ b/apps/entities/response_data.py @@ -6,11 +6,11 @@ from typing import Any, Optional from pydantic import BaseModel, Field -from apps.entities.collection import Blacklist, Document +from apps.entities.collection import Blacklist, Document,NodeMetaData from apps.entities.enum_var import DocumentStatus from apps.entities.plugin import PluginData from apps.entities.record import RecordData - +from apps.entities.flow import PositionItem,FlowItem,NodeItem,EdgeItem class ResponseData(BaseModel): """基础返回数据结构""" @@ -229,3 +229,78 @@ class GetKnowledgeIDRsp(ResponseData): """GET /api/knowledge 返回数据结构""" result: GetKnowledgeIDMsg + + +class NodeMetaDataItem(BaseModel): + """GET /api/flow/node/metadata 单个节点元数据结构""" + api_id: str = Field(alias="apiId") + name:str + type:str + created_at: str= Field(alias="createdAt") +class ServiceNodeMetaDatasItem(BaseModel): + """GET /api/flow/node/metadata 服务与服务下节点元数据结构""" + service_id:str=Field(alias="serviceId") + name:str + type:str + node_meta_datas:list[NodeMetaDataItem]=Field(alias="nodeMetaData",default=[]) + created_at: str= Field(alias="createdAt") +class NodeMetaDataListMsg(ResponseData): + services:list[ServiceNodeMetaDatasItem] +class NodeMetaDataListRsp(ResponseData): + """GET /api/flow/node/metadata 返回数据结构""" + result:NodeMetaDataListMsg + + +class FlowStructureGetMsg(BaseModel): + """GET /api/flow/{flowId} result""" + flow:FlowItem + nodes:list[NodeItem] + edges:list[EdgeItem] + focus_point:PositionItem=Field(alias="focusPoint") + +class FlowStructureGetRsp(BaseModel): + """GET /api/flow/{flowId} 返回数据结构""" + result:FlowStructureGetMsg +class FlowStructurePutMsg(BaseModel): + """PUT /api/flow result""" + flow_id:str=Field(alias="flowId") +class FlowStructurePutRsp(ResponseData): + """PUT /api/flow 返回数据结构""" + flow_id:str=Field(alias="flowId") + +class FlowStructureDeleteMsg(BaseModel): + """DELETE /api/flow/{flowId} result""" + flow_id:str=Field(alias="flowId") +class FlowStructureDeleteRsp(ResponseData): + """DELETE /api/flow/{flowId} 返回数据结构""" + flow_id:str=Field(alias="flowId") + +class NodeParameterItem(BaseModel): + parameter_id:str=Field(alias="parameterId") + content:str + updated_at: str= Field(alias="updatedAt") +class NodeParameterGetMsg(BaseModel): + """GET /api/flow/node/parameter result""" + node_id:str=Field(alias="nodeId") + parameter:NodeParameterItem +class NodeParameterGetRsp(ResponseData): + """GET /api/flow/node/parameter 返回数据结构""" + result:NodeParameterGetMsg +class NodeParameterListMsg(BaseModel): + """GET /api/flow/node/parameter/history result""" + node_id:str=Field(alias="nodeId") + parameter_history:list[NodeParameterItem]=Field(alias="parameterHistory") +class NodeParameterListRsp(ResponseData): + """GET /api/flow/node/parameter/history 返回数据结构""" + result:NodeParameterListMsg + +class NodeParameterPutMsg(BaseModel): + """PUT /api/flow/node/parameter result""" + node_id:str=Field(alias="nodeId") + parameter_id:str=Field(alias="parameterId") +class NodeParameterPutRsp(ResponseData): + """PUT /api/flow/node/parameter 返回数据结构""" + result:NodeParameterPutMsg + + + \ No newline at end of file diff --git a/apps/routers/flow.py b/apps/routers/flow.py new file mode 100644 index 0000000000000000000000000000000000000000..592b550ca7859605b280daf3e684b929889efcd7 --- /dev/null +++ b/apps/routers/flow.py @@ -0,0 +1,64 @@ +"""FastAPI 用户画像相关API + +Copyright (c) Huawei Technologies Co., Ltd. 2023-2024. All rights reserved. +""" +from fastapi import APIRouter, Depends, status,Path,Query,Body +from fastapi.responses import JSONResponse + +from apps.dependency.csrf import verify_csrf_token +from apps.dependency.user import verify_user +from apps.entities.request_data import PutFlowReq,PutNodeParameterReq +from apps.entities.response_data import NodeMetaDataListRsp,FlowStructureGetRsp,FlowStructurePutRsp,\ + FlowStructureDeleteRsp,NodeParameterGetRsp,NodeParameterListRsp,NodeParameterPutRsp +from apps.manager.domain import DomainManager + +router = APIRouter( + prefix="/api/flow", + tags=["flow"], + dependencies=[ + Depends(verify_csrf_token), + Depends(verify_user), + ], +) + + +@router.get("/node/metadata",response_model=NodeMetaDataListRsp) +async def get_node_metadatas(page:int =Query(...), + page_size:int =Query(...,alias="pageSize")): # noqa: ANN201 + """获取节点元数据""" + pass + +@router.get("/{flowId}", response_model=FlowStructureGetRsp) +async def get_flow(flowId: str = Path(..., title="流的id")): + flow_id=flowId + pass + +@router.put("", response_model=FlowStructurePutRsp) +async def put_flow(flow_id:str = Query(..., alias="flowId"), + put_body: PutFlowReq=Body(...)): + pass + +@router.delete("/{flowId}", response_model=FlowStructureDeleteRsp) +async def delte_flow(flowId: str = Path(..., title="流的id")): + flow_id=flowId + pass + +@router.get("/node/parameter", response_model=NodeParameterGetRsp) +async def get_node_parameter(flow_id:str = Query(..., alias="flowId"), + node_id:str = Query(..., alias="nodeId")): + pass +@router.get("/node/parameter/history", response_model=NodeParameterListRsp) +async def get_node_parameter_history(flow_id:str = Query(..., alias="flowId"), + node_id:str = Query(..., alias="nodeId"), + start_time:str = Query(..., alias="startTime"), + end_time:str = Query(..., alias="endTime"), + page:int =Query(...), + page_size:int =Query(...,alias="pageSize"), + ): + pass +@router.put("/node/parameter", response_model=NodeParameterPutRsp) +async def put_node_parameter(flow_id:str = Query(..., alias="flowId"), + node_id:str = Query(..., alias="nodeId"), + put_body:PutNodeParameterReq=Body(...)): + pass +