DuanAPI

Hướng dẫn kết nối

Cấu hình Cursor, Antigravity, VS Code, Windsurf, Cline và các công cụ CLI để trỏ về API của bạn.

Bạn cần 3 thông tin:

Cursor

Cursor hỗ trợ endpoint OpenAI-compatible qua cơ chế BYOK.

  1. Mở cài đặt: vào Cursor Settings → Models → cuộn xuống mục API Keys.
    Phím tắt mở nhanh: Ctrl+Shift+0 (Windows/Linux) hoặc Cmd+Shift+0 (macOS).
  2. Dán API key: ở ô OpenAI API Key, dán key sk-duan-... của bạn và bật công tắc Use OpenAI API Key.
  3. Ghi đè Base URL: bật Override OpenAI Base URL và nhập:
    https://thuehay.com/v1
  4. Thêm model: bấm Add model, nhập tên model khớp chính xác với API của bạn (vd: gpt-4o-mini).
    ⚠️ Không đặt tên model bắt đầu bằng claude- nếu bạn chỉ dán key ở ô OpenAI — Cursor sẽ gửi key đó vào ô Anthropic và báo lỗi "Model name is not valid". Hãy dùng tên alias không có tiền tố, ví dụ duan-gpt-4o-mini.
  5. Khởi động lại Cursor, mở chat mới và chọn model vừa thêm trong dropdown.
Lưu ý quan trọng:
  • Khi bật Override OpenAI Base URL, mọi request họ OpenAI-family (kể cả model do Cursor quản lý) đều đi qua endpoint của bạn. Muốn dùng lại model của Cursor thì tắt công tắc này.
  • Tính năng Tab autocomplete vẫn dùng hạ tầng riêng của Cursor, không đi qua API của bạn.
  • Nếu dùng Cursor trong Team/Enterprise có bật Restrict Personal API Keys, bạn cần admin bật quyền OpenAI trong Team Dashboard → Settings → Models.
  • Cursor vẫn thu phí nền tảng (Cursor Token Rate) cho các request dùng key của bạn.

Antigravity (Google)

⚠️ Antigravity Desktop IDE chưa hỗ trợ endpoint tùy chỉnh. Google chưa mở BYOK / custom base URL cho IDE. Các khóa cấu hình cộng đồng như antigravity.openai-compatible.endpoint trong ~/.antigravity/settings.json không có tác dụng — request vẫn đi về Google.

Giải pháp: dùng Antigravity CLI (agy) hoặc Antigravity SDK, cả hai đều cho phép trỏ về endpoint Gemini-compatible của chúng ta.

Phương án 1 — Antigravity CLI (khuyến nghị)

  1. Tạo file cấu hình:
    mkdir -p ~/.gemini/antigravity-cli
    
    cat > ~/.gemini/antigravity-cli/settings.json <<'EOF'
    {
      "modelProvider": "gemini"
    }
    EOF
    Windows: %USERPROFILE%\.gemini\antigravity-cli\settings.json
  2. Xuất biến môi trường:
    export GEMINI_API_KEY="sk-duan-xxxxxxxx"
    export GOOGLE_GEMINI_BASE_URL="https://thuehay.com"
    export GEMINI_API_KEY_AUTH_MECHANISM=bearer
    Đặt base URL là origin trần, KHÔNG có /v1 hay /v1beta — CLI tự thêm /v1beta vào sau. Nếu thêm /v1beta bạn sẽ gặp lỗi 404.
    Biến GEMINI_API_KEY_AUTH_MECHANISM=bearer buộc CLI gửi key dạng Authorization: Bearer thay vì x-goog-api-key (mặc định) — hệ thống hỗ trợ cả hai.
  3. Chạy thử:
    agy --model gemini-2.5-flash --effort low
    Khi dùng model Gemini, nhớ thêm --effort (low / medium / high).

Phương án 2 — Kiểm tra kết nối bằng curl

Luôn kiểm tra bằng curl trước khi cấu hình IDE/CLI — phần lớn lỗi "API problem" chỉ là do sai tên model hoặc sai định dạng request.

curl -X POST "https://thuehay.com/v1beta/models/gemini-2.5-flash:generateContent" \
  -H "Authorization: Bearer sk-duan-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "contents": [
      { "role": "user", "parts": [{ "text": "Reply with exactly: ok" }] }
    ]
  }'

Phương án 3 — Antigravity SDK (Python)

import asyncio
from google.antigravity import Agent, LocalOpenAIAgentConfig

async def main():
    config = LocalOpenAIAgentConfig(
        model="gpt-4o-mini",
        base_url="https://thuehay.com/v1",
        api_key="sk-duan-xxxxxxxx",
    )
    async with Agent(config) as agent:
        response = await agent.chat("Xin chào!")
        async for token in response:
            print(token, end="", flush=True)

asyncio.run(main())
SDK dùng giao thức OpenAI nên dùng /v1 (khác với CLI dùng /v1beta).

VS Code

Dùng extension Continue, Cline, Roo Code hoặc GitHub Copilot Chat (BYO key).

Continue

{
  "models": [
    {
      "title": "DuanAPI GPT-4o Mini",
      "provider": "openai",
      "model": "gpt-4o-mini",
      "apiBase": "https://thuehay.com/v1",
      "apiKey": "sk-duan-xxxxxxxx"
    }
  ]
}

