以下内容节选自我的实战课程《从0到1教你搭建一个基于微信小程序的AI智能体应用平台》,课程包含详细代码和讲解,链接如下: https://edu.csdn.net/course/detail/40753

课程目标

本课程将实现智能体选择功能的前后端协同开发,包括智能体列表展示、切换机制、免费次数管理和计费策略。通过本课程学习,你将掌握:

  • 智能体管理:提供完整的智能体列表与详情展示
  • 用户交互:实现智能体切换与偏好保存功能
  • 计费系统:实现免费次数与计费策略的初始化和管理
  • 前后端协同:确保数据一致性和用户体验的流畅性

知识要点

核心配置

  • 配置来源:server/bots_config.json - 智能体配置文件
  • 数据结构:包含智能体ID、名称、能力描述、消耗积分等信息
  • 接口设计:RESTful API设计原则,支持CRUD操作

关键接口

  • POST /api/bot/initialize_free_uses - 初始化用户免费次数
  • GET /getBotIdInfo - 获取智能体详细信息
  • PUT /api/bot/switch - 切换当前智能体
  • GET /api/bot/list - 获取智能体列表

计费要素

  • cost:单次对话消耗的积分数量
  • free_uses:新用户免费使用次数
  • 积分余额:用户当前可用积分
  • 计费策略:免费次数用完后按次计费

前端开发任务

1. 智能体列表展示

// 智能体列表组件
const BotList = () => {
  const [bots, setBots] = useState([]);
  const [currentBot, setCurrentBot] = useState(null);
 
  // 获取智能体列表
  const fetchBotList = async () => {
    try {
      const response = await request.get('/api/bot/list');
      setBots(response.data);
    } catch (error) {
      console.error('获取智能体列表失败:', error);
    }
  };
 
  return (
    <div className="bot-list">
      {bots.map(bot => (
        <BotCard
          key={bot.id}
          bot={bot}
          isSelected={currentBot?.id === bot.id}
          onSelect={() => handleBotSelect(bot)}
        />
      ))}
    </div>
  );
};

2. 智能体切换功能

// 智能体切换逻辑
const handleBotSelect = async (bot) => {
  try {
    // 更新本地状态
    setCurrentBot(bot);
    localStorage.setItem('selectedBot', JSON.stringify(bot));
   
    // 同步到后端
    await request.put('/api/bot/switch', {
      botId: bot.id,
      userId: getCurrentUserId()
    });
   
    // 显示切换成功提示
    showToast('智能体切换成功');
  } catch (error) {
    console.error('智能体切换失败:', error);
    showToast('切换失败,请重试');
  }
};

3. 免费次数初始化

// 首次使用初始化
const initializeFreeUses = async (botId) => {
  try {
    const response = await request.post('/api/bot/initialize_free_uses', {
      botId: botId,
      userId: getCurrentUserId()
    });
   
    if (response.data.success) {
      updateUserFreeUses(botId, response.data.freeUses);
    }
  } catch (error) {
    console.error('初始化免费次数失败:', error);
  }
};

后端开发任务

1. 智能体配置管理

# 智能体配置服务
class BotConfigService:
    def __init__(self):
        self.config_file = 'server/bots_config.json'
        self.bots_config = self.load_config()
   
    def load_config(self):
        """加载智能体配置"""
        try:
            with open(self.config_file, 'r', encoding='utf-8') as f:
                return json.load(f)
        except FileNotFoundError:
            return self.get_default_config()
   
    def get_default_config(self):
        """获取默认配置"""
        return {
            "default_bot": {
                "id": "default",
                "name": "通用助手",
                "description": "通用AI助手",
                "cost": 1,
                "free_uses": 10
            }
        }
   
    def get_bot_list(self):
        """获取智能体列表"""
        return list(self.bots_config.values())
   
    def get_bot_info(self, bot_id):
        """获取智能体详情"""
        return self.bots_config.get(bot_id)

2. 免费次数管理

# 免费次数管理服务
class FreeUsesService:
    def __init__(self, db):
        self.db = db
   
    def initialize_free_uses(self, user_id, bot_id):
        """初始化用户免费次数"""
        try:
            # 检查是否已初始化
            existing = self.db.query(FreeUses).filter(
                FreeUses.user_id == user_id,
                FreeUses.bot_id == bot_id
            ).first()
           
            if existing:
                return {"success": True, "freeUses": existing.remaining_uses}
           
            # 获取智能体配置
            bot_config = BotConfigService().get_bot_info(bot_id)
            free_uses = bot_config.get('free_uses', 10)
           
            # 创建免费次数记录
            free_uses_record = FreeUses(
                user_id=user_id,
                bot_id=bot_id,
                total_uses=free_uses,
                remaining_uses=free_uses
            )
           
            self.db.add(free_uses_record)
            self.db.commit()
           
            return {"success": True, "freeUses": free_uses}
           
        except Exception as e:
            self.db.rollback()
            return {"success": False, "error": str(e)}
   
    def consume_use(self, user_id, bot_id):
        """消耗一次使用次数"""
        try:
            record = self.db.query(FreeUses).filter(
                FreeUses.user_id == user_id,
                FreeUses.bot_id == bot_id
            ).first()
           
            if not record or record.remaining_uses <= 0:
                return False
           
            record.remaining_uses -= 1
            self.db.commit()
            return True
           
        except Exception as e:
            self.db.rollback()
            return False

3. 智能体切换接口

# 智能体切换API
@app.route('/api/bot/switch', methods=['PUT'])
@token_required
def switch_bot(current_user):
    try:
        data = request.get_json()
        bot_id = data.get('bot_id')
       
        if not bot_id:
            return jsonify({'error': '缺少智能体ID'}), 400
       
        # 验证智能体是否存在
        bot_config = BotConfigService().get_bot_info(bot_id)
        if not bot_config:
            return jsonify({'error': '智能体不存在'}), 404
       
        # 更新用户当前智能体
        user = User.query.filter_by(username=current_user).first()
        user.current_bot_id = bot_id
        db.session.commit()
       
        # 初始化免费次数(如果未初始化)
        free_uses_service = FreeUsesService(db.session)
        free_uses_service.initialize_free_uses(user.id, bot_id)
       
        return jsonify({
            'success': True,
            'message': '智能体切换成功',
            'bot_info': bot_config
        }), 200
       
    except Exception as e:
        return jsonify({'error': str(e)}), 500

数据库设计

用户智能体关联表

CREATE TABLE user_bot_preferences (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    current_bot_id VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

免费次数记录表

CREATE TABLE free_uses (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    bot_id VARCHAR(50) NOT NULL,
    total_uses INT DEFAULT 10,
    remaining_uses INT DEFAULT 10,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY unique_user_bot (user_id, bot_id),
    FOREIGN KEY (user_id) REFERENCES users(id)
);

验收标准

功能验收

  • ✅ 能够正确加载和展示智能体列表
  • ✅ 智能体切换功能正常工作
  • ✅ 免费次数正确初始化和扣减
  • ✅ 切换后聊天使用正确的智能体配置
  • ✅ 用户偏好能够持久化保存

性能验收

  • ✅ 智能体列表加载时间 < 2秒
  • ✅ 智能体切换响应时间 < 1秒
  • ✅ 免费次数查询响应时间 < 500ms

异常处理验收

  • ✅ 网络异常时的降级处理
  • ✅ 智能体配置缺失时的默认处理
  • ✅ 数据库异常时的错误提示

总结

通过本课程的学习,你将掌握智能体选择功能的完整实现,包括前后端协同开发、数据库设计、异常处理等关键技能。这些知识将为构建更复杂的AI应用奠定坚实基础。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