# 工作流、WorkItem 与数据血缘

使用 Product SDK 部署和运行工作流、发布 WorkItem API 服务，以及查看工作流产物和数据血缘。SDK 返回的资源对象会保留工作区与资源 ID 的作用域；后续操作应从创建、查询或运行结果取得下一层对象。

## 运行工作流

运行工作流前，准备已审核的工作流定义、工作流 ID 和运行输入。运行调用返回工作流作业标识后，保存该标识并使用工作流作业对象查询状态、结果、算子信息，或在条件允许时取消和重新运行。

启动工作流作业只表示运行请求已提交。应用应设置自己的轮询间隔和截止时间，在状态进入终态后再读取结果；本地等待超时并不代表平台已经停止运行，也不应直接提交第二次运行。

## SDK 调用

:::::{tab-set}

::::{tab-item} Go

```go
workflow, _, err := workspace.DeployWorkflow(ctx, workflowName, dslYAML, workflowID)
started, err := workflow.Run(ctx, sdk.WithWorkflowRunInput(runInput))
run, err := workflow.RunHandle(started.GetWorkflowRun().GetExecutionId())
result, err := run.Result(ctx)
```

::::

::::{tab-item} Python

```python
workflow, deployed = workspace.deploy_workflow(workflow_name, dsl_yaml, workflow_id)
started = workflow.run(sdk.with_workflow_run_input(run_input))
run = workflow.run_handle(started.workflow_run.execution_id)
result = run.result()
```

::::

:::::

`started` 中的工作流作业标识用于取得运行对象；`result` 才是读取运行结果的入口。

## 发布 WorkItem API 服务

WorkItem API 服务以 WorkItem 目录项和版本为范围。发布和调用都应使用 SDK 提供的服务对象与配置对象，并明确提供目录项标识、版本、服务名称、服务类型、计算实例和调用负载。

SDK 不会从目录显示名称推断发布参数。发布、启用、禁用和调用都可能影响外部使用方，操作前请确认版本和服务配置。

## 查看工作流产物与数据血缘

使用工作流产物对象查看输出块、算子、算子块和版本关系。切换有效版本或从算子重新运行时，先读取当前数据血缘和重新运行计划，再由调用方明确选择目标版本、算子和重新运行方式。

工作流产物与数据血缘不等同于智能体响应。不要将工作流作业 ID、算子 ID 或版本标识用于智能体任务。

## 语言方法对照

| 任务 | Go | Python |
| --- | --- | --- |
| 运行工作流 | `Run` | `run` |
| 查询工作流作业状态和结果 | `Info` / `Result` | `info` / `result` |
| 取消工作流作业 | `Cancel` | `cancel` |

## 下一步

- [异步任务、错误与重试](../async-tasks-error-handling)
- [使用 Product API 管理工作流、WorkItem 与数据血缘](../../../api/product-api/workflows-workitems-lineage/index)
