Đến nội dung chính

BLOGAI · AGENT

Mày mò đem Gemini 4 Argon (High) sang chạy trên OpenAI Codex — Khi hết tiền mua Plus nhưng chê Antigravity “lỏ” (Phần 2)

Ở Phần 1 — Giải ngố AI Agent, Code Harness và MCP, mình đã chia sẻ lý do vì sao bộ khung điều phối (Harness) và dàn công cụ MCP mới là thứ quyết định trải nghiệm thực tế khi code cùng AI. Còn bài viết này xuất phát từ tình cảnh rất thật của mình sau khi hết hạn gói dùng thử ChatGPT Plus miễn phí:

  • Quen tay với hệ sinh thái Codex nhưng hết tiền mua tiếp: Dùng OpenAI Codex Desktop một thời gian, mình thực sự nghiện cái hệ sinh thái của nó — từ cơ chế Sandbox workspace-write, tách nhánh Git worktree, bật 4 Sub-agent chạy song song cho tới hơn 60 công cụ MCP nối sẵn với Browser, GitHub, Word, Excel, PDF. Ngặt nỗi khi hết đợt dùng thử ChatGPT Plus miễn phí thì túi tiền của mình cũng đang... cạn, chưa muốn tốn thêm 20 USD mỗi tháng.
  • Có sẵn Gemini 4 Argon (High) nhưng app Antigravity trả output quá "lỏ": Trong khi đó, mình đang có sẵn tài khoản chạy được Gemini 4 Argon (High) bên kênh Antigravity. Nhưng ngồi dùng trực tiếp trên app Antigravity thì cực kỳ ức chế: hệ sinh thái xung quanh nghèo nàn, thiếu hẳn dàn MCP mình hay dùng, mà output của AI Agent bên Antigravity trả về lại rất "lỏ" — nói năng dài dòng, hay bị lỗi lặp lại cùng một câu dẫn hàng chục lần trên luồng SSE, hơi tí lại dừng hỏi vặt và đốt quota tuần nhanh khủng khiếp.

“Đằng nào cũng mê cái hệ sinh thái của Codex mà ngán cái output lỏ bên Antigravity, giờ giữ nguyên cái vỏ MCP + Harness của Codex rồi nhét con Gemini 4 Argon (High) vào làm não chạy bên dưới được không?”

Mò thử cấu hình của Codex cùng với repo mã nguồn mở router-for-me/CLIProxyAPI trong một buổi tối thì hóa ra ghép được thật. Thậm chí sau khi mình "cấy" thêm bộ System Instructions của gpt-6.1-sol vào, con Argon lột xác hoàn toàn: trả lời ngắn gọn, tự chạy test, gọi 13 công cụ MCP song song mượt như model chính chủ mà không tốn một đồng phí ChatGPT Plus nào.

Sơ đồ kiến trúc ghép OpenAI Codex với Gemini 4 Argon (High)

Như mình đã giải thích ở Phần 1, ứng dụng Codex Desktop tách rời hoàn toàn phần khung điều phối trên máy Mac (Harness + MCP) và phần gọi model suy luận qua giao thức OpenAI Responses API (wire_api = "responses"). Toàn bộ đường đi của request và tool call sau khi bắc cầu qua CLIProxyAPI ở cổng 8317 hoạt động đúng như sơ đồ dưới đây:

Mô hình ghép OpenAI Codex Desktop với Gemini 4 Argon High qua CLIProxyAPI
Mô hình 4: Sơ đồ ghép bộ khung OpenAI Codex Desktop với model Gemini 4 Argon (High) qua local proxy cổng 8317 và bộ System Instructions của Sol 6.1.
  • Khung Codex Desktop (Bên trái): Giữ nguyên toàn bộ 60+ MCP tools, Sandbox workspace-write, bộ chỉ thị sol61_instructions.md và cơ chế gọi tool direct. Đặc biệt, hơn 98% lượng token đầu vào (chứa định nghĩa 60+ MCP tools) đều được lấy từ Prompt Cache.
  • Local Proxy CLIProxyAPI :8317 (Ở giữa): Nhận request chuẩn /v1/responses từ Codex, tự động giả lập User-Agent của Antigravity CLI để mở khóa gemini-4-argon-high, giữ nguyên thoughtSignature khi gọi tool nhiều vòng rồi dịch ngược luồng SSE trả về cho Codex.
  • Gemini 4 Argon High (Bên phải): Chạy bằng tài khoản OAuth Google có sẵn với Context Window 1 triệu token và tự động nén lịch sử (Auto-Compact) ở mốc 500k tokens.

