> ## 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.

# ステップモジュールオプション

> ループ（forEach）、条件分岐（when）、依存関係（needs）などの高度なステップオプションの使い方を学びます

## 概要

Jinba Flowの各ステップは、実行のタイミングと方法を制御する高度なオプションで設定できます。これらのオプションにより、条件分岐、ループ、複雑な依存関係を持つ洗練されたワークフローを作成できます。

## ステップの依存関係（needs）

`needs`オプションは、現在のステップが実行される前に完了する必要があるステップを指定します。これにより実行順序が作成され、必要なときにデータが利用可能になります。

### 基本的な使い方

```yaml theme={null}
- id: analyze_data
  tool: PYTHON_SANDBOX_RUN
  needs:
    - fetch_data
    - validate_input
  input:
    - name: code
      value: "process({{steps.fetch_data.result}})"
```

### 重要なポイント

* **実行順序**: `needs`を持つステップは、指定されたすべての依存関係が完了するまで待機します
* **並列実行**: 依存関係のないステップは自動的に並列で実行されます
* **失敗の処理**: 依存先が失敗またはスキップされた場合、依存するステップもスキップされます
* **ダイヤモンドパターン**: 複雑な依存関係グラフがサポートされています（A→B, A→C, B→D, C→D）

### 例：マルチブランチワークフロー

```yaml theme={null}
- id: input_data
  tool: INPUT_JSON
  input:
    - name: value
      value: "[1, 2, 3, 4, 5]"

- id: process_even
  tool: PYTHON_SANDBOX_RUN
  needs:
    - input_data
  input:
    - name: code
      value: |
        data = {{steps.input_data.result}}
        result = [x for x in data if x % 2 == 0]

- id: process_odd
  tool: PYTHON_SANDBOX_RUN
  needs:
    - input_data
  input:
    - name: code
      value: |
        data = {{steps.input_data.result}}
        result = [x for x in data if x % 2 != 0]

- id: combine_results
  tool: PYTHON_SANDBOX_RUN
  needs:
    - process_even
    - process_odd
  input:
    - name: code
      value: |
        even = {{steps.process_even.result}}
        odd = {{steps.process_odd.result}}
        result = {"even": even, "odd": odd}
```

## 条件付き実行（when）

`when`オプションを使用すると、指定した条件がtrueの場合にのみステップを実行できます。これにより、前のステップの結果に基づいた動的なワークフロー動作が可能になります。

### 基本構文

```yaml theme={null}
- id: conditional_step
  tool: TOOL_NAME
  when: "<条件式>"
  input:
    - name: param
      value: "value"
```

### 条件式

条件は以下をサポートします：

* **文字列比較**: `"{{steps.check.result.status}}" == "success"`
* **数値比較**: `{{steps.count.result}} > 5`
* **ブール値評価**: `{{steps.validate.result.isValid}} == true`

### 例：条件分岐

```yaml theme={null}
- id: check_type
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        result = {"type": "premium"}

- id: premium_processing
  tool: PYTHON_SANDBOX_RUN
  when: "'{{steps.check_type.result.type}}' == 'premium'"
  needs:
    - check_type
  input:
    - name: code
      value: |
        result = "プレミアムユーザーを処理中..."

- id: standard_processing
  tool: PYTHON_SANDBOX_RUN
  when: "'{{steps.check_type.result.type}}' == 'standard'"
  needs:
    - check_type
  input:
    - name: code
      value: |
        result = "スタンダードユーザーを処理中..."
```

### 重要な注意事項

* 条件はステップ実行**前**に評価されます
* 条件がfalseの場合、ステップのステータスは`skipped`になります
* スキップされたステップに依存するステップも同様にスキップされます
* 文字列比較ではテンプレート変数をシングルクォートで囲んでください

## ループ実行（forEach）

`forEach`オプションは、コレクション内の各アイテムに対してステップを複数回実行します。これはデータリストのバッチ処理に便利です。

### 基本構文

```yaml theme={null}
- id: process_items
  tool: TOOL_NAME
  forEach: "{{steps.get_list.result}}"
  input:
    - name: item
      value: "{{item}}"
```

### 動作の仕組み

1. `forEach`の値がリスト/配列として評価されます
2. リスト内の各アイテムに対してステップが1回ずつ実行されます
3. ステップ内では、`{{item}}`が現在のアイテムを参照します
4. 結果は配列として収集されます

### 例：複数アイテムの処理

```yaml theme={null}
- id: get_users
  tool: INPUT_JSON
  input:
    - name: value
      value: |
        [
          {"id": 1, "name": "Alice"},
          {"id": 2, "name": "Bob"},
          {"id": 3, "name": "Charlie"}
        ]

- id: greet_users
  tool: PYTHON_SANDBOX_RUN
  forEach: "{{steps.get_users.result}}"
  needs:
    - get_users
  input:
    - name: code
      value: |
        user = {{item}}
        result = f"こんにちは、{user['name']}さん！"

- id: combine_greetings
  tool: PYTHON_SANDBOX_RUN
  needs:
    - greet_users
  input:
    - name: code
      value: |
        greetings = {{steps.greet_users.result}}
        result = "\n".join([g['result'] for g in greetings])
```

### アイテムプロパティへのアクセス

```yaml theme={null}
forEach: "{{steps.items.result}}"
input:
  - name: id
    value: "{{item.id}}"
  - name: name
    value: "{{item.name}}"
```

### forEachとインデックス

現在のアイテムのインデックスが必要な場合は、入力でJinja2ループを使用できます：

```yaml theme={null}
- id: process_with_index
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        items = {{steps.get_items.result}}
        results = []
        {%- for item in items %}
        results.append({"index": {{loop.index}}, "value": "{{item}}"})
        {%- endfor %}
        result = results
```

## オプションの組み合わせ

`needs`、`when`、`forEach`を1つのステップで組み合わせることができます：

```yaml theme={null}
- id: process_active_items
  tool: PYTHON_SANDBOX_RUN
  needs:
    - get_items
    - check_enabled
  when: "{{steps.check_enabled.result.active}} == true"
  forEach: "{{steps.get_items.result}}"
  input:
    - name: code
      value: |
        item = {{item}}
        result = f"処理完了: {item}"
```

**評価順序**：

1. すべての`needs`依存関係が完了するまで待機
2. `when`条件がtrueかどうかを確認
3. trueの場合、`forEach`ループを実行（forEachがない場合は単一実行）

## ベストプラクティス

### 依存関係

* 可能な限り依存チェーンを浅くする
* 並列実行を使用してパフォーマンスを向上させる
* ステップに明確な名前を付けて依存関係を読みやすくする

### 条件

* 意味のある条件式を使用する
* すべての可能な結果（成功、失敗、エッジケース）を考慮する
* さまざまな入力値で条件をテストする

### ループ

* 長い実行時間を避けるためにループ回数を制限する
* 空の配列を適切に処理する
* 大規模なデータセットのメモリ使用量を考慮する

## 関連ドキュメント

* [YAMLコーディングパネル](/ja/pages/basics/manifest) - 完全なYAML構文リファレンス
* [変数とテンプレート](/ja/pages/basics/variables) - 変数プレースホルダーとJinja2テンプレート
* [デバッグ](/ja/pages/basics/debug) - ワークフロー実行のデバッグ
