mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-09 17:28:51 +00:00
Update the v3.8.8 changelog (date, Codex Responses-over-WebSocket toggle, Xiaomi MiMo usage tracking, API Manager Normal/Quota sections, MiniMax coding-plan percent fix) and add scripts/codex-ws.sh — a documented wrapper to run the Codex CLI against a local OmniRoute instance.
94 lines
4.6 KiB
Bash
Executable file
94 lines
4.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# =============================================================================
|
|
# codex-ws — roda a OpenAI Codex CLI contra um OmniRoute LOCAL usando o
|
|
# transporte Responses-over-WebSocket (em vez do HTTP da Cloud).
|
|
#
|
|
# POR QUE ESTE WRAPPER EXISTE
|
|
# ---------------------------
|
|
# O OmniRoute expõe um proxy WebSocket para a API de Responses do Codex em
|
|
# ws(s)://<host>/v1/responses
|
|
# A Codex CLI sabe falar esse transporte quando o provider tem
|
|
# `supports_websockets = true` + `wire_api = "responses"`. Mas há DOIS detalhes
|
|
# que quebram o uso ingênuo:
|
|
#
|
|
# 1) A Codex CLI valida o NOME do modelo no cliente. Ids com prefixo de provider
|
|
# (ex.: "codex/gpt-5.5") são REJEITADOS ("model is not supported ... ChatGPT
|
|
# account"). É preciso mandar o id "puro" -> "gpt-5.5". (O OmniRoute, no
|
|
# bridge WS, re-resolve "gpt-5.5" -> provider codex internamente.)
|
|
#
|
|
# 2) A Codex CLI v0.136 carrega TAMBÉM "$CWD/.codex/config.toml" como config
|
|
# "project-local". Se você rodar de um diretório que tenha um .codex (ex.:
|
|
# /root, onde mora a config da Cloud), o `model` daquele arquivo SOBRESCREVE
|
|
# o `model` do seu CODEX_HOME -> você acaba mandando o modelo errado.
|
|
# Por isso forçamos model + model_provider via `-c` (precedência máxima),
|
|
# que vence qualquer config de arquivo (user-level OU project-local).
|
|
#
|
|
# Além disso, no modo `exec` (headless) a CLI exige um diretório "confiável" ou
|
|
# a flag --skip-git-repo-check; o wrapper adiciona a flag automaticamente.
|
|
#
|
|
# USO
|
|
# ---
|
|
# codex-ws "sua pergunta" # abre a TUI interativa (precisa de terminal)
|
|
# codex-ws exec "Responda: PONG" # one-shot headless (CI/validação)
|
|
# codex-ws --help # repassa flags pra Codex CLI
|
|
#
|
|
# Variáveis de ambiente (todas com default; sobrescreva exportando antes):
|
|
# OMNIROUTE_WS_BASE base URL do OmniRoute local (default abaixo)
|
|
# OMNIROUTE_WS_MODEL modelo codex (id puro) (default "gpt-5.5")
|
|
# OMNIROUTE_LOCAL_KEY API key (qualquer valor se REQUIRE_API_KEY=false)
|
|
# CODEX_WS_HOME dir de config isolado da Codex (default ~/.codex-ws)
|
|
# =============================================================================
|
|
|
|
set -euo pipefail
|
|
|
|
# ---- Configuração (com defaults seguros) ------------------------------------
|
|
OMNIROUTE_WS_BASE="${OMNIROUTE_WS_BASE:-http://127.0.0.1:20128/v1}" # base do OmniRoute local
|
|
OMNIROUTE_WS_MODEL="${OMNIROUTE_WS_MODEL:-gpt-5.5}" # id PURO (sem "codex/")
|
|
CODEX_WS_HOME="${CODEX_WS_HOME:-$HOME/.codex-ws}" # CODEX_HOME isolado da Cloud
|
|
|
|
# A Codex CLI lê a key Bearer da env var nomeada em `env_key`. Mantemos um nome
|
|
# próprio para não colidir com OPENAI_API_KEY da config da Cloud.
|
|
export OMNIROUTE_LOCAL_KEY="${OMNIROUTE_LOCAL_KEY:-local}"
|
|
|
|
# CODEX_HOME isolado: a Codex CLI usa ESTE diretório como config "user-level",
|
|
# deixando a sua ~/.codex (Cloud) totalmente intacta.
|
|
export CODEX_HOME="$CODEX_WS_HOME"
|
|
|
|
# ---- Garante que a config do CODEX_HOME exista (auto-bootstrap) --------------
|
|
# Só o bloco [model_providers.*] precisa estar aqui; model/model_provider são
|
|
# forçados via -c logo abaixo (por causa do detalhe #2 do cabeçalho).
|
|
if [ ! -f "$CODEX_HOME/config.toml" ]; then
|
|
mkdir -p "$CODEX_HOME"
|
|
cat > "$CODEX_HOME/config.toml" <<EOF
|
|
# Gerado por codex-ws.sh — config isolada para o WS local do OmniRoute.
|
|
model = "$OMNIROUTE_WS_MODEL"
|
|
model_provider = "omniroute-local"
|
|
|
|
[model_providers.omniroute-local]
|
|
name = "OmniRoute Local (WS)"
|
|
base_url = "$OMNIROUTE_WS_BASE" # a URL WebSocket é derivada desta base pela CLI
|
|
wire_api = "responses" # único valor suportado desde fev/2026
|
|
supports_websockets = true # <- liga o transporte Responses-over-WebSocket
|
|
env_key = "OMNIROUTE_LOCAL_KEY" # a CLI lê a key Bearer desta env var
|
|
|
|
# Marca o HOME como diretório confiável para o modo exec.
|
|
[projects."$HOME"]
|
|
trust_level = "trusted"
|
|
EOF
|
|
fi
|
|
|
|
# ---- Overrides de precedência máxima ----------------------------------------
|
|
# Vencem qualquer config de arquivo (inclusive a project-local da Cloud em
|
|
# $CWD/.codex/config.toml). É o que garante o modelo certo no transporte certo.
|
|
overrides=(-c model="$OMNIROUTE_WS_MODEL" -c model_provider="omniroute-local")
|
|
|
|
# ---- Dispatch ---------------------------------------------------------------
|
|
# No modo headless (`exec`) injeta --skip-git-repo-check (senão a CLI recusa
|
|
# rodar fora de um repo git "confiável"). O `shift` remove o "exec" duplicado.
|
|
if [ "${1:-}" = "exec" ]; then
|
|
shift
|
|
exec codex exec --skip-git-repo-check "${overrides[@]}" "$@"
|
|
fi
|
|
|
|
# Modo interativo (TUI) ou qualquer outro subcomando/flag: repassa direto.
|
|
exec codex "${overrides[@]}" "$@"
|