Spaces:
Paused
Paused
| source /add_bash_util.sh | |
| gh_install caddyserver/caddy linux_amd64.tar.gz /tmp/caddy.tar.gz | |
| mkdir -p /tmp/caddy | |
| tar -xzf /tmp/caddy.tar.gz -C /tmp/caddy | |
| # Start the Node.js application | |
| git clone https://github.com/waxz/Gemini-CLI-2-API.git /tmp/Gemini-CLI-2-API | |
| git clone https://github.com/waxz/gemini-cli-openai /tmp/gemini-cli-openai | |
| git clone https://github.com/snailyp/gemini-balance.git /tmp/gemini-balance | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| source $HOME/.local/bin/env | |
| uv venv /tmp/.venv | |
| source /tmp/.venv/bin/activate | |
| uv pip install -r /tmp/gemini-balance/requirements.txt | |
| cat << EOF | tee /tmp/Gemini-CLI-2-API/config.json | |
| { | |
| "REQUIRED_API_KEY": "${REQUIRED_API_KEY:-}", | |
| "SERVER_PORT": 3000, | |
| "HOST": "localhost", | |
| "MODEL_PROVIDER": "gemini-cli-oauth", | |
| "OPENAI_API_KEY": "${OPENAI_API_KEY:-}", | |
| "OPENAI_BASE_URL": "https://api.openai.com/v1", | |
| "CLAUDE_API_KEY": "${CLAUDE_API_KEY:-}", | |
| "CLAUDE_BASE_URL": "https://api.anthropic.com/v1", | |
| "PROJECT_ID": "${PROJECT_ID:-}", | |
| "PROMPT_LOG_MODE": "console", | |
| "GEMINI_OAUTH_CREDS_FILE_PATH":"/tmp/gemini_oauth_creds.json" | |
| } | |
| EOF | |
| cat << EOF | tee /tmp/gemini_oauth_creds.json | |
| { | |
| "access_token": "${GEMINI_OAUTH_ACCESS_TOKEN:-}", | |
| "refresh_token": "${GEMINI_OAUTH_REFRESH_TOKEN:-}", | |
| "scope": "https://www.googleapis.com/auth/cloud-platform", | |
| "token_type": "Bearer", | |
| "expiry_date": 1753880406425 | |
| } | |
| EOF | |
| cat << EOF | tee /tmp/gemini-balance/.env | |
| # 数据库配置 | |
| DATABASE_TYPE=mysql | |
| #SQLITE_DATABASE=default_db | |
| MYSQL_HOST=${MYSQL_HOST} | |
| #MYSQL_SOCKET=/run/mysqld/mysqld.sock | |
| MYSQL_PORT=${MYSQL_PORT} | |
| MYSQL_USER=${MYSQL_USER} | |
| MYSQL_PASSWORD=${MYSQL_PASSWORD} | |
| MYSQL_DATABASE=${MYSQL_DATABASE} | |
| API_KEYS=["${GEMINI_API_KEYS}"] | |
| ALLOWED_TOKENS=["${REQUIRED_API_KEY}"] | |
| AUTH_TOKEN=${REQUIRED_API_KEY} | |
| # For Vertex AI Platform API Keys | |
| VERTEX_API_KEYS=["AQ.Abxxxxxxxxxxxxxxxxxxx"] | |
| # For Vertex AI Platform Express API Base URL | |
| VERTEX_EXPRESS_BASE_URL=https://aiplatform.googleapis.com/v1beta1/publishers/google | |
| TEST_MODEL=gemini-1.5-flash | |
| THINKING_MODELS=["gemini-2.5-flash-preview-04-17"] | |
| THINKING_BUDGET_MAP={"gemini-2.5-flash-preview-04-17": 4000} | |
| IMAGE_MODELS=["gemini-2.0-flash-exp"] | |
| SEARCH_MODELS=["gemini-2.0-flash-exp","gemini-2.0-pro-exp"] | |
| FILTERED_MODELS=["gemini-1.0-pro-vision-latest", "gemini-pro-vision", "chat-bison-001", "text-bison-001", "embedding-gecko-001"] | |
| # 是否启用网址上下文,默认启用 | |
| URL_CONTEXT_ENABLED=false | |
| URL_CONTEXT_MODELS=["gemini-2.5-pro","gemini-2.5-flash","gemini-2.5-flash-lite","gemini-2.0-flash","gemini-2.0-flash-live-001"] | |
| TOOLS_CODE_EXECUTION_ENABLED=false | |
| SHOW_SEARCH_LINK=true | |
| SHOW_THINKING_PROCESS=true | |
| BASE_URL=https://generativelanguage.googleapis.com/v1beta | |
| MAX_FAILURES=10 | |
| MAX_RETRIES=3 | |
| CHECK_INTERVAL_HOURS=1 | |
| TIMEZONE=Asia/Shanghai | |
| # 请求超时时间(秒) | |
| TIME_OUT=300 | |
| # 代理服务器配置 (支持 http 和 socks5) | |
| # 示例: PROXIES=["http://user:pass@host:port", "socks5://host:port"] | |
| PROXIES=[] | |
| # 对同一个API_KEY使用代理列表中固定的IP策略 | |
| PROXIES_USE_CONSISTENCY_HASH_BY_API_KEY=true | |
| #########################image_generate 相关配置########################### | |
| PAID_KEY=AIzaSyxxxxxxxxxxxxxxxxxxx | |
| CREATE_IMAGE_MODEL=imagen-3.0-generate-002 | |
| UPLOAD_PROVIDER=smms | |
| SMMS_SECRET_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX | |
| PICGO_API_KEY=xxxx | |
| CLOUDFLARE_IMGBED_URL=https://xxxxxxx.pages.dev/upload | |
| CLOUDFLARE_IMGBED_AUTH_CODE=xxxxxxxxx | |
| CLOUDFLARE_IMGBED_UPLOAD_FOLDER= | |
| ########################################################################## | |
| #########################stream_optimizer 相关配置######################## | |
| STREAM_OPTIMIZER_ENABLED=false | |
| STREAM_MIN_DELAY=0.016 | |
| STREAM_MAX_DELAY=0.024 | |
| STREAM_SHORT_TEXT_THRESHOLD=10 | |
| STREAM_LONG_TEXT_THRESHOLD=50 | |
| STREAM_CHUNK_SIZE=5 | |
| ########################################################################## | |
| ######################### 日志配置 ####################################### | |
| # 日志级别 (debug, info, warning, error, critical),默认为 info | |
| LOG_LEVEL=info | |
| # 是否开启自动删除错误日志 | |
| AUTO_DELETE_ERROR_LOGS_ENABLED=true | |
| # 自动删除多少天前的错误日志 (1, 7, 30) | |
| AUTO_DELETE_ERROR_LOGS_DAYS=7 | |
| # 是否开启自动删除请求日志 | |
| AUTO_DELETE_REQUEST_LOGS_ENABLED=false | |
| # 自动删除多少天前的请求日志 (1, 7, 30) | |
| AUTO_DELETE_REQUEST_LOGS_DAYS=30 | |
| ########################################################################## | |
| # 假流式配置 (Fake Streaming Configuration) | |
| # 是否启用假流式输出 | |
| FAKE_STREAM_ENABLED=True | |
| # 假流式发送空数据的间隔时间(秒) | |
| FAKE_STREAM_EMPTY_DATA_INTERVAL_SECONDS=5 | |
| # 安全设置 (JSON 字符串格式) | |
| # 注意:这里的示例值可能需要根据实际模型支持情况调整 | |
| SAFETY_SETTINGS=[{"category": "HARM_CATEGORY_HARASSMENT", "threshold": "OFF"}, {"category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "OFF"}, {"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "OFF"}, {"category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "OFF"}, {"category": "HARM_CATEGORY_CIVIC_INTEGRITY", "threshold": "BLOCK_NONE"}] | |
| URL_NORMALIZATION_ENABLED=false | |
| # tts配置 | |
| TTS_MODEL=gemini-2.5-flash-preview-tts | |
| TTS_VOICE_NAME=Zephyr | |
| TTS_SPEED=normal | |
| #########################Files API 相关配置######################## | |
| # 是否启用文件过期自动清理 | |
| FILES_CLEANUP_ENABLED=true | |
| # 文件过期清理间隔(小时) | |
| FILES_CLEANUP_INTERVAL_HOURS=1 | |
| # 是否启用用户文件隔离(每个用户只能看到自己上传的文件) | |
| FILES_USER_ISOLATION_ENABLED=true | |
| ########################################################################## | |
| EOF | |
| cat << EOF | tee /tmp/gemini-cli-openai/.dev.vars | |
| # Required: OAuth2 credentials JSON from Gemini CLI authentication | |
| GCP_SERVICE_ACCOUNT=${GCP_SERVICE_ACCOUNT} | |
| # Optional: Google Cloud Project ID (auto-discovered if not set) | |
| GEMINI_PROJECT_ID=${GEMINI_PROJECT_ID} | |
| # Optional: API key for authentication (if not set, API is public) | |
| # When set, clients must include "Authorization: Bearer <your-api-key>" header | |
| # Example: sk-1234567890abcdef1234567890abcdef | |
| OPENAI_API_KEY=${REQUIRED_API_KEY} | |
| EOF | |
| cd /tmp/Gemini-CLI-2-API && npm install && node src/api-server.js & | |
| cd /tmp/gemini-balance && uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload & | |
| cd /tmp/gemini-cli-openai && npm i && npm run dev & | |
| /tmp/caddy/caddy run --config /Caddyfile & | |
| MAIN_PID=$! | |
| # Wait for caddy process | |
| wait $MAIN_PID | |