mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-13 04:59:51 +08:00
Every fact about a provider lives in one record in lib/providers.ts (SDK kind, credential kind, env var prefix, default URL, picker group, four-language notes, and a short model list for the six providers that cannot list models). The thirteen tables keyed by provider name are gone. resolveEndpoint decides whose key a call uses and where it goes; usesServerCredentials reads its answer instead of mirroring getAIModel's branches; serverCredentialError holds the server credential check once. The UI, the connection test and the routes read the record's credential and sdk fields instead of comparing provider names (44 such checks before, 6 after, in the admin panel's fixed-variable branches). Intended behavior changes: providers that can list their models have no hand-written list; the settings dialog fetches the live list in the background once credentials are entered for a provider without models and offers it behind "Browse models". Azure has no placeholder default URL (old entries that hold it still count as unset); the base URL field of Azure and of the new "custom" OpenAI-compatible preset (CUSTOM_API_KEY, CUSTOM_BASE_URL) is labelled required. The connection test answers 400 for an unknown provider name; prototype names are refused everywhere. Provider lists in error messages and the admin "add provider" dropdown follow the picker's order. Also fixed, from before the refactor: the redirect guard drops x-access-code on cross-origin redirects, and edgeOneEndpoint accepts the Origin header only when it matches Host or X-Forwarded-Host. Verification: a behavior snapshot of getAIModel's SDK factory calls and the quota functions over 25 providers, 22 client override shapes and 9 server environments (5843 rows), recorded on the old code and unchanged apart from the intended changes; 752 unit tests, 65 provider e2e tests, tsc, biome, next build. Reviewed by five models from one brief; their findings and the resulting fixes are recorded in docs/plans/2026-10-provider-refactor.md.
243 lines
13 KiB
Plaintext
243 lines
13 KiB
Plaintext
# AI Provider Configuration
|
|
# AI_PROVIDER: Which provider to use
|
|
# Options: bedrock, openai, anthropic, google, vertexai, azure, ollama, openrouter, aihubmix, deepseek, siliconflow, sglang, gateway, edgeone, doubao, modelscope, glm, qwen, qiniu, kimi, minimax, novita, mimo, atlascloud, custom
|
|
# Default: bedrock
|
|
AI_PROVIDER=bedrock
|
|
|
|
# AI_MODEL: The model ID for your chosen provider (REQUIRED)
|
|
# Tip: For a single-provider quick multi-model setup, list comma-separated model IDs.
|
|
# The first one becomes the default and the rest appear in the model picker.
|
|
# For multiple providers or custom apiKeyEnv/baseUrlEnv, use AI_MODELS_CONFIG / ai-models.json instead.
|
|
# There, apiKeyEnv may also be an array of env var names: each request picks one that has a value at random.
|
|
# Example: AI_MODEL=doubao-seed-1-8-251215,doubao-seed-1-6-flash,doubao-seed-1-6-pro
|
|
AI_MODEL=global.anthropic.claude-sonnet-4-5-20250929-v1:0
|
|
|
|
# Output limit, all providers (default: 64000). Shared by reasoning and the diagram XML,
|
|
# so a thinking model can spend it all before the tool call. Users can lower it in Settings,
|
|
# and raise it only when they use their own API key, so this also caps cost on server keys.
|
|
# If a model's own ceiling is lower, the request is retried with that ceiling automatically.
|
|
# MAX_OUTPUT_TOKENS=64000
|
|
|
|
# AWS Bedrock Configuration
|
|
# AWS_REGION=us-east-1
|
|
# AWS_ACCESS_KEY_ID=your-access-key-id
|
|
# AWS_SECRET_ACCESS_KEY=your-secret-access-key
|
|
# Note: Claude and Nova models support reasoning/extended thinking
|
|
# BEDROCK_REASONING_BUDGET_TOKENS=12000 # Optional: Claude reasoning budget in tokens (1024-64000)
|
|
# BEDROCK_REASONING_EFFORT=medium # Optional: Nova reasoning effort (low/medium/high)
|
|
|
|
# OpenAI Configuration
|
|
# OPENAI_API_KEY=sk-...
|
|
# OPENAI_BASE_URL=https://api.openai.com/v1 # Optional: Custom OpenAI-compatible endpoint
|
|
# Note: o1/o3/gpt-5 models automatically enable reasoning summary (default: detailed)
|
|
# OPENAI_REASONING_EFFORT=low # Optional: Reasoning effort (minimal/low/medium/high) - for o1/o3/gpt-5
|
|
# OPENAI_REASONING_SUMMARY=detailed # Optional: Override reasoning summary (none/brief/detailed)
|
|
|
|
# Anthropic (Direct) Configuration
|
|
# ANTHROPIC_API_KEY=sk-ant-... # Sent as `x-api-key` header
|
|
# ANTHROPIC_AUTH_TOKEN= # Alternative to ANTHROPIC_API_KEY; sent as `Authorization: Bearer` header (mutually exclusive)
|
|
# ANTHROPIC_BASE_URL=https://your-custom-anthropic/v1
|
|
# ANTHROPIC_THINKING_TYPE=enabled # Optional: Anthropic extended thinking (enabled)
|
|
# ANTHROPIC_THINKING_BUDGET_TOKENS=12000 # Optional: Budget for extended thinking in tokens
|
|
|
|
# Google Generative AI Configuration
|
|
# GOOGLE_GENERATIVE_AI_API_KEY=...
|
|
# GOOGLE_BASE_URL=https://generativelanguage.googleapis.com/v1beta # Optional: Custom endpoint
|
|
# GOOGLE_TOP_K=40 # Optional: Top K sampling parameter
|
|
# GOOGLE_TOP_P=0.95 # Optional: Nucleus sampling parameter
|
|
# Note: Gemini 2.5/3 models automatically enable reasoning display (includeThoughts: true)
|
|
# GOOGLE_THINKING_BUDGET=8192 # Optional: Gemini 2.5 thinking budget in tokens (for more/less thinking)
|
|
# GOOGLE_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (low/high)
|
|
|
|
# Google Vertex AI Configuration (Enterprise GCP)
|
|
# For enterprise users needing data residency, VPC Service Controls, or GCP integration
|
|
# GOOGLE_VERTEX_API_KEY= # Required: Express Mode API key
|
|
# GOOGLE_VERTEX_BASE_URL=https://... # Optional: Custom endpoint URL
|
|
# Note: Gemini 2.5/3 models automatically enable reasoning display (includeThoughts: true)
|
|
# GOOGLE_VERTEX_THINKING_BUDGET=8192 # Optional: Gemini 2.5 thinking budget in tokens (1024-100000)
|
|
# GOOGLE_VERTEX_THINKING_LEVEL=high # Optional: Gemini 3 thinking level (minimal/low/medium/high)
|
|
|
|
# Azure OpenAI Configuration
|
|
# Configure endpoint using ONE of these methods:
|
|
# 1. AZURE_RESOURCE_NAME - SDK constructs: https://{name}.openai.azure.com/openai/v1{path}
|
|
# 2. AZURE_BASE_URL - SDK appends /v1{path} to your URL
|
|
# If both are set, AZURE_BASE_URL takes precedence.
|
|
# AZURE_RESOURCE_NAME=your-resource-name
|
|
# AZURE_API_KEY=...
|
|
# AZURE_BASE_URL=https://your-resource.openai.azure.com/openai # Alternative: Custom endpoint
|
|
# AZURE_REASONING_EFFORT=low # Optional: Azure reasoning effort (low, medium, high)
|
|
# AZURE_REASONING_SUMMARY=detailed
|
|
|
|
# Ollama Configuration (Local or Cloud)
|
|
# OLLAMA_BASE_URL=https://ollama.com/api # Optional: Ollama Cloud; defaults to local Ollama (http://127.0.0.1:11434/api)
|
|
# OLLAMA_API_KEY=your-ollama-cloud-api-key # Optional: For Ollama Cloud or authenticated remote instances
|
|
# OLLAMA_ENABLE_THINKING=true # Optional: Enable thinking for models that support it (e.g., qwen3)
|
|
|
|
# OpenRouter Configuration
|
|
# OPENROUTER_API_KEY=sk-or-v1-...
|
|
# OPENROUTER_BASE_URL=https://openrouter.ai/api/v1 # Optional: Custom endpoint
|
|
|
|
# AIHubMix Configuration
|
|
# AIHUBMIX_API_KEY=your-aihubmix-api-key
|
|
# AIHUBMIX_BASE_URL=https://aihubmix.com/v1 # Optional: Custom endpoint
|
|
|
|
# DeepSeek Configuration
|
|
# DEEPSEEK_API_KEY=sk-...
|
|
# DEEPSEEK_BASE_URL=https://api.deepseek.com/v1 # Optional: Custom endpoint
|
|
|
|
# SiliconFlow Configuration (OpenAI-compatible)
|
|
# Base domain can be .com or .cn, defaults to https://api.siliconflow.com/v1
|
|
# SILICONFLOW_API_KEY=sk-...
|
|
# SILICONFLOW_BASE_URL=https://api.siliconflow.com/v1 # Optional: switch to https://api.siliconflow.cn/v1 if needed
|
|
|
|
# SGLang Configuration (OpenAI-compatible)
|
|
# SGLANG_API_KEY=your-sglang-api-key
|
|
# SGLANG_BASE_URL=http://127.0.0.1:8000/v1 # Your SGLang endpoint
|
|
|
|
# Any other OpenAI-compatible API (vLLM, LM Studio, LiteLLM, a gateway)
|
|
# CUSTOM_API_KEY=your-api-key # Any non-empty value if the server ignores keys
|
|
# CUSTOM_BASE_URL=http://127.0.0.1:8000/v1 # Required: the API's base URL
|
|
|
|
# ModelScope Configuration
|
|
# MODELSCOPE_API_KEY=ms-...
|
|
# MODELSCOPE_BASE_URL=https://api-inference.modelscope.cn/v1 # Optional: Custom endpoint
|
|
|
|
# ByteDance Doubao Configuration (via Volcengine)
|
|
# DOUBAO_API_KEY=your-doubao-api-key
|
|
# DOUBAO_BASE_URL=https://ark.cn-beijing.volces.com/api/v3 # ByteDance Volcengine endpoint
|
|
|
|
# Vercel AI Gateway Configuration
|
|
# Get your API key from: https://vercel.com/ai-gateway
|
|
# Model format: "provider/model" e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4-5"
|
|
# AI_GATEWAY_API_KEY=...
|
|
# AI_GATEWAY_BASE_URL=https://your-custom-gateway.com/v1/ai # Optional: Custom Gateway URL (for local dev or self-hosted Gateway)
|
|
# # If not set, uses Vercel default: https://ai-gateway.vercel.sh/v1/ai
|
|
|
|
# Langfuse Observability (Optional)
|
|
# Enable LLM tracing and analytics - https://langfuse.com
|
|
# LANGFUSE_PUBLIC_KEY=pk-lf-...
|
|
# LANGFUSE_SECRET_KEY=sk-lf-...
|
|
# LANGFUSE_BASEURL=https://cloud.langfuse.com # EU region, use https://us.cloud.langfuse.com for US
|
|
|
|
# Optional server-side multi-model configuration
|
|
# If set, points to a JSON file with server-provided models (see README for schema).
|
|
# Default: ./ai-models.json in project root
|
|
# AI_MODELS_CONFIG_PATH=/path/to/ai-models.json
|
|
|
|
# Temperature (Optional)
|
|
# Controls randomness in AI responses. Lower = more deterministic.
|
|
# Leave unset for models that don't support temperature (e.g., GPT-5.1 reasoning models).
|
|
# Claude 4.7 and later reject it; the request is then retried without it.
|
|
# TEMPERATURE=0
|
|
|
|
# Debug Logging (Optional)
|
|
# Log the structure of the messages each chat request sends to the model
|
|
# DEBUG_LLM_PAYLOAD=true
|
|
|
|
# Access Control (Optional)
|
|
# ACCESS_CODE_LIST=your-secret-code,another-code
|
|
|
|
# Admin Panel (Optional)
|
|
# Set a password to enable the web admin panel at /admin, where most of the
|
|
# settings in this file can be edited at runtime (stored in data/settings.json,
|
|
# which takes precedence over environment variables).
|
|
# Leave unset to disable the admin panel entirely.
|
|
# ADMIN_PASSWORD=your-admin-password
|
|
# SETTINGS_FILE=./data/settings.json # Optional: custom settings file location
|
|
|
|
# Quota & Validation (Optional, also editable in the admin panel)
|
|
# Quota enforcement is disabled unless DYNAMODB_QUOTA_TABLE is set.
|
|
# DYNAMODB_QUOTA_TABLE=next-ai-draw-io-quota # DynamoDB table that stores the per-IP counters
|
|
# DYNAMODB_REGION=ap-northeast-1 # Region of the table
|
|
# QUOTA_TIMEZONE=UTC # Timezone for the daily reset boundary
|
|
# DAILY_REQUEST_LIMIT=10 # Requests per IP per day
|
|
# DAILY_TOKEN_LIMIT=200000 # Tokens per IP per day
|
|
# TPM_LIMIT=20000 # Tokens per minute
|
|
# ENABLE_VLM_VALIDATION=true # Visually validate generated diagrams with a vision model
|
|
# VALIDATION_MODEL= # Falls back to the default AI model when empty
|
|
# VALIDATION_TIMEOUT=30000 # Validation timeout in ms
|
|
|
|
# Draw.io Configuration (Optional)
|
|
# By default the app serves its own copy of draw.io from /drawio (downloaded into
|
|
# public/drawio by `npm run dev` / `npm run build`). Same origin is required for
|
|
# highlighting AI changes, asking about selected shapes and the custom toolbar.
|
|
# NEXT_PUBLIC_DRAWIO_BASE_URL=https://embed.diagrams.net # Optional: use an external draw.io instead
|
|
# With an external draw.io the app falls back to draw.io's own toolbar and those features are off.
|
|
|
|
# Subdirectory Deployment (Optional)
|
|
# For deploying to a subdirectory (e.g., https://example.com/nextaidrawio)
|
|
# Set this to your subdirectory path with leading slash (e.g., /nextaidrawio)
|
|
# Leave empty for root deployment (default)
|
|
# NEXT_PUBLIC_BASE_PATH=/nextaidrawio
|
|
|
|
# PDF Input Feature (Optional)
|
|
# PDF file upload to extract text and generate diagrams
|
|
# NEXT_PUBLIC_MAX_EXTRACTED_CHARS=150000 # Max characters for PDF/text extraction (default: 150000)
|
|
|
|
# Security Settings (Optional)
|
|
# Allow private/internal URLs for reverse proxy setups (default: true)
|
|
# Set to "false" to block private IPs, localhost, and internal hostnames
|
|
# ALLOW_PRIVATE_URLS=false
|
|
|
|
# Behind a CDN such as Cloudflare (Optional)
|
|
# The daily quota is counted per IP. By default the IP is the first
|
|
# X-Forwarded-For entry, which visitors can set to anything. Name the header
|
|
# your CDN fills with the visitor's real IP instead:
|
|
# CLIENT_IP_HEADER=cf-connecting-ip
|
|
# Then have the CDN add an X-Origin-Secret header with this value to every
|
|
# request. API calls without it get 403, so nobody can skip the CDN and fake
|
|
# the IP header above.
|
|
# ORIGIN_SECRET=a-long-random-string
|
|
|
|
# Self-hosted deployment (Optional)
|
|
# Self-hosted users may implement custom quota-management solutions,
|
|
# which triggers the client UI to display messages suggesting self-hosting or sponsorship.
|
|
# This switch allows self-hosted users to provide custom messages in response to a 429 code,
|
|
# in messageTokenSelfHosted, messageApiSelfHosted, and tipSelfHosted translation strings.
|
|
# It also turns off the MCP server advertisement in Settings > About.
|
|
# NEXT_PUBLIC_SELFHOSTED=true
|
|
|
|
# Analytics (Optional)
|
|
# Google Analytics measurement ID; nothing is loaded when unset
|
|
# NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
|
|
|
|
# Minimax Configuration (Optional)
|
|
# Get your API key from: https://platform.minimaxi.com/docs/guides/models-intro
|
|
# MINIMAX_API_KEY=your_minimax_api_key
|
|
# MINIMAX_BASE_URL=https://api.minimaxi.com/anthropic # Optional, default (China mainland)
|
|
|
|
# GLM Configuration (Optional)
|
|
# Get your API key from: https://open.bigmodel.cn/dev/api
|
|
# GLM_API_KEY=your_glm_api_key
|
|
# GLM_BASE_URL=https://open.bigmodel.cn/api/paas/v4 # Optional, default
|
|
|
|
# Qwen Configuration (Optional)
|
|
# Get your API key from: https://www.aliyun.com/product/bailian
|
|
# QWEN_API_KEY=your_qwen_api_key
|
|
# QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1 # Optional, default
|
|
|
|
# Kimi Configuration (Optional)
|
|
# Get your API key from: https://platform.moonshot.cn/
|
|
# KIMI_API_KEY=your_kimi_api_key
|
|
# KIMI_BASE_URL=https://api.moonshot.cn/v1 # Optional, default
|
|
|
|
# Qiniu Configuration (Optional)
|
|
# Get your API key from: https://www.qiniu.com/ai/models
|
|
# QINIU_API_KEY=your_qiniu_api_key
|
|
# QINIU_BASE_URL=https://api.qnaigc.com/v1 # Optional, default
|
|
|
|
# Novita AI Configuration (Optional)
|
|
# Get your API key from: https://novita.ai/dashboard/key
|
|
# NOVITA_API_KEY=your_novita_api_key
|
|
# NOVITA_BASE_URL=https://api.novita.ai/openai # Optional, default
|
|
|
|
# MiMo (Xiaomi) Configuration (Optional)
|
|
# Get your API key from: https://platform.xiaomimimo.com/
|
|
# MIMO_API_KEY=your_mimo_api_key
|
|
# MIMO_BASE_URL=https://api.xiaomimimo.com/v1 # Optional, default. Token Plan users: https://token-plan-cn.xiaomimimo.com/v1
|
|
|
|
# Atlas Cloud Configuration (Optional)
|
|
# Get your API key from: https://www.atlascloud.ai/console/api-keys
|
|
# ATLASCLOUD_API_KEY=your_atlascloud_api_key
|
|
# ATLASCLOUD_BASE_URL=https://api.atlascloud.ai/v1 # Optional, default. LLM chat endpoint; media generation uses a separate API.
|