> ## 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

> 공식 OpenAI 라이브러리로 API 직접 호출

모든 공식 OpenAI 라이브러리가 작동합니다; `base_url`만 변경됩니다. 예제는 `gpt-5.6-sol`을 사용합니다; Astra 패키지는 `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": "You are a helpful assistant."},
        {"role": "user", "content": "Explain closures in 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": "You are a helpful assistant."},
          {"role": "user", "content": "Explain closures in 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: "You are a helpful assistant." },
      { role: "user", content: "Explain closures in JavaScript" },
    ],
  })

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

<Warning>
  `base_url`에는 `/v1`이 포함되어야 하며 `/`로 끝나면 **안 됩니다**. 라이브러리가 자체적으로 `/chat/completions`를 추가합니다.
</Warning>

응답은 OpenAI 스키마를 정확히 따릅니다: `id`는 `chatcmpl-...`이고, `usage`에는 `prompt_tokens`, `completion_tokens` 및 `completion_tokens_details.reasoning_tokens`가 있습니다. 할당량은 정확히 `usage.total_tokens`로 청구됩니다.

## Responses API

Codex와 최신 SDK는 이 프로토콜을 사용합니다. 추론 설정은 `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": "Write a Python function that checks for primes",
      "reasoning": {"effort": "medium"}
    }'
  ```

  ```python Python theme={null}
  resp = client.responses.create(
      model="gpt-5.6-sol",
      input="Write a Python function that checks for primes",
      reasoning={"effort": "medium"},
  )
  print(resp.output_text)
  ```
</CodeGroup>

## 추론 노력

Chat Completions에서는 `reasoning_effort`(`low`, `medium`, `high`)를 사용합니다. 설정하지 않으면 게이트웨이가 `high`를 사용합니다. 간단한 작업은 토큰을 절약하기 위해 `low`를 설정하세요:

```python theme={null}
resp = client.chat.completions.create(
    model="gpt-5.6-sol",
    reasoning_effort="low",
    messages=[{"role": "user", "content": "Translate to French: good morning"}],
)
```

<Warning>
  `reasoning_effort`는 Chat Completions 전용입니다. Responses API에서는 `reasoning: {"effort": ...}`을 사용하세요; `/v1/responses`에 `reasoning_effort`를 보내면 "Unsupported parameter"로 거부됩니다.
</Warning>

## 스트리밍

<CodeGroup>
  ```python Python theme={null}
  stream = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[{"role": "user", "content": "Write a short paragraph about autumn"}],
      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": "Write a short paragraph about autumn"}],
      "stream": true,
      "stream_options": {"include_usage": true}
    }'
  ```
</CodeGroup>

<Tip>
  어려운 질문에서는 모델이 첫 번째 토큰 전에 잠시 생각할 수 있습니다. 연결이 끊어지지 않도록 `stream: true`를 사용하세요. `stream_options.include_usage`는 마지막 청크에 `usage`를 포함시켜 할당량을 직접 확인할 수 있게 합니다.
</Tip>

## 이미지 전송 (비전)

이미지는 `content` 배열에 들어가며, 공개 URL이나 로컬 파일의 base64로 전달합니다.

<CodeGroup>
  ```python Image URL theme={null}
  resp = client.chat.completions.create(
      model="gpt-5.6-sol",
      messages=[{
          "role": "user",
          "content": [
              {"type": "text", "text": "What error does this show?"},
              {"type": "image_url", "image_url": {"url": "https://example.com/screenshot.png"}},
          ],
      }],
  )
  print(resp.choices[0].message.content)
  ```

  ```python Local file (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": "What error does this show?"},
              {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
          ],
      }],
  )
  print(resp.choices[0].message.content)
  ```
</CodeGroup>

<Warning>
  이미지는 크기에 따라 토큰을 소모합니다. 전체 4K 스크린샷을 보내는 대신 관련 부분만 잘라서 보내세요.
</Warning>

## API를 통한 모델 및 할당량

```bash theme={null}
# 이 키가 호출 가능한 모델
curl https://gpt.teamsoclo.site/v1/models -H "Authorization: Bearer sk-xxx"

# 할당량 (레거시 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`은 `hard_limit_usd`에 합계를 반환합니다; `usage`는 `total_usage`에 사용량을 **센트** 단위로 반환합니다(비교 전에 100으로 나누세요). [확인 페이지](https://gpt.teamsoclo.site/check)가 이를 자동으로 처리합니다.


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