Bước 1: Cài đặt CLIProxyAPI và đăng nhập tài khoản Antigravity

Trên macOS, bạn cài thẳng cliproxyapi qua Homebrew cho gọn (hoặc tải binary từ mục Releases của repo router-for-me/CLIProxyAPI):

SHELL
# 1. Cài CLIProxyAPI qua Homebrew
brew install cliproxyapi

# 2. Mở trình duyệt đăng nhập OAuth tài khoản Antigravity
cliproxyapi --antigravity-login

Gõ xong dòng thứ hai thì trình duyệt sẽ bật lên để bạn đăng nhập tài khoản Google có quyền Antigravity. Xác thực xong, công cụ sẽ tự lưu một file token dạng ~/.cli-proxy-api/antigravity-<email-cua-ban>.json.

Bước 2: Tạo file cấu hình và cho CLIProxyAPI chạy ngầm tự động

Có token rồi thì mình tạo file ~/.cli-proxy-api/config.yaml để quy định cổng chạy local là 8317, trỏ vào thư mục chứa token vừa lấy và tự đặt một cái API key nội bộ (mình để là sk-local-ultra-key).

Lưu ý ở lệnh dưới mình dùng cat << END_CFG (không có dấu nháy đơn) để Terminal tự động bung biến $HOME thành đường dẫn tuyệt đối của máy bạn (ví dụ /Users/ten-ban/.cli-proxy-api), giúp dịch vụ chạy ngầm qua launchd không bị lỗi lệch đường dẫn:

SHELL
mkdir -p ~/.cli-proxy-api
cat << END_CFG > ~/.cli-proxy-api/config.yaml
port: 8317
auth-dir: "$HOME/.cli-proxy-api"
api-keys:
  - "sk-local-ultra-key"
END_CFG

Trước khi cho chạy ngầm, bạn bật thử trực tiếp trên Terminal một lần xem nó đã nhận cổng 8317 và đọc được file token OAuth ngon lành chưa:

SHELL
cliproxyapi --config ~/.cli-proxy-api/config.yaml

Thấy báo lắng nghe ở cổng 8317 là ổn. Lúc này bạn bấm Ctrl + C để tắt đi, rồi chép file cấu hình đó vào thư mục của Homebrew và bật brew services cho nó tự chạy ngầm mỗi khi mở máy:

SHELL
cp ~/.cli-proxy-api/config.yaml "$(brew --prefix)/etc/cliproxyapi.conf"
brew services restart cliproxyapi

Bước 3: Nối Gemini 4 Argon (High) vào ứng dụng OpenAI Codex

Tới đây bạn có thể dùng Argon 4.0 theo hai kiểu: chạy thẳng trên giao diện ứng dụng Codex Desktop hoặc gõ lệnh nhanh trên Terminal (Codex CLI).

Cách 1: Cấu hình cho ứng dụng OpenAI Codex Desktop (Đầy đủ MCP Server + Harness)

Ứng dụng Codex Desktop đọc cấu hình ở file ~/.codex/config.toml.

Lưu ý quan trọng để không làm mất cấu hình MCP cũ: Nếu bạn đã dùng Codex trước đó, trong ~/.codex/config.toml thường đã có sẵn các khối [mcp_servers.*], [plugins] và danh sách [projects] đã cấp quyền trusted. Theo chuẩn định dạng TOML, các khóa cấu hình chung (model, model_provider...) bắt buộc phải nằm ở trên cùng của file (trước bất kỳ dấu ngoặc vuông [...] nào).

Bạn hãy chạy đoạn lệnh dưới đây để tạo bản sao lưu .bak an toàn và mở file cấu hình lên:

SHELL
# 1. Tạo bản backup file config.toml hiện tại (nếu có)
mkdir -p ~/.codex
cp ~/.codex/config.toml ~/.codex/config.toml.bak 2>/dev/null || true

