第26课:智能体选择功能
本课程聚焦智能体选择功能的前后端协同开发,涵盖四大核心模块:1)智能体管理,实现列表展示与详情查询;2)用户交互,支持智能体切换与偏好保存;3)计费系统,管理免费次数与积分消耗策略;4)前后端协同,确保数据一致性。课程提供完整的代码示例,包括前端React组件开发、后端Python接口实现及数据库设计,涉及智能体初始化、切换、计费扣减等关键业务流程。通过规范化API设计(RESTful)和异常处理
以下内容节选自我的实战课程《从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应用奠定坚实基础。
更多推荐
所有评论(0)