参考
环境变量
Federation 常见环境变量。
| 变量 | 用途 |
|---|---|
DOWNCITY_FEDERATION_ADMIN_SECRET_KEY | Admin City 管理 Federation |
DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY | Federation 内部签发和校验 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_KEY、DOWNCITY_FEDERATION_TOKEN_SIGNING_KEY 和 BETTER_AUTH_SECRET 会在 Federation 首次启动时自动写入 Federation 数据库的 env 表。provider API key 也统一通过 Admin API 或 fed 的 admin workspace 写入同一张表。
DOWNCITY_CITY_DATABASE_URL 不填时,默认数据库路径是:
.base/downcity.sqliteprovider 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 环境变量。