> ## Documentation Index
> Fetch the complete documentation index at: https://docs.teamsoclo.site/llms.txt
> Use this file to discover all available pages before exploring further.

# cURL / Python / Node.js

> Gọi API trực tiếp bằng thư viện OpenAI chính thức

Mọi thư viện OpenAI chính thức đều dùng được, chỉ cần đổi `base_url`. Ví dụ dưới dùng `gpt-5.6-sol`; gói Astra thay bằng `gpt-astra`.

## Chat Completions

<CodeGroup>
  ```bash cURL theme={null}
  curl https://gpt.teamsoclo.site/v1/chat/completions \
    -H "Authorization: Bearer sk-xxx" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "gpt-5.6-sol",
      "messages": [
        {"role": "system", "content": "Bạn là trợ lý tiếng Việt."},
        {"role": "user", "content": "Giải thích closure trong JavaScript"}
      ]
    }'
  ```

  ```python Python theme={null}
  from openai import OpenAI

  client = OpenAI(
      api_key="sk-xxx",
      base_url="https://gpt.teamsoclo.site/v1",
  )

  resp = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[
          {"role": "system", "content": "Bạn là trợ lý tiếng Việt."},
          {"role": "user", "content": "Giải thích closure trong JavaScript"},
      ],
  )

  print(resp.choices[0].message.content)
  print(resp.usage)
  ```

  ```javascript Node.js theme={null}
  import OpenAI from "openai"

  const client = new OpenAI({
    apiKey: "sk-xxx",
    baseURL: "https://gpt.teamsoclo.site/v1",
  })

  const resp = await client.chat.completions.create({
    model: "gpt-5.6-sol",
    messages: [
      { role: "system", content: "Bạn là trợ lý tiếng Việt." },
      { role: "user", content: "Giải thích closure trong JavaScript" },
    ],
  })

  console.log(resp.choices[0].message.content)
  console.log(resp.usage)
  ```
</CodeGroup>

<Warning>
  `base_url` phải có `/v1` và **không** có dấu `/` ở cuối. Thư viện tự nối `/chat/completions` vào sau.
</Warning>

Phản hồi đúng chuẩn OpenAI: `id` dạng `chatcmpl-...`, `usage` có `prompt_tokens`, `completion_tokens`, `completion_tokens_details.reasoning_tokens`. Hạn mức trừ đúng bằng `usage.total_tokens`.

## Responses API

Codex và các SDK mới dùng giao thức này. Tham số suy luận nằm trong `reasoning.effort`.

<CodeGroup>
  ```bash cURL theme={null}
  curl https://gpt.teamsoclo.site/v1/responses \
    -H "Authorization: Bearer sk-xxx" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "gpt-5.6-sol",
      "input": "Viết hàm Python kiểm tra số nguyên tố",
      "reasoning": {"effort": "medium"}
    }'
  ```

  ```python Python theme={null}
  resp = client.responses.create(
      model="gpt-5.6-sol",
      input="Viết hàm Python kiểm tra số nguyên tố",
      reasoning={"effort": "medium"},
  )
  print(resp.output_text)
  ```
</CodeGroup>

## Chỉnh mức suy luận

Với Chat Completions dùng `reasoning_effort` (`low`, `medium`, `high`). Không chỉ định thì gateway dùng `high`. Việc đơn giản đặt `low` để tiết kiệm token:

```python theme={null}
resp = client.chat.completions.create(
    model="gpt-5.6-sol",
    reasoning_effort="low",
    messages=[{"role": "user", "content": "Dịch sang tiếng Anh: Xin chào"}],
)
```

<Warning>
  `reasoning_effort` chỉ dùng với Chat Completions. Với Responses API dùng `reasoning: {"effort": ...}`, gửi `reasoning_effort` vào `/v1/responses` sẽ bị từ chối "Unsupported parameter".
</Warning>

## Streaming

<CodeGroup>
  ```python Python theme={null}
  stream = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[{"role": "user", "content": "Viết một đoạn văn ngắn về mùa thu"}],
      stream=True,
      stream_options={"include_usage": True},
  )

  for chunk in stream:
      if chunk.choices and chunk.choices[0].delta.content:
          print(chunk.choices[0].delta.content, end="", flush=True)
      if chunk.usage:
          print("\n", chunk.usage)
  ```

  ```bash cURL theme={null}
  curl https://gpt.teamsoclo.site/v1/chat/completions \
    -H "Authorization: Bearer sk-xxx" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "gpt-5.6-sol",
      "messages": [{"role": "user", "content": "Viết một đoạn văn ngắn về mùa thu"}],
      "stream": true,
      "stream_options": {"include_usage": true}
    }'
  ```
</CodeGroup>

<Tip>
  Với câu hỏi khó, model có thể suy nghĩ khá lâu trước khi trả chữ đầu tiên. Bật `stream: true` để không bị ngắt kết nối giữa chừng. `stream_options.include_usage` cho chunk cuối chứa `usage` để bạn tự đối chiếu hạn mức.
</Tip>

## Gửi ảnh (vision)

Ảnh nằm trong mảng `content`. Dùng URL công khai hoặc nhúng base64 cho ảnh trong máy.

<CodeGroup>
  ```python Ảnh từ URL theme={null}
  resp = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[{
          "role": "user",
          "content": [
              {"type": "text", "text": "Ảnh này báo lỗi gì?"},
              {"type": "image_url", "image_url": {"url": "https://example.com/screenshot.png"}},
          ],
      }],
  )
  print(resp.choices[0].message.content)
  ```

  ```python Ảnh trong máy (base64) theme={null}
  import base64

  with open("screenshot.png", "rb") as f:
      b64 = base64.b64encode(f.read()).decode()

  resp = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[{
          "role": "user",
          "content": [
              {"type": "text", "text": "Ảnh này báo lỗi gì?"},
              {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
          ],
      }],
  )
  print(resp.choices[0].message.content)
  ```
</CodeGroup>

<Warning>
  Ảnh tốn token theo kích thước. Cắt lấy phần cần hỏi thay vì gửi nguyên màn hình 4K.
</Warning>

## Danh sách model và hạn mức bằng API

```bash theme={null}
# Model key được phép gọi
curl https://gpt.teamsoclo.site/v1/models -H "Authorization: Bearer sk-xxx"

# Hạn mức (chuẩn cũ của OpenAI)
curl https://gpt.teamsoclo.site/v1/dashboard/billing/subscription -H "Authorization: Bearer sk-xxx"
curl https://gpt.teamsoclo.site/v1/dashboard/billing/usage -H "Authorization: Bearer sk-xxx"
```

`subscription` trả tổng hạn mức trong `hard_limit_usd`, `usage` trả phần đã dùng trong `total_usage` tính bằng **cent** (chia 100 trước khi so). Không muốn tự tính thì dùng [trang kiểm tra key](https://gpt.teamsoclo.site/check).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.