# 2. Mở file config.toml bằng TextEdit (hoặc VS Code / nano tùy bạn)
open -e ~/.codex/config.toml

Khi file ~/.codex/config.toml mở ra, bạn chèn khối cấu hình sau lên trên cùng của file (ngay trên các khối [mcp_servers] hoặc [projects] cũ của bạn, tuyệt đối không xóa các khối cũ bên dưới):

TOML
model = "gemini-4-argon-high"
model_provider = "cliproxy"
model_reasoning_effort = "high"

[model_providers.cliproxy]
name = "CLIProxyAPI"
base_url = "http://127.0.0.1:8317/v1"
wire_api = "responses"
http_headers = { "Authorization" = "Bearer sk-local-ultra-key" }

# --- Giữ nguyên các khối [mcp_servers.*] và [projects.*] cũ của bạn ở bên dưới ---

Làm sao để kiểm tra chắc chắn Codex Desktop đã Sync được model?

Lưu file ~/.codex/config.toml xong, bạn mở ứng dụng Codex lên (hoặc bấm ⌘ + N tạo New Thread mới). Codex sẽ gọi ngầm vào http://127.0.0.1:8317/v1/models để đồng bộ danh sách model từ CLIProxyAPI về lưu trong ~/.codex/models_cache.json.

Để kiểm tra tận gốc trên Terminal, bạn gõ thử 3 lệnh này:

SHELL
# 1. Xem dịch vụ cliproxyapi đã ở trạng thái started chưa
brew services list | grep cliproxyapi

# 2. Xem cổng 8317 đã mở khóa đủ 9 model từ tài khoản Antigravity chưa
curl -s http://127.0.0.1:8317/v1/models \
  -H "Authorization: Bearer sk-local-ultra-key" | jq -r '.data[].id'

# 3. Kiểm tra xem Codex Desktop đã đồng bộ (Sync) gemini-4-argon-high vào cache chưa
jq '.models[] | select(.slug=="gemini-4-argon-high") | {slug, display_name, context_window, reasoning_efforts: [.supported_reasoning_levels[].effort]}' ~/.codex/models_cache.json
Màn hình Terminal kiểm tra dịch vụ cliproxyapi, danh sách /v1/models và trạng thái Đã Sync trong ~/.codex/models_cache.json
Hình 1: Chạy thử trên Terminal thật — cliproxyapi đã started, cổng 8317 trả về 9 model và file ~/.codex/models_cache.json của Codex đã đồng bộ xong gemini-4-argon-high cùng 3 mức suy luận low / medium / high.

Khi thấy Terminal trả về đúng JSON có "slug": "gemini-4-argon-high" kèm "context_window": 1048576 như Hình 1, đồng thời góc dưới khung chat của Codex hiện tên Gemini 4 Argon là quá trình Sync đã hoàn tất.

Cách 2: Tạo thêm alias codex-argon để gọi nhanh ngoài Terminal

Nếu bạn đã cấu hình ~/.codex/config.toml ở Cách 1 thì bản thân lệnh codex trên Terminal cũng sẽ tự nhận gemini-4-argon-high. Tuy nhiên, nếu bạn muốn giữ config.toml mặc định cho một model khác và chỉ gọi riêng Argon khi cần trên Terminal, bạn có thể cài gói CLI @openai/codex rồi gắn alias codex-argon vào ~/.zshrc:

SHELL
npm install -g @openai/codex

cat << 'END_ZSH' >> ~/.zshrc

# Chạy nhanh OpenAI Codex CLI bằng Gemini 4 Argon High
alias codex-argon='OPENAI_BASE_URL=http://127.0.0.1:8317/v1 \
  OPENAI_API_KEY=sk-local-ultra-key \
  codex -m gemini-4-argon-high'
END_ZSH

source ~/.zshrc

Bước 4: "Cấy" bộ System Instructions của Sol 6.1 để trị dứt điểm cái nết output lỏ

