apps/server/docs/ai-context/data-model-and-state.md
这套服务端最关键的状态归属如下:
Postgres
Redis
如果要判断“改哪个地方才算真的改成功”,大多数场景答案都是 Postgres。
usersessionaccountverification来源文件:
src/schemas/accounts.ts说明:
better-auth 直接用这组表src/schemas/auth.ts 基本是重复副本,目前不是主要依赖入口characterscharacter_coversavatar_modelcharacter_capabilitiescharacter_i18ncharacter_promptsuser_character_likesuser_character_bookmarks来源文件:
src/schemas/characters.tssrc/schemas/user-character.ts说明:
characters 表上chatschat_membersmessagesmediastickerssticker_packs来源文件:
src/schemas/chats.ts说明:
messages.seq 是会话内顺序字段SELECT ... FOR UPDATE 锁 chat 以串行生成 seqsenderId 是宽松字段,不强制外键user_provider_configssystem_provider_configs来源文件:
src/schemas/providers.ts说明:
config 是 jsonbuser_fluxflux_transactionflux_transaction来源文件:
src/schemas/flux.tssrc/schemas/flux-transaction.tssrc/schemas/flux-transaction.ts职责边界:
user_flux
flux_transaction
flux_transaction
关键约束:
flux_transaction 对 (userId, requestId) 有部分唯一索引stripe_customerstripe_checkout_sessionstripe_subscriptionstripe_invoice来源文件:
src/schemas/stripe.ts说明:
billingService 写入 user_flux + flux_transactionfluxCredited 字段用于避免重复入账llm_request_log来源文件:
src/schemas/llm-request-log.ts说明:
createFluxService()负责:
user_flux不负责:
createBillingService()负责:
redis.set 更新 Flux 余额缓存这是所有 Flux 写路径应收敛到的中心。
createStripeService()负责:
不负责:
真正入账通过 billingService.creditFluxFromStripeCheckout() 或相关 credit 方法完成。
flux:<userId>写入来源:
fluxService.getFlux() cache miss 后回填billingService 余额事务提交后 best-effort redis.set 直接更新(API 进程内同步)config:<CONFIG_NAME>由 config-kv.ts 管理,支持:
FLUX_PACKAGES JSONchat:broadcast:<userId>billing-eventsbillingService 在事务中:
SELECT user_flux FOR UPDATE这保证同一用户余额更新是串行化的。
主要依赖:
stripe_checkout_session.fluxCreditedstripe_invoice.fluxCreditedflux_transaction(userId, requestId) 唯一约束request-log.ts 与 llm-request-log.ts 完全重叠,后者更像旧名残留。accounts.ts 与 auth.ts 也是重复 schema,后续如果做整理,应先统一真实使用入口再删副本。