Bridge
推論エンジンの HTTP の顔:何がロードされているか、誰が貢献したか、そして補完 — それ以外は何も。
bridge は、精算ゲートウェイが推論のために話しかける唯一の相手です。p4 の用語でいう OUTER であり、モデルの各ステージにまたがるセッションを設置し、先頭ステージへリクエストを投入し、トークンストリームを回収し、各ノードの貢献を報告します。配置もスケジューリングも持たず、ロード済みモデルのカタログ以上の状態も持ちません — 意図的に小さくしてあります。自分で決めないことは、ずれようがないからです。
4 つのルート、ひとつのトークン
| ルート | 何を返すか |
|---|---|
/api/controllers | どのモデルがロードされているか、各ステージの状態 |
/api/runtime | オペレーターウォレットと、その背後のマシン群 |
/api/contributions | ノードごとの行数・ユニット・リクエスト数・スループット |
/c/<model>/v1/chat/completions | 推論 |
/api/health を除くすべてのルートは、X-Kvasir-Service-Token として送る共有サービストークンを要求します。そのトークンこそが、公開インターネットとリングの無償利用のあいだに立つ唯一のものです。だからこそ bridge はループバックにバインドし、公開せずトンネル越しに到達します。
エンジンがやらない 2 つの仕事
- チャットテンプレート。 p4 はステージサーバーに不透明なプロンプトを渡すだけで、独自のターン形式を一切適用しません。モデルのターン形式をレンダリングするのは bridge です — GGUF から読み取り、カタログでは
prompt_formatとして示されます。これを飛ばすと instruct モデルは質問に答える代わりにテキストの続きを書き、end-of-turn トークンを決して出さず、毎回トークン上限まで走り切ります。 - 推論(thinking)ブロック。推論モデルは返答をまず思考から始めます。bridge はそれを
contentとは別のreasoning_contentとして返し、enable_thinking: falseはプロンプト側でブロックを閉じることで尊重します — さもなければ長い思考パスが予算を丸ごと食い、すでに支払い済みの呼び出し元に空の答えを返しかねません。
なぜ 409 を返すのか
bridge にモデルの提供を依頼すると 409 が返ります。どのレイヤーがどの GPU に載り、どの load generation で動くかは、オペレーターが書いてロードした配置プランから来るものであり、リモートから再ロードする手段は存在しません。ゲートウェイのリングウォッチドッグはこれを一度学習し、成立しえないことを繰り返し試す代わりに問い合わせをやめます。
貢献カウンタはメモリ上にあります。 bridge を再起動すると、ゲートウェイがまだポーリングしていない分は失われ — ポーリングは 30 秒ごとです — カウンタが巻き戻ったときゲートウェイは二重計上せず再ベースライン化します。所有者が bridge にわからないノードは黙ってスキップされるため、オペレーターウォレット未設定は「これらのマシンは何も稼いでいない」と読めてしまいます。