LiteLLM으로 Gemini 연결하기: 프록시 구성과 관리자 화면 설정
from litellm import completion
response = completion(
model="gemini/gemini-2.0-flash",
messages=[{"role": "user", "content": "안녕하세요"}],
)
print(response.choices[0].message.content)Gemini를 부르는 코드는 이게 전부입니다. 이 글이 다루는 것은 이 코드를 웹서비스에 올린 다음입니다. 서버가 한 대이고 호출하는 앱도 하나라면 이대로 써도 됩니다. 앱이 둘이 되거나 누가 얼마를 썼는지 화면으로 보고 싶어지면, 같은 LiteLLM을 프록시로 세워야 합니다. SDK와 프록시가 어떻게 갈라졌는지는 LiteLLM의 역사 글에 정리해 두었고, 여기서는 Gemini 하나를 기준으로 키 발급부터 관리자 화면까지 따라갑니다.
호출 한 번으로 끝나는 Gemini 연동, 키 발급부터
LiteLLM은 모델 이름 앞에 제공사 경로를 붙여 요청을 보낼 곳을 정합니다. Gemini는 gemini/이고, 인증은 GEMINI_API_KEY 환경변수 하나입니다. 키는 Google AI Studio에서 발급받고, 코드에 적지 말고 환경변수로 넘깁니다.
pip install litellm
export GEMINI_API_KEY="발급받은 키"응답은 어느 제공사를 쓰든 OpenAI 응답 형식이라 response.choices[0].message.content로 꺼냅니다. 모델 이름은 자주 바뀝니다. 위 예의 gemini-2.0-flash는 LiteLLM 문서의 표기를 따른 것이고, 실제로 쓸 이름은 Google AI Studio의 모델 목록에서 확인하는 편이 안전합니다.
앱마다 Gemini 키를 들고 있을 때 생기는 문제
웹서비스 백엔드, 관리자 도구, 배치 스크립트가 각자 GEMINI_API_KEY를 들고 있다고 해 봅시다. 키가 새면 어느 쪽에서 샜는지 알 수 없고, 한 곳만 막으려 해도 키를 통째로 폐기해야 합니다. 누가 얼마를 썼는지 보려면 앱마다 직접 기록하는 코드를 넣어야 합니다.
프록시는 이 키를 한곳에 모읍니다. Gemini 키는 프록시만 갖고, 앱에는 프록시가 발급한 가상 키(virtual key)를 줍니다. 앱 하나가 문제를 일으키면 그 앱의 가상 키만 끄면 됩니다.
프록시 설정 파일 하나에 모델 별칭 정하기
프록시는 config.yaml에 모델 목록을 적어 둡니다.
model_list:
- model_name: gemini-flash
litellm_params:
model: gemini/gemini-2.0-flash
api_key: os.environ/GEMINI_API_KEYmodel_name은 앱이 부르는 이름이고, litellm_params.model이 실제로 호출되는 모델입니다. 앱은 gemini-flash만 알면 되므로 나중에 Gemini 버전을 올려도 앱 코드는 그대로 둘 수 있습니다. os.environ/GEMINI_API_KEY는 설정 파일에 키를 적지 않고 환경변수에서 읽겠다는 표기입니다.
관리자 화면까지 띄우는 Docker Compose 구성
가상 키와 관리자 화면에는 Postgres가 필요합니다. LiteLLM 문서는 키 관리, 관리자 화면(/ui), 비용 추적에 Postgres(DATABASE_URL)와 LITELLM_MASTER_KEY가 필요하다고 적고 있습니다. 데이터베이스를 따로 설치하지 않아도 되도록, 공식 퀵스타트는 프록시와 Postgres를 함께 올리는 Compose 파일을 제공합니다.
curl -sSLO https://github.com/BerriAI/litellm/raw/main/docker/docker-compose.quickstart.yml
docker compose -f docker-compose.quickstart.yml up -d실행 전에 마스터 키를 정해 두어야 합니다. 문서 기준으로 마스터 키가 없으면 프록시가 시작하지 않습니다. 마스터 키는 sk-로 시작해야 하고, 다른 키를 만드는 관리자 권한을 가집니다. 퀵스타트는 솔트 키(LITELLM_SALT_KEY)도 함께 정하도록 안내하는데, 이 키는 관리자 화면에서 입력한 제공사 키를 암호화하는 데 쓰입니다. 올라오면 http://localhost:4000/ui에서 관리자 화면이 열립니다.
가상 키를 발급해 웹서비스에 연결하는 순서
관리자 화면에서는 모델 추가, 키 발급, 지출 확인을 모두 브라우저로 합니다. 위 config.yaml에 적은 모델 내용은 관리자 화면의 모델 추가 메뉴에서 같은 값으로 입력할 수도 있습니다. 로그인 방법은 버전에 따라 안내가 달라질 수 있으니 퀵스타트 문서를 따라 주세요.
모델을 넣었으면 Virtual Keys 메뉴에서 + Create New Key를 눌러 키 이름을 정하고 만듭니다. 저는 앱 하나에 키 하나를 주는 쪽을 권합니다. 이름을 앱 이름으로 붙이면 지출 화면에서 어느 앱이 쓴 돈인지 바로 보이고, 문제가 생긴 앱의 키만 끌 수 있습니다. 키를 만들 때 쓸 수 있는 모델을 제한하거나 예산을 걸 수도 있어서, 관리자 도구용 키에는 Gemini 호출만 허용하는 식으로 범위를 좁힐 수 있습니다.
웹서비스 쪽 코드는 OpenAI 클라이언트의 주소만 프록시로 바꾸면 됩니다.
import openai
client = openai.OpenAI(
api_key="sk-발급받은-가상-키",
base_url="http://localhost:4000",
)
response = client.chat.completions.create(
model="gemini-flash",
messages=[{"role": "user", "content": "안녕하세요"}],
)
print(response.choices[0].message.content)백엔드가 Node.js라면 openai 패키지에서 baseURL만 같은 주소로 지정하면 됩니다. 앱은 이제 Gemini 키를 모르고, model에는 프록시에서 정한 별칭을 적습니다.
서버에서만 쓰는 키와 브라우저에 내려가는 응답의 구분
저라면 가상 키를 브라우저에 내려보내지 않겠습니다. 가상 키도 호출 권한을 가진 키라서, 화면 코드에 넣으면 누구든 꺼내 쓸 수 있습니다. 브라우저는 우리 백엔드 경로만 부르고, 그 백엔드가 가상 키로 프록시를 부르는 구조가 안전합니다. 관리자 화면(/ui)도 바깥에 열어 둘 이유가 없다면 내부 주소로만 접근하게 두는 편이 낫다고 봅니다.
문서로 확인한 부분과 직접 확인해야 할 부분
이 글의 명령과 설정은 LiteLLM 공식 문서를 기준으로 썼습니다. 버전에 따라 달라질 수 있는 것은 Gemini 모델 이름, 관리자 화면의 메뉴 이름과 로그인 방식, Compose 파일이 요구하는 환경변수입니다. 시작하기 전에 퀵스타트 문서와 한 번 대조해 보세요.
Redis는 이 구성에 필요하지 않습니다. 프록시를 여러 대로 늘리면 달라집니다. 문서는 키, 팀, 사용자별 속도 제한(TPM, RPM)을 Redis로 집행한다고 안내합니다.
참고: Gemini 연동 문서, 프록시 퀵스타트, 가상 키 문서, 멀티 리전 배포 문서
우리 서비스에 적용할 계획이 있으신가요?
AI 챗봇·업무 자동화 살펴보기 →함께 읽기
- LiteLLM의 역사: Python SDK에서 AI Gateway까지LiteLLM을 단순한 멀티 모델 호출 라이브러리로만 이해하면 현재 모습의 절반만 보게 됩니다. 출발점은 Python 애플리케이션 안에서 여러 AI 모델 제공자를 같은 방식으로 호출하는 일이었지만, 지금은 조직의 모델 접근을 한곳에서 통제하는 AI Gateway까지 범위가 넓어졌습니다. 이 변화는 이름만 커진 것이 아니…
- 테스트용 LLM API 비용 비교: 로컬 모델에서 Gemini·Groq·Claude까지LLM 기능을 개발하면서 테스트는 몇 달째 로컬 모델로만 돌리고 있습니다. 대화, 툴을 부르는 에이전트, 문서에서 필드를 뽑는 구조화 추출, 이미지 인식, 요약까지 전부 자체 추론 서버 한 대에서 확인했습니다. 호출 비용이 0원이라 마음 놓고 몇백 번씩 돌릴 수 있다는 점이 가장 컸습니다. 그런데 기능이 늘수록 로컬 모…
- YouTube Data API OAuth 인증 설정: 로컬 자동 업로더 연결하기YouTube 영상을 코드로 업로드하려면 API 키만으로는 부족합니다. 영상 업로드, 썸네일 지정, 자막 등록처럼 채널 데이터를 바꾸는 작업은 채널 소유자의 동의를 받은 OAuth 2.0 인증이 필요합니다.
- LLM 게이트웨이 직접 구현: 스트리밍부터 사용량 기록까지이 글에서 직접 구현할 LLM 서버는 모델 가중치를 GPU에 올리는 추론 서버가 아닙니다. 여러 외부 또는 내부 모델 엔드포인트 앞에서 인증, 모델 선택, 스트리밍, 장애 처리, 사용량 기록을 담당하는 애플리케이션 계층의 LLM Gateway입니다. 모델 추론 자체는 vLLM 같은 별도 엔진이나 상용 API가 담당한다고…
- macOS 클립보드 관리자, Swift·Tauri·Electron 중 무엇으로 만들까?클립보드 관리자를 만들겠다고 하면 첫 질문은 대개 "UI를 뭘로 짤까"입니다. React가 익숙하면 Electron이나 Tauri, 네이티브가 좋으면 SwiftUI를 떠올립니다. 그런데 이 앱의 화면은 검색창 하나와 목록 하나가 거의 전부입니다. 나머지는 운영체제와 주고받는 일입니다.