# CheapSub API — 연동 문서

> **이 파일을 AI(ChatGPT, Claude, Cursor 등)에 통째로 붙여 넣고**  
> 「이 문서로 CheapSub API 연동 코드 짜줘」라고 하면 됩니다.  
> HTML 문서: https://cheapsub.im/api/docs  
> 마크다운 원본: https://cheapsub.im/api/docs.md

---

## 목차

1. [30초 요약](#0-30초-요약)
2. [공통 빠른 시작](#1-공통-빠른-시작)
3. [운영체제별 빠른 시작](#2-운영체제별-빠른-시작)
   - [macOS](#21-macos)
   - [Windows](#22-windows)
   - [Linux](#23-linux)
4. [도구별 연동](#3-도구별-연동)
   - [Codex (맥 앱 / CLI)](#31-codex-맥-앱--cli)
   - [Claude Code](#32-claude-code)
   - [Cursor](#33-cursor)
   - [OpenAI SDK](#34-openai-sdk)
   - [Anthropic SDK](#35-anthropic-sdk)
5. [엔드포인트 목록](#4-엔드포인트-목록)
6. [인증](#5-인증)
7. [모델](#6-모델)
8. [Chat Completions](#7-chat-completions)
9. [Responses API (Codex)](#8-responses-api-codex)
10. [Messages API (Claude Code)](#9-messages-api-claude-code)
11. [Image Generations (이미지 생성)](#10-image-generations-이미지-생성)
12. [코드 예제](#11-코드-예제)
13. [과금](#12-과금)
14. [오류 코드](#13-오류-코드)
15. [AI에게 시킬 때](#14-ai에게-시킬-때)
16. [체크리스트 · FAQ](#15-체크리스트--faq)

---

## 0. 30초 요약

| 항목 | 값 |
|------|-----|
| 서비스 | OpenAI / Anthropic 호환 **API 게이트웨이** (칩섭) |
| Base URL (OpenAI · Codex) | `https://api.cheapsub.im/v1` 또는 `https://api.cheapsub.im/api/v1` |
| Base URL (Claude Code · Anthropic SDK) | `https://api.cheapsub.im` 또는 `https://api.cheapsub.im/api` (**끝에 `/v1` 넣지 말 것**) |
| API 키 | `csk_` 로 시작 (OpenAI `sk-` 키 아님) |
| 과금 | 토큰 종량제 · **1 크레딧 = 1원** · 소수 **2자리** |
| 도구 수정 | **base URL + API 키(+모델)** 만 바꾸면 됨 |

Base: `https://api.cheapsub.im`


### 하지 말 것

- `https://api.openai.com` / `https://api.anthropic.com` 그대로 사용
- OpenAI 공식 `sk-` 키 사용
- 문서/`GET /models`에 없는 모델 ID
- ~~`stream: true` 미지원~~ → **stream 지원** (Codex / Claude Code / OpenAI SDK)

---

## 1. 공통 빠른 시작

1. 대시보드에서 발급한 **API 키** (`csk_…`) 준비  
2. 아래 **OS / 도구** 중 쓰는 것만 따라하기  
3. 사용량·잔액은 콘솔 **개요 / 사용량**에서 확인  

### Base URL 한눈에

| 클라이언트 | Base URL 예 | 비고 |
|------------|-------------|------|
| OpenAI SDK / Codex | `https://api.cheapsub.im/v1` | 끝에 **`/v1` 포함** |
| OpenAI SDK (대안) | `https://api.cheapsub.im/api/v1` | 동일 동작 |
| Claude Code / Anthropic SDK | `https://api.cheapsub.im` | **`/v1` 붙이지 말 것** (SDK가 `/v1/messages` 추가) |
| Anthropic SDK (대안) | `https://api.cheapsub.im/api` | rewrite 없이 `/api/v1/messages` 로 감 |

서버는 `/v1/*` → `/api/v1/*` 리라이트를 지원합니다.

---

## 2. 운영체제별 빠른 시작

아래 `https://api.cheapsub.im` 은 예: `https://api.cheapsub.im` 또는 배포 도메인.

---

### 2.1 macOS

#### A) Codex (맥 앱 / CLI) — 추천

1. 터미널에서 키 등록:

```bash
export CHEAPSUB_API_KEY="csk_YOUR_KEY"
# 영구 저장 (zsh)
echo 'export CHEAPSUB_API_KEY="csk_YOUR_KEY"' >> ~/.zshrc
source ~/.zshrc
```

2. `~/.codex/config.toml` 작성/수정:

```toml
model = "gpt-5.6-luna"
model_provider = "cheapsub"

[model_providers.cheapsub]
name = "칩섭"
base_url = "https://api.cheapsub.im/v1"
env_key = "CHEAPSUB_API_KEY"
wire_api = "responses"
requires_openai_auth = false
```

3. 실행:

```bash
codex
```

- `wire_api = "responses"` → `POST /v1/responses`
- `base_url` 에 **`/v1` 포함**

#### B) Claude Code

```bash
export ANTHROPIC_BASE_URL="https://api.cheapsub.im"
export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"
# 또는: export ANTHROPIC_API_KEY="csk_YOUR_KEY"
export ANTHROPIC_MODEL="claude-sonnet-5"

# 영구 저장 예
echo 'export ANTHROPIC_BASE_URL="https://api.cheapsub.im"' >> ~/.zshrc
echo 'export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"' >> ~/.zshrc
echo 'export ANTHROPIC_MODEL="claude-sonnet-5"' >> ~/.zshrc
source ~/.zshrc

claude
```

- Base URL 에 **`/v1` 붙이지 말 것**

#### C) 바로 확인 (curl)

```bash
curl https://api.cheapsub.im/v1/models
curl https://api.cheapsub.im/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPSUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-5.6-luna","messages":[{"role":"user","content":"ping"}],"max_tokens":32}'
```

---

### 2.2 Windows

#### A) PowerShell — 환경 변수 (현재 세션)

```powershell
$env:CHEAPSUB_API_KEY = "csk_YOUR_KEY"
$env:ANTHROPIC_BASE_URL = "https://api.cheapsub.im"
$env:ANTHROPIC_AUTH_TOKEN = "csk_YOUR_KEY"
$env:ANTHROPIC_MODEL = "claude-sonnet-5"
```

#### B) 사용자 환경 변수 (영구) — GUI

1. **설정 → 시스템 → 정보 → 고급 시스템 설정 → 환경 변수**  
2. 사용자 변수에 추가:
   - `CHEAPSUB_API_KEY` = `csk_…`
   - Claude Code용: `ANTHROPIC_BASE_URL`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_MODEL`
3. **새 터미널**을 연 뒤 사용

#### C) 영구 설정 — PowerShell (선택)

```powershell
[System.Environment]::SetEnvironmentVariable("CHEAPSUB_API_KEY", "csk_YOUR_KEY", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_BASE_URL", "https://api.cheapsub.im", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_AUTH_TOKEN", "csk_YOUR_KEY", "User")
[System.Environment]::SetEnvironmentVariable("ANTHROPIC_MODEL", "claude-sonnet-5", "User")
```

#### D) Claude Code (Windows)

```powershell
# Node 설치 후 Claude Code 설치 가정
$env:ANTHROPIC_BASE_URL = "https://api.cheapsub.im"
$env:ANTHROPIC_AUTH_TOKEN = "csk_YOUR_KEY"
$env:ANTHROPIC_MODEL = "claude-sonnet-5"
claude
```

WSL2를 쓰는 경우 **Linux 섹션**과 동일하게 `~/.bashrc` / `~/.zshrc` 에 export 하면 됩니다.

#### E) Codex CLI (Windows / WSL)

- **WSL 권장**: Linux 가이드의 `~/.codex/config.toml` 동일 적용  
- Windows 네이티브 경로는 Codex 설치 버전에 따라 다를 수 있음  
  - 일반적으로 `%USERPROFILE%\.codex\config.toml` 또는 WSL 홈의 `~/.codex/config.toml`

```toml
model = "gpt-5.6-luna"
model_provider = "cheapsub"

[model_providers.cheapsub]
name = "칩섭"
base_url = "https://api.cheapsub.im/v1"
env_key = "CHEAPSUB_API_KEY"
wire_api = "responses"
requires_openai_auth = false
```

#### F) curl (Windows 10+ / PowerShell)

```powershell
curl.exe https://api.cheapsub.im/v1/models
curl.exe https://api.cheapsub.im/v1/chat/completions `
  -H "Authorization: Bearer $env:CHEAPSUB_API_KEY" `
  -H "Content-Type: application/json" `
  -d "{\"model\":\"gpt-5.6-luna\",\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}],\"max_tokens\":32}"
```

---

### 2.3 Linux

#### A) 환경 변수

```bash
export CHEAPSUB_API_KEY="csk_YOUR_KEY"
export ANTHROPIC_BASE_URL="https://api.cheapsub.im"
export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"
export ANTHROPIC_MODEL="claude-sonnet-5"

# bash 영구
cat >> ~/.bashrc <<'EOF'
export CHEAPSUB_API_KEY="csk_YOUR_KEY"
export ANTHROPIC_BASE_URL="https://api.cheapsub.im"
export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"
export ANTHROPIC_MODEL="claude-sonnet-5"
EOF
source ~/.bashrc
```

#### B) Codex CLI

```bash
mkdir -p ~/.codex
cat > ~/.codex/config.toml <<'EOF'
model = "gpt-5.6-luna"
model_provider = "cheapsub"

[model_providers.cheapsub]
name = "칩섭"
base_url = "https://api.cheapsub.im/v1"
env_key = "CHEAPSUB_API_KEY"
wire_api = "responses"
requires_openai_auth = false
EOF

codex
```

#### C) Claude Code

```bash
export ANTHROPIC_BASE_URL="https://api.cheapsub.im"
export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"
export ANTHROPIC_MODEL="claude-sonnet-5"
claude
```

#### D) 연결 확인

```bash
curl -sS "$ANTHROPIC_BASE_URL/v1/models" | head
curl -sS "$ANTHROPIC_BASE_URL/v1/chat/completions" \
  -H "Authorization: Bearer $CHEAPSUB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-5.6-luna","messages":[{"role":"user","content":"ping"}],"max_tokens":32}'
```

---

## 3. 도구별 연동

### 3.1 Codex (맥 앱 / CLI)

| 항목 | 값 |
|------|-----|
| Base URL | `https://api.cheapsub.im/v1` |
| API 키 env | `CHEAPSUB_API_KEY` (config의 `env_key`) |
| wire_api | **`responses`** |
| 호출 경로 | `POST /v1/responses` |
| 추천 모델 | `gpt-5.6-luna`, `gpt-5.6-sol`, `gpt-5.6-terra` |

전체 config 예시는 [macOS](#21-macos) / [Linux](#23-linux) 참고.

---

### 3.2 Claude Code

| 항목 | 값 |
|------|-----|
| Base URL | `https://api.cheapsub.im` (**`/v1` 없음**) |
| 인증 | `ANTHROPIC_AUTH_TOKEN` 또는 `ANTHROPIC_API_KEY` |
| 호출 경로 | `POST /v1/messages` (SDK가 자동 추가) |
| 추천 모델 | `claude-sonnet-5`, `claude-opus-5`, `claude-opus-4-8`, `claude-fable-5` |

```bash
export ANTHROPIC_BASE_URL="https://api.cheapsub.im"
export ANTHROPIC_AUTH_TOKEN="csk_YOUR_KEY"
export ANTHROPIC_MODEL="claude-sonnet-5"
claude
```

헤더는 `x-api-key` 또는 `Authorization: Bearer` 모두 허용.

---

### 3.3 Cursor

Cursor 설정에서 OpenAI 호환 커스텀 엔드포인트를 지원하는 경우:

| 항목 | 값 |
|------|-----|
| Base URL | `https://api.cheapsub.im/v1` 또는 `https://api.cheapsub.im/api/v1` |
| API Key | `csk_…` |
| 모델 | `GET /models` 목록의 ID |

설정 UI 경로는 Cursor 버전에 따라 다릅니다.  
**OpenAI Compatible** / **Override OpenAI Base URL** 류 항목에 위 Base URL을 넣으면 됩니다.

---

### 3.4 OpenAI SDK

```python
from openai import OpenAI
client = OpenAI(api_key="csk_YOUR_KEY", base_url="https://api.cheapsub.im/v1")
r = client.chat.completions.create(
    model="gpt-5.6-luna",
    messages=[{"role": "user", "content": "안녕"}],
    max_tokens=256,
)
print(r.choices[0].message.content)
```

```javascript
import OpenAI from "openai";
const client = new OpenAI({
  apiKey: process.env.CHEAPSUB_API_KEY,
  baseURL: "https://api.cheapsub.im/v1",
});
const r = await client.chat.completions.create({
  model: "gpt-5.6-luna",
  messages: [{ role: "user", content: "안녕" }],
  max_tokens: 256,
});
console.log(r.choices[0].message.content);
```

---

### 3.5 Anthropic SDK

```python
import anthropic
client = anthropic.Anthropic(
    api_key="csk_YOUR_KEY",
    base_url="https://api.cheapsub.im",  # /v1 없음
)
msg = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=256,
    messages=[{"role": "user", "content": "안녕"}],
)
print(msg.content)
```

---

## 4. 엔드포인트 목록

모든 경로는 **`/v1/...`** 또는 **`/api/v1/...`** 둘 다 동일합니다.

| 용도 | Method | Path | 비고 |
|------|--------|------|------|
| 모델 목록 | GET | `/v1/models` | 인증 선택(공개 조회 가능) |
| Chat (일반 SDK) | POST | `/v1/chat/completions` | OpenAI Chat Completions |
| **Codex** | POST | `/v1/responses` | OpenAI Responses API |
| **Claude Code** | POST | `/v1/messages` | Anthropic Messages API |
| **이미지 생성** | POST | `/v1/images/generations` | OpenAI Image Generations API |
| **이미지 프록시/다운로드** | GET | `/v1/images/proxy` | Mixed Content 방지 및 브라우저 다운로드 |

인증 헤더:

```http
Authorization: Bearer csk_YOUR_KEY
```

Claude / Anthropic 계열 추가 허용:

```http
x-api-key: csk_YOUR_KEY
```

---

## 5. 인증

| 상황 | HTTP |
|------|------|
| 키 없음 · 오류 · 폐기 | 401 |
| 잔액 0 이하 | 402 |
| 고객 키 아님(스태프 키 등) | 403 |

- 키는 발급 시 **한 번만** 전체 표시됩니다.
- 키 발급: https://cheapsub.im/api/dashboard · 충전: https://cheapsub.im/api/dashboard/recharge

---

## 6. 모델

실제 판매 여부와 단가는 항상:

```http
GET https://api.cheapsub.im/v1/models
```

를 따르세요. 일반적으로 제공:

| 모델 ID | 벤더 | 대표 용도 |
|---------|------|-----------|
| `gpt-5.6-sol` | OpenAI | Codex / Chat |
| `gpt-5.6-terra` | OpenAI | Codex / Chat |
| `gpt-5.6-luna` | OpenAI | Codex / Chat (가성비) |
| `gpt-image-2` | OpenAI | 이미지 생성 (`/v1/images/generations`) |
| `claude-opus-5` | Anthropic | Claude Code / Messages |
| `claude-opus-4-8` | Anthropic | Claude Code / Messages |
| `claude-sonnet-5` | Anthropic | Claude Code / Messages |
| `claude-fable-5` | Anthropic | Claude Code / Messages |
| `grok-4.5` | xAI | Chat / Reasoning |

응답 필드 예: `pricing.input_krw_per_1m`, `pricing.output_krw_per_1m` (원 / 1M tokens).

---

## 7. Chat Completions

```
POST {OPENAI_BASE}/chat/completions
```

| 필드 | 필수 | 설명 |
|------|------|------|
| model | O | `GET /models` 의 id |
| messages | O | OpenAI chat messages |
| max_tokens | X | 최대 출력 토큰 |
| stream | X | `true` 지원 (SSE). Codex 기본값 |

응답 형식: OpenAI `chat.completion`.

```bash
curl https://api.cheapsub.im/v1/chat/completions \
  -H "Authorization: Bearer csk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-luna",
    "messages": [{"role": "user", "content": "안녕하세요"}],
    "max_tokens": 256
  }'
```

---

## 8. Responses API (Codex)

```
POST https://api.cheapsub.im/v1/responses
```

- Codex `wire_api = "responses"` 가 이 경로를 사용합니다.
- 인증: `Authorization: Bearer csk_…`
- `stream: true` 지원 (Codex 기본)
- 모델: GPT 계열 권장 (`gpt-5.6-*`)

```bash
curl https://api.cheapsub.im/v1/responses \
  -H "Authorization: Bearer csk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-luna",
    "input": "Say hello in one word"
  }'
```

(요청 body 필드는 OpenAI Responses 스펙을 따릅니다. Codex가 자동 생성합니다.)

---

## 9. Messages API (Claude Code)

```
POST https://api.cheapsub.im/v1/messages
```

| 필드 | 필수 | 설명 |
|------|------|------|
| model | O | `claude-sonnet-5` 등 |
| messages | O | Anthropic messages |
| max_tokens | O | 최대 출력 |
| stream | X | `true` 이면 400 |

```bash
curl https://api.cheapsub.im/v1/messages \
  -H "x-api-key: csk_YOUR_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-5",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "안녕"}]
  }'
```

---

## 10. Image Generations (이미지 생성)

```
POST https://api.cheapsub.im/v1/images/generations
```

OpenAI 공식 `POST /v1/images/generations` 규격 호환 이미지 생성 API입니다.  
텍스트 프롬프트를 전달받아 고품질 이미지를 생성하며, 상류 404/시간초과 노드가 감지될 경우 200 OK 노드를 찾을 때까지 최대 3회 자동 재시도하여 안정적인 결과를 보장합니다.

### 요청 파라미터 (Request Body)

| 필드 | 필수 | 타입 | 기본값 | 설명 |
|------|------|------|--------|------|
| `prompt` | **O** | string | - | 생성할 이미지에 대한 상세 텍스트 설명 (최대 32,000자 지원) |
| `model` | X | string | `gpt-image-2` | 사용할 이미지 생성 모델 ID (예: `gpt-image-2`) |
| `n` | X | integer | `1` | 생성할 이미지 개수 (1~10) |
| `size` | X | string | `1024x1024` | 이미지 해상도 규격 (예: `1024x1024`, `1792x1024`, `1024x1792`) |
| `quality` | X | string | `standard` | 이미지 화질 설정 (`standard` 또는 `hd`) |
| `style` | X | string | `vivid` | 화풍 스타일 (`vivid`: 생생한 예술적 느낌, `natural`: 자연스러운 사진 느낌) |
| `response_format` | X | string | `url` | 응답 형식 (`url` 또는 `b64_json`) |
| `user` | X | string | - | 요청 구분을 위한 사용자 식별자 ID |

### 응답 객체 (Response Format)

```json
{
  "created": 1722123456,
  "data": [
    {
      "url": "http://upstream-node.domain/path/image.png",
      "proxy_url": "https://api.cheapsub.im/v1/images/proxy?url=http%3A%2F%2Fupstream-node...",
      "download_url": "https://api.cheapsub.im/v1/images/proxy?url=http%3A%2F%2Fupstream-node...&download=1",
      "revised_prompt": "A cute cybernetic neon cat resting on a high-tech desk..."
    }
  ]
}
```

* `url` : 상류 원본 이미지 URL (외부 IP/HTTP 형태일 수 있음)
* `proxy_url` : 브라우저 Mixed Content 차단 및 SSL 보안 문제를 해결한 HTTPS 중계 프록시 URL
* `download_url` : 접속 즉시 브라우저에서 `cheapsub_image_[timestamp].png` 파일로 다운로드되는 전용 URL
* `revised_prompt` : 모델이 이미지 생성을 위해 보정한 최종 프롬프트 (모델에 따라 포함)

### 이미지 프록시 & 보안 다운로드 (`GET /v1/images/proxy`)

브라우저 내 Mixed Content 차단 및 원클릭 자동 다운로드를 지원하는 프록시 엔드포인트입니다.

* **이미지 프록시 뷰**: `GET https://api.cheapsub.im/v1/images/proxy?url=<ENCODED_URL>`
  * `Content-Type: image/png` (또는 원본 MIME 타입)으로 바이너리 중계
* **파일 즉시 다운로드**: `GET https://api.cheapsub.im/v1/images/proxy?url=<ENCODED_URL>&download=1`
  * `Content-Disposition: attachment; filename="image_1722123456.png"` 헤더 포함하여 강제 파일 저장

---

## 11. 코드 예제

### 11.1 cURL — Chat

```bash
curl https://api.cheapsub.im/v1/chat/completions \
  -H "Authorization: Bearer csk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.6-luna",
    "messages": [{"role": "user", "content": "안녕하세요"}],
    "max_tokens": 256
  }'
```

### 11.2 Python — OpenAI (Chat)

```python
from openai import OpenAI

client = OpenAI(
    api_key="csk_YOUR_KEY",
    base_url="https://api.cheapsub.im/v1",
)
resp = client.chat.completions.create(
    model="gpt-5.6-luna",
    messages=[{"role": "user", "content": "안녕하세요"}],
    max_tokens=256,
)
print(resp.choices[0].message.content)
```

### 10.3 Node.js — OpenAI

```javascript
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "csk_YOUR_KEY",
  baseURL: "https://api.cheapsub.im/v1",
});
const resp = await client.chat.completions.create({
  model: "gpt-5.6-luna",
  messages: [{ role: "user", content: "안녕하세요" }],
  max_tokens: 256,
});
console.log(resp.choices[0].message.content);
```

### 10.4 Python — Anthropic

```python
import anthropic

client = anthropic.Anthropic(
    api_key="csk_YOUR_KEY",
    base_url="https://api.cheapsub.im",
)
msg = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=256,
    messages=[{"role": "user", "content": "안녕"}],
)
print(msg.content)
```

---

## 11. 과금

- 판매가 ≈ 공식 정가의 **약 10%** (종량제)
- **성공 응답만** 과금 (실패 시 0원)
- 금액(원) ≈ round2( 입력단가×inTok/1e6 + 출력단가×outTok/1e6 )  ※ 단가는 이미 KRW/1M 기준일 수 있음  
  내부적으로 USD 단가 × 환율(기본 1500) 사용
- **1 크레딧 = 1원**, 소수 **2자리**
- 프롬프트·응답 **본문은 서버에 저장하지 않음**
- 잔액·사용량은 대시보드에서 확인

---

## 12. 오류 코드

| HTTP | code | 의미 |
|------|------|------|
| 401 | unauthorized / invalid_api_key | 키 없음·오류·폐기 |
| 402 | insufficient_balance | 잔액 부족 |
| 403 | forbidden | 고객 키 아님 |
| 400 | stream_not_supported | (구버전) stream 거부 — 현재는 지원 |
| 400 | invalid_request_error | model/JSON 오류 |
| 404 | model_not_found | 비활성·미등록 모델 |
| 4xx/5xx | upstream_error | 상류 오류 |
| 504 | timeout | 상류 시간 초과 |

OpenAI 스타일 오류:

```json
{ "error": { "message": "...", "type": "...", "code": "..." } }
```

Anthropic 스타일 오류 (`/v1/messages`):

```json
{ "type": "error", "error": { "type": "...", "message": "..." } }
```

---

## 13. AI에게 시킬 때

이 문서 규칙만 따르고 Base URL + `csk_` 키로 연동 코드를 작성하세요.

```
규칙:
- Base URL (OpenAI/Codex): https://api.cheapsub.im/v1
- Base URL (Claude Code): https://api.cheapsub.im  (/v1 없음)
- API 키: csk_... (sk- 금지)
- 모델: GET /v1/models 목록만
- stream: true 사용 가능 (Codex/Claude Code 기본)
- OpenAI/Anthropic 공식 URL 하드코딩 금지
```

---

## 14. 체크리스트 · FAQ

### 체크리스트

- [ ] 키 접두사 `csk_`
- [ ] Codex → base에 `/v1` + `wire_api = "responses"`
- [ ] Claude Code → base에 `/v1` **없음**
- [ ] 모델 ID가 카탈로그에 있음
- [ ] stream 사용 가능 (필요 시)
- [ ] 잔액 > 0

### FAQ

**Q. Codex가 401이 나요**  
→ env 이름과 `env_key` 일치 여부, `export` 후 새 터미널, base_url 끝에 `/v1` 확인.

**Q. Claude Code가 404 / 경로 오류**  
→ `ANTHROPIC_BASE_URL` 에 `/v1` 을 붙였는지 확인. 붙였다면 제거.

**Q. stream 관련 에러**  
→ 칩섭은 stream을 지원합니다. 타임아웃/상류 오류면 모델·잔액·키를 확인하세요.

**Q. `/api/v1` 과 `/v1` 차이는?**  
→ 동일. `/v1/*` 는 서버에서 `/api/v1/*` 로 rewrite.

**Q. 어떤 모델을 Codex에, 어떤 모델을 Claude에?**  
→ Codex/OpenAI 경로: `gpt-5.6-*` · Claude 경로: `claude-*`.

---

*문서 버전: chat + responses + messages · stream 지원 · 정가 약 10%*
```
