필요한 정보 모아보기
테크

LiteLLM로 OpenAI·Claude·Gemini 코드 하나로 - 실제 테스트해보니

#LiteLLM#LLM API#오픈소스#AI게이트웨이#개발도구

LiteLLM은 OpenAI, Anthropic, Google Gemini를 포함한 100개 넘는 LLM API를 똑같은 코드 한 줄로 호출할 수 있게 해주는 오픈소스 라이브러리다. BerriAI가 만들었고 MIT 라이선스로 공개돼 있으며, 현재 5만 9천 개 넘는 GitHub 스타와 1만 1천 개가 넘는 포크를 보유했다 — Show HN에 올라오는 갓 만든 프로젝트가 아니라 이미 꽤 오래 검증된 도구라는 뜻이다.

여러 LLM을 동시에 다루는 서비스를 만들다 보면 자연스럽게 겪는 문제가 있다. OpenAI SDK, Anthropic SDK, Google의 SDK가 요청 형식도, 응답 형식도, 인증 방식도 전부 다르다는 것이다. 모델 하나를 갈아타거나 둘 이상을 동시에 쓰려면 그때마다 별도의 클라이언트 코드를 짜야 한다. LiteLLM은 이 부분을 OpenAI 형식으로 통일해서, provider 이름만 바꾸면 나머지 코드는 그대로 재사용할 수 있게 만들었다.

직접 설치해서 돌려봤다

격리된 가상환경부터 새로 만들어서 테스트했다.

python3 -m venv litellm_test_venv   # 이 맥미니 기본 Python 3.9.6 사용
litellm_test_venv/bin/pip install --upgrade pip -q
litellm_test_venv/bin/pip install litellm -q

설치가 끝나면 pip show litellm으로 실제 버전과 의존성부터 살펴보는 게 순서다.

Name: litellm
Version: 1.83.9
License-Expression: MIT
Requires: aiohttp, click, fastuuid, httpx, importlib-metadata, jinja2,
          jsonschema, openai, pydantic, python-dotenv, tiktoken, tokenizers

내부적으로 OpenAI SDK(openai)와 토크나이저 라이브러리(tiktoken, tokenizers)까지 딸려 들어온다는 게 여기서 드러난다. 다음은 세 개 provider를 같은 코드로 직접 호출해볼 차례. API 키는 없어도 된다 — mock_response 옵션을 쓰면 실제 네트워크 호출 없이 인터페이스 동작만 확인할 수 있다.

from litellm import completion

providers = ["openai/gpt-4o", "anthropic/claude-3-5-sonnet-20241022", "gemini/gemini-1.5-pro"]

for model in providers:
    response = completion(
        model=model,
        messages=[{"role": "user", "content": "hello"}],
        mock_response="This is a mocked response.",
    )
    u = response.usage
    print(f"model={model}")
    print(f"  content = {response.choices[0].message.content!r}  type: {type(response).__name__}")
    print(f"  usage: Usage(completion_tokens={u.completion_tokens}, prompt_tokens={u.prompt_tokens}, total_tokens={u.total_tokens})")
    print()

결과는 이렇다. 세 provider 모두 완전히 같은 형태로 응답이 돌아온다.

model=openai/gpt-4o
  content = 'This is a mocked response.'  type: ModelResponse
  usage: Usage(completion_tokens=20, prompt_tokens=10, total_tokens=30)

model=anthropic/claude-3-5-sonnet-20241022
  content = 'This is a mocked response.'  type: ModelResponse
  usage: Usage(completion_tokens=20, prompt_tokens=10, total_tokens=30)

model=gemini/gemini-1.5-pro
  content = 'This is a mocked response.'  type: ModelResponse
  usage: Usage(completion_tokens=20, prompt_tokens=10, total_tokens=30)

response.choices[0].message.content나 response.usage로 값을 꺼내는 방식도 다르지 않다. model= 앞에 openai/, anthropic/, gemini/만 바꿔 끼우면, 나머지 코드는 그대로라는 뜻이다.

라이브러리만 쓰는 방법 말고, 프록시 서버로 띄우는 방법도 있다. uv tool install 'litellm[proxy]'로 설치한 뒤 litellm --model gpt-4o를 실행하면 로컬에 게이트웨이 서버가 뜨고, 여기에 가상 키 발급·사용량 추적·요청 분산 같은 기능이 딸려 온다. 이쪽은 개인 프로젝트보다는 여러 명이 같이 쓰는 사내 AI 게이트웨이를 만들 때 쓰는 모드에 가깝다.

실무에 붙이기 전 확인할 것

실제로 써보면서 미리 정리해두면 좋을 부분들이다.

  1. PyPI 공급망 공격 이력 — 2026년 3월 23~24일, LiteLLM 1.82.7·1.82.8 두 버전의 PyPI 배포 권한이 탈취당해 SSH 키와 클라우드 자격증명을 훔치는 악성코드가 심어진 사건이 있었다(공격자 자칭 "TeamPCP"). 두 버전 모두 PyPI에서 영구 삭제됐고, 이번에 설치해서 테스트한 1.83.9(2026년 10월 8일 기준 PyPI 최신은 1.104.2)는 그 이후 나온 버전이라 이 사건과는 무관하다. 다만 그 시기에 1.82.7 이상 버전을 설치한 적이 있는 시스템이라면, site-packages/에 litellm_init.pth 파일이 있든 없든 그 시스템의 환경변수·설정 파일에 들어 있던 자격증명을 전부 교체해야 한다 — LiteLLM 측 권고가 그렇다. .pth 파일은 1.82.8에서 쓰인 방식이고, 1.82.7은 악성 코드가 litellm/proxy/proxy_server.py 안에 심겨 litellm.proxy를 import할 때 실행됐기 때문에 파일이 없다고 안심할 수 없다.
  2. 라이선스 경계 — 저장소 전체가 MIT는 아니다. enterprise/ 디렉터리 아래 코드만 별도 라이선스가 걸려 있고, 그 바깥(일반적으로 쓰는 completion() 함수를 포함한 핵심 SDK)은 MIT다. 가상 키 발급이나 관리 대시보드 같은 고급 기능을 쓸 계획이라면 이 경계를 한 번쯤 확인해두는 게 안전하다.
  3. 자체 공개 성능 수치는 재검증 대상 — "8ms P95 지연시간, 초당 1000건 처리"는 LiteLLM 자체 테스트 환경 기준이라, 그대로 믿기보다는 자기 워크로드로 다시 재봐야 하는 숫자다.
  4. 라이브러리냐 프록시냐부터 정한다 — 개인 스크립트나 작은 서비스라면 코드에 바로 import하는 라이브러리 방식으로 충분하다. 여러 팀이 같은 LLM 예산을 나눠 쓰는 조직이라면, 별도 서버로 띄우는 프록시 방식의 가상 키·사용량 추적 기능이 훨씬 유용하다.
  5. MCP·A2A 연동은 미검증 — Model Context Protocol 서버 연동과 A2A 에이전트 프로토콜도 지원한다고 나와 있지만, 이번에 직접 테스트하지는 못했다. 에이전트 파이프라인을 이미 운영 중이라면 이 부분은 별도로 검증해보고 붙이는 게 안전하다.
출처 github.com/…/litellmgithub.com/…/24518pypi.org

내용이 틀렸나요? 정정 요청

관련 글