Cline / Roo Code

  1. Mở panel extension (biểu tượng Cline ở thanh bên phải).
  2. Bấm biểu tượng ⚙️ bánh răng (API Provider) → chọn OpenAI Compatible.
  3. Điền:
    • Base URL: https://thuehay.com/v1
    • API Key: sk-duan-xxxxxxxx
    • Model ID: gpt-4o-mini
  4. Lưu và bắt đầu chat.

Cherry Studio / LM Studio / AnythingLLM / LobeChat

Ở mọi app này, chọn provider OpenAI / OpenAI Compatible rồi điền Base URL + API key như trên.

Mẹo: hầu hết extension yêu cầu Base URL kết thúc bằng /v1. Nếu gặp lỗi 404, hãy thử cả hai dạng (có/không /v1) — mỗi app xử lý khác nhau.

Windsurf

  1. Mở Windsurf Settings → tab API Keys (biểu tượng chìa khóa).
  2. Chọn provider OpenAI Compatible hoặc mục Add custom provider.
  3. Điền Base URL https://thuehay.com/v1, API key sk-duan-... và tên model.
  4. Lưu → chọn model trong dropdown chat.
Windsurf có thể dùng header x-api-key thay vì Authorization. Nếu bị lỗi 401, hãy chọn chế độ OpenAI (dùng Bearer) thay vì Custom.

Cline / Roo Code / Continue

Cả ba đều dùng cấu hình OpenAI-compatible giống nhau.

Base URL:   https://thuehay.com/v1API Key:    sk-duan-xxxxxxxx
Model ID:   gpt-4o-mini
  • Chọn provider OpenAI Compatible (không phải "OpenAI" — provider OpenAI gốc sẽ ép base URL).
  • Bật Use custom base URL nếu app có tùy chọn này.
  • Tắt Use custom context window / max tokens nếu app hỏi — để app tự suy ra.

CLI & SDK

Python (OpenAI SDK)

from openai import OpenAI

client = OpenAI(
    api_key="sk-duan-xxxxxxxx",
    base_url="https://thuehay.com/v1",
)

resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Viết haiku về AI"}],
)
print(resp.choices[0].message.content)

Node.js

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "sk-duan-xxxxxxxx",
  baseURL: "https://thuehay.com/v1",
});

const r = await client.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [{ role: "user", content: "Hello" }],
});
console.log(r.choices[0].message.content);

cURL

curl "https://thuehay.com/v1/chat/completions" \
  -H "Authorization: Bearer sk-duan-xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "Xin chào"}]
  }'

Anthropic SDK

from anthropic import Anthropic

client = Anthropic(
    api_key="sk-duan-xxxxxxxx",
    base_url="https://thuehay.com/v1",
)

msg = client.messages.create(
    model="claude-3-5-sonnet",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Xin chào"}],
)
print(msg.content[0].text)

Gemini SDK

from google import genai

client = genai.Client(
    api_key="sk-duan-xxxxxxxx",
    http_options={"base_url": "https://thuehay.com"},
)

resp = client.models.generate_content(
    model="gemini-2.5-flash",
    contents="Xin chào",
)
print(resp.text)
Gemini SDK dùng đường dẫn /v1beta — endpoint này đã được hỗ trợ sẵn, không cần adapter phía bạn.

Xử lý sự cố

401 Unauthorized

Key sai hoặc đã bị thu hồi. Kiểm tra lại key tại /user/api-keys. Nếu dùng Cursor, nhớ bật công tắc Use OpenAI API Key.

402 / insufficient quota

Số dư không đủ. Nạp thêm tại /user/billing hoặc dùng GET /v1/usage để xem số dư hiện tại.

400 model_not_found

Tên model không tồn tại trong bảng giá của hệ thống. Gọi GET /v1/models để lấy đúng danh sách, và dùng đúng y hệt (phân biệt hoa thường, có/không tiền tố vendor).

404 Not Found

Sai đường dẫn base URL. Với OpenAI-compatible, base URL phải kết thúc bằng /v1. Với Antigravity/Gemini CLI, base URL là origin trần (không /v1, không /v1beta).

429 rate limit

Vượt giới hạn request/phút của gói. Xem header X-RateLimit-Reset để biết thời điểm reset, hoặc nâng cấp gói tại /pricing.

Streaming bị treo / không nhận dữ liệu

Đảm bảo request gửi "stream": true. Với SSE, dùng curl -N để xem realtime. Một số proxy cần header X-Accel-Buffering: no — endpoint của chúng ta đã tự set.

Cursor: "Model name is not valid"

Đổi tên model, đảm bảo không bắt đầu bằng claude-. Cursor chọn ô key theo tiền tố tên model — model tên claude-... sẽ dùng key Anthropic mà bạn chưa điền.

Antigravity CLI báo 404

Đặt GOOGLE_GEMINI_BASE_URL là origin trần (vd https://thuehay.com). Không thêm /v1beta — CLI tự thêm. Cũng nhớ tạo file settings.json với {"modelProvider": "gemini"}, nếu không GEMINI_API_KEY sẽ bị bỏ qua.