# api-server 外部服务环境变量配置 2026-05-07 ## 背景 `server-rs/crates/api-server/src/config.rs` 统一收口 api-server 启动配置。外部服务分为两类: 1. 公共服务:阿里云、腾讯云、微信等对外公开且接口域名稳定的服务。 2. 非公共服务:团队自选模型网关、图片网关、视频模型、内部兼容服务等,URL 与模型名可能随部署、供应商或账号策略变化。 本次约定:公共服务 URL 可以保留代码默认值;非公共服务的 URL 与模型名必须通过环境变量提供,不再在 `config.rs` 写死具体模型名称或私有网关地址。 ## 公共服务默认值 以下默认值属于公共服务稳定接口,可继续保留在代码或示例环境中: ```text DASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/api/v1 ALIYUN_SMS_ENDPOINT=dypnsapi.aliyuncs.com WECHAT_AUTHORIZE_ENDPOINT=https://open.weixin.qq.com/connect/qrconnect WECHAT_ACCESS_TOKEN_ENDPOINT=https://api.weixin.qq.com/sns/oauth2/access_token WECHAT_USER_INFO_ENDPOINT=https://api.weixin.qq.com/sns/userinfo ``` 说明:DashScope 属于阿里云公开服务,基础 URL 可保留;具体图片模型名不属于稳定公共接口,必须由环境变量配置。 ## 非公共服务必配项 生产环境或真实联调使用到对应能力时,应显式配置以下变量: ```text # 文本 LLM 网关 GENARRATIVE_LLM_PROVIDER=openai-compatible GENARRATIVE_LLM_BASE_URL= GENARRATIVE_LLM_API_KEY= GENARRATIVE_LLM_MODEL= # APIMart / OpenAI 兼容 Responses 文本网关 APIMART_BASE_URL= APIMART_API_KEY= # VectorEngine / GPT-image-2 / Suno / Vidu 生成网关 VECTOR_ENGINE_BASE_URL=https://api.vectorengine.ai VECTOR_ENGINE_API_KEY= VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS=180000 VECTOR_ENGINE_AUDIO_REQUEST_TIMEOUT_MS=180000 # Hyper3D Rodin Gen-2 3D 模型生成 HYPER3D_BASE_URL=https://api.hyper3d.com/api/v2 HYPER3D_API_KEY= HYPER3D_MODEL_REQUEST_TIMEOUT_MS=180000 # 火山引擎豆包语音 ASR / TTS VOLCENGINE_SPEECH_API_KEY= VOLCENGINE_SPEECH_APP_ID= VOLCENGINE_SPEECH_ACCESS_KEY= VOLCENGINE_SPEECH_ASR_RESOURCE_ID=volc.seedasr.sauc.concurrent VOLCENGINE_SPEECH_TTS_RESOURCE_ID=seed-tts-2.0 VOLCENGINE_SPEECH_REQUEST_TIMEOUT_MS=180000 VOLCENGINE_SPEECH_ASR_WS_URL=wss://openspeech.bytedance.com/api/v3/sauc/bigmodel_async VOLCENGINE_SPEECH_TTS_BIDIRECTION_WS_URL=wss://openspeech.bytedance.com/api/v3/tts/bidirection VOLCENGINE_SPEECH_TTS_SSE_URL=https://openspeech.bytedance.com/api/v3/tts/unidirectional/sse # DashScope 图片模型名 DASHSCOPE_SCENE_IMAGE_MODEL= DASHSCOPE_REFERENCE_IMAGE_MODEL= DASHSCOPE_COVER_IMAGE_MODEL= # Ark / 角色视频模型网关 ARK_CHARACTER_VIDEO_BASE_URL= ARK_CHARACTER_VIDEO_API_KEY= ARK_CHARACTER_VIDEO_MODEL= ARK_CHARACTER_VIDEO_REQUEST_TIMEOUT_MS=420000 ``` ## 兼容变量 为降低部署切换成本,当前代码仍兼容部分历史变量: ```text GENARRATIVE_LLM_BASE_URL / LLM_BASE_URL GENARRATIVE_LLM_MODEL / LLM_MODEL / VITE_LLM_MODEL GENARRATIVE_LLM_API_KEY / LLM_API_KEY / ARK_API_KEY DASHSCOPE_SCENE_IMAGE_MODEL / DASHSCOPE_IMAGE_MODEL DASHSCOPE_REFERENCE_IMAGE_MODEL / DASHSCOPE_IMAGE_EDIT_MODEL DASHSCOPE_COVER_IMAGE_MODEL / DASHSCOPE_IMAGE_MODEL ARK_CHARACTER_VIDEO_BASE_URL / ARK_BASE_URL / GENARRATIVE_LLM_BASE_URL / LLM_BASE_URL ARK_CHARACTER_VIDEO_API_KEY / ARK_API_KEY / GENARRATIVE_LLM_API_KEY / LLM_API_KEY ARK_CHARACTER_VIDEO_MODEL / DASHSCOPE_CHARACTER_VIDEO_MODEL VOLCENGINE_SPEECH_API_KEY / VOLCENGINE_API_KEY VOLCENGINE_SPEECH_APP_ID / VOLCENGINE_ACCESS_KEY_ID VOLCENGINE_SPEECH_ACCESS_KEY / VOLCENGINE_SECRET_ACCESS_KEY HYPER3D_BASE_URL / RODIN_BASE_URL HYPER3D_API_KEY / RODIN_API_KEY HYPER3D_MODEL_REQUEST_TIMEOUT_MS / RODIN_MODEL_REQUEST_TIMEOUT_MS ``` ## 运行时行为 1. `AppConfig::default()` 不再包含具体非公共模型名或私有网关 URL。 2. `AppConfig::from_env()` 会从环境变量读取非公共模型名和 URL。 3. 文本 LLM provider 为 `ark` 且未配置 `GENARRATIVE_LLM_BASE_URL` 时,仍回退到 Ark 公开基础 URL。 4. 角色视频 provider 复用 Ark 且未配置 `ARK_CHARACTER_VIDEO_BASE_URL` 时,仍回退到 Ark 公开基础 URL。 5. 具体模型名缺失时不在配置层伪造默认模型,调用到对应能力时由下游配置校验返回缺配置错误。 6. VectorEngine 图片与音频生成只读取 `VECTOR_ENGINE_BASE_URL` / `VECTOR_ENGINE_API_KEY`,其中 GPT-image-2 图片生成额外读取 `VECTOR_ENGINE_IMAGE_REQUEST_TIMEOUT_MS`;不复用 `APIMART_*`、`GENARRATIVE_LLM_*` 或前端变量。 7. 火山引擎语音能力由 `platform-speech` 收口协议帧与上游鉴权,`api-server` 只暴露平台鉴权后的代理路由,不向前端返回任何密钥字段。 8. Hyper3D Rodin Gen-2 使用公开默认 `https://api.hyper3d.com/api/v2`,API Key 只读取 `HYPER3D_API_KEY` / `RODIN_API_KEY`,不复用文本 LLM、图片或音频网关密钥。 9. APIMart 当前只保留给创意 Agent 的 `gpt-5` Responses 文本/多模态理解链路;GPT-image-2 图片生成不得再读取 APIMart 配置。 10. 本地 `npm run api-server`、`npm run dev:rust` 与 `npm run dev` 的环境文件优先级固定为外层 shell 变量最高,其后 `.env`、`.env.local`、`.env.secrets.local` 逐层覆盖;真实密钥建议放在 `.env.secrets.local`,防止 `.env` 中的空示例值覆盖私密配置。 ## 示例文件 生产示例环境变量维护在: ```text deploy/env/api-server.env.example ``` 真实密钥、内部网关 URL 和具体模型名只应写入服务器 `/etc/genarrative/api-server.env` 或本地未提交的 `.env.local` / `.env.secrets.local`,不得提交到仓库。