Bridge

推論エンジンの HTTP の顔:何がロードされているか、誰が貢献したか、そして補完 — それ以外は何も。

bridge は、精算ゲートウェイが推論のために話しかける唯一の相手です。p4 の用語でいう OUTER であり、モデルの各ステージにまたがるセッションを設置し、先頭ステージへリクエストを投入し、トークンストリームを回収し、各ノードの貢献を報告します。配置もスケジューリングも持たず、ロード済みモデルのカタログ以上の状態も持ちません — 意図的に小さくしてあります。自分で決めないことは、ずれようがないからです。

契約

4 つのルート、ひとつのトークン

ルート何を返すか
/api/controllersどのモデルがロードされているか、各ステージの状態
/api/runtimeオペレーターウォレットと、その背後のマシン群
/api/contributionsノードごとの行数・ユニット・リクエスト数・スループット
/c/<model>/v1/chat/completions推論

/api/health を除くすべてのルートは、X-Kvasir-Service-Token として送る共有サービストークンを要求します。そのトークンこそが、公開インターネットとリングの無償利用のあいだに立つ唯一のものです。だからこそ bridge はループバックにバインドし、公開せずトンネル越しに到達します。

p4 が委ねるもの

エンジンがやらない 2 つの仕事

  • チャットテンプレート。 p4 はステージサーバーに不透明なプロンプトを渡すだけで、独自のターン形式を一切適用しません。モデルのターン形式をレンダリングするのは bridge です — GGUF から読み取り、カタログでは prompt_format として示されます。これを飛ばすと instruct モデルは質問に答える代わりにテキストの続きを書き、end-of-turn トークンを決して出さず、毎回トークン上限まで走り切ります。
  • 推論(thinking)ブロック。推論モデルは返答をまず思考から始めます。bridge はそれを content とは別の reasoning_content として返し、enable_thinking: false はプロンプト側でブロックを閉じることで尊重します — さもなければ長い思考パスが予算を丸ごと食い、すでに支払い済みの呼び出し元に空の答えを返しかねません。
配置は bridge の仕事ではない

なぜ 409 を返すのか

bridge にモデルの提供を依頼すると 409 が返ります。どのレイヤーがどの GPU に載り、どの load generation で動くかは、オペレーターが書いてロードした配置プランから来るものであり、リモートから再ロードする手段は存在しません。ゲートウェイのリングウォッチドッグはこれを一度学習し、成立しえないことを繰り返し試す代わりに問い合わせをやめます。

貢献カウンタはメモリ上にあります。 bridge を再起動すると、ゲートウェイがまだポーリングしていない分は失われ — ポーリングは 30 秒ごとです — カウンタが巻き戻ったときゲートウェイは二重計上せず再ベースライン化します。所有者が bridge にわからないノードは黙ってスキップされるため、オペレーターウォレット未設定は「これらのマシンは何も稼いでいない」と読めてしまいます。