Zilla는 OpenAI, Anthropic, Gemini API 요청을 하나의 게이트웨이로 받아 모델 이름에 따라 제공업체로 전달하는 데모다. 클라이언트와 제공업체가 서로 다른 API를 쓰면 요청과 응답 형식을 변환하므로, OpenAI SDK로 Claude나 Gemini를 호출하는 방식도 시험할 수 있다.
데모는 오픈소스 Zilla를 사용하는 Part 1과 Zilla Plus에 AWS Bedrock을 추가하는 Part 2로 나뉜다. 클라이언트가 보낸 API 키는 제공업체로 전달하며 zilla.yaml에는 저장하지 않는다.
- Part 1은 OpenAI, Anthropic, Gemini를 지원하고 스트리밍, 도구 호출, 가드레일, 모델 대체(fallback), 토큰 지표를 제공한다. Gemini API를 쓰려면 Zilla
2.6.0이상이 필요하다. - Part 2는 같은 게이트웨이 설정에 AWS Bedrock을 제공업체와 API로 추가한다. Zilla Plus 라이선스 키와 AWS 자격 증명이 필요하다.
모델 이름에 따라 gpt-*는 OpenAI, claude-*는 Anthropic, gemini-*는 Gemini로 라우팅한다. claude-primary는 연결할 수 없는 Anthropic 배포를 가리키며, 요청이 claude-haiku-4-5로 대체되는 과정을 보여준다. Bedrock 모델 패턴은 anthropic.*, amazon.*, us.anthropic.*, us.amazon.*이며 AWS 자격 증명으로 요청에 서명한다.
실행과 체험
필요한 것은 Docker Compose와 사용할 제공업체의 API 키다. .env.example을 .env로 복사하고 키를 입력한다. Gradio 앱과 명령줄 클라이언트가 요청마다 키를 보내며 Zilla가 제공업체로 전달한다. .env는 Git에서 제외된다. Apple silicon Mac 등 arm64 호스트에서는 .env의 TEI_VERSION=cpu-arm64-1.9 설정 주석도 해제해야 한다.
cp .env.example .env
docker compose up --build --wait
첫 실행 때는 프롬프트의 탈옥 여부를 확인하는 임베딩 모델을 제공하는 tei가 모델을 내려받으므로 docker compose up에 몇 분이 걸릴 수 있다. 개인정보 탐지에는 presidio-analyzer가 쓰인다.
브라우저에서 Gradio 비교 앱을 열고 SDK와 모델을 선택한다. OpenAI SDK와 claude-* 모델을 고르면 Zilla가 Anthropic으로 요청을 보내고 OpenAI 형식으로 응답한다. Anthropic SDK로 gpt-* 모델을 호출하는 경우도 같은 방식으로 변환한다. Gemini SDK는 gemini-3.5-flash-lite를 Gemini API로 보낼 수 있으며, gpt-* 모델을 선택하면 OpenAI로 요청을 라우팅하고 Gemini 형식으로 응답한다. OpenAI와 Anthropic SDK에서도 Gemini 모델을 요청할 수 있다.
앱에서는 스트리밍을 켜 토큰이 생성되는 대로 응답을 받거나, Compare 탭에서 같은 프롬프트를 gpt-*와 claude-* 모델에 보내 경로·토큰 사용량·시간을 비교할 수 있다. 도구 호출 기능은 get_weather 요청을 SDK 형식에 맞춰 보여준다. gpt-4o-mini 또는 claude-haiku-4-5를 선택해 AWS 액세스 키, 이메일 주소 또는 탈옥 시도를 포함한 프롬프트를 보내면 제공업체에 도달하기 전에 400 오류와 user-text rejected 응답으로 거부된다.
명령줄에서는 공식 SDK를 사용하는 llm-client 서비스를 실행한다. 예를 들어 OpenAI SDK로 Claude를 호출하려면 다음과 같이 입력한다.
docker compose run --rm \\
-e SDK=openai -e MODEL=claude-haiku-4-5 \\
llm-client
SDK에는 openai, anthropic, gemini를 지정할 수 있다. -e STREAM=true를 추가하면 스트리밍을 사용하고, -e TOOLS=true를 추가하면 get_weather 도구 호출을 보낸다. 사용할 수 있는 모델 이름은 API 키가 접근할 수 있어야 하며, 해당 경로의 모델 패턴과 일치해야 한다.
Grafana 대시보드(http://localhost:3000)에서는 제공업체와 클라이언트 API별 요청, 입력·출력 토큰, 지연 시간, 첫 토큰까지 걸린 시간, 상호작용 및 활성 요청을 확인할 수 있다. 토큰은 제공업체 클라이언트 바인딩에서 한 번만 집계된다. Prometheus 지표는 포트 7190에서 제공된다.
AWS Bedrock 추가
Part 2는 Zilla 2.6.0 이상을 기반으로 한 Zilla Plus와 라이선스 키가 필요하다. AWS 자격 증명에는 bedrock:InvokeModel 및 bedrock:InvokeModelWithResponseStream 호출 권한이 있어야 한다. .env에서 Zilla Plus 이미지와 라이선스 키, AWS 리전 및 자격 증명을 설정한 뒤 Zilla 서비스를 다시 만든다. 이어 etc/zilla.yaml에서 # Part 2 (Zilla Plus) 아래 설정의 주석을 해제한다.
Bedrock 클라이언트는 AWS Signature Version 4로 각 요청에 서명하며, Zilla 컨테이너의 AWS 자격 증명을 사용한다. 따라서 AWS 키를 zilla.yaml에 기록하지 않는다. 서명 리전은 server 호스트에서 가져온다. 다른 리전을 쓰려면 server, TLS 클라이언트의 sni, TCP 클라이언트의 host에 설정된 호스트를 함께 바꿔야 한다. 설정을 바꾸면 Zilla가 재시작 없이 변경을 반영한다.
포트 7164의 Bedrock API는 AWS SDK의 Converse API 요청을 받는다. AWS SDK로 Bedrock 모델을 호출하면 요청은 Bedrock으로 간다. 같은 API에서 gpt-*, claude-*, gemini-* 모델을 요청하면 Zilla가 해당 제공업체 API 형식으로 변환하고, 응답은 Bedrock 형식으로 돌려준다. 이때 AWS SDK 요청에는 제공업체 키가 없으므로 Zilla 컨테이너의 OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY를 사용한다. claude-primary의 대체 처리와 Part 1의 가드레일도 적용된다.
데모 설정과 자세한 안내는 Zilla LLM gateway README에서 확인할 수 있다. 관련 자료: AI Gateway 문서, 지표 문서, inline guard 문서, llm.proxy 예제.
실행한 서비스를 종료하고 볼륨을 삭제하려면 다음 명령을 사용한다.
docker compose down -v
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요