コンテンツにスキップ

Joinノード

Joinノードは汎用の複数入力バリアです。join_modeに従って上流ノードの確定を待ち、aggregationに従って出力を束ね、必要ならその束をスキルに渡したうえで下流へcascadeします。

名前から想像されるかもしれませんが、Joinは特定のFan-outにペアリングされるわけではありません。複数の並列ブランチが合流するどの場所でも使える、素のN入力合流点です。

  • 独立した複数のブランチを待ち合わせしてから次のステップに進みたい(例: 3つのソースからリサーチを集めてからサマリを書く)。
  • Fan-outから出る要素ごとの出力を集約したい — fan-outの下流にJoinを置き、aggregation: arraymergeで束ねる。
  • 「すべてのブランチが成功」より弱い同期で十分な場合 — 最初の1本が返ったら続行(join_mode: any)、過半数で続行(majority)など。
フィールド説明
aggregation上流出力の束ね方。array(デフォルト)は{ _items, _sources, _total, _completed, _failed }で包む。mergeはオブジェクト型出力を浅くキーマージ。
join_modeバリアが解放される条件。all(デフォルト)/ any / majority
on_failurefail_all(デフォルト)は上流のいずれかが失敗したらJoinを失敗、ignoreは成功分で続行、collectは失敗も下流に通す。
skill_id / skill_version_id(任意)設定すると、集約済み入力をこのスキルに渡して実行(自動完了ではなく)。ブランチ出力をLLMで統合したい場合に便利。
  1. join_modeに対する到達可否が判定されます:
    • all — 非revisionな上流がすべて終端状態。
    • any — 少なくとも1本が完了かつ承認済み。
    • majority — 過半数が完了かつ承認済み。
  2. 到達したら、aggregationに従って上流出力を束ね、_items(または merge済みキー)、_sources_total_completed_failed を入力データに付けます。
  3. 上流のいずれかが失敗しon_failure === "fail_all"なら、Joinはfailedとして記録され、cascadeが止まります。
  4. そうでなければ:
    • スキルが設定されていれば、集約済み入力でpending挿入し、アサインミニオンで実行。
    • スキルが無ければ、その束を入力兼出力として自動的にcompletedにし、cascadeが下流へ続きます。
  • join_mode を設定する場合、all / any / majority のいずれか。
  • aggregation を設定する場合、array / merge / pick_first のいずれか。
flowchart LR
A["Skill: research-a"] --> J(("Join"))
B["Skill: research-b"] --> J
C["Skill: research-c"] --> J
J --> Sum["Skill: summarize"]

aggregation: arrayの場合、summarizeは入力エッジの順序で3要素の_itemsを受け取ります。