Raypx

@raypx/billing

免费版和专业版的套餐限额与计费逻辑。

@raypx/billing 定义了免费版和专业版的套餐限额,提供用量检查函数,用于在 RPC 层和中间件中实施配额控制。

计划层级

层级说明
free免费版
pro专业版
import type { PlanTier } from "@raypx/billing"

type PlanTier = "free" | "pro"

限额定义

限额项免费版专业版
每月 AI Token 数25,000250,000
每月 AI 请求次数1002,000
最大文档数量252,000
单文件最大大小2 MB25 MB

PlanLimits 类型

interface PlanLimits {
  monthlyAiTokens: number    // 每月 AI Token 配额
  monthlyAiRequests: number  // 每月 AI 请求配额
  maxDocuments: number       // 最大文档数
  maxFileSizeBytes: number   // 单文件最大字节数
}

核心函数

getPlanLimits()

获取指定计划的限额配置。

import { getPlanLimits } from "@raypx/billing"

const limits = getPlanLimits("free")
// { monthlyAiTokens: 25000, monthlyAiRequests: 100, maxDocuments: 25, maxFileSizeBytes: 2097152 }

resolvePlanTier()

安全地将字符串解析为计划层级,无效值默认返回 "free"

import { resolvePlanTier } from "@raypx/billing"

resolvePlanTier("pro")    // "pro"
resolvePlanTier("free")   // "free"
resolvePlanTier("invalid") // "free"
resolvePlanTier(null)     // "free"

getDefaultUsageSnapshot()

获取初始化的用量快照,所有计数器归零。

import { getDefaultUsageSnapshot } from "@raypx/billing"

const snapshot = getDefaultUsageSnapshot()
// { aiTokens: 0, aiRequests: 0, documents: 0 }

canUseAi()

检查用户是否可以在当前用量下使用 AI 功能。

import { canUseAi } from "@raypx/billing"

const result = canUseAi(
  { aiTokens: 24000, aiRequests: 99, documents: 5 },
  "free",
  500, // 请求使用的 Token 数
)

if (!result.allowed) {
  // result.reason: "monthly_ai_tokens" | "monthly_ai_requests"
}

检查顺序:

  1. 请求次数是否超出月度限额
  2. Token 总量是否超出月度限额

canUploadDocument()

检查用户是否可以上传新文档。

import { canUploadDocument } from "@raypx/billing"

const result = canUploadDocument(
  { aiTokens: 1000, aiRequests: 10, documents: 24 },
  "free",
  1024 * 1024, // 文件大小 1MB
)

if (!result.allowed) {
  // result.reason: "max_documents" | "max_file_size"
}

检查顺序:

  1. 文档数量是否超出上限
  2. 单文件大小是否超出上限

UsageAllowanceResult

所有用量检查函数返回统一的结果类型:

interface UsageAllowanceResult {
  allowed: boolean
  reason?: "monthly_ai_tokens" | "monthly_ai_requests" | "max_documents" | "max_file_size"
}

在 RPC 中的使用

通常在 protectedProcedure 的中间件或 handler 中调用用量检查:

import { canUseAi } from "@raypx/billing"

const chatHandler = protectedProcedure.handler(async ({ context, input }) => {
  const result = canUseAi(userSnapshot, user.plan, estimatedTokens)
  if (!result.allowed) {
    throw new Error(`Usage limit exceeded: ${result.reason}`)
  }
  // ... 执行 AI 请求
})

类型导出

import type {
  PlanTier,
  PlanLimits,
  UsageSnapshot,
  UsageAllowanceResult,
} from "@raypx/billing"

On this page