平台专家与开发者专家切换机制
📋 概述
平台自建专家和开发者专家可以切换,但需要满足一定的条件和流程。本文档说明切换的可能性和实现方案。
🔄 切换方向
1. 平台专家 → 开发者专家
场景:平台希望将某个专家转为开发者专家,允许开发者获得收益分成。
步骤:
- 在知识库索引中设置
developer_id - 在专家索引中添加
developer_id字段 - 设置市场配置(定价、收益分成等)
- 通过市场发布流程发布到市场
- 发布成功后,从平台索引中移除(可选)
注意事项:
- 需要指定开发者ID(
developer_id) - 需要设置定价和收益分成
- 需要经过审核流程
- 已购买的用户不受影响(如果已发布)
2. 开发者专家 → 平台专家
场景:平台希望将某个开发者专家收回为平台专家,免费提供给所有用户。
步骤:
- 从市场系统(Redis)中移除专家
- 移除知识库索引中的
developer_id(设为null) - 移除专家索引中的
developer_id字段 - 添加到平台专家索引(
knowledge_bases/experts/index.json) - 移除市场配置(
marketplace字段)
注意事项:
- 需要处理已购买用户的退款或补偿
- 需要通知相关开发者
- 需要更新所有相关索引
💻 当前系统状态
已实现的功能
✅ 开发者专家发布流程:
/api/market/publish- 发布专家到市场- 审核流程(
PENDING_REVIEW → APPROVED → PUBLISHED) - 市场系统存储(Redis)
✅ 平台专家管理:
- 存储在
knowledge_bases/experts/index.json - 通过
UnifiedExpertPool加载和管理
未实现的功能
❌ 直接切换API:
- 没有一键切换的API端点
- 需要手动执行多个步骤
❌ 自动化切换流程:
- 没有自动化的切换脚本
- 需要手动操作多个文件
🛠️ 实现方案
方案1:手动切换(当前方式)
优点:
- 灵活,可以精确控制每个步骤
- 适合一次性操作
缺点:
- 容易出错
- 需要手动操作多个文件
- 没有统一的流程
示例:平台专家 → 开发者专家
# 1. 更新知识库索引
kb_index = load_kb_index()
kb = find_kb_by_id(kb_index, "psychotherapy_kb_001")
kb["developer_id"] = "mbe_developer"
save_kb_index(kb_index)
# 2. 更新专家索引
expert_index = load_expert_index()
expert = find_expert_by_id(expert_index, "psychotherapy_expert")
expert["developer_id"] = "mbe_developer"
expert["marketplace"] = {
"published": False,
"pricing": {...},
"revenue_share": {...}
}
save_expert_index(expert_index)
# 3. 发布到市场(通过API)
# POST /api/market/publish
# {
# "expert_id": "psychotherapy_expert",
# "category": "health",
# "tags": "心理咨询,情绪管理",
# "price_per_1k_tokens": 0.01
# }
# 4. 审核通过后,从平台索引移除(可选)
# 如果希望完全移到市场,可以从 index.json 中移除
方案2:创建切换API(推荐)
优点:
- 统一的切换流程
- 自动处理所有步骤
- 减少错误
缺点:
- 需要开发新功能
- 需要处理边界情况
API设计:
# POST /api/admin/experts/{expert_id}/switch-ownership
{
"target_type": "developer", # 或 "platform"
"developer_id": "mbe_developer", # 切换到开发者时必需
"pricing": {...}, # 切换到开发者时必需
"remove_from_platform": true # 是否从平台索引移除
}
实现步骤:
创建切换服务:
# src/services/expert_ownership_service.py class ExpertOwnershipService: async def switch_to_developer(self, expert_id, developer_id, pricing): # 1. 更新知识库 developer_id # 2. 更新专家 developer_id # 3. 设置市场配置 # 4. 发布到市场 # 5. 可选:从平台索引移除 async def switch_to_platform(self, expert_id): # 1. 从市场移除 # 2. 移除 developer_id # 3. 添加到平台索引 # 4. 处理已购买用户创建API端点:
# src/api/admin/expert_ownership.py @router.post("/api/admin/experts/{expert_id}/switch-ownership") async def switch_expert_ownership(expert_id: str, request: SwitchOwnershipRequest): service = get_expert_ownership_service() if request.target_type == "developer": await service.switch_to_developer(...) else: await service.switch_to_platform(...)
方案3:创建切换脚本(快速实现)
优点:
- 快速实现
- 可以立即使用
- 适合批量操作
缺点:
- 需要手动运行
- 不是API,不能通过Web界面操作
脚本示例:
# scripts/switch_expert_ownership.py
def switch_to_developer(expert_id, developer_id, pricing_config):
"""将平台专家切换为开发者专家"""
# 实现切换逻辑
pass
def switch_to_platform(expert_id):
"""将开发者专家切换为平台专家"""
# 实现切换逻辑
pass
⚠️ 注意事项
1. 数据一致性
- 确保知识库和专家的
developer_id一致 - 确保市场配置正确
- 确保索引文件同步更新
2. 用户影响
平台专家 → 开发者专家:
- 已使用该专家的用户需要购买
- 可能需要通知用户
- 考虑提供过渡期
开发者专家 → 平台专家:
- 已购买的用户需要退款或补偿
- 需要通知开发者
- 需要处理收益结算
3. 权限控制
- 只有管理员(
admin/super_admin)可以切换 - 需要审核流程(切换到开发者时)
- 需要记录操作日志
4. 状态管理
- 切换过程中专家可能暂时不可用
- 需要处理并发访问
- 需要回滚机制
📝 实际案例
心理治疗专家
当前状态:
- 已标记为开发者专家(
developer_id: "mbe_developer") - 仍在平台索引中(
marketplace.published = false) - 未发布到市场
切换到完全开发者专家:
- 设置
marketplace.published = true - 通过
/api/market/publish发布 - 审核通过后,从平台索引移除(可选)
切换回平台专家:
- 移除
developer_id - 移除
marketplace配置 - 确保在平台索引中
🎯 推荐方案
短期:使用方案3(切换脚本)
- 快速实现
- 满足当前需求
- 可以立即使用
长期:实现方案2(切换API)
- 统一的切换流程
- 更好的用户体验
- 减少错误