コンセプト
L402トークン(macaroon:preimage)はポータブルな文字列です — 一度支払いが完了すれば、同じリソースへのアクセスが必要な任意のサブエージェントに渡すことができます。オーケストレーターがウォレットを保持し、サブエージェントはトークンのみを受け取ります。
トークンは1時間後に期限切れになります。各preimageはサーバーごとに一度しか使用できません(リプレイ保護)。同じエンドポイントにアクセスする並列サブエージェントの場合、それぞれが独自の支払いを必要とします。
トークンを共有するか独立して支払うかの判断基準
デリゲーションパターンには2種類あり、それぞれトレードオフが異なります: トークン共有は、サブエージェントが同じエンドポイントに順番にアクセスする場合に有効です。オーケストレーターが一度支払い、Authorizationヘッダーの値を取り出して文字列として渡します。サブエージェントはそのヘッダーを直接使ってエンドポイントを呼び出します — ウォレットは不要です。コストを最小化できます(支払いは一回)が、並行アクセスには安全ではありません — 特定のpreimageを保持できるエージェントは一つだけであり、サーバーはリプレイを拒否します。
独立支払い(各サブエージェントがオーケストレーターのウォレットを共有する独自のL402Clientを持つ方式)は、並列または並行アクセスに有効です。各エージェントが独自のインボイスを支払い、独自のトークンをキャッシュします。satsのコストは増えますが、動作の把握が容易で、どの並行レベルでも安全です。
目安: サブエージェントが並列に展開する場合は、それぞれに独自のL402Clientを持たせてください。順番に実行して同じエンドポイントにアクセスする場合は、トークン文字列を共有してください。
セキュリティに関する考慮事項
- ウォレットのクレデンシャルをサブエージェントに渡さないでください。 トークン文字列(
L402 <macaroon>:<preimage>)のみを渡してください。トークンは最大1時間、一つのエンドポイントを呼び出せますが、秘密鍵はウォレットを空にしてしまいます。 - トークンはサーバーごとに単一使用です。 最初のリクエストが受け入れられた後、サーバーはpreimageハッシュを記録します。同じpreimageによる2回目のリクエストは402を返します。これによりリプレイ攻撃は防げますが、同じサーバーにアクセスする2つの並行サブエージェント間でトークンを共有することはできません。
- 予算管理はウォレットレベルで行います。 オーケストレーターの
L402ClientにbudgetSatsを設定して、そのウォレットを共有するすべてのサブエージェントの総支出に上限を設けてください。詳細はBudget Controlをご覧ください。
TypeScript — オーケストレーターが支払い、サブエージェントがトークンを使用
Python — オーケストレーターが支払い、サブエージェントがトークンを使用
マルチエージェントパターン:一度の支払いで並列読み取り
複数のサブエージェントが同じリソースに同時にアクセスする必要がある場合、最もクリーンなパターンは、共有ウォレットを持つ独自のL402Clientを使って各サブエージェントが独立して支払うことです: