场景指南
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。