平台专家与开发者专家切换机制

📋 概述

平台自建专家和开发者专家可以切换,但需要满足一定的条件和流程。本文档说明切换的可能性和实现方案。

🔄 切换方向

1. 平台专家 → 开发者专家

场景:平台希望将某个专家转为开发者专家,允许开发者获得收益分成。

步骤

  1. 在知识库索引中设置 developer_id
  2. 在专家索引中添加 developer_id 字段
  3. 设置市场配置(定价、收益分成等)
  4. 通过市场发布流程发布到市场
  5. 发布成功后,从平台索引中移除(可选)

注意事项

  • 需要指定开发者ID(developer_id
  • 需要设置定价和收益分成
  • 需要经过审核流程
  • 已购买的用户不受影响(如果已发布)

2. 开发者专家 → 平台专家

场景:平台希望将某个开发者专家收回为平台专家,免费提供给所有用户。

步骤

  1. 从市场系统(Redis)中移除专家
  2. 移除知识库索引中的 developer_id(设为 null
  3. 移除专家索引中的 developer_id 字段
  4. 添加到平台专家索引(knowledge_bases/experts/index.json
  5. 移除市场配置(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  # 是否从平台索引移除
}

实现步骤

  1. 创建切换服务

    # 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. 处理已购买用户
    
  2. 创建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
  • 未发布到市场

切换到完全开发者专家

  1. 设置 marketplace.published = true
  2. 通过 /api/market/publish 发布
  3. 审核通过后,从平台索引移除(可选)

切换回平台专家

  1. 移除 developer_id
  2. 移除 marketplace 配置
  3. 确保在平台索引中

🎯 推荐方案

短期:使用方案3(切换脚本)

  • 快速实现
  • 满足当前需求
  • 可以立即使用

长期:实现方案2(切换API)

  • 统一的切换流程
  • 更好的用户体验
  • 减少错误

📚 相关文档