OMP Headroom Bridge:外部ルーティングコントローラとネイティブ Codex/OMP プロキシ境界
技術ノート
公開 / DavidHLPL
昇格条件(三つの検証可能な確認):
- loopback proxy、OMP provider route、Codex 共有 provider の三者共存 smoke test。
bin/omp-routesとbin/codex-routesの atomic restore 状態機械と mode 判定。- rollback の順序と障害復旧の再現可能な操作手順。
omp-headroom-provider-proxy は外部ルーティングコントローラと Headroom デプロイプロジェクトだ。OMP、Codex、クライアント認証の owner 境界を保持し、OMP/Headroom のソースを変更せず、credential や models.db をコピーせず、明示的な設定、systemd user service、状態検証、ロールバック可能な操作で複数のクライアントを同じ loopback Headroom 入口に接続する。本ページは現在の Headroom 0.34/OMP/Codex 環境向けの provisional entity ページであり、実装ソースとランタイム証拠は sources にある。
何を解決するか
このプロジェクトは、混同しやすい三つの問題を分ける:
- 入口:Headroom は
systemd --userが管理し、127.0.0.1:8787だけを listen する。 - ルーティング:OMP provider route と Codex ネイティブ Responses provider は、正確な prefix、API、header、upstream 制約で Headroom に入る。
- ライフサイクル:
bin/omp-routesとbin/codex-routesが apply/check/restore を明示的に担当する。サービス起動・停止が暗黙的にユーザールートを書き換えることはない。
Headroom が compression owner である。同じリクエストに二つ目の application-level compression bridge を重ねてはならない。Claude Code と共存する場合、cc-switch は Anthropic↔OpenAI プロトコル変換と資格情報注入だけを行い、圧縮は担当しない。
ルーティングトポロジ
flowchart LR
OMP1[OMP opencode-go] -->|OpenAI-compatible /v1| H[Headroom 127.0.0.1:8787]
OMP2[OMP openai-codex] -->|Responses / Live WebSocket| H
CLI[Codex CLI/Desktop] -->|native Responses provider| H
H -->|x-headroom-base-url| C[ChatGPT/Codex upstream]
CC[Claude Code /v1/messages] --> H
H -->|整理後の Anthropic messages| SW[cc-switch 127.0.0.1:15721]
SW --> C
| 呼び出し元 | 入口と責務 | このパスから推測してはいけないこと |
|---|---|---|
opencode-go |
OpenAI-compatible provider route で Headroom prefix に入る | 他の provider が自動的に引き継がれる |
openai-codex |
Responses/Live WebSocket で Headroom に入り、header で ChatGPT upstream を選ぶ | model discovery、ログイン、realtime voice が proxy を経由する |
| Codex CLI/Desktop | ユーザー単位の $CODEX_HOME/config.toml を共有するネイティブ provider |
HTTP_PROXY/CONNECT が必須の手段である |
| Claude Code | HEADROOM_CC_SWITCH_RECONCILE=1 のとき Headroom を経て cc-switch が変換 |
cc-switch が圧縮を担当する、または二つのプロトコルパスが状態を共有する |
Codex ネイティブ provider
Codex CLI と Desktop は同じユーザー設定を使うため、このプロジェクトは別の proxy を立てず、システムレベルの HTTP proxy も装わない。config/codex-headroom.toml が宣言する provider の重要セマンティクスは次の通り:
model_provider = "headroom";wire_api = "responses";base_urlは既存の loopback Headroom prefix を使う;requires_openai_auth = trueとsupports_websockets = trueで Codex の OAuth/Live WebSocket セマンティクスを保持する;x-headroom-base-url = https://chatgpt.com/backend-apiを request 単位の upstream hint とする;- auth ファイル、token、OMP 所有の database は各 owner のユーザーディレクトリに残り、プロジェクトに入らない。
bin/codex-routes は唯一の実ユーザー設定書き込み入口である。root-safe な TOML managed marker を維持し、apply 前後にターゲットの identity、mode、content hash、backup hash、state journal を検査する。flock、atomic write/exchange、prepared restore、mode drift と target drift の検査が一体となり、ユーザーの手編集、外部 writer、異常終了があっても、コントローラは推測して上書きするのではなく停止する。
OMP ルーティングとプロジェクト永続化
bin/omp-routes は許可された opencode-go と openai-codex provider だけに明示的に apply/check/restore する。provider API、exact loopback prefix、upstream header、パスはすべて静的契約である。プロジェクト state、Headroom の workspace/log/savings など永続化ディレクトリはプロジェクト var/ に置かれるが、OMP credential、models.db、ユーザーの route ownership はプロジェクトにコピーされない。
したがって、次の項目をそれぞれ別々に検証すべきだ:
- OMP 設定が正しいか;
- Headroom service が healthy/ready か;
- リクエストが本当に loopback proxy に届くか;
- proxy が最終的に期待する HTTP/WebSocket upstream に接続するか。
クライアントの成功、/health、HTTP 200 だけでは compression route が有効なことを証明できない。proxy の inbound/outbound ログとレスポンス完了イベントを組み合わせなければならない。
実検証
現在の納品証拠は次の通り:
./bin/validate PASS
./bin/headroom-ponytail-check PASS
./bin/omp-routes check PASS
./bin/codex-routes check PASS
systemctl --user ... active
Codex CLI の fresh process は CODEX_HEADROOM_CLI_SMOKE_OK を返し、Desktop の fresh local-thread は CODEX_HEADROOM_DESKTOP_SMOKE_OK_2 を返す。どちらの proxy ログにも loopback Responses リクエスト、ChatGPT OAuth Codex WebSocket、response.completed が見える。これは現在の環境の実 inference path を証明するもので、discovery、クラウドスレッド、voice への汎用互換宣言ではない。
ロールバック
- すべての Codex CLI/Desktop writer を停止する。
./bin/codex-routes restore --forceを実行する。./bin/codex-routes checkで backup/state hash とターゲット mode を確認する。- 再び有効にする必要があるときは、明示的に
applyし直す。コントローラを迂回してユーザー設定を直接編集しない。
OMP ルートは対応する bin/omp-routes restore を使う。Claude Code/cc-switch 共存のロールバックでは、さらに reconciler と BindPaths=%h/.claude を削除し、元の ANTHROPIC_BASE_URL を復元する必要がある。すべてのロールバックで実際の writer を先に停止し、backup を保持すること。
バージョンと証拠の境界
- 情報源の事実:固定プロジェクトコミット、プロジェクトドキュメント、controller contract、分離された lifecycle smoke、fresh CLI/Desktop の proxy 証拠。
- 本ページの総合:「単一の compression owner、ネイティブ Codex provider、明示的なルートトランザクション、実 proxy 証拠」を再利用可能なプロジェクトモデルにまとめる。
- 不確実性:provider schema、Desktop の設定読み込み、ログフィールド、WebSocket 挙動、Headroom/OMP のバージョン境界は変わり得る。現在の作業ツリーのルーティングコントローラはまだ新しい公開コミットを形成しておらず、リリース前にコミットを再固定して検証を再実行する必要がある。
関連ページ
出典と関連文書
研究記録
- 元の文書: src/content/note/ja/omp-headroom-provider-proxy.md
- 出典リビジョン: f49953fb0d4bd52a39bf81167b0c4b7dd7d78a64
- 証拠の状態: 暫定