Lúc mới nối xong, mình phát hiện ra hai lý do cốt lõi khiến model chạy qua custom provider hoặc chạy bên Antigravity hay trả về output lỏ:

  • System Prompt mặc định cho custom provider quá cụt: Khi chạy gpt-6.1-sol chính chủ, Codex nạp bộ base_instructions dài tới 18,448 ký tự quy định rõ cách tự chủ làm việc, cách chạy test và cách viết câu trả lời gọn gàng. Trong khi đó, model đi qua custom provider mặc định chỉ được gắn đúng 1 câu dài 68 ký tự: "You are Codex, a coding agent. You and the user share one workspace.".
  • Tật viết câu dẫn lê thê và khác biệt công cụ sửa file: Bản thân Gemini 4 Argon khi không bị ràng buộc rất hay viết câu dẫn dài dòng trước lúc gọi tool (dễ dẫn tới lỗi lặp chữ trên luồng SSE khi context vượt 300k tokens) và hay bị vấp cú pháp *** Begin Patch nếu cố gọi công cụ apply_patch độc quyền của dòng GPT.

Cách xử lý triệt để của mình là trích xuất bộ chỉ thị chuẩn của gpt-6.1-sol lưu vào ~/.codex/sol61_instructions.md, khóa câu dẫn trung gian ở mức tối đa 1 câu ngắn dưới 18 từ và hướng dẫn Argon sửa file bằng script chuẩn qua exec_command:

SHELL
# Tự động tìm file log phiên chạy OpenAI chính chủ gần nhất để trích xuất chỉ thị (nếu có)
OPENAI_SESSION=$(grep -l '"model_provider":"openai"' ~/.codex/sessions/*/*/*/rollout-*.jsonl 2>/dev/null | tail -n 1)

if [ -n "$OPENAI_SESSION" ]; then
  head -n 1 "$OPENAI_SESSION" | jq -r '.payload.base_instructions.text' > ~/.codex/sol61_instructions.md
  echo "Đã trích xuất $(wc -c < ~/.codex/sol61_instructions.md) bytes vào ~/.codex/sol61_instructions.md"
else
  cat << 'END_SOL' > ~/.codex/sol61_instructions.md
You are Codex, an autonomous coding agent collaborating with the user in a shared workspace.
- Bias towards action: read the code, implement the complete solution, and verify with relevant tests before yielding back.
- Batch independent searches and reads in parallel; prefer rg and rg --files for fast search.
- Keep intermediate commentary before tool calls to at most 1 short sentence under 18 words.
- Keep technical communication clear, concise, and direct without horizontal rules (---) or concluding summary headers.
END_SOL
fi

cat << 'END_NOTE' >> ~/.codex/sol61_instructions.md

# Tooling note for Gemini Argon
When editing files via exec_command, use standard POSIX/Node/Python scripts cleanly instead of raw patch syntax.
END_NOTE

Tiếp theo, bạn lấy đường dẫn tuyệt đối của file sol61_instructions.md trên máy bạn bằng lệnh:

SHELL
echo "$HOME/.codex/sol61_instructions.md"

Sau đó mở lại file ~/.codex/config.toml và cập nhật cụm cấu hình ở đầu file (nhớ thay /Users/<ten-user-cua-ban> bằng đúng đường dẫn vừa in ra ở trên, vì file TOML không tự dịch ký tự ~ hay $HOME):

TOML
model = "gemini-4-argon-high"
model_provider = "cliproxy"
model_reasoning_effort = "high"

model_context_window = 1048576
model_auto_compact_token_limit = 500000
tool_output_token_limit = 30000
project_doc_max_bytes = 65536
model_instructions_file = "/Users/<ten-user-cua-ban>/.codex/sol61_instructions.md"

[model_providers.cliproxy]
name = "CLIProxyAPI"
base_url = "http://127.0.0.1:8317/v1"
wire_api = "responses"
http_headers = { "Authorization" = "Bearer sk-local-ultra-key" }

# --- Giữ nguyên các khối [mcp_servers.*] và [projects.*] cũ của bạn ở bên dưới ---

Nhớ tạo New Thread mới: Codex chỉ đọc model_instructions_file một lần lúc khởi tạo thread. Sửa config.toml xong, bạn nhớ bấm ⌘ + N mở thread mới thì bộ chỉ thị 18.4KB mới chính thức được nạp vào phiên làm việc.

Bước 5: Test thực chiến từ cổng API, dàn MCP cho tới Prompt Cache

1. Test trực tiếp endpoint /v1/responses trên Terminal

