Skip to main content
POST
Gemini OpenAI 형식(Chat)
Google Gemini 네이티브 프로토콜은 Gemini Native를 참조하세요. 일반 다중 모델 Chat Completions는 OpenAI Chat Completions를 참조하세요.
엔드포인트: POST https://api.gravitex.ai/v1/chat/completions

1. 모델 카테고리


2. 엔드포인트 및 인증


3. OpenAI 필드 → Gemini 매핑

messages.content는 멀티모달 배열(OpenAI v2)을 지원합니다:
  • type:"text"parts[].text
  • type:"image_url" / type:"input_audio" / type:"file" → 다운로드/디코딩 후 MIME 허용 목록에 따라 parts[].inlineData로 변환:
    • 이미지: image/pngimage/jpegimage/jpgimage/webpimage/heicimage/heif
    • 오디오: audio/mpegaudio/mp3audio/wav
    • 비디오: video/mp4video/movvideo/mpegvideo/mpgvideo/avivideo/wmvvideo/mpegpsvideo/flv
    • 문서: application/pdftext/plain
  • content 문자열에 포함된 ![alt](data:image/...;base64,...) Markdown 이미지는 image_url과 동일하게 inlineData part로 변환됩니다.

4. 도구 전달

세 가지 특수 이름은 Gemini 네이티브 도구로 매핑되며, 다른 function 항목은 functionDeclarations를 사용합니다.

5. extra_body — Gemini 네이티브 매개변수 전달

extra_body.google.* 이 네임스페이스 아래의 모든 필드는 Gemini 네이티브 API로 전달됩니다.

5.1 두 가지 전달 경로

5.2 thinking_config (snake_case 허용 목록)

extra_body.google을 전달하면 시스템 자동 사고 체인 어댑터가 비활성화되며, 모든 사고 동작은 호출자가 제어합니다.

5.3 깊은 병합 규칙

  • extra_body.google(위 snake_case 키 제외)을 패치로 취급합니다.
  • OpenAI 필드로 구성된 Gemini 요청을 base로 사용합니다.
  • deep merge:
    • 동일 키, 둘 다 map → 재귀 병합;
    • 기타 타입(스칼라, 배열, null) → 패치가 base를 직접 덮어씀;
    • base에만 있는 키는 유지됩니다.
  • 병합된 본문이 업스트림으로 전송됩니다 — 네이티브 Gemini 호출과 동등합니다.
extra_body.google.generationConfig.maxOutputTokens로 OpenAI 필드 max_tokens로 설정한 값을 덮어쓸 수 있고, extra_body.google.safetySettings로 플랫폼 기본 안전 설정을 완전히 교체할 수 있습니다. 향후 추가되는 Gemini 필드도 코드 변경 없이 바로 사용할 수 있습니다.

5.4 전달 예시


6. 응답 형식

6.1 비스트리밍 chat.completion

  • id = 업스트림 responseId(로그 request_id와 일치); 없으면 chatcmpl-*로 폴백.
  • reasoning_content: 사고 텍스트(include_thoughts:true일 때만).
  • executable_code / code_execution_result: 텍스트에 markdown 코드 블록으로 삽입.
  • 이미지가 아닌 미디어(오디오 등)는 markdown [media](data:...) 형식으로 삽입.
  • finish_reason 매핑: STOP→stop, MAX_TOKENS→length, safety/recitation/…→content_filter, functionCalltool_calls.

6.2 스트리밍 chat.completion.chunk

  • 스트리밍에서 delta.content는 문자열입니다(배열 아님).
  • 이미지는 delta.content![image](data:...) markdown으로 삽입됩니다.
  • id는 스트리밍 청크 전체에서 안정적입니다.

7. Usage

response.usage 전체 필드:

7.1 사고 토큰 집계 방식

  • reasoning_tokens는 가시성을 위해 별도 표시됩니다.
  • completion_tokensreasoning_tokens포함합니다(OpenAI 의미론; 과금은 completion_tokens 기준).

7.2 출력 토큰 분류

시스템이 출력에 따라 토큰 유형을 자동 분류합니다:
분류는 모델명이 아닌 출력 기준입니다 — 모델명에 “image”가 있어도 순수 텍스트 응답은 텍스트로 과금됩니다.

7.3 모달리티 대소문자 처리

image / IMAGE 대소문자 변형을 모두 허용합니다.

8. 로깅 및 대조

업스트림 토큰 사용량은 요청별로 로깅됩니다:
  • responseIdresponse.id 및 로그 request_id와 일치합니다.

9. 예시

9.1 사고 모드가 있는 텍스트 채팅

9.2 멀티모달 입력(텍스트 + 이미지 URL)

9.3 Google Search + URL 컨텍스트

9.4 스트리밍 채팅


10. OpenAI 전용 매개변수(Gemini에서 무시됨)

다음 OpenAI 표준 매개변수는 Gemini API에 대응 필드가 없어 전달해도 오류 없이 무시됩니다:

11. FAQ — Thinking / Reasoning

Q1: OpenAI 형식에서 Gemini 사고 길이를 제어할 수 있나요?

예. 세 가지 방법이 있습니다:

방법 1: reasoning_effort(OpenAI 표준 필드, 가장 간단)

OpenAI reasoning_effort를 전달하면 Gemini 사고 설정으로 매핑됩니다:
매핑(자동):

방법 2: 모델명 접미사

예: gemini-3.5-flash-thinking-16384 → 사고 활성화, 예산 16384.

방법 3: extra_body.google.thinking_config(전체 제어)

Gemini 3 시리즈는 thinking_budget 대신 thinking_level을 사용합니다:
우선순위: extra_body.google.thinking_config > reasoning_effort > 접미사. extra_body.google을 전달하면 시스템 자동 사고 체인 어댑터가 비활성화되며, 모든 사고 동작은 호출자가 완전히 제어합니다.

Q2: 사고 출력을 어떻게 읽나요?

include_thoughts: true로 설정하면 사고 과정이 응답의 reasoning_content 필드에 담깁니다:
스트리밍에서는 delta.reasoning_content로 사고 내용이 도착합니다.

Q3: Gemini 2.5 vs 3 사고 차이


12. 알려진 제한 사항


13. 문제 해결