3254018d more deleted codes and Fix naming error ambiguity between workflow_run_id and workflow_id (#17075)
Co-authored-by: 刘江波 <jiangbo721@163.com>tags/1.2.0
| class WorkflowRunDetailApi(Resource): | class WorkflowRunDetailApi(Resource): | ||||
| @validate_app_token | @validate_app_token | ||||
| @marshal_with(workflow_run_fields) | @marshal_with(workflow_run_fields) | ||||
| def get(self, app_model: App, workflow_id: str): | |||||
| def get(self, app_model: App, workflow_run_id: str): | |||||
| """ | """ | ||||
| Get a workflow task running detail | Get a workflow task running detail | ||||
| """ | """ | ||||
| if app_mode != AppMode.WORKFLOW: | if app_mode != AppMode.WORKFLOW: | ||||
| raise NotWorkflowAppError() | raise NotWorkflowAppError() | ||||
| workflow_run = db.session.query(WorkflowRun).filter(WorkflowRun.id == workflow_id).first() | |||||
| workflow_run = db.session.query(WorkflowRun).filter(WorkflowRun.id == workflow_run_id).first() | |||||
| return workflow_run | return workflow_run | ||||
| api.add_resource(WorkflowRunApi, "/workflows/run") | api.add_resource(WorkflowRunApi, "/workflows/run") | ||||
| api.add_resource(WorkflowRunDetailApi, "/workflows/run/<string:workflow_id>") | |||||
| api.add_resource(WorkflowRunDetailApi, "/workflows/run/<string:workflow_run_id>") | |||||
| api.add_resource(WorkflowTaskStopApi, "/workflows/tasks/<string:task_id>/stop") | api.add_resource(WorkflowTaskStopApi, "/workflows/tasks/<string:task_id>/stop") | ||||
| api.add_resource(WorkflowAppLogApi, "/workflows/logs") | api.add_resource(WorkflowAppLogApi, "/workflows/logs") |
| WorkflowFinishStreamResponse, | WorkflowFinishStreamResponse, | ||||
| WorkflowStartStreamResponse, | WorkflowStartStreamResponse, | ||||
| ) | ) | ||||
| from core.app.task_pipeline.exc import WorkflowRunNotFoundError | |||||
| from core.file import FILE_MODEL_IDENTITY, File | from core.file import FILE_MODEL_IDENTITY, File | ||||
| from core.model_runtime.utils.encoders import jsonable_encoder | from core.model_runtime.utils.encoders import jsonable_encoder | ||||
| from core.ops.entities.trace_entity import TraceTaskName | from core.ops.entities.trace_entity import TraceTaskName | ||||
| WorkflowRunStatus, | WorkflowRunStatus, | ||||
| ) | ) | ||||
| from .exc import WorkflowRunNotFoundError | |||||
| class WorkflowCycleManage: | class WorkflowCycleManage: | ||||
| def __init__( | def __init__( | ||||
| outputs = WorkflowEntry.handle_special_values(outputs) | outputs = WorkflowEntry.handle_special_values(outputs) | ||||
| workflow_run.status = WorkflowRunStatus.SUCCEEDED.value | |||||
| workflow_run.status = WorkflowRunStatus.SUCCEEDED | |||||
| workflow_run.outputs = json.dumps(outputs or {}) | workflow_run.outputs = json.dumps(outputs or {}) | ||||
| workflow_run.elapsed_time = time.perf_counter() - start_at | workflow_run.elapsed_time = time.perf_counter() - start_at | ||||
| workflow_run.total_tokens = total_tokens | workflow_run.total_tokens = total_tokens | ||||
| workflow_run = self._get_workflow_run(session=session, workflow_run_id=workflow_run_id) | workflow_run = self._get_workflow_run(session=session, workflow_run_id=workflow_run_id) | ||||
| outputs = WorkflowEntry.handle_special_values(dict(outputs) if outputs else None) | outputs = WorkflowEntry.handle_special_values(dict(outputs) if outputs else None) | ||||
| workflow_run.status = WorkflowRunStatus.PARTIAL_SUCCESSED.value | |||||
| workflow_run.status = WorkflowRunStatus.PARTIAL_SUCCEEDED.value | |||||
| workflow_run.outputs = json.dumps(outputs or {}) | workflow_run.outputs = json.dumps(outputs or {}) | ||||
| workflow_run.elapsed_time = time.perf_counter() - start_at | workflow_run.elapsed_time = time.perf_counter() - start_at | ||||
| workflow_run.total_tokens = total_tokens | workflow_run.total_tokens = total_tokens |
| from enum import Enum | |||||
| from enum import Enum, StrEnum | |||||
| class BuiltInField(str, Enum): | |||||
| class BuiltInField(StrEnum): | |||||
| document_name = "document_name" | document_name = "document_name" | ||||
| uploader = "uploader" | uploader = "uploader" | ||||
| upload_date = "upload_date" | upload_date = "upload_date" |
| from enum import Enum | |||||
| from enum import StrEnum | |||||
| class IndexType(str, Enum): | |||||
| class IndexType(StrEnum): | |||||
| PARAGRAPH_INDEX = "text_model" | PARAGRAPH_INDEX = "text_model" | ||||
| QA_INDEX = "qa_model" | QA_INDEX = "qa_model" | ||||
| PARENT_CHILD_INDEX = "hierarchical_model" | PARENT_CHILD_INDEX = "hierarchical_model" |
| all_documents = [] # type: ignore | all_documents = [] # type: ignore | ||||
| if rules.parent_mode == ParentMode.PARAGRAPH: | if rules.parent_mode == ParentMode.PARAGRAPH: | ||||
| # Split the text documents into nodes. | # Split the text documents into nodes. | ||||
| if not rules.segmentation: | |||||
| raise ValueError("No segmentation found in rules.") | |||||
| splitter = self._get_splitter( | splitter = self._get_splitter( | ||||
| processing_rule_mode=process_rule.get("mode"), | processing_rule_mode=process_rule.get("mode"), | ||||
| max_tokens=rules.segmentation.max_tokens, | max_tokens=rules.segmentation.max_tokens, |
| WorkflowRunStatus.SUCCEEDED: 0, | WorkflowRunStatus.SUCCEEDED: 0, | ||||
| WorkflowRunStatus.FAILED: 0, | WorkflowRunStatus.FAILED: 0, | ||||
| WorkflowRunStatus.STOPPED: 0, | WorkflowRunStatus.STOPPED: 0, | ||||
| WorkflowRunStatus.PARTIAL_SUCCESSED: 0, | |||||
| WorkflowRunStatus.PARTIAL_SUCCEEDED: 0, | |||||
| } | } | ||||
| for message in messages: | for message in messages: | ||||
| { | { | ||||
| "success": status_counts[WorkflowRunStatus.SUCCEEDED], | "success": status_counts[WorkflowRunStatus.SUCCEEDED], | ||||
| "failed": status_counts[WorkflowRunStatus.FAILED], | "failed": status_counts[WorkflowRunStatus.FAILED], | ||||
| "partial_success": status_counts[WorkflowRunStatus.PARTIAL_SUCCESSED], | |||||
| "partial_success": status_counts[WorkflowRunStatus.PARTIAL_SUCCEEDED], | |||||
| } | } | ||||
| if messages | if messages | ||||
| else None | else None |
| tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) | tenant_id: Mapped[str] = mapped_column(StringUUID, nullable=False) | ||||
| app_id: Mapped[str] = mapped_column(StringUUID, nullable=False) | app_id: Mapped[str] = mapped_column(StringUUID, nullable=False) | ||||
| type: Mapped[str] = mapped_column(db.String(255), nullable=False) | type: Mapped[str] = mapped_column(db.String(255), nullable=False) | ||||
| version: Mapped[str] | |||||
| version: Mapped[str] = mapped_column(db.String(255), nullable=False) | |||||
| marked_name: Mapped[str] = mapped_column(default="", server_default="") | marked_name: Mapped[str] = mapped_column(default="", server_default="") | ||||
| marked_comment: Mapped[str] = mapped_column(default="", server_default="") | marked_comment: Mapped[str] = mapped_column(default="", server_default="") | ||||
| graph: Mapped[str] = mapped_column(sa.Text) | graph: Mapped[str] = mapped_column(sa.Text) | ||||
| SUCCEEDED = "succeeded" | SUCCEEDED = "succeeded" | ||||
| FAILED = "failed" | FAILED = "failed" | ||||
| STOPPED = "stopped" | STOPPED = "stopped" | ||||
| PARTIAL_SUCCESSED = "partial-succeeded" | |||||
| PARTIAL_SUCCEEDED = "partial-succeeded" | |||||
| class WorkflowRun(Base): | class WorkflowRun(Base): |
| from enum import Enum | |||||
| from enum import StrEnum | |||||
| from typing import Literal, Optional | from typing import Literal, Optional | ||||
| from pydantic import BaseModel | from pydantic import BaseModel | ||||
| enabled: Optional[bool] = None | enabled: Optional[bool] = None | ||||
| class ParentMode(str, Enum): | |||||
| class ParentMode(StrEnum): | |||||
| FULL_DOC = "full-doc" | FULL_DOC = "full-doc" | ||||
| PARAGRAPH = "paragraph" | PARAGRAPH = "paragraph" | ||||
| --- | --- | ||||
| <Heading | <Heading | ||||
| url='/workflows/run/:workflow_id' | |||||
| url='/workflows/run/:workflow_run_id' | |||||
| method='GET' | method='GET' | ||||
| title='获取workflow执行情况' | title='获取workflow执行情况' | ||||
| name='#get-workflow-run-detail' | name='#get-workflow-run-detail' | ||||
| <Col> | <Col> | ||||
| 根据 workflow 执行 ID 获取 workflow 任务当前执行结果 | 根据 workflow 执行 ID 获取 workflow 任务当前执行结果 | ||||
| ### Path | ### Path | ||||
| - `workflow_id` (string) workflow 执行 ID,可在流式返回 Chunk 中获取 | |||||
| - `workflow_run_id` (string) workflow_run_id,可在流式返回 Chunk 中获取 | |||||
| ### Response | ### Response | ||||
| - `id` (string) workflow 执行 ID | - `id` (string) workflow 执行 ID | ||||
| - `workflow_id` (string) 关联的 Workflow ID | - `workflow_id` (string) 关联的 Workflow ID | ||||
| </Col> | </Col> | ||||
| <Col sticky> | <Col sticky> | ||||
| ### Request Example | ### Request Example | ||||
| <CodeGroup title="Request" tag="GET" label="/workflows/run/:workflow_id" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json'`}> | |||||
| <CodeGroup title="Request" tag="GET" label="/workflows/run/:workflow_run_id" targetCode={`curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_run_id' \\\n-H 'Authorization: Bearer {api_key}' \\\n-H 'Content-Type: application/json'`}> | |||||
| ```bash {{ title: 'cURL' }} | ```bash {{ title: 'cURL' }} | ||||
| curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_id' \ | |||||
| curl -X GET '${props.appDetail.api_base_url}/workflows/run/:workflow_run_id' \ | |||||
| -H 'Authorization: Bearer {api_key}' \ | -H 'Authorization: Bearer {api_key}' \ | ||||
| -H 'Content-Type: application/json' | -H 'Content-Type: application/json' | ||||
| ``` | ``` |