SHELL
curl -s http://127.0.0.1:8317/v1/responses   -H "Authorization: Bearer sk-local-ultra-key"   -H "Content-Type: application/json"   -d '{
    "model": "gemini-4-argon-high",
    "input": "Trả lời 1 câu tiếng Việt: Bạn là mô hình AI nào và của hãng nào?"
  }' | jq '{model, status, reply: ([.output[].content[]?.text] | join(""))}'
Màn hình Terminal kiểm tra ~/.codex/config.toml và bắn thử request POST /v1/responses tới gemini-4-argon-high
Hình 2: Kiểm tra lại 18 dòng đầu của ~/.codex/config.toml và bắn thử một request /v1/responses — kết quả trả về "status": "completed" cùng câu trả lời từ chính Gemini của Google.

2. Test gọi 13 MCP tools song song và bật 4 Sub-agent quét project thật

Mình tạo một New Thread trên Codex Desktop và giao luôn một chuỗi việc thực tế: tự kiểm tra 13 nhánh MCP trong 1 lượt, mở In-App Browser qua cua_repl, rồi bật đồng thời 4 luồng Multi-Agent quét hơn 700 file của project discord_gpt_bot ngoài Desktop. Nó tìm ra đúng 5 điểm nghẽn re-render và layout thrashing, tự sửa code cả 5 file, chạy tsc --noEmit pass xanh mượt rồi hỏi quyền require_escalated để commit và push thẳng lên GitHub.

3. Soi trực tiếp file log .jsonl để kiểm chứng Prompt Cache

SHELL
# Lấy file log của phiên chat đang chạy mới nhất
LATEST_SESSION=$(ls -t ~/.codex/sessions/*/*/*/rollout-*.jsonl | head -n 1)

# 1. Xem provider và tổng số ký tự System Instructions đã nạp vào phiên
head -n 1 "$LATEST_SESSION" | jq '{
  model_provider: .payload.model_provider,
  base_instructions_chars: (.payload.base_instructions.text | length)
}'

# 2. Xem chính xác model, mức suy luận (effort) và chế độ Sandbox đang chạy
jq 'select(.type=="turn_context") | {
  model: .payload.model,
  effort: .payload.effort,
  sandbox: .payload.sandbox_policy.type
}' "$LATEST_SESSION" | tail -n 5

# 3. Xem lượng token đầu vào được lấy từ Prompt Cache (cached_input_tokens)
jq 'select(.payload.type=="token_count") | .payload.info.last_token_usage | {
  input_tokens,
  cached_input_tokens,
  output_tokens
}' "$LATEST_SESSION" | tail -n 5
Màn hình Terminal soi file log rollout-*.jsonl xác nhận model_provider cliproxy, base_instructions_chars 22091, gemini-4-argon-high và cached_input_tokens 194754
Hình 3: Soi trực tiếp file log phiên chạy trên Terminal để xác nhận toàn bộ thông số từ chỉ thị hệ thống, model, mức suy luận cho tới Prompt Cache.

Nhìn vào kết quả ở Hình 3 là yên tâm tuyệt đối:

  • "base_instructions_chars": 22091: Bộ chỉ thị sol61_instructions.md (~18.4KB) cộng với phần context của Codex Desktop (~3.6KB) đã nạp đủ 100%.
  • "model": "gemini-4-argon-high", "effort": "high", "sandbox": "workspace-write": Đúng model Argon 4.0 High và giữ nguyên cơ chế bảo vệ Sandbox.
  • "input_tokens": 197667 và "cached_input_tokens": 194754: Hơn 98.5% lượng token đầu vào (bao gồm định nghĩa 60+ MCP tools và lịch sử hội thoại) được lấy thẳng từ Prompt Cache, giúp tốc độ phản hồi cực nhanh và không lo đốt cạn quota.

Vậy là giải quyết trọn vẹn bài toán: dù hết hạn ChatGPT Plus miễn phí và không tốn thêm đồng nào, mình vẫn giữ được nguyên hệ sinh thái làm việc cực xịn của OpenAI Codex Desktop và biến con Gemini 4 Argon (High) thành một trợ lý code sắc bén, gọn gàng thay vì phải chịu đựng cái output lỏ bên app Antigravity gốc.