Tinyship
Tinyship
 Tinyship
Tinyship
TinyShip 文档中心
TinyShip 用户指南快速开始基础配置
积分系统配置指南
存储服务配置验证码配置
用户指南

积分系统配置指南

配置积分消耗和充值功能

积分系统是为 AI 功能设计的按需付费模式,与传统订阅模式并行运行。用户可以选择订阅获得会员权益,或者购买积分按使用量付费。

前置条件:在配置积分系统之前,请先完成 支付配置 中的支付方式设置。

相关页面

页面路径说明
定价页/pricing购买积分入口
用户仪表盘/dashboard查看积分余额和消耗记录
AI 对话页/ai消耗积分的 AI 对话
图片生成页/image-generate消耗积分的图片生成
管理后台-积分/admin/credits管理员查看积分交易记录

积分系统概述

特性说明
付费模式一次性购买,按需消耗
支持的支付方式WeChat Pay、Stripe、Creem
消耗模式固定消耗 / 动态消耗(按 token)
与订阅关系并行运行,用户可同时拥有

积分计划配置

计划类型说明

积分计划使用 duration.type: 'credits' 来区分于订阅和单次付费计划:

type CreditPlan = {
  duration: { 
    type: 'credits';    // 标记为积分计划
    credits: number     // 充值获得的积分数量
  };
  stripePriceId?: string;    // Stripe 价格 ID
  creemProductId?: string;   // Creem 产品 ID
}

配置示例

在 config/payment.ts 中的 plans 添加积分充值计划:

// 基础积分包
credits100: {
  provider: 'stripe',
  id: 'credits100',
  amount: 10,
  currency: 'USD',
  duration: {
    type: 'credits',
    credits: 100
  },
  stripePriceId: 'price_xxx',
  i18n: {
    'en': {
      name: '100 Credits',
      description: 'Perfect for trying out AI features',
      duration: '100 credits',
      features: ['No expiration', 'Use anytime']
    },
    'zh-CN': {
      name: '100 积分',
      description: '适合体验 AI 功能',
      duration: '100 积分',
      features: ['永不过期', '随时使用']
    }
  }
},

// 包含赠送的积分包(推荐)
credits500: {
  provider: 'stripe',
  id: 'credits500',
  amount: 45,
  currency: 'USD',
  recommended: true,
  duration: {
    type: 'credits',
    credits: 550              // 500 + 50 赠送
  },
  stripePriceId: 'price_xxx',
  i18n: {
    'en': {
      name: '500 Credits + 50 Bonus',
      description: 'Best value for regular users',
      duration: '550 credits',
      features: ['10% bonus credits', 'No expiration']
    },
    'zh-CN': {
      name: '500 积分 + 50 赠送',
      description: '常规用户的最佳选择',
      duration: '550 积分',
      features: ['赠送10%积分', '永不过期']
    }
  }
},

// 大额积分包
credits1000: {
  provider: 'stripe',
  id: 'credits1000',
  amount: 80,
  currency: 'USD',
  duration: {
    type: 'credits',
    credits: 1200             // 1000 + 200 赠送
  },
  stripePriceId: 'price_xxx',
  i18n: {
    'en': {
      name: '1000 Credits + 200 Bonus',
      description: 'Best for power users',
      duration: '1200 credits',
      features: ['20% bonus credits', 'No expiration']
    },
    'zh-CN': {
      name: '1000 积分 + 200 赠送',
      description: '重度用户的超值选择',
      duration: '1200 积分',
      features: ['赠送20%积分', '永不过期']
    }
  }
}

⚡ 积分消耗配置

消耗模式

系统支持两种积分消耗模式:

模式说明适用场景
fixed每次操作消耗固定积分简单计费、图片生成
dynamic按实际 token 消耗计费AI 聊天、文本处理

在 config/credits.ts 中配置:

// config/credits.ts
export const creditsConfig = {
  // 消耗模式:'fixed' 或 'dynamic'
  consumptionMode: 'dynamic',
  
  /**
   * 固定消耗配置
   * 每个条目可以是:
   * - 数字: 所有操作统一消耗
   * - 对象: { default: number, models?: { modelName: number } }
   */
  fixedConsumption: {
    // AI 聊天 - 简单数字格式(所有模型统一消耗)
    aiChat: 1,
    
    // AI 图片生成 - 对象格式(按模型定价)
    // 模型名称全局唯一,无需按 provider 嵌套
    aiImage: {
      default: 10,
      models: {
        'qwen-image-max': 8,
        'qwen-image-plus': 5,
        'fal-ai/flux/schnell': 6,
        'dall-e-3': 15,
        'dall-e-2': 8,
      }
    },
  },
  
  // 动态消耗配置
  dynamicConsumption: {
    tokensPerCredit: 1000,  // 每 1000 token 消耗 1 积分
    
    // 不同 AI 模型的积分消耗乘数
    modelMultipliers: {
      'qwen-turbo': 0.5,      // 经济模型
      'qwen-plus': 1.0,       // 标准模型
      'qwen-max': 1.2,        // 高级模型
      'deepseek-chat': 0.8,
      'gpt-4': 2.0,           // GPT-4 双倍消耗
      'default': 1.0
    }
  }
}

