# 呼叫工作流程

Source: https://openflow.run/zh-tw/docs/nodes/workflow/
Language: zh-TW
Product version: 0.1.0-beta.77

透過已宣告的輸入和輸出，複用另一個已發布工作流程。

呼叫工作流程節點（Call Workflow）可以呼叫目前帳號名下、已發布且具有開始節點介面的工作流程。平臺根據目標已發布的介面生成連接埠，呼叫方無需重建目標的內部執行圖。

## 選擇目標

```json
{
  "op": "node.add", "as": "greeting", "type": "workflow", "name": "Call greeting",
  "config": { "flowId": "TARGET_FLOW_ID" },
  "inputs": { "name": { "kind": "value", "value": "Ada" } }
}
```

公開節點型別是 `workflow`。選擇的目標應具有呼叫方要傳入的欄位。沒有工作流程輸出節點的目標，會回傳空的業務結果。

## 儲存的介面

節點會儲存所選目標的介面快照。一般編輯不會更新它；需要載入目標目前已發布的介面時，使用 `node.refresh`。

```json
{ "op": "node.refresh", "node": "CALL_NODE_REFERENCE" }
```

如果目標的新修訂版本保留了相同的欄位名、schema 和 null 約束，呼叫方無需更新即可繼續呼叫。介面變化時則需要更新。欄位按名稱精確匹配，無法解析的引用會保留，以便診斷。

呼叫工作流程節點向另一個工作流程傳入姓名，並讀取對方宣告的業務結果。

**輸入**
{"name":"Ada"}

**預期結果**
被呼叫工作流程的 message 輸出成為目前工作流程的 message 結果。

**執行前準備**
選擇目前帳號名下、已啟用且已發布、具有匹配的 name/message 介面的工作流程，再更新節點。案例中的目標 ID 僅作示意。

[下載工作流程](https://openflow.run/docs/examples/call-workflow.openflow.json)

## 執行時行為

執行時，部署端檢查目標目前已啟用的 Live 版本，並建立版本固定的子執行。子執行成功後，呼叫方接收它宣告的業務輸出。子工作流程中的等待屬於子執行；父執行取消或失敗時，尚未完成的後代執行也會被取消。

不允許自呼叫和遞迴呼叫鏈。草稿可以保留目前不可用的目標，但實際執行仍需要符合條件的已發布目標。呼叫工作流程節點不支援一般任務的重試策略。

Agent 和程式碼節點也可以使用明確宣告的工作流程工具。詳見 [Agent](https://openflow.run/zh-tw/docs/nodes/agent/index.md) 和[程式碼節點](https://openflow.run/zh-tw/docs/nodes/code/index.md)。

## 資料來源

*   [docs/authoring/node-authoring.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/authoring/node-authoring.md)
*   [docs/control/contracts/control-api.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/control/contracts/control-api.md#call-workflow)
*   [docs/architecture.md](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/docs/architecture.md#workflow-calls)
*   [packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts](https://github.com/oomol-lab/open-flow/blob/e25a738d170322734572a0b8a1323cb00b9d355a/packages/open-flow/src/workbench/browser/runtime/editor/addNodeOptions.ts)
