# Cài Codex CLI và sử dụng FunkyApe CPA

Tài liệu này hướng dẫn cài Codex CLI trên Ubuntu và Windows, cấu hình Codex gửi
request qua `https://api.funkyape.tech/v1`, và kiểm tra end-to-end để chắc chắn
request thực sự đi qua FunkyApe CPA.

> Không đưa API key lên Git, ảnh chụp màn hình, ticket hoặc nhóm chat.
> Thay `YOUR_PERSONAL_CPA_KEY` bằng CPA key cá nhân của bạn.

## Lấy CPA key cá nhân

Đăng nhập `https://quota.funkyape.tech` bằng tài khoản quota của bạn.
Ngay dưới **FAC cá nhân**, chọn **Xem key cá nhân**, nhập lại mật khẩu,
rồi chọn **Sao chép key**. Nếu đang dùng mật khẩu khởi tạo, đổi mật khẩu trước.
Không dùng mật khẩu OpenAI hoặc mật khẩu web chat nếu chúng khác mật khẩu quota.

Key tự ẩn sau 30 giây, khi rời tab/cửa sổ, nhấn Escape hoặc chọn **Ẩn key**.
Clipboard không tự xóa; hãy xóa sau khi cấu hình, kể cả lịch sử clipboard nếu có.
Giới hạn xem key là 5 lần yêu cầu mỗi 15 phút cho mỗi tài khoản.
Nếu tài khoản chưa có key, bị khóa hoặc là tài khoản dịch vụ dùng chung, liên hệ admin.

`YOUR_PERSONAL_CPA_KEY` chỉ là chỗ giữ chỗ, không phải key hợp lệ.
Chỉ dùng key cá nhân qua `https://api.funkyape.tech/v1`; mọi lượt gọi vẫn bị trừ
FAC và chịu giới hạn gateway. Khi nghi ngờ lộ key, liên hệ admin để thu hồi/đổi key.
Không dùng key web chat dùng chung hoặc key quản trị CPA.

## 1. Cài đặt trên Ubuntu

### Cách khuyến nghị: standalone installer

Mở Terminal và chạy:

```bash
sudo apt update
sudo apt install -y curl ca-certificates bubblewrap
curl -fsSL https://chatgpt.com/codex/install.sh | sh
```

Đóng rồi mở lại Terminal nếu lệnh `codex` chưa có trong `PATH`, sau đó kiểm tra:

```bash
codex --version
```

Cập nhật Codex về sau bằng cách chạy lại installer:

```bash
curl -fsSL https://chatgpt.com/codex/install.sh | sh
```

### Cách thay thế: npm

Nếu máy đã có Node.js LTS và npm:

```bash
npm install -g @openai/codex
codex --version
```

## 2. Cài đặt trên Windows

### Cách A — Windows native

Mở **PowerShell** và chạy installer chính thức:

```powershell
irm https://chatgpt.com/codex/install.ps1 | iex
```

Đóng rồi mở lại PowerShell, sau đó kiểm tra:

```powershell
codex --version
```

Nếu dùng npm, cài Node.js LTS trước rồi chạy:

```powershell
npm install -g @openai/codex
codex --version
```

## 3. Đăng nhập tài khoản ChatGPT

Đăng nhập bằng một tài khoản ChatGPT bất kỳ trước khi cấu hình FunkyApe CPA:

```bash
codex login
```

Hoàn tất đăng nhập trong cửa sổ trình duyệt được mở, sau đó kiểm tra trạng thái:

```bash
codex login status
```

Nếu đang thao tác trên VPS hoặc máy không có trình duyệt, có thể dùng đăng nhập
bằng mã thiết bị:

```bash
codex login --device-auth
```

## 4. Thêm FunkyApe CPA vào `config.toml`

Provider phải nằm trong file cấu hình **cấp người dùng**. Không đặt block này ở
`.codex/config.toml` bên trong repository vì Codex không cho project override
`model_provider` và `model_providers`.

Vị trí file:

- Ubuntu/WSL: `~/.codex/config.toml`
- Windows native: `%USERPROFILE%\.codex\config.toml`

### Ubuntu hoặc WSL

```bash
nano ~/.codex/config.toml
```

