콘텐츠로 이동

추론 (infer) — LLM 채팅·비전

infer는 게이트웨이 뒤에서 동작하는 danny22의 로컬 LLM 서비스입니다. OpenAI 호환 인터페이스를 노출하므로, 베이스 URL만 바꾸면 기존 OpenAI 클라이언트·SDK를 그대로 사용할 수 있습니다.

모든 infer 호출은 게이트웨이의 엔드포인트 경로 규칙을 따릅니다 — /v1/infer/ 뒤에 오는 경로가 추론 서비스로 그대로 전달됩니다. 따라서 OpenAI의 /v1/chat/completions는 다음 경로로 노출됩니다:

POST https://api.danny22.com/v1/infer/v1/chat/completions

모든 infer 요청은 인증이 필요합니다(Authorization: Bearer <token>). 서버-대-서버·스크립트 호출에는 ak_ API 키를 권장합니다.

사용 가능한 모델은 모델 목록 엔드포인트로 조회합니다:

Terminal window
curl -s https://api.danny22.com/v1/infer/v1/models \
-H "Authorization: Bearer $DANNY22_API_KEY"

현재 제공 모델:

모델 ID설명
qwen3.6-vlQwen3.6-35B-A3B(MoE, 활성 ~3B) 비전-언어(multimodal) 채팅 모델 — 텍스트 대화와 이미지 입력을 함께 지원합니다.

요청 바디의 "model" 필드에는 위 모델 ID(qwen3.6-vl)를 사용하세요.

OpenAI Chat Completions와 동일한 요청/응답 스키마입니다.

요청 예시

Terminal window
curl -s https://api.danny22.com/v1/infer/v1/chat/completions \
-H "Authorization: Bearer $DANNY22_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.6-vl",
"messages": [
{ "role": "system", "content": "You are a helpful assistant." },
{ "role": "user", "content": "한 문장으로 인사해줘." }
],
"max_tokens": 128
}'

응답 예시

{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "qwen3.6-vl",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": { "role": "assistant", "content": "안녕하세요! 만나서 반갑습니다." }
}
],
"usage": { "prompt_tokens": 15, "completion_tokens": 9, "total_tokens": 24 }
}

temperature·top_p·stop·max_tokens 등 표준 샘플링 파라미터를 지원합니다.

"stream": true를 주면 응답이 Server-Sent Events(SSE)로 토큰 단위 스트리밍됩니다. 각 이벤트의 choices[].delta.content를 이어 붙여 출력을 구성하고, 종료는 data: [DONE] 라인으로 표시됩니다.

Terminal window
curl -N -s https://api.danny22.com/v1/infer/v1/chat/completions \
-H "Authorization: Bearer $DANNY22_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.6-vl",
"messages": [{ "role": "user", "content": "긴 이야기를 들려줘." }],
"stream": true
}'

추론(thinking) 제어 — 속도 vs 깊이

섹션 제목: “추론(thinking) 제어 — 속도 vs 깊이”

qwen3.6-vl은 기본적으로 답변 전에 내부 **추론(chain-of-thought)**을 먼저 생성합니다. 추론은 복잡한 다단계 문제(논리·수학·꼼꼼한 지시 준수)의 정확도를 높이지만, 그만큼 첫 답변 토큰까지 지연이 생깁니다(체감 수 초).

스트리밍("stream": true)에서 추론 토큰은 답변 본문(delta.content)과 분리되어 delta.reasoning_content로 먼저 흐릅니다. 답변만 필요하면 reasoning_content는 무시하고 content만 이어 붙이면 됩니다.

추론 끄기 (즉답 · 채팅/비전에 권장)

섹션 제목: “추론 끄기 (즉답 · 채팅/비전에 권장)”

단순 채팅·캡셔닝·조회처럼 깊은 추론이 불필요하고 응답 속도가 중요하면, 요청에 chat_template_kwargs로 추론을 꺼서 첫 토큰을 즉시 받을 수 있습니다:

{
"model": "qwen3.6-vl",
"messages": [{ "role": "user", "content": "한 문장으로 인사해줘." }],
"stream": true,
"chat_template_kwargs": { "enable_thinking": false }
}
  • enable_thinking: false → 추론 없이 곧바로 답변 생성(첫 토큰 지연이 크게 줄어듦).
  • 생략(기본) → 추론 후 답변(복잡한 작업에 유리).

언제 무엇을: 빠른 대화·비전·간단한 지시 → 끄기. 다단계 논리·수학·엄격한 형식 준수가 중요 → 켠 채로(기본). 추론 분량 자체를 숫자로 조절하는 요청 파라미터는 제공하지 않습니다(추론은 켬/끔 이진).

qwen3.6-vl은 멀티모달 모델이라 메시지에 이미지를 함께 실을 수 있습니다. OpenAI 비전 형식과 동일하게, content를 파트 배열로 구성하고 image_url에 데이터 URI (data:image/...;base64,...) 또는 공개 이미지 URL을 넣습니다.

{
"model": "qwen3.6-vl",
"messages": [
{
"role": "user",
"content": [
{ "type": "text", "text": "이 이미지를 한국어로 설명해줘." },
{ "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } }
]
}
]
}

OpenAI 호환이므로 공식 SDK의 베이스 URLhttps://api.danny22.com/v1/infer/v1로, API 키를 발급받은 ak_ 키로 설정하면 그대로 동작합니다.

from openai import OpenAI
client = OpenAI(
base_url="https://api.danny22.com/v1/infer/v1",
api_key="ak_xxxxxxxx.yyyyyyyyyyyyyyyy", # platform 콘솔에서 발급
)
resp = client.chat.completions.create(
model="qwen3.6-vl",
messages=[{"role": "user", "content": "안녕!"}],
)
print(resp.choices[0].message.content)

SDK는 베이스 URL 뒤에 /chat/completions·/models를 이어 붙입니다. 따라서 베이스 URL을 .../v1/infer/v1까지로 지정해야 최종 경로가 .../v1/infer/v1/chat/completions로 맞습니다.

  • 이 API는 비상업·신뢰소수 목적으로 운영됩니다(개요의 거버넌스 참고) — 종량제 과금이나 공개 가입형 키 판매는 제공하지 않습니다.
  • 요청 빈도가 한도를 초과하면 429 rate_limited가 반환됩니다 — 잠시 후 재시도하세요.
  • 게이트웨이 뒤 추론 서비스에 일시적으로 도달할 수 없으면 502 bad_gateway가 반환됩니다. 자세한 코드는 에러를 참고하세요.