apps/server/docs/ai-context/config-and-naming-conventions.md
这篇文档收口三类容易逐步漂移的约定:
configKV 的默认值和读取语义这些约定不是“代码风格建议”,而是为了减少:
configKV 约定src/services/config-kv.ts 中的 ConfigEntrySchemas 是以下三件事的单一真相源:
这意味着:
ConfigEntrySchemas?? defaultValueconfigKV.get() / configKV.getOrThrow() 应直接依赖 schema 默认值getOptional(key)
nullgetOrThrow(key)
CONFIG_NOT_SETget(key)
getOrThrow(key) 的别名getOptional 增加调用点默认值参数,例如 getOptional(key, fallback)configKV 直接从 Redis 读配置推荐:
const fluxPer1kTokens = await configKV.get('FLUX_PER_1K_TOKENS')
const maxCheckoutAmount = await configKV.get('MAX_CHECKOUT_AMOUNT_CENTS')
不推荐:
const fluxPer1kTokens = (await configKV.getOptional('FLUX_PER_1K_TOKENS')) ?? 1
const maxCheckoutAmount = (await configKV.getOptional('MAX_CHECKOUT_AMOUNT_CENTS')) ?? 1_000_000
Redis key 和 channel 统一采用“分段命名”,推荐使用冒号 : 作为分隔符:
{scope}:{id}:{resource}
{scope}:{id}:{subscope}:{subid}:{resource}
lock:{domain}:{id}
config:{key}
推荐例子:
user:{userId}:flux
config:{key}
chat:{userId}:broadcast
lock:user:{userId}:flux
不推荐例子:
flux:{userId}
chat:broadcast:{userId}
userFlux:{userId}
userUidFlux1
1、2 这种占位编号如果要在文档中表示“这个 key 有几个参数位”,可以用编号描述模板:
userUserId1FluxconfigKey1lockDomain1Id1但最终真实 key 仍然必须是:
user:{userId}:flux
config:{key}
lock:{domain}:{id}
me推荐:
/api/v1/flux
/api/v1/flux/history
不推荐:
/api/user/flux
/api/flux
如果某类 HTTP API 需要长期稳定对外契约,优先在一个明确子树下版本化,例如:
/api/v1/...
/api/v1/openai/...
不要让“部分资源版本化、部分资源裸挂”长期并存而没有说明。
apps/server 中现有 Redis key / channel 继续向 helper 收口,避免业务代码里散落模板字符串。configKV 增补一份“哪些配置属于 infra、哪些属于运营策略”的清单,避免继续模糊放置位置。configKV.getOptional(...) ?? defaultValue 模式清理掉,默认值统一回到 ConfigEntrySchemas。/api/v1/* 版本树,还是为兼容 API 与业务 API 引入更明确的子域分隔。