参考

环境变量

Federation 常见环境变量。

变量用途
DOWNCITY_FEDERATION_ADMIN_SECRET_KEYAdmin City 管理 Federation
DOWNCITY_FEDERATION_TOKEN_SIGNING_KEYFederation 内部签发和校验 user_token
DOWNCITY_CITY_DATABASE_URL可选。指定 Federation 使用的数据库 URL
OPENAI_API_KEY示例 provider key,建议通过 Admin env 写入 Federation 数据库
OPENAI_BASE_URL示例 provider base URL,建议通过 Admin env 写入 Federation 数据库

DOWNCITY_FEDERATION_ADMIN_SECRET_KEYDOWNCITY_FEDERATION_TOKEN_SIGNING_KEYBETTER_AUTH_SECRET 会在 Federation 首次启动时自动写入 Federation 数据库的 env 表。provider API key 也统一通过 Admin API 或 fed 的 admin workspace 写入同一张表。

DOWNCITY_CITY_DATABASE_URL 不填时,默认数据库路径是:

.base/downcity.sqlite

provider env 的使用方式

model handler 直接读取 ctx.env

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

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

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

  async text(ctx: Context): Promise<AIProviderChargedOutput<UIMessage>> {
    const apiKey = ctx.env("DEEPSEEK_API_KEY");
    const client = createOpenAICompatible({
      apiKey,
      baseURL: this.baseURL ?? "",
      name: "deepseek",
    });
    const result = await generateText({
      model: client.chat("deepseek-v4-flash"),
      prompt: ctx.input.prompt,
    });
    return buildAssistantMessage(result.text, ctx, { finishReason: "stop" });
  }
}

const deepseek = new DeepSeekProvider();

所以实际约束很简单:

  • env key 名称由你自己决定
  • 建议使用大写下划线命名
  • handler 里通过 ctx.env(key) 读取

写入数据库

可信后端可以用 Admin City 写入 provider key:

await admin.env.upsert({
  key: "DEEPSEEK_API_KEY",
  value: "sk-xxx",
});

这些值会保存到 Federation 数据库的 env 表。业务 Runtime 只从 Federation 自己的 env 表读取,不再回退到 .env 或进程环境变量。

详见 Provider 环境变量