Duru AI는 OpenAI SDK / Cursor 등 기존 OpenAI 호환 클라이언트에서
baseURL 과 apiKey 만 교체하면 그대로 사용할 수 있는 OPEN API를 제공합니다.1. 개요
- OpenAI Chat Completions 규격 호환
- OpenAI Responses 규격 호환 (Responses 전용 모델 지원)
- 사용량은 크레딧(원화) 으로 차감됩니다.
2. 기본 정보 (Base URL)
| 환경 | Base URL |
|---|---|
| 운영 | https://api.duruai.com/llm/v1 |
3. 인증
모든 요청은 발급받은 API 키를Authorization: Bearer 헤더에 담아 보냅니다.
- API 키는
duruai_접두어로 시작합니다. - 키는 발급 시점에 한 번만 전체 값이 노출되며, 서버에는 해시만 저장됩니다. 분실 시 재발급이 필요합니다.
- 개인용 키 / 조직(팀) 공유 키를 발급할 수 있습니다.
API 키 관리 엔드포인트 (로그인 세션 필요)
| 메서드 | 경로 | 설명 |
|---|---|---|
| GET | /llm/apis?isOrganization=true | 키 목록 조회 (조직/개인) |
| POST | /llm/apis | 키 발급 (name, description?, isOrganization?) |
| PATCH | /llm/apis/:uuid/status | 키 활성/비활성 (status: 1 또는 0) |
| DELETE | /llm/apis/:uuid | 키 삭제 |
4. 지원 모델
GET /llm/v1/models 로 목록을 조회할 수 있습니다. 실제 텍스트 생성 호출이 가능한 모델은 다음과 같습니다.
| 모델 (model 값) | 제공사 |
|---|---|
gpt-5.4-mini | OpenAI |
gpt-5.4 | OpenAI |
gpt-5.4-pro | OpenAI |
gpt-5.5 | OpenAI |
gemini-3-flash | |
gemini-3.1-flash-lite | |
gemini-3.1-pro | |
gemini-3.5-flash | |
grok-4-20-reasoning | xAI |
grok-4-20-non-reasoning | xAI |
claude-4.5-haiku | Claude |
claude-4.5-sonnet | Claude |
claude-4.6-sonnet | Claude |
claude-4.6-opus | Claude |
claude-4.7-opus | Claude |
claude-4.8-opus | Claude |
claude-4.7-opus / claude-4.8-opus 는
temperature 파라미터가 자동 무시됩니다. gpt-5.4-pro / gpt-5.5 는 temperature 와 top_p 파라미터가 모두 자동 무시됩니다.5. 엔드포인트
5-1. 모델 목록 조회
{ "object": "list", "data": [...] } 형식으로 반환됩니다.
5-2. Chat Completions
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
model | string | Required | 모델 slug |
messages | array | Required | role/content 배열 (system/user/assistant) |
stream | boolean | Optional | true 시 SSE 스트리밍 (기본값: false) |
temperature | number | Optional | 범위 0.0~2.0, 기본값 1.0. claude-4.7-opus / claude-4.8-opus / gpt-5.4-pro / gpt-5.5 호출 시 자동 무시됨 |
top_p | number | Optional | 범위 0.0~1.0, 기본값 1.0. gpt-5.4-pro / gpt-5.5 호출 시 자동 무시됨 |
max_tokens | number | Optional | 최대 출력 토큰 |
5-3. Responses
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
model | string | Required | 모델 slug |
input | string/array | Required | 입력 (문자열 또는 role/content 배열) |
instructions | string | Optional | 시스템 지시문 (system 메시지로 변환) |
stream | boolean | Optional | true 시 Responses SSE 이벤트 스트리밍 (기본값: false) |
temperature | number | Optional | 범위 0.0~2.0, 기본값 1.0 (claude-4.7-opus / claude-4.8-opus / gpt-5.4-pro / gpt-5.5 자동 무시) |
top_p | number | Optional | 범위 0.0~1.0, 기본값 1.0 (gpt-5.4-pro / gpt-5.5 자동 무시) |
max_output_tokens | number | Optional | 최대 출력 토큰 |
6. 사용 예시
cURL
Python
Node.js
스트리밍 (Streaming)
stream: true 로 설정하면 OpenAI와 동일하게 data: ... (Chat) / event: response.* ... (Responses) SSE 청크가 전송되며, 마지막에 data: [DONE] 으로 종료됩니다.
cURL (Chat Completions - 스트리밍)
cURL
Python (OpenAI SDK - 스트리밍)
Python
Node.js (OpenAI SDK - 스트리밍)
Node.js
SSE 응답 데이터 형식
Chat Completions 스트리밍 응답
각 청크는data: {...} 형식으로 전송됩니다.
Responses 스트리밍 응답
event: 이벤트명 + data: {...} 쌍으로 전송됩니다.
Cursor 연동
Cursor의 OpenAI 호환 설정에서 Override Base URL 에https://api.duruai.com/llm/v1, API Key 에 발급받은 duruai_... 키를 입력하면 됩니다.
7. 과금
- 요청 성공 시
입력/출력 토큰 × 모델 단가(USD) × 환율 → 원화로 환산해 크레딧을 차감합니다. - 환율은 한국수출입은행 API 기준 전일 최종 환율을 사용합니다 (매일 자동 갱신, 고정 환율 아님).
- 모델/조직별 할인율이 적용될 수 있습니다.
- 요청 직전 잔액이 1원 미만이면 호출이 차단됩니다. (조직 키는 조직 잔액 기준)
8. 응답 상태 코드
오류 발생 시 HTTP 4xx 상태 코드와 함께, 아래 형식의 JSON이 반환됩니다.status 필드는 HTTP 상태 코드가 아닌 앱 전용 에러 코드입니다.
| status (앱 코드) | HTTP 상태 코드 | 의미 |
|---|---|---|
| 100 | 400 | 요청 값 검증 오류 |
| 110 | 401 | 권한 오류 / 잘못된 API 키 |
| 120 | 404 | 대상 없음 |
| 300 | 400 / 500 | LLM 처리 오류 |
| 400 | 400 | 조직 크레딧 부족 |
| 401 | 400 | 사용자 크레딧 부족 |