### Windows native

```powershell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.codex" | Out-Null
notepad "$env:USERPROFILE\.codex\config.toml"
```

Sao lưu `config.toml` trước khi sửa và giữ lại các cấu hình khác đang có.
Cập nhật `model_provider` và `service_tier` ở phần đầu file, trước mọi dòng
`[tên_bảng]`; đặt bảng `[model_providers.funkyape]` ở cuối file. Nếu khóa hoặc
bảng đã tồn tại, sửa nội dung đó thay vì thêm bản trùng. Không dán cả khối mẫu
vào đầu file cũ vì các khóa đứng sau bảng provider có thể bị hiểu sai phạm vi.

Mẫu cấu hình cần có:
Thay `YOUR_PERSONAL_CPA_KEY` bằng CPA key cá nhân của bạn.

```toml
# CLI Proxy API Config
model_provider = "funkyape"
service_tier = "default"

[model_providers.funkyape]
base_url = "https://api.funkyape.tech/v1"
experimental_bearer_token = "YOUR_PERSONAL_CPA_KEY"
name = "FunkyApe CPA"
wire_api = "responses"
requires_openai_auth = true
supports_websockets = true
```

## 5. Xác minh đang dùng đúng FunkyApe CPA

Thực hiện các bước kiểm tra sau.

### Bước 1 — Kiểm tra provider trong Codex

Khởi động một phiên Codex mới sau khi lưu file cấu hình:

```bash
codex
```

Trong Codex nhập:

```text
/status
```

Xác nhận model provider là `funkyape`/`FunkyApe CPA`, model là model bạn đã chọn
trong Codex và được CPA cho phép, ví dụ `gpt-5.6-sol` nếu tài khoản được cấp.
Mẫu trên chỉ chọn provider, không cố định model. Nếu `/status` vẫn hiện
provider `openai`, thường là do chỉnh nhầm file cấu hình cấp project hoặc file
`config.toml` có khóa trùng.

### Bước 2 — Kiểm tra end-to-end qua quota dashboard

Đăng nhập bằng username tài khoản quota của bạn và ghi nhận FAC đã dùng hiện tại:

```text
https://quota.funkyape.tech
```

Sau đó gửi một request nhỏ:

```bash
codex exec "Chỉ trả lời đúng chuỗi: FUNKYAPE_CPA_OK"
```

Tải lại `https://quota.funkyape.tech`, nếu FAC đã dùng của đúng account tăng sau khi request được quyết toán, request Codex CLI đã đi qua FunkyApe CPA. Đây là
kiểm tra end-to-end đáng tin cậy hơn việc chỉ nhìn `config.toml`.

## 6. Xử lý lỗi thường gặp

### `codex: command not found`

- Mở terminal mới.
- Ubuntu/WSL: kiểm tra `~/.local/bin` có trong `PATH`.
- Windows: kiểm tra `%LOCALAPPDATA%\Programs\OpenAI\Codex\bin` có trong `PATH`.
- Nếu cài bằng npm, kiểm tra thư mục global binary của npm có trong `PATH`.

### `401 Unauthorized`

- Kiểm tra đang dùng đúng API key được cấp cho FunkyApe CPA.
- Không thêm dấu cách hoặc dấu nháy vào chính giá trị key.
- Nếu key bị thu hồi hoặc vừa đổi, lấy lại key cá nhân và cập nhật cấu hình.

### Codex yêu cầu đăng nhập ChatGPT

Có thể thử cấu hình sau:

```toml
requires_openai_auth = false
```

Sau đó thoát hoàn toàn Codex và mở phiên mới.

### Model không tồn tại hoặc không được phép

Kiểm tra danh sách model qua `/v1/models` với key cá nhân và chọn model được phép. Không tự thêm
model đã bị ẩn hoặc không được cấp quyền vào `config.toml`.

## Tham khảo chính thức

- [Codex CLI — cài đặt và quickstart](https://learn.chatgpt.com/docs/codex/cli)
- [Codex config.toml reference](https://learn.chatgpt.com/docs/config-file/config-reference)
- [Codex CLI trên Windows/WSL](https://learn.chatgpt.com/docs/windows/wsl)
