メインコンテンツへスキップ

概要

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}}
itemforEachループ内の現在のアイテム{{item}}
item.<property>現在のアイテムのプロパティ{{item.id}}

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

# 結果全体にアクセス
- 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]}}"

シークレットの使用

シークレットはワークスペースレベルで設定され、安全にアクセスされます:
config:
  - name: api_key
    value: "{{secrets.OPENAI_API_KEY}}"
  - name: token
    value: "{{secrets.GITHUB_TOKEN}}"
セキュリティに関する注意
  • シークレットは保存時に暗号化されます
  • ワークフローに機密値をハードコーディングしないでください
  • APIキー、トークン、認証情報にはシークレットを使用してください

Jinja2テンプレート

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

制御構造

Forループ

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

条件文

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

インデックス付きループ

value: |
  {%- for item in items %}
  {{loop.index}}: {{item}}
  {%- endfor %}

組み込み関数

Jinja2は便利な組み込み関数を提供します:
# zip - 複数のリストを結合
{%- for a, b in zip(list1, list2) %}
{{a}}: {{b}}
{%- endfor %}

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

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

フィルター

値に変換を適用します:
# 文字列操作
{{ variable | upper }}
{{ variable | lower }}
{{ variable | trim }}
{{ variable | replace('old', 'new') }}

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

# JSON処理
{{ data | tojson }}

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

空白の制御

{%--%}を使用して空白を制御します:
value: |
  {%- for item in items -%}
  {{item}}
  {%- endfor -%}
  • {%- はタグの前の空白を削除
  • -%} はタグの後の空白を削除

一般的なパターン

リストの処理

- 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

条件付きデータ選択

- 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

複数ソースの結合

- 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

リストのフィルタリング

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

動的プロンプトの構築

- 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 オブジェクト)

関連ドキュメント