Gemini 이미지 생성 마이그레이션 가이드
Gemini 이미지 생성 마이그레이션 가이드
이 변경의 영향을 받는 사람은?
/chat/completions 에서 다음 모델을 사용하는 모든 사람:
gemini/gemini-2.0-flash-exp-image-generationvertex_ai/gemini-2.0-flash-exp-image-generation
핵심 변경
v1.77.0부터 LiteLLM은 response.choices[0].message.image 의 단일 이미지 대신 response.choices[0].message.images 에 이미지 목록을 반환합니다.
Gemini 모델은 이제 채팅 컴플리션을 통해 이미지 생성을 지원합니다. 이미지는 base64 data URL과 함께 response.choices[0].message.images 에 반환됩니다.
출처: 문서
본문
Before / After
이전:
from litellm import completion
response = completion(
model="gemini/gemini-2.0-flash-exp-image-generation",
messages=[{"role": "user", "content": "Generate an image of a cat"}],
modalities=["image", "text"],
)
base_64_image_data = response.choices[0].message.content
이후:
from litellm import completion
response = completion(
model="gemini/gemini-2.0-flash-exp-image-generation",
messages=[{"role": "user", "content": "Generate an image of a cat"}],
modalities=["image", "text"],
)
# Image is now available in the response
image_url = response.choices[0].message.images[0]["image_url"]["url"] # "data:image/png;base64,..."
왜 바꾸었나?
새로운 gemini-2.5-flash-image-preview 모델이 같은 응답에서 텍스트와 이미지 응답을 모두 보내기 때문이에요. 이 인터페이스는 개발자가 응답의 이미지 또는 텍스트 구성 요소에 명시적으로 접근하게 해 줍니다. 이전에는 개발자가 모델이 생성한 이미지를 찾기 위해 메시지 콘텐츠를 뒤져야 했어요.
image 에서 images 로 바꾼 이유는 OpenRouter API와의 일관성 때문입니다. 가능한 경우 단순하고 잘 알려진 인터페이스를 사용하고자 하는 것입니다.
사용법
Python SDK 사용
핵심 변경:
# Before
-- base_64_image_data = response.choices[0].message.content
# After
++ image_url = response.choices[0].message.images[0]["image_url"]["url"]
기본 이미지 생성
from litellm import completion
import os
# Set your API key
os.environ["GEMINI_API_KEY"] = "your-api-key"
# Generate an image
response = completion(
model="gemini/gemini-2.0-flash-exp-image-generation",
messages=[{"role": "user", "content": "Generate an image of a cat"}],
modalities=["image", "text"],
)
# Access the generated image
print(response.choices[0].message.content) # Text response (if any)
print(response.choices[0].message.images[0]) # Image data
응답 형식
이미지는 message.images 필드에 반환됩니다:
{
"image_url": {
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
"detail": "auto"
},
"index": 0,
"type": "image_url"
}
LiteLLM Proxy Server 사용
핵심 변경:
# Before
-- "content": "base64-image-data..."
# After
++ "images": [{
++ "image_url": {
++ "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
++ "detail": "auto"
++ },
++ "index": 0,
++ "type": "image_url"
++ }]
구성 설정
- config.yaml 에서 모델 구성:
model_list:
- model_name: gemini-image-gen
litellm_params:
model: gemini/gemini-2.0-flash-exp-image-generation
api_key: os.environ/GEMINI_API_KEY
- model_name: vertex-image-gen
litellm_params:
model: vertex_ai/gemini-2.5-flash-image-preview
vertex_project: your-project-id
vertex_location: us-central1
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY # Your proxy API key
- proxy server 시작:
litellm --config /path/to/config.yaml
# RUNNING on http://0.0.0.0:4000
요청 만들기
OpenAI SDK 사용:
from openai import OpenAI
# Point to your proxy server
client = OpenAI(
api_key="sk-<your-litellm-api-key>", # Your proxy API key
base_url="http://0.0.0.0:4000"
)
response = client.chat.completions.create(
model="gemini-image-gen",
messages=[{"role": "user", "content": "Generate an image of a cat"}],
extra_body={"modalities": ["image", "text"]}
)
# Access the generated image
print(response.choices[0].message.content) # Text response (if any)
print(response.choices[0].message.image) # Image data
curl 사용:
curl -X POST 'http://0.0.0.0:4000/v1/chat/completions' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer ***" \
-d '{
"model": "gemini-image-gen",
"messages": [
{
"role": "user",
"content": "Generate an image of a cat"
}
],
"modalities": ["image", "text"]
}'
proxy의 응답 형식:
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1704089632,
"model": "gemini-image-gen",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Here's an image of a cat for you!",
"images": [{
"url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...",
"detail": "auto"
}]
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 8,
"total_tokens": 18
}
}