场景指南

Provider 环境变量

如何在 Federation 运行环境中配置 Provider API Key。

所有 Provider 需要的 API Key 都通过 Federation 自己的 env 表统一管理。

声明环境变量

Provider 构造时声明:

import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { Provider, type OpenAICompatibleClientConfig } from "@downcity/city";

class DeepSeekProvider extends Provider {
  constructor() {
    super({
      id: "deepseek",
      env: { DEEPSEEK_API_KEY: "DeepSeek API Key" },
      baseURL: "https://api.deepseek.com",
      envKey: "DEEPSEEK_API_KEY",
    });
  }

  protected createClient({ apiKey, baseURL }: OpenAICompatibleClientConfig) {
    return createOpenAICompatible({ apiKey, baseURL, name: "deepseek" });
  }
}

const deepseek = new DeepSeekProvider();

env 字段声明环境变量需求(key → 描述),envKey 指定自动透传时读取的 key。

设置环境变量

通过 Admin API 写入:

curl -X POST http://127.0.0.1:43127/v1/env/upsert \
  -H "Authorization: Bearer <admin_secret_key>" \
  -H "Content-Type: application/json" \
  -d '{"key": "DEEPSEEK_API_KEY", "value": "sk-xxx"}'

或批量导入 .env 文件:

curl -X POST http://127.0.0.1:43127/v1/env/import \
  -H "Authorization: Bearer <admin_secret_key>" \
  -H "Content-Type: application/json" \
  -d '{"raw": "DEEPSEEK_API_KEY=sk-xxx\nOPENAI_API_KEY=sk-yyy"}'

在 handler 中读取

import { readRequiredEnv, type Context } from "@downcity/city";

async text(ctx: Context) {
  const apiKey = ctx.env("DEEPSEEK_API_KEY");
  // 或使用 readRequiredEnv 辅助函数(找不到时抛错)
  const apiKey2 = readRequiredEnv(ctx, "DEEPSEEK_API_KEY");
}

ctx.env(key) 从 Federation 当前运行时绑定的 env 表读取。AIService 的自动透传 handler 也通过 ctx.env(envKey) 读取 API Key。

详见 HTTP API - env 管理