> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jinba.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 実行モデル

> ワークフローがトリガーから完了までどのように実行されるか

実行モデルを理解することで、信頼性の高いワークフローを設計し、問題を効果的にデバッグできます。

## ビルドタイムとランタイム

ワークフローには2つの異なるフェーズがあります：

<CardGroup cols={2}>
  <Card title="ビルドタイム" icon="hammer">
    エディタでワークフローを設計する段階。ステップの定義、ツールの設定、依存関係の構成を行います。
  </Card>

  <Card title="ランタイム" icon="play">
    ランナーがマニフェストを解釈し実行する段階。ステップが依存関係順に実行され、データが流れます。
  </Card>
</CardGroup>

## 実行タイムライン

ワークフローが実行されると、以下のタイムラインに従います：

<Steps>
  <Step title="トリガー">
    API呼び出し、スケジュール、MCP、または手動実行で開始
  </Step>

  <Step title="検証">
    入力パラメータを検証、マニフェストを読み込み
  </Step>

  <Step title="実行">
    依存グラフに従ってステップを実行
  </Step>

  <Step title="処理">
    エラーをキャッチ、設定されていればリトライを試行
  </Step>

  <Step title="返却">
    最終結果を呼び出し元に返す
  </Step>
</Steps>

## ステップ実行パターン

<CardGroup cols={2}>
  <Card title="直列" icon="arrow-right">
    依存関係のあるステップが順番に実行
  </Card>

  <Card title="並列" icon="arrows-split-up-and-left">
    独立したステップが同時に実行
  </Card>

  <Card title="条件分岐" icon="code-branch">
    `when`条件がtrueの場合のみ実行
  </Card>

  <Card title="ループ" icon="rotate">
    `forEach`で各アイテムに対して繰り返し実行
  </Card>
</CardGroup>

### 直列実行

`needs`を持つステップは依存関係を待ちます：

```yaml theme={null}
steps:
  - id: step_a
    tool: TOOL_A

  - id: step_b
    tool: TOOL_B
    needs: [step_a]  # step_aを待つ

  - id: step_c
    tool: TOOL_C
    needs: [step_b]  # step_bを待つ
```

**実行順序：** `step_a` → `step_b` → `step_c`

### 並列実行

共有の依存関係がないステップは並列に実行されます：

```yaml theme={null}
steps:
  - id: input
    tool: INPUT_TEXT

  - id: branch_a
    tool: TOOL_A
    needs: [input]

  - id: branch_b
    tool: TOOL_B
    needs: [input]  # branch_aと並列に実行

  - id: merge
    tool: TOOL_C
    needs: [branch_a, branch_b]  # 両方を待つ
```

**実行順序：** `input` → (`branch_a` ∥ `branch_b`) → `merge`

### 条件分岐実行

条件ロジックには`when`を使用：

```yaml theme={null}
steps:
  - id: classify
    tool: GEMINI_CHAT
    input:
      - name: prompt
        value: "「緊急」または「通常」に分類: {{inputs.message}}"

  - id: urgent_handler
    tool: SLACK_POST_MESSAGE
    needs: [classify]
    when: "'{{steps.classify.result.content}}' == '緊急'"
    input:
      - name: message
        value: "緊急: {{inputs.message}}"

  - id: normal_handler
    tool: GMAIL_SEND
    needs: [classify]
    when: "'{{steps.classify.result.content}}' == '通常'"
    input:
      - name: body
        value: "{{inputs.message}}"
```

分類結果に基づいて1つのハンドラーのみが実行されます。

### ループ実行（forEach）

`forEach`でコレクションを処理：

```yaml theme={null}
steps:
  - id: get_items
    tool: INPUT_JSON
    input:
      - name: value
        value: '[{"name": "Alice"}, {"name": "Bob"}, {"name": "Carol"}]'

  - id: greet_each
    tool: GEMINI_CHAT
    forEach: "{{steps.get_items.result}}"
    needs: [get_items]
    input:
      - name: prompt
        value: "{{item.name}}への挨拶を書いて"
```

ステップはコレクション内の各アイテムに対して1回実行されます。

## 障害モード

| 障害タイプ         | 原因                  | 処理             |
| ------------- | ------------------- | -------------- |
| **検証エラー**     | 無効な入力パラメータまたはマニフェスト | 実行が即座に停止       |
| **ツールエラー**    | 外部サービスの障害またはタイムアウト  | ステップが失敗としてマーク  |
| **タイムアウトエラー** | ステップが設定された時間制限を超過   | ステップが終了        |
| **依存関係エラー**   | 必要なステップが失敗          | 依存ステップがスキップ    |
| **条件エラー**     | 無効な`when`式          | 警告付きでステップがスキップ |

## ステップ状態

各ステップは以下の状態を遷移します：

| 状態          | 説明                |
| ----------- | ----------------- |
| **Pending** | 依存関係の完了を待機中       |
| **Running** | 現在実行中             |
| **Success** | 正常に完了             |
| **Failed**  | エラーで実行失敗          |
| **Skipped** | 条件が満たされないか依存関係が失敗 |

## 変数解決

変数は実行時に解決されます：

| パターン                             | 解決先                     |
| -------------------------------- | ----------------------- |
| `{{inputs.name}}`                | 入力パラメータの値               |
| `{{steps.step_id.result}}`       | 完了したステップの完全な結果          |
| `{{steps.step_id.result.field}}` | ステップ結果の特定フィールド          |
| `{{secrets.KEY_NAME}}`           | ワークスペースシークレットからのクレデンシャル |
| `{{item}}`                       | forEachループの現在のアイテム      |
| `{{item.field}}`                 | 現在のループアイテムのフィールド        |

## エラー処理のベストプラクティス

1. **早期検証**：INPUT\_\*ツールを使用して開始時にデータを検証
2. **出力チェック**：重要な操作の後に検証ステップを追加
3. **条件の使用**：`when`句で異なる結果を処理
4. **障害への設計**：外部サービスが失敗した場合を考慮
5. **履歴のレビュー**：実行履歴を使用して障害を分析

## デバッグのヒント

| 問題          | 解決策                       |
| ----------- | ------------------------- |
| ステップが実行されない | `needs`依存関係が満たされているか確認    |
| 間違ったデータ     | 変数参照構文を確認                 |
| 条件が動作しない    | 実際の値で`when`式をテスト          |
| ループが反復しない   | `forEach`ターゲットが配列であることを確認 |
| タイムアウト      | ステップのタイムアウトを増やすかロジックを最適化  |

## 次のステップ

<CardGroup cols={2}>
  <Card title="ワークフローのデバッグ" icon="bug" href="/ja/pages/basics/debug">
    デバッグ技術を学ぶ
  </Card>

  <Card title="YAMLリファレンス" icon="file-code" href="/ja/pages/basics/manifest">
    マニフェスト構文の完全リファレンス
  </Card>
</CardGroup>