模型乘数

不同 AI 模型的成本不同,可以通过乘数来调整积分消耗:

模型乘数说明
qwen-turbo1.0基础模型,标准消耗
qwen-plus1.2高级模型,+20% 消耗
qwen-max1.5最强模型,+50% 消耗
gpt-42.0GPT-4,双倍消耗
default1.0未配置模型的默认值

环境变量

# 积分消耗模式
CREDITS_CONSUMPTION_MODE=dynamic

# 固定消耗模式配置
CREDITS_FIXED_CHAT_COST=10

# 动态消耗模式配置
CREDITS_DYNAMIC_CHAT_COST_PER_KILO_TOKEN=1

# 模型乘数配置(可选)
CREDITS_QWEN_TURBO_MULTIPLIER=1.0
CREDITS_QWEN_PLUS_MULTIPLIER=1.2
CREDITS_QWEN_MAX_MULTIPLIER=1.5
CREDITS_GPT4_MULTIPLIER=2.0

🔌 API 端点

获取积分余额

GET /api/credits/balance

// 响应
{
  "balance": 450
}

获取交易记录

GET /api/credits/transactions?page=1&limit=10

// 响应
{
  "transactions": [
    {
      "id": "txn_xxx",
      "type": "consumption",
      "amount": "-5",
      "balanceAfter": "445",
      "description": "ai_chat",
      "metadata": {
        "model": "qwen-turbo",
        "tokens": 1500
      },
      "createdAt": "2024-01-15T10:30:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 25
  }
}

获取完整状态

GET /api/credits/status

// 响应
{
  "credits": {
    "balance": 450,
    "totalPurchased": 550,
    "totalConsumed": 100
  },
  "subscription": {
    "hasSubscription": false,
    "plan": null,
    "expiresAt": null
  }
}

🎯 适用场景

AI 聊天/对话

  • 用户购买积分后使用 AI 聊天功能
  • 按 token 消耗或固定消耗积分
  • 适合:ChatGPT 类应用、AI 助手等

AI 图片生成

  • 每次生成图片消耗固定积分
  • 不同模型/分辨率消耗不同积分
  • 适合:AI 绘画、图片编辑等

📄 文档处理

  • 文档翻译、摘要、分析等
  • 按文档大小或处理复杂度消耗
  • 适合:AI 翻译、文档助手等

🎵 音视频处理

  • 语音转文字、视频分析等
  • 按时长或文件大小消耗积分
  • 适合:转录服务、内容分析等

🛠️ 技术实现

核心模块

积分系统的核心实现位于 @libs/credits:

import { 
  creditService, 
  calculateCreditConsumption, 
  safeNumber, 
  TransactionTypeCode 
} from '@libs/credits';

// 获取余额
const balance = await creditService.getBalance(userId);

// 添加积分(支付成功后自动调用)
await creditService.addCredits({
  userId,
  amount: 100,
  description: TransactionTypeCode.PURCHASE,
  relatedOrderId: orderId
});

// 消耗积分
await creditService.consumeCredits({
  userId,
  amount: creditsToConsume,
  description: TransactionTypeCode.AI_CHAT,
  metadata: { model, tokens }
});

安全处理

使用 safeNumber 函数防止 NaN/Infinity 导致的数据问题:

import { safeNumber } from '@libs/credits';

const totalTokens = safeNumber(usageData.totalTokens); // 安全转换
const credits = calculateCreditConsumption({ totalTokens, model });

交易类型

const TransactionTypeCode = {
  AI_CHAT: 'ai_chat',
  IMAGE_GENERATION: 'image_generation',
  DOCUMENT_PROCESSING: 'document_processing',
  PURCHASE: 'purchase',
  BONUS: 'bonus',
  REFUND: 'refund',
  ADJUSTMENT: 'adjustment',
};

相关文档:

  • 支付配置指南 - 配置支付方式和订阅计划
  • 支付测试指南 - 本地开发测试和 Webhook 调试

支付测试指南

本地开发环境支付测试和 Webhook 调试

AI 功能配置

配置 AI 对话和图片生成功能

On this page

相关页面积分系统概述积分计划配置计划类型说明配置示例⚡ 积分消耗配置消耗模式模型乘数环境变量🔌 API 端点获取积分余额获取交易记录获取完整状态🎯 适用场景AI 聊天/对话AI 图片生成📄 文档处理🎵 音视频处理🛠️ 技术实现核心模块安全处理交易类型