Google Gemini 채팅 형식 (Generate Content)¶
📝 소개¶
Google Gemini API는 이미지, 오디오, 코드, 도구 등 다양한 입력을 활용해 콘텐츠를 생성할 수 있습니다. GenerateContentRequest를 전달하면 모델 응답이 생성됩니다. 텍스트 생성, 시각 이해, 오디오 처리, 긴 컨텍스트, 코드 실행, JSON 스키마, 함수 호출 등 다양한 기능을 지원합니다.
🤖 지원 모델¶
현재 지원되는 모델:
| 모델 | 설명 |
|---|---|
| gemini-1.5-pro | Gemini 1.5 Pro 채팅 모델 |
| gemini-1.5-flash | Gemini 1.5 Flash 채팅 모델 |
| gemini-1.5-flash-8b | Gemini 1.5 Flash 8B 채팅 모델 |
| gemini-1.5-pro-latest | Gemini 1.5 Pro 채팅 모델 (최신 버전) |
| gemini-1.5-flash-latest | Gemini 1.5 Flash 채팅 모델 (최신 버전) |
| gemini-2.0-flash | Gemini 2.0 Flash 채팅 모델 |
| gemini-2.0-flash-lite-preview | Gemini 2.0 Flash Lite 채팅 모델 (프리뷰) |
| gemini-2.0-flash-exp | Gemini 2.0 Flash 채팅 모델 (실험 버전) |
| gemini-2.0-pro-exp | Gemini 2.0 Pro 채팅 모델 (실험 버전) |
| gemini-2.0-flash-thinking-exp | Gemini 2.0 Flash Thinking 채팅 모델 (실험 버전) |
| gemini-2.5-flash | Gemini 2.5 Flash 채팅 모델 |
| gemini-2.5-pro | Gemini 2.5 Pro 채팅 모델 |
| gemini-3-pro-preview | Gemini 3 Pro 채팅 모델 (프리뷰) |
| gemini-3-flash-preview | Gemini 3 Flash 채팅 모델 (프리뷰) |
💡 요청 예시¶
기본 텍스트 대화 ✅¶
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[{"text": "Write a story about a magic backpack."}]
}]
}'
이미지 분석 대화 ✅¶
# base64 인코딩된 이미지 데이터를 임시 파일에 저장
TEMP_B64=$(mktemp)
trap 'rm -f "$TEMP_B64"' EXIT
base64 $B64FLAGS $IMG_PATH > "$TEMP_B64"
# JSON 페이로드를 임시 파일에 저장
TEMP_JSON=$(mktemp)
trap 'rm -f "$TEMP_JSON"' EXIT
cat > "$TEMP_JSON" << EOF
{
"contents": [{
"parts":[
{"text": "Tell me about this instrument"},
{
"inline_data": {
"mime_type":"image/jpeg",
"data": "$(cat "$TEMP_B64")"
}
}
]
}]
}
EOF
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d "@$TEMP_JSON"
함수 호출 ✅¶
cat > tools.json << EOF
{
"function_declarations": [
{
"name": "enable_lights",
"description": "Turn on the lighting system."
},
{
"name": "set_light_color",
"description": "Set the light color. Lights must be enabled for this to work.",
"parameters": {
"type": "object",
"properties": {
"rgb_hex": {
"type": "string",
"description": "The light color as a 6-digit hex string, e.g. ff0000 for red."
}
},
"required": [
"rgb_hex"
]
}
},
{
"name": "stop_lights",
"description": "Turn off the lighting system."
}
]
}
EOF
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-d @<(echo '
{
"system_instruction": {
"parts": {
"text": "You are a helpful lighting system bot. You can turn lights on and off, and you can set the color. Do not perform any other tasks."
}
},
"tools": ['$(cat tools.json)'],
"tool_config": {
"function_calling_config": {"mode": "auto"}
},
"contents": {
"role": "user",
"parts": {
"text": "Turn on the lights please."
}
}
}
')
JSON 스키마 응답 ✅¶
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"contents": [{
"parts":[
{"text": "List 5 popular cookie recipes"}
]
}],
"generationConfig": {
"response_mime_type": "application/json",
"response_schema": {
"type": "ARRAY",
"items": {
"type": "OBJECT",
"properties": {
"recipe_name": {"type":"STRING"},
}
}
}
}
}'
오디오 처리 🟡¶
파일 업로드 제한
inline_data를 통한 base64 오디오 업로드만 지원하며, file_data.file_uri 또는 File API는 지원하지 않습니다.
# File API 업로드는 지원하지 않음
# base64 inline_data를 사용해 API 요청에 오디오 업로드
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
AUDIO_B64=$(base64 $B64FLAGS "$AUDIO_PATH")
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts": [
{"text": "Please describe this audio file."},
{"inline_data": {"mime_type": "audio/mpeg", "data": "'$AUDIO_B64'"}}
]
}]
}'
비디오 처리 🟡¶
파일 업로드 제한
inline_data를 통한 base64 비디오 업로드만 지원하며, file_data.file_uri 또는 File API는 지원하지 않습니다.
# File API 업로드는 지원하지 않음
# base64 inline_data를 사용해 API 요청에 비디오 업로드
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
VIDEO_B64=$(base64 $B64FLAGS "$VIDEO_PATH")
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts": [
{"text": "Transcribe the audio from this video and provide visual descriptions."},
{"inline_data": {"mime_type": "video/mp4", "data": "'$VIDEO_B64'"}}
]
}]
}'
PDF 처리 🟡¶
파일 업로드 제한
inline_data를 통한 base64 PDF 업로드만 지원하며, file_data.file_uri 또는 File API는 지원하지 않습니다.
MIME_TYPE=$(file -b --mime-type "${PDF_PATH}")
# base64 inline_data를 사용해 API 요청에 PDF 업로드
if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
B64FLAGS="--input"
else
B64FLAGS="-w0"
fi
PDF_B64=$(base64 $B64FLAGS "$PDF_PATH")
echo $MIME_TYPE
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts": [
{"text": "Can you add a few more lines to this poem?"},
{"inline_data": {"mime_type": "application/pdf", "data": "'$PDF_B64'"}}
]
}]
}'
채팅 대화 ✅¶
curl https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [
{"role":"user",
"parts":[{
"text": "Hello"}]},
{"role": "model",
"parts":[{
"text": "Great to meet you. What would you like to know?"}]},
{"role":"user",
"parts":[{
"text": "I have two dogs in my house. How many paws are in my house?"}]},
]
}'
스트리밍 응답 ✅¶
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:streamGenerateContent?alt=sse&key=$API_KEY" \
-H 'Content-Type: application/json' \
--no-buffer \
-d '{
"contents": [{
"parts": [{"text": "마법의 배낭에 대한 이야기를 써줘"}]
}]
}'
코드 실행 ✅¶
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts": [{"text": "피보나치 수열의 10번째 항을 계산해줘"}]
}],
"tools": [{
"codeExecution": {}
}]
}'
생성 설정 ✅¶
curl https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY \
-H 'Content-Type: application/json' \
-X POST \
-d '{
"contents": [{
"parts":[
{"text": "Explain how AI works"}
]
}],
"generationConfig": {
"stopSequences": [
"Title"
],
"temperature": 1.0,
"maxOutputTokens": 800,
"topP": 0.8,
"topK": 10
}
}'
안전 설정 ✅¶
echo '{
"safetySettings": [
{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_ONLY_HIGH"},
{"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_MEDIUM_AND_ABOVE"}
],
"contents": [{
"parts":[{
"text": "'I support Martians Soccer Club and I think Jupiterians Football Club sucks! Write a ironic phrase about them.'"}]}]}' > request.json
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-X POST \
-d @request.json
시스템 지침 ✅¶
curl "https://ssanai-workspace.atto-lab.cc/v1beta/models/gemini-3-pro-preview:generateContent?key=$API_KEY" \
-H 'Content-Type: application/json' \
-d '{ "system_instruction": {
"parts":
{ "text": "You are a cat. Your name is Neko."}},
"contents": {
"parts": {
"text": "Hello there"}}}'
📮 요청¶
엔드포인트¶
콘텐츠 생성 (Generate Content)¶
스트림 콘텐츠 생성 (Stream Generate Content)¶
인증 방법¶
요청 URL에 API 키를 포함하세요:
$API_KEY는 발급받은 Google AI API 키입니다.
경로 파라미터¶
model¶
- 유형: string
- 필수: yes
완성을 생성할 대상 모델 이름입니다.
형식: models/{model} (예: models/gemini-3-pro-preview)
요청 본문 파라미터¶
contents¶
- 유형: array
- 필수: yes
모델과의 현재 대화 콘텐츠입니다. 단일 요청에서는 하나의 항목만 전달하며, 채팅형 다중 턴 요청에서는 대화 이력과 최신 요청을 포함한 반복 필드로 전달합니다.
Content 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
parts |
array | yes | 하나의 메시지를 구성하는 순서화된 콘텐츠 파트 |
role |
string | no | 대화에서 콘텐츠를 생성한 주체. user, model, function, tool |
Part 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
text |
string | no | 순수 텍스트 콘텐츠 |
inlineData |
object | no | 인라인 미디어 바이트 데이터 |
fileData |
object | no | 업로드된 파일의 URI 참조 |
functionCall |
object | no | 함수 호출 요청 |
functionResponse |
object | no | 함수 호출 응답 |
executableCode |
object | no | 실행 가능한 코드 |
codeExecutionResult |
object | no | 코드 실행 결과 |
InlineData 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
mimeType |
string | yes | 미디어 MIME 타입 |
data |
string | yes | Base64 인코딩된 미디어 데이터 |
FileData 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
mimeType |
string | yes | 파일 MIME 타입 |
fileUri |
string | yes | 파일 URI |
tools¶
- 유형: array
- 필수: no
모델이 다음 응답을 생성할 때 사용할 수 있는 도구 목록입니다. 함수 호출과 코드 실행 도구를 지원합니다.
Tool 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
functionDeclarations |
array | no | 함수 선언 목록(선택) |
codeExecution |
object | no | 모델 코드 실행 활성화 |
FunctionDeclaration 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
name |
string | yes | 함수 이름 |
description |
string | no | 함수 설명 |
parameters |
object | no | 함수 파라미터(JSON Schema 형식) |
FunctionCall 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
name |
string | yes | 호출할 함수 이름 |
args |
object | no | 함수 인자의 키-값 쌍 |
FunctionResponse 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
name |
string | yes | 호출된 함수 이름 |
response |
object | yes | 함수 호출 응답 데이터 |
ExecutableCode 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
language |
enum | yes | 코드의 프로그래밍 언어 |
code |
string | yes | 실행할 코드 |
CodeExecutionResult 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
outcome |
enum | yes | 코드 실행 결과 상태 |
output |
string | no | 코드 실행 출력 내용 |
CodeExecution 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
| {} | 빈 객체 | - | 코드 실행을 활성화하는 빈 설정 객체 |
toolConfig¶
- 유형: object
- 필수: no
요청에 포함된 도구에 대한 설정입니다.
ToolConfig 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
functionCallingConfig |
object | no | 함수 호출 설정 |
FunctionCallingConfig 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
mode |
enum | no | 함수 호출 모드 지정 |
allowedFunctionNames |
array | no | 호출 허용 함수 이름 목록 |
FunctionCallingMode enum 값:
MODE_UNSPECIFIED: 기본 모드, 함수 호출 여부를 모델이 결정AUTO: 함수 호출 시점을 모델이 자동 결정ANY: 모델이 반드시 함수를 호출NONE: 모델이 함수를 호출하지 않음
safetySettings¶
- 유형: array
- 필수: no
유해 콘텐츠를 필터링하기 위한 SafetySetting 목록입니다.
SafetySetting 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
category |
enum | yes | 안전 카테고리 |
threshold |
enum | yes | 차단 임계값 |
HarmCategory enum 값:
HARM_CATEGORY_HARASSMENT: 괴롭힘 콘텐츠HARM_CATEGORY_HATE_SPEECH: 혐오 발언/콘텐츠HARM_CATEGORY_SEXUALLY_EXPLICIT: 노골적인 성적 콘텐츠HARM_CATEGORY_DANGEROUS_CONTENT: 위험 콘텐츠HARM_CATEGORY_CIVIC_INTEGRITY: 시민적 신뢰를 훼손할 수 있는 콘텐츠
HarmBlockThreshold enum 값:
BLOCK_LOW_AND_ABOVE: NEGLIGIBLE 점수만 허용BLOCK_MEDIUM_AND_ABOVE: NEGLIGIBLE, LOW 점수 허용BLOCK_ONLY_HIGH: NEGLIGIBLE, LOW, MEDIUM 위험 수준 허용BLOCK_NONE: 모든 콘텐츠 허용OFF: 안전 필터 비활성화
전체 HarmBlockThreshold enum 값:
HARM_BLOCK_THRESHOLD_UNSPECIFIED: 임계값 미지정BLOCK_LOW_AND_ABOVE: 중간 이상 확률의 유해 콘텐츠를 차단, NEGLIGIBLE만 허용BLOCK_MEDIUM_AND_ABOVE: 중간 이상 확률의 유해 콘텐츠를 차단, NEGLIGIBLE/LOW 허용BLOCK_ONLY_HIGH: 높은 확률 유해 콘텐츠만 차단, NEGLIGIBLE/LOW/MEDIUM 허용BLOCK_NONE: 콘텐츠 차단 없음OFF: 안전 필터 완전 비활성화
systemInstruction¶
- 유형: object (Content)
- 필수: no
개발자가 지정하는 시스템 지침입니다. 현재 텍스트만 지원합니다.
generationConfig¶
- 유형: object
- 필수: no
모델 생성 및 출력 관련 설정 옵션입니다.
GenerationConfig 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
stopSequences |
array | no | 생성을 중지할 문자열 시퀀스 집합(최대 5개) |
responseMimeType |
string | no | 생성 후보 텍스트의 MIME 타입 |
responseSchema |
object | no | 생성 후보 텍스트의 출력 스키마 |
responseModalities |
array | no | 요청한 응답 모달리티 |
candidateCount |
integer | no | 반환할 생성 답변 수 |
maxOutputTokens |
integer | no | 생성 답변의 최대 토큰 수 |
temperature |
number | no | 출력 무작위성 제어, 범위 [0.0, 2.0] |
topP |
number | no | 샘플링 시 고려할 토큰 누적 확률 상한 |
topK |
integer | no | 샘플링 시 고려할 최대 토큰 수 |
seed |
integer | no | 디코딩에 사용할 시드 |
presencePenalty |
number | no | 존재 페널티 |
frequencyPenalty |
number | no | 빈도 페널티 |
responseLogprobs |
boolean | no | 응답에 logprobs 결과 포함 여부 |
logprobs |
integer | no | 반환할 상위 logprobs 개수 |
enableEnhancedCivicAnswers |
boolean | no | 강화된 공공 정보 답변 기능 활성화 |
speechConfig |
object | no | 음성 생성 설정 |
thinkingConfig |
object | no | 추론 기능 설정 |
mediaResolution |
enum | no | 미디어 해상도 지정 |
지원 MIME 타입:
text/plain: (기본값) 텍스트 출력application/json: JSON 응답text/x.enum: ENUM 문자열 응답
Modality enum 값:
TEXT: 모델이 텍스트를 반환IMAGE: 모델이 이미지를 반환AUDIO: 모델이 오디오를 반환
Schema 객체 속성:
| 속성 | 유형 | 필수 | 설명 |
|---|---|---|---|
type |
enum | yes | 데이터 타입 |
description |
string | no | 필드 설명 |
enum |
array | no | enum 값 목록(type이 string일 때) |
example |
any | no | 예시 값 |
nullable |
boolean | no | null 허용 여부 |
format |
string | no | 문자열 형식(예: date, date-time) |
items |
object | no | 배열 아이템 스키마(type이 array일 때) |
properties |
object | no | 객체 속성 스키마(type이 object일 때) |
required |
array | no | 필수 속성 이름 목록 |
minimum |
number | no | 숫자 최소값 |
maximum |
number | no | 숫자 최대값 |
minItems |
integer | no | 배열 최소 길이 |
maxItems |
integer | no | 배열 최대 길이 |
minLength |
integer | no | 문자열 최소 길이 |
maxLength |
integer | no | 문자열 최대 길이 |
Type enum 값:
TYPE_UNSPECIFIED: 타입 미지정STRING: 문자열 타입NUMBER: 숫자 타입INTEGER: 정수 타입BOOLEAN: 불리언 타입ARRAY: 배열 타입OBJECT: 객체 타입
지원 프로그래밍 언어 (ExecutableCode):
LANGUAGE_UNSPECIFIED: 언어 미지정PYTHON: Python 프로그래밍 언어
코드 실행 결과 enum (Outcome):
OUTCOME_UNSPECIFIED: 결과 미지정OUTCOME_OK: 코드 실행 성공OUTCOME_FAILED: 코드 실행 실패OUTCOME_DEADLINE_EXCEEDED: 코드 실행 시간 초과
cachedContent¶
- 유형: string
- 필수: no
예측 제공 시 컨텍스트로 사용할 캐시 콘텐츠 이름입니다. 형식: cachedContents/{cachedContent}
📥 응답¶
GenerateContentResponse¶
여러 후보 답변을 지원하는 모델의 응답 객체입니다. 시스템은 프롬프트 및 각 후보에 대한 안전 등급과 콘텐츠 필터링 정보를 함께 반환합니다.
candidates¶
- 유형: array
- 설명: 모델이 생성한 후보 답변 목록
Candidate 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
content |
object | 모델이 반환한 생성 콘텐츠 |
finishReason |
enum | 모델이 토큰 생성을 중단한 이유 |
safetyRatings |
array | 후보 답변의 안전 등급 목록 |
citationMetadata |
object | 생성 후보의 참조 정보 |
tokenCount |
integer | 해당 후보의 토큰 수 |
groundingAttributions |
array | 근거 기반 답변 생성에 기여한 출처 정보 |
groundingMetadata |
object | 후보 객체의 참조 메타데이터 |
avgLogprobs |
number | 후보의 평균 로그 확률 점수 |
logprobsResult |
object | 답변 토큰 및 선행 토큰의 로그 확률 점수 |
urlRetrievalMetadata |
object | URL 컨텍스트 조회 도구 관련 메타데이터 |
urlContextMetadata |
object | URL 컨텍스트 조회 도구 관련 메타데이터 |
index |
integer | 응답 후보 목록 내 후보 인덱스 |
FinishReason enum 값:
STOP: 자연스러운 종료 지점 또는 지정된 중지 시퀀스 도달MAX_TOKENS: 요청에서 지정한 최대 토큰 한도 도달SAFETY: 안전 정책으로 후보 답변 콘텐츠가 차단됨RECITATION: 반복/인용 관련 사유로 후보 답변 콘텐츠가 표시됨LANGUAGE: 지원되지 않는 언어 사용으로 후보 답변 콘텐츠가 표시됨OTHER: 기타(알 수 없는 이유)BLOCKLIST: 금지어 포함으로 토큰 생성 중단PROHIBITED_CONTENT: 금지 콘텐츠 가능성으로 토큰 생성 중단SPII: 민감한 개인정보 포함 가능성으로 토큰 생성 중단MALFORMED_FUNCTION_CALL: 모델이 생성한 함수 호출 형식이 잘못됨IMAGE_SAFETY: 생성 이미지가 안전 규칙을 위반하여 중단됨
promptFeedback¶
- 유형: object
- 설명: 콘텐츠 필터링과 관련된 프롬프트 피드백
PromptFeedback 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
blockReason |
enum | 프롬프트 차단 이유 |
safetyRatings |
array | 프롬프트의 안전 등급 |
BlockReason enum 값:
BLOCK_REASON_UNSPECIFIED: 기본값(사용되지 않음)SAFETY: 안전 사유로 시스템이 프롬프트를 차단OTHER: 알 수 없는 이유로 프롬프트 차단BLOCKLIST: 블록리스트 용어 포함으로 프롬프트 차단PROHIBITED_CONTENT: 금지 콘텐츠 포함으로 프롬프트 차단IMAGE_SAFETY: 생성 이미지가 안전하지 않아 후보 이미지 차단
usageMetadata¶
- 유형: object
- 설명: 생성 요청의 토큰 사용량 메타데이터
UsageMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
promptTokenCount |
integer | 프롬프트 토큰 수 |
cachedContentTokenCount |
integer | 프롬프트 캐시 영역 토큰 수 |
candidatesTokenCount |
integer | 생성된 모든 후보 답변의 총 토큰 수 |
totalTokenCount |
integer | 생성 요청의 총 토큰 수 |
toolUsePromptTokenCount |
integer | 도구 사용 프롬프트 토큰 수 |
thoughtsTokenCount |
integer | 추론 모델의 thoughts 토큰 수 |
promptTokensDetails |
array | 요청 입력에서 처리된 모달리티 목록 |
candidatesTokensDetails |
array | 응답에서 반환된 모달리티 목록 |
cacheTokensDetails |
array | 요청 입력의 캐시 콘텐츠 모달리티 목록 |
toolUsePromptTokensDetails |
array | 도구 사용 입력에서 처리된 모달리티 목록 |
modelVersion¶
- 유형: string
- 설명: 응답 생성에 사용된 모델 버전
responseId¶
- 유형: string
- 설명: 각 응답의 ID
전체 응답 예시¶
{
"candidates": [
{
"content": {
"parts": [
{
"text": "안녕하세요! 저는 Gemini입니다. Google에서 개발한 AI 어시스턴트로, 질의응답, 정보 제공, 글쓰기, 코드 작성 등 다양한 작업을 도와드릴 수 있습니다."
}
],
"role": "model"
},
"finishReason": "STOP",
"index": 0,
"safetyRatings": [
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_HARASSMENT",
"probability": "NEGLIGIBLE",
"blocked": false
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"probability": "NEGLIGIBLE",
"blocked": false
}
],
"tokenCount": 47
}
],
"promptFeedback": {
"safetyRatings": [
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"probability": "NEGLIGIBLE"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"probability": "NEGLIGIBLE"
}
]
},
"usageMetadata": {
"promptTokenCount": 4,
"candidatesTokenCount": 47,
"totalTokenCount": 51,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 4
}
],
"candidatesTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 47
}
]
},
"modelVersion": "gemini-3-pro-preview",
"responseId": "response-12345"
}
🔧 고급 기능¶
안전 등급¶
SafetyRating 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
category |
enum | 해당 등급의 카테고리 |
probability |
enum | 해당 콘텐츠의 유해 확률 |
blocked |
boolean | 해당 등급으로 인해 차단되었는지 여부 |
HarmProbability enum 값:
NEGLIGIBLE: 유해 확률이 매우 낮음LOW: 유해 확률이 낮음MEDIUM: 유해 확률이 중간HIGH: 유해 확률이 높음
인용 메타데이터¶
CitationMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
citationSources |
array | 특정 응답의 출처 참조 목록 |
CitationSource 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
startIndex |
integer | 해당 출처가 기여한 응답 구간의 시작 인덱스 |
endIndex |
integer | 해당 출처 기여 구간의 종료 인덱스(exclusive) |
uri |
string | 해당 출처로 귀속된 텍스트 구간의 URI |
license |
string | 출처 조각에 귀속된 GitHub 프로젝트 라이선스 |
코드 실행¶
코드 실행 도구를 활성화하면 모델이 문제 해결을 위해 코드를 생성하고 실행할 수 있습니다.
코드 실행 응답 예시:
{
"candidates": [
{
"content": {
"parts": [
{
"text": "피보나치 수열의 10번째 항을 계산하겠습니다:"
},
{
"executableCode": {
"language": "PYTHON",
"code": "def fibonacci(n):\n if n <= 1:\n return n\n else:\n return fibonacci(n-1) + fibonacci(n-2)\n\nresult = fibonacci(10)\nprint(f'The 10th Fibonacci number is: {result}')"
}
},
{
"codeExecutionResult": {
"outcome": "OK",
"output": "The 10th Fibonacci number is: 55"
}
},
{
"text": "따라서 피보나치 수열의 10번째 항은 55입니다."
}
],
"role": "model"
},
"finishReason": "STOP"
}
]
}
그라운딩¶
GroundingMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
groundingChunks |
array | 지정된 그라운딩 소스에서 조회된 근거 문서 목록 |
groundingSupports |
array | 그라운딩 지원 목록 |
webSearchQueries |
array | 후속 웹 검색에 사용된 쿼리 목록 |
searchEntryPoint |
object | 후속 웹 검색을 위한 Google 검색 진입점 |
retrievalMetadata |
object | 조회 과정 관련 메타데이터 |
GroundingAttribution 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
sourceId |
object | 해당 귀속에 기여한 소스의 식별자 |
content |
object | 해당 귀속에 기여한 소스 콘텐츠 |
AttributionSourceId 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
groundingPassage |
object | 임베딩된 문단의 식별자 |
semanticRetrieverChunk |
object | Semantic Retriever가 추출한 청크 식별자 |
GroundingPassageId 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
passageId |
string | GenerateAnswerRequest의 GroundingPassage.id와 매칭되는 문단 ID |
partIndex |
integer | GroundingPassage.content 내 파트 인덱스 |
SemanticRetrieverChunk 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
source |
string | 요청의 SemanticRetrieverConfig.source와 일치하는 소스 이름 |
chunk |
string | 귀속 텍스트가 포함된 청크 이름 |
SearchEntryPoint 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
renderedContent |
string | 웹페이지 또는 앱 WebView에 임베드 가능한 웹 콘텐츠 코드 조각 |
sdkBlob |
string | 검색어와 URL 튜플 배열을 나타내는 Base64 인코딩 JSON |
Segment 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
partIndex |
integer | 상위 Content 객체 내 Part 객체 인덱스 |
startIndex |
integer | 해당 파트의 시작 바이트 인덱스 |
endIndex |
integer | 해당 청크의 종료 바이트 인덱스 |
text |
string | 응답 내 해당 조각에 해당하는 텍스트 |
RetrievalMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
googleSearchDynamicRetrievalScore |
number | Google 검색 정보가 답변에 기여할 확률 점수, 범위 [0,1] |
GroundingChunk 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
web |
object | 웹에서 가져온 그라운딩 청크 |
Web 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
uri |
string | 청크의 URI 참조 |
title |
string | 데이터 블록 제목 |
GroundingSupport 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
groundingChunkIndices |
array | 저작권 관련 인용 지정에 사용되는 인덱스 목록 |
confidenceScores |
array | 근거 문서 신뢰도 점수, 범위 0-1 |
segment |
object | 해당 지원 요청이 속한 콘텐츠 세그먼트 |
멀티모달 처리¶
Gemini API는 입력과 출력의 다양한 모달리티 처리를 지원합니다:
지원 입력 모달리티:
TEXT: 순수 텍스트IMAGE: 이미지 (JPEG, PNG, WebP, HEIC, HEIF)AUDIO: 오디오 (WAV, MP3, AIFF, AAC, OGG, FLAC)VIDEO: 비디오 (MP4, MPEG, MOV, AVI, FLV, MPG, WEBM, WMV, 3GPP)DOCUMENT: 문서 (PDF)
ModalityTokenCount 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
modality |
enum | 해당 토큰 수와 연결된 모달리티 |
tokenCount |
integer | 토큰 수 |
MediaResolution enum 값:
MEDIA_RESOLUTION_LOW: 저해상도 (64 토큰)MEDIA_RESOLUTION_MEDIUM: 중해상도 (256 토큰)MEDIA_RESOLUTION_HIGH: 고해상도 (스케일링/리프레이밍에 256 토큰 사용)
추론(Thinking) 기능¶
ThinkingConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
includeThoughts |
boolean | 응답에 추론 콘텐츠를 포함할지 여부 |
thinkingBudget |
integer | 모델이 생성할 아이디어 토큰 수 |
음성 생성¶
SpeechConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
voiceConfig |
object | 단일 화자 음성 출력 설정 |
multiSpeakerVoiceConfig |
object | 다중 화자 설정 |
languageCode |
string | 음성 합성 언어 코드 |
VoiceConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
prebuiltVoiceConfig |
object | 사용할 사전 정의 음성 설정 |
PrebuiltVoiceConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
voiceName |
string | 사용할 사전 정의 음성 이름 |
MultiSpeakerVoiceConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
speakerVoiceConfigs |
array | 활성화된 화자 음성 설정 목록 |
SpeakerVoiceConfig 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
speaker |
string | 사용할 화자 이름 |
voiceConfig |
object | 사용할 음성 설정 |
지원 언어 코드:
zh-CN: 중국어 (간체)en-US: 영어 (미국)ja-JP: 일본어ko-KR: 한국어fr-FR: 프랑스어de-DE: 독일어es-ES: 스페인어pt-BR: 포르투갈어 (브라질)hi-IN: 힌디어ar-XA: 아랍어it-IT: 이탈리아어tr-TR: 터키어vi-VN: 베트남어th-TH: 태국어ru-RU: 러시아어pl-PL: 폴란드어nl-NL: 네덜란드어
Logprobs 결과¶
LogprobsResult 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
topCandidates |
array | 로그 확률 내림차순으로 정렬된 후보 배열 |
chosenCandidates |
array | 선택된 후보 배열(반드시 topCandidates에 포함되지 않을 수 있으며 길이는 전체 디코딩 단계 수와 동일) |
TopCandidates 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
candidates |
array | 로그 확률 내림차순으로 정렬된 후보 |
Candidate (Logprobs) 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
token |
string | 후보의 토큰 문자열 값 |
tokenId |
integer | 후보의 토큰 ID 값 |
logProbability |
number | 후보의 로그 확률 |
URL 조회 기능¶
UrlRetrievalMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
urlRetrievalContexts |
array | URL 조회 컨텍스트 목록 |
UrlRetrievalContext 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
retrievedUrl |
string | 도구가 조회한 URL |
UrlContextMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
urlMetadata |
array | URL 컨텍스트 목록 |
UrlMetadata 객체 속성:
| 속성 | 유형 | 설명 |
|---|---|---|
retrievedUrl |
string | 도구가 조회한 URL |
urlRetrievalStatus |
enum | URL 조회 상태 |
UrlRetrievalStatus enum 값:
URL_RETRIEVAL_STATUS_SUCCESS: URL 조회 성공URL_RETRIEVAL_STATUS_ERROR: 오류로 URL 조회 실패
전체 유해성 카테고리¶
HarmCategory enum 값:
HARM_CATEGORY_UNSPECIFIED: 카테고리 미지정HARM_CATEGORY_DEROGATORY: PaLM - 정체성/보호 속성을 겨냥한 부정적·유해한 발언HARM_CATEGORY_TOXICITY: PaLM - 무례하거나 비속한 콘텐츠HARM_CATEGORY_VIOLENCE: PaLM - 개인/집단 대상 폭력 묘사HARM_CATEGORY_SEXUAL: PaLM - 성적 행위 또는 노골적 콘텐츠 언급HARM_CATEGORY_MEDICAL: PaLM - 검증되지 않은 의료 조언 조장HARM_CATEGORY_DANGEROUS: PaLM - 유해 행위를 촉진/권장/조장하는 콘텐츠HARM_CATEGORY_HARASSMENT: Gemini - 괴롭힘 콘텐츠HARM_CATEGORY_HATE_SPEECH: Gemini - 혐오 발언/콘텐츠HARM_CATEGORY_SEXUALLY_EXPLICIT: Gemini - 노골적인 성적 콘텐츠HARM_CATEGORY_DANGEROUS_CONTENT: Gemini - 위험 콘텐츠HARM_CATEGORY_CIVIC_INTEGRITY: Gemini - 시민적 신뢰를 훼손할 수 있는 콘텐츠
HarmProbability enum 값:
HARM_PROBABILITY_UNSPECIFIED: 확률 미지정NEGLIGIBLE: 유해 확률이 매우 낮음LOW: 유해 확률이 낮음MEDIUM: 유해 확률이 중간HIGH: 유해 확률이 높음
Modality enum 값:
MODALITY_UNSPECIFIED: 모달리티 미지정TEXT: 순수 텍스트IMAGE: 이미지VIDEO: 비디오AUDIO: 오디오DOCUMENT: 문서(예: PDF)
MediaResolution enum 값:
MEDIA_RESOLUTION_UNSPECIFIED: 미디어 해상도 미설정MEDIA_RESOLUTION_LOW: 저해상도 설정 (64 토큰)MEDIA_RESOLUTION_MEDIUM: 중해상도 설정 (256 토큰)MEDIA_RESOLUTION_HIGH: 고해상도 설정 (스케일링/리프레이밍에 256 토큰 사용)
UrlRetrievalStatus enum 값:
URL_RETRIEVAL_STATUS_UNSPECIFIED: 기본값(사용되지 않음)URL_RETRIEVAL_STATUS_SUCCESS: URL 조회 성공URL_RETRIEVAL_STATUS_ERROR: 오류로 URL 조회 실패
🔍 오류 처리¶
주요 오류 코드¶
| 오류 코드 | 설명 |
|---|---|
400 |
요청 형식 오류 또는 잘못된 파라미터 |
401 |
API 키가 유효하지 않거나 누락됨 |
403 |
권한 부족 또는 할당량 제한 |
429 |
요청 빈도가 너무 높음 |
500 |
서버 내부 오류 |
상세 오류 코드 설명¶
| 오류 코드 | 상태 | 설명 | 해결 방법 |
|---|---|---|---|
400 |
INVALID_ARGUMENT |
요청 파라미터가 잘못되었거나 형식 오류 | 요청 파라미터 형식과 필수 필드 확인 |
400 |
FAILED_PRECONDITION |
요청 사전 조건 미충족 | API 호출 전제 조건 충족 여부 확인 |
401 |
UNAUTHENTICATED |
API 키가 유효하지 않거나 누락/만료됨 | API 키 유효성과 형식 확인 |
403 |
PERMISSION_DENIED |
권한 부족 또는 할당량 소진 | API 키 권한 확인 또는 할당량 상향 |
404 |
NOT_FOUND |
지정한 모델 또는 리소스가 없음 | 모델 이름 및 리소스 경로 확인 |
413 |
PAYLOAD_TOO_LARGE |
요청 본문이 너무 큼 | 입력 크기 축소 또는 배치 처리 |
429 |
RESOURCE_EXHAUSTED |
요청 빈도 초과 또는 할당량 부족 | 요청 빈도 조절 또는 할당량 초기화 대기 |
500 |
INTERNAL |
서버 내부 오류 | 요청 재시도, 지속 시 지원팀 문의 |
503 |
UNAVAILABLE |
서비스 일시 사용 불가 | 잠시 후 재시도 |
504 |
DEADLINE_EXCEEDED |
요청 시간 초과 | 입력 크기 축소 또는 재시도 |