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

# 変数とテンプレート

> 変数プレースホルダーとJinja2テンプレートを使用して動的なワークフローを作成する方法を学びます

## 概要

Jinba Flowは以下を可能にする強力なテンプレート機能をサポートしています：

* 前のステップの結果を参照する
* 設定済みのシークレットに安全にアクセスする
* 複雑なロジックにJinja2テンプレートを使用する
* 動的で再利用可能なワークフローを作成する

## 変数プレースホルダー

### 基本構文

変数は二重波括弧で囲みます：`{{ 変数 }}`

### 利用可能な変数

| 変数                                  | 説明                  | 例                                   |
| ----------------------------------- | ------------------- | ----------------------------------- |
| `steps.<step_id>.result`            | 前のステップの結果           | `{{steps.fetch_data.result}}`       |
| `steps.<step_id>.result.<property>` | 結果の特定のプロパティ         | `{{steps.api_call.result.content}}` |
| `secrets.<secret_name>`             | 設定済みのワークスペースシークレット  | `{{secrets.API_KEY}}`               |
| `item`                              | forEachループ内の現在のアイテム | `{{item}}`                          |
| `item.<property>`                   | 現在のアイテムのプロパティ       | `{{item.id}}`                       |

### ステップ結果へのアクセス

```yaml theme={null}
# 結果全体にアクセス
- name: data
  value: "{{steps.previous_step.result}}"

# 特定のプロパティにアクセス
- name: content
  value: "{{steps.llm_response.result.content}}"

# ネストしたプロパティにアクセス
- name: user_email
  value: "{{steps.get_user.result.user.email}}"

# 配列要素にアクセス
- name: first_item
  value: "{{steps.get_list.result[0]}}"
```

### シークレットの使用

シークレットはワークスペースレベルで設定され、安全にアクセスされます：

```yaml theme={null}
config:
  - name: api_key
    value: "{{secrets.OPENAI_API_KEY}}"
  - name: token
    value: "{{secrets.GITHUB_TOKEN}}"
```

**セキュリティに関する注意**：

* シークレットは保存時に暗号化されます
* ワークフローに機密値をハードコーディングしないでください
* APIキー、トークン、認証情報にはシークレットを使用してください

## Jinja2テンプレート

Jinba Flowは高度なロジックのための完全なJinja2テンプレートをサポートしています。テンプレートはステップ実行前に処理されます。

### 制御構造

#### Forループ

```yaml theme={null}
value: |
  items = []
  {%- for user in steps.get_users.result %}
  items.append({
    "id": "{{user.id}}",
    "name": "{{user.name}}"
  })
  {%- endfor %}
```

#### 条件文

```yaml theme={null}
value: |
  {%- if steps.check.result.status == 'success' %}
  print("処理成功")
  {%- else %}
  print("エラー処理中")
  {%- endif %}
```

#### インデックス付きループ

```yaml theme={null}
value: |
  {%- for item in items %}
  {{loop.index}}: {{item}}
  {%- endfor %}
```

### 組み込み関数

Jinja2は便利な組み込み関数を提供します：

```yaml theme={null}
# zip - 複数のリストを結合
{%- for a, b in zip(list1, list2) %}
{{a}}: {{b}}
{%- endfor %}

# range - 数値シーケンスを生成
{%- for i in range(5) %}
アイテム {{i}}
{%- endfor %}

# length/count
合計: {{items|length}}
```

### フィルター

値に変換を適用します：

```yaml theme={null}
# 文字列操作
{{ variable | upper }}
{{ variable | lower }}
{{ variable | trim }}
{{ variable | replace('old', 'new') }}

# デフォルト値
{{ variable | default('フォールバック値') }}

# JSON処理
{{ data | tojson }}

# リスト操作
{{ items | first }}
{{ items | last }}
{{ items | join(', ') }}
```

### 空白の制御

`{%-`と`-%}`を使用して空白を制御します：

```yaml theme={null}
value: |
  {%- for item in items -%}
  {{item}}
  {%- endfor -%}
```

* `{%-` はタグの前の空白を削除
* `-%}` はタグの後の空白を削除

## 一般的なパターン

### リストの処理

```yaml theme={null}
- id: process_items
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        results = []
        {%- for item in steps.input_list.result %}
        results.append({
          "id": "{{item.id}}",
          "processed": True
        })
        {%- endfor %}
        result = results
```

### 条件付きデータ選択

```yaml theme={null}
- id: select_data
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        {%- if steps.config.result.mode == 'full' %}
        data = {{steps.full_data.result}}
        {%- else %}
        data = {{steps.summary_data.result}}
        {%- endif %}
        result = data
```

### 複数ソースの結合

```yaml theme={null}
- id: merge_data
  tool: PYTHON_SANDBOX_RUN
  input:
    - name: code
      value: |
        combined = []
        {%- for user, order in zip(steps.users.result, steps.orders.result) %}
        combined.append({
          "user": "{{user.name}}",
          "order": "{{order.id}}"
        })
        {%- endfor %}
        result = combined
```

### リストのフィルタリング

```yaml theme={null}
value: |
  active_items = []
  {%- for item in items if item.status == 'active' %}
  active_items.append("{{item.name}}")
  {%- endfor %}
```

### 動的プロンプトの構築

```yaml theme={null}
- id: generate_prompt
  tool: LLM
  input:
    - name: prompt
      value: |
        以下のアイテムを分析してください：
        {%- for item in steps.items.result %}
        - {{item.name}}: {{item.description}}
        {%- endfor %}
        
        上記のデータに基づいてインサイトを提供してください。
```

## ベストプラクティス

### 変数参照

* 明確さのために説明的なステップIDを使用する
* 必要なプロパティのみにアクセスする
* デフォルト値でnull/undefined値を処理する

### テンプレート

* 適切なインデントでテンプレートを読みやすく保つ
* きれいな出力のために空白制御を使用する
* 複雑なロジックは複数のステップに分割する

### シークレット

* シークレット値をログに記録したり公開したりしない
* チーム共有にはワークスペースレベルのシークレットを使用する
* シークレットを定期的にローテーションする

### パフォーマンス

* 深くネストしたテンプレートを避ける
* ループ回数を制限する
* 可能な場合はデータを事前処理する

## トラブルシューティング

### よくある問題

**変数が見つからない**

* ステップIDのスペルを確認
* 参照されるステップが現在のステップの前に実行されることを確認
* プロパティパスが正しいことを確認

**テンプレート構文エラー**

* 波括弧`{{ }}`のバランスを確認
* Jinja2タグの構文`{% %}`を確認
* 文字列内のクォートが不足していないか確認

**予期しない出力**

* デバッグステップを使用して中間値を検査
* 空白の処理を確認
* データ型を確認（文字列 vs オブジェクト）

## 関連ドキュメント

* [ステップモジュールオプション](/ja/pages/basics/step-options) - forEach、when、needs
* [YAMLコーディングパネル](/ja/pages/basics/manifest) - 完全なYAML構文
* [デバッグ](/ja/pages/basics/debug) - ワークフローのデバッグ
