diff --git a/.env.example b/.env.example index 69b3eee..7afd54c 100644 --- a/.env.example +++ b/.env.example @@ -9,12 +9,31 @@ ROBOFLOW_API_FALLBACK_URLS= # 2) Create a Read token and set it below HF_TOKEN= +# Optional OpenRouter defaults +# OPENROUTER_API_KEY=sk-or-v1-xxx +# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 +# OPENROUTER_IMAGE_MODEL=google/gemini-3-pro-image-preview +# OPENROUTER_SVG_MODEL=google/gemini-3.1-pro-preview + +# Optional Bianxie defaults +# BIANXIE_API_KEY=your_bianxie_key +# BIANXIE_BASE_URL=https://api.bianxie.ai/v1 +# BIANXIE_IMAGE_MODEL=gemini-3-pro-image-preview +# BIANXIE_SVG_MODEL=gemini-3.1-pro-preview + +# Optional Gemini defaults +# GEMINI_API_KEY=your_gemini_key +# GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta +# GEMINI_IMAGE_MODEL=gemini-3-pro-image-preview +# GEMINI_SVG_MODEL=gemini-3.1-pro + # Optional: OpenRouter multimodal retry tuning (step 4 SVG generation) # OPENROUTER_MULTIMODAL_RETRIES=3 # OPENROUTER_MULTIMODAL_RETRY_DELAY=1.5 # Optional build source overrides (for restricted networks) -# BASE_IMAGE=docker.m.daocloud.io/library/python:3.11-slim +# BASE_IMAGE=python:3.11-slim-bookworm +# DOCKER_PLATFORM=linux/amd64 # PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple # PIP_EXTRA_INDEX_URL= diff --git a/README.md b/README.md index 9fc8598..7933ded 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,22 @@ HF_TOKEN=hf_xxx Optional but recommended: ```bash +# LLM provider defaults (used when CLI flags are omitted) +OPENROUTER_API_KEY=sk-or-v1-xxx +OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 +OPENROUTER_IMAGE_MODEL=google/gemini-3-pro-image-preview +OPENROUTER_SVG_MODEL=google/gemini-3.1-pro-preview + +BIANXIE_API_KEY=your_bianxie_key +BIANXIE_BASE_URL=https://api.bianxie.ai/v1 +BIANXIE_IMAGE_MODEL=gemini-3-pro-image-preview +BIANXIE_SVG_MODEL=gemini-3.1-pro-preview + +GEMINI_API_KEY=your_gemini_key +GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta +GEMINI_IMAGE_MODEL=gemini-3-pro-image-preview +GEMINI_SVG_MODEL=gemini-3.1-pro + # SAM3 API backend (Docker default in UI is Roboflow) ROBOFLOW_API_KEY=your_roboflow_key @@ -323,6 +339,8 @@ Optional CLI flags (API): | **Bianxie** | `api.bianxie.ai/v1` | OpenAI-compatible API | | **Gemini (Google)** | `generativelanguage.googleapis.com/v1beta` | Official Google Gemini API (`google-genai`) | +Each provider can read `API_KEY`, `BASE_URL`, `IMAGE_MODEL`, and `SVG_MODEL` defaults from `.env`. + Common CLI flags: - `--provider` (openrouter | bianxie | gemini) diff --git a/README_ZH.md b/README_ZH.md index e133bca..1b3bcae 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -135,6 +135,22 @@ HF_TOKEN=hf_xxx 可选但建议配置: ```bash +# LLM provider 默认值(当未传 CLI 参数时使用) +OPENROUTER_API_KEY=sk-or-v1-xxx +OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 +OPENROUTER_IMAGE_MODEL=google/gemini-3-pro-image-preview +OPENROUTER_SVG_MODEL=google/gemini-3.1-pro-preview + +BIANXIE_API_KEY=your_bianxie_key +BIANXIE_BASE_URL=https://api.bianxie.ai/v1 +BIANXIE_IMAGE_MODEL=gemini-3-pro-image-preview +BIANXIE_SVG_MODEL=gemini-3.1-pro-preview + +GEMINI_API_KEY=your_gemini_key +GEMINI_BASE_URL=https://generativelanguage.googleapis.com/v1beta +GEMINI_IMAGE_MODEL=gemini-3-pro-image-preview +GEMINI_SVG_MODEL=gemini-3.1-pro + # SAM3 API(Docker/Web 默认后端为 Roboflow) ROBOFLOW_API_KEY=your_roboflow_key @@ -313,6 +329,8 @@ python autofigure2.py \ | **Bianxie** | `api.bianxie.ai/v1` | 兼容 OpenAI 接口 | | **Gemini (Google)** | `generativelanguage.googleapis.com/v1beta` | Google 官方 Gemini API(`google-genai`) | +每个 provider 都支持从 `.env` 读取 `API_KEY`、`BASE_URL`、`IMAGE_MODEL`、`SVG_MODEL` 默认值。 + 常用 CLI 参数: - `--provider` (openrouter | bianxie | gemini) diff --git a/autofigure2.py b/autofigure2.py index 95556f0..042877c 100644 --- a/autofigure2.py +++ b/autofigure2.py @@ -90,19 +90,36 @@ PROVIDER_CONFIGS = { "openrouter": { - "base_url": "https://openrouter.ai/api/v1", - "default_image_model": "google/gemini-3-pro-image-preview", - "default_svg_model": "google/gemini-3.1-pro-preview", + "api_key": os.environ.get("OPENROUTER_API_KEY", ""), + "base_url": os.environ.get("OPENROUTER_BASE_URL", "https://openrouter.ai/api/v1"), + "default_image_model": os.environ.get( + "OPENROUTER_IMAGE_MODEL", "google/gemini-3-pro-image-preview" + ), + "default_svg_model": os.environ.get( + "OPENROUTER_SVG_MODEL", "google/gemini-3.1-pro-preview" + ), }, "bianxie": { - "base_url": "https://api.bianxie.ai/v1", - "default_image_model": "gemini-3-pro-image-preview", - "default_svg_model": "gemini-3.1-pro-preview", + "api_key": os.environ.get("BIANXIE_API_KEY", ""), + "base_url": os.environ.get("BIANXIE_BASE_URL", "https://api.bianxie.ai/v1"), + "default_image_model": os.environ.get( + "BIANXIE_IMAGE_MODEL", "gemini-3-pro-image-preview" + ), + "default_svg_model": os.environ.get( + "BIANXIE_SVG_MODEL", "gemini-3.1-pro-preview" + ), }, "gemini": { - "base_url": "https://generativelanguage.googleapis.com/v1beta", - "default_image_model": "gemini-3-pro-image-preview", - "default_svg_model": "gemini-3.1-pro", + "api_key": os.environ.get("GEMINI_API_KEY", ""), + "base_url": os.environ.get( + "GEMINI_BASE_URL", "https://generativelanguage.googleapis.com/v1beta" + ), + "default_image_model": os.environ.get( + "GEMINI_IMAGE_MODEL", "gemini-3-pro-image-preview" + ), + "default_svg_model": os.environ.get( + "GEMINI_SVG_MODEL", "gemini-3.1-pro" + ), }, } @@ -2817,11 +2834,12 @@ def method_to_svg( Returns: 结果字典 """ - if not api_key: - raise ValueError("必须提供 api_key") - # 获取默认配置 config = PROVIDER_CONFIGS[provider] + if not api_key: + api_key = config.get("api_key") or None + if not api_key: + raise ValueError("必须提供 api_key") if base_url is None: base_url = config["base_url"] if image_gen_model is None: diff --git a/docker-compose.yml b/docker-compose.yml index 180ccc1..f84f159 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,18 @@ services: HF_HOME: /app/.cache/huggingface HF_TOKEN: ${HF_TOKEN:-} HUGGINGFACE_HUB_TOKEN: ${HF_TOKEN:-} + OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-} + OPENROUTER_BASE_URL: ${OPENROUTER_BASE_URL:-} + OPENROUTER_IMAGE_MODEL: ${OPENROUTER_IMAGE_MODEL:-} + OPENROUTER_SVG_MODEL: ${OPENROUTER_SVG_MODEL:-} + BIANXIE_API_KEY: ${BIANXIE_API_KEY:-} + BIANXIE_BASE_URL: ${BIANXIE_BASE_URL:-} + BIANXIE_IMAGE_MODEL: ${BIANXIE_IMAGE_MODEL:-} + BIANXIE_SVG_MODEL: ${BIANXIE_SVG_MODEL:-} + GEMINI_API_KEY: ${GEMINI_API_KEY:-} + GEMINI_BASE_URL: ${GEMINI_BASE_URL:-} + GEMINI_IMAGE_MODEL: ${GEMINI_IMAGE_MODEL:-} + GEMINI_SVG_MODEL: ${GEMINI_SVG_MODEL:-} OPENROUTER_MULTIMODAL_RETRIES: ${OPENROUTER_MULTIMODAL_RETRIES:-3} OPENROUTER_MULTIMODAL_RETRY_DELAY: ${OPENROUTER_MULTIMODAL_RETRY_DELAY:-1.5} ROBOFLOW_API_KEY: ${ROBOFLOW_API_KEY:-}