Sophomoresty/gemini-web2api
Convert Google Gemini web into OpenAI-compatible API. Zero auth, cross-platform, single file.
gemini‑web2api – Google Gemini 웹 UI를 OpenAI 호환 API로 전환
무엇인가요 – 비공개 Gemini 웹 엔드포인트와 통신하고 OpenAI /v1/chat/completions (및 관련) API로 재노출하는 단일 파일 Python 서버입니다. 이는 어떤 OpenAI 호환 클라이언트(예: ChatGPT 스타일 UI, openai Python SDK, curl 등)라도 Google 전용 클라이언트 없이 Gemini 모델을 사용할 수 있게 해줍니다.
핵심 기능 (README에 설명됨)
| 기능 | 의미 |
|---|---|
| OpenAI 호환 엔드포인트 | /v1/chat/completions, /v1/models를 구현하고, Codex 스타일 사용을 위한 특수한 /v1/responses 및 네이티브 Gemini /v1beta/* 엔드포인트도 지원합니다. |
| 선택적 API 키 인증 | config.json의 api_keys가 비어 있으면 서버는 오픈 상태이며, 그렇지 않으면 Bearer 토큰(또는 x‑api‑key)이 필요합니다. |
| 도구/함수 호출 | OpenAI 스타일의 함수 정의를 수락하고 함수 호출 객체를 반환하여 도구 사용을 가능하게 합니다. |
| 다중 모달 이미지 입력 | Gemini의 이미지 이해 엔드포인트를 위한 OpenAI 스타일의 image_url 메시지(URL 또는 base64)를 지원합니다. |
| 스트리밍(SSE) | httpx를 사용해 Gemini의 Server-Sent Events를 전달하여 클라이언트가 부분 토큰을 수신할 수 있습니다. |
| 다수의 Gemini 모델 | gemini-3.6-flash, gemini-3.5-flash-thinking, gemini-3.1-pro 등과 같은 별칭을 제공하며, 출력 길이 힌트(10–20 k 문자)가 포함됩니다. |
| 조정 가능한 "사고 깊이" | 모델 이름에 @think=N(0–4)를 추가하여 더 깊거나 얕은 사고를 요청할 수 있습니다. |
| 웹 검색 통합 | Gemini의 내장 검색 기능을 활용하여 프롬프트가 자동으로 인터넷 검색을 트리거할 수 있습니다. |
| 크로스플랫폼, 단일 파일 | 순수 Python(단지 httpx 필요). |
| Docker 지원 | 간편한 배포를 위한 공식 Dockerfile 및 compose 스크립트 제공. |
| 프록시 지원 | CLI 플래그, 설정 또는 HTTPS_PROXY를 통해 HTTP 프록시를 통해 트래픽을 라우팅할 수 있습니다. |
빠른 시작 (README에서)
pip install httpx # 유일한 종속성
python gemini_web2api.py # http://localhost:8081/v1에서 서버 시작
OpenAI 클라이언트 사용
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8081/v1", api_key="sk‑your‑key")
resp = client.chat.completions.create(
model="gemini-3.5-flash-thinking",
messages=[{"role": "user", "content": "양자 컴퓨팅을 설명해줘"}]
)
print(resp.choices[0].message.content)
동일한 엔드포인트는 curl, Postman, 또는 사용자 정의 기반 URL을 설정할 수 있는 모든 UI와 함께 작동합니다.
구성 요약
config.json은 스크립트와 동일한 디렉토리에 위치합니다. 주요 필드:port,host– 서버가 리슨하는 위치.api_keys– 문자열 목록; 비어 있으면 인증이 필요하지 않습니다.cookie_file– Google 인증 쿠키를 포함한 파일 경로(유료 Gemini Advanced 모델 및 이미지 업로드에 필수).auth_user/xsrf_token– 쿠키가 다중 계정 Google 세션에 속할 경우 필요합니다.proxy– 선택적 HTTP 프록시 URL.temporary_chats– true일 경우 대화는 Google 계정 기록에 저장되지 않습니다.
- 리포지토리에는 예제
config.json이 제공되며,config.example.json을 복사하여 필요에 따라 편집하세요.
모델 목록 (README 표)
| 모델 이름 | 설명 | 약간의 최대 출력 |
|---|---|---|
gemini-3.6-flash (별칭 gemini-3.5-flash) |
일반 목적, 최신 모델 | 약 12 k 문자 |
gemini-3.5-flash-thinking |
"확장된 사고", 가장 긴 출력 | 약 20 k 문자 |
gemini-3.5-flash-thinking-lite |
적응형 깊이, 중간 출력 | 약 15 k 문자 |
gemini-3.1-pro |
고급 수학 및 코드 처리(유료 구독 쿠키 필요) | 약 12 k 문자 |
gemini-auto |
최적 모델 자동 선택 | 변동 |
gemini-flash-lite |
가장 빠르고 가벼움 | 약 10 k 문자 |
깊이를 @think=N 접미사로 변경할 수 있습니다(0 = 가장 깊음, 4 = 가장 얕음).
제한 사항 및 주의사항 (목록에 기재됨)
- 이미지 업로드는 쿠키 필요할 수 있음 – 익명 사용자는 다중 모달 엔드포인트를 사용할 수 없으며, 유효한 Gemini Advanced 쿠키를 제공해야 합니다.
- "Pro" 라벨은 UI만의 차이 – 유료 구독 쿠키 없이
gemini-3.1-pro는 Flash 모델로 백업됩니다. - 요청별로 상태 없음 – 서버는 대화 상태를 유지하지 않습니다. 다중 회차 컨텍스트를 원하면 이전 메시지를 요청 페이로드에 포함해야 합니다.
- Google의 레이트 제한 – 많은 트래픽은 제한될 수 있습니다. 서버는 몇 번 리트라이하지만, 지속적인 남용은 차단될 수 있습니다.
- Docker 네트워킹 – 일부 NAT 범위는 Gemini에 의해 차단됩니다. 빈 응답이 보이면 호스트 네트워킹을 사용하세요.
작동 방식 (간략히)
스크립트는 Gemini 웹 앱이 StreamGenerate 엔드포인트에 전송하는 프로토버프 유사 페이로드를 역공학합니다. OpenAI JSON 요청 본문을 해당 형식으로 변환하고 httpx를 통해 전달한 후, 응답을 OpenAI 스타일 JSON(스트리밍 청크 포함)로 변환합니다. 모델 선택은 Gemini의 프론트엔드 자바스크립트에서 추출한 필드([79])에 의해 결정됩니다.
라이선스
MIT – 코드를 자유롭게 사용, 수정, 재배포할 수 있습니다.
관련
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트
- 프로젝트