diff --git a/backend/server.py b/backend/server.py index b8c1931..024a370 100644 --- a/backend/server.py +++ b/backend/server.py @@ -1604,53 +1604,68 @@ def handle_agent_select_modify_delete_aspect_ws(data): def handle_set_agents_ws(data): """ WebSocket版本:设置智能体 - 保存到 user_agents 数据库表 + 保存到 user_agents 数据库表(可选) """ request_id = data.get('id') incoming_data = data.get('data', {}) global AgentBoard, AgentProfile_Dict, yaml_data + # 支持新格式:{ agents: [...], save_to_db: true/false } + # 兼容旧格式:直接是数组 [...] + if isinstance(incoming_data, dict): + agents_list = incoming_data.get('agents', incoming_data) + save_to_db = incoming_data.get('save_to_db', False) + else: + agents_list = incoming_data + save_to_db = False + try: - AgentBoard = incoming_data + # 无论是否保存到数据库,都需要设置全局变量 + AgentBoard = agents_list AgentProfile_Dict = {} - # 保存到数据库 - saved_agents = [] - with get_db_context() as db: - for item in AgentBoard: - name = item["Name"] - if all(item.get(field) for field in ["apiUrl", "apiKey", "apiModel"]): - agent_config = { - "profile": item["Profile"], - "Icon": item.get("Icon", ""), - "Classification": item.get("Classification", ""), - "apiUrl": item["apiUrl"], - "apiKey": item["apiKey"], - "apiModel": item["apiModel"], - "useCustomAPI": True - } - else: - agent_config = { - "profile": item["Profile"], - "Icon": item.get("Icon", ""), - "Classification": item.get("Classification", ""), - "apiUrl": yaml_data.get("OPENAI_API_BASE"), - "apiKey": yaml_data.get("OPENAI_API_KEY"), - "apiModel": yaml_data.get("OPENAI_API_MODEL"), - "useCustomAPI": False - } - AgentProfile_Dict[name] = agent_config + # 处理每个智能体配置 + for item in agents_list: + name = item["Name"] + if all(item.get(field) for field in ["apiUrl", "apiKey", "apiModel"]): + agent_config = { + "profile": item["Profile"], + "Icon": item.get("Icon", ""), + "Classification": item.get("Classification", ""), + "apiUrl": item["apiUrl"], + "apiKey": item["apiKey"], + "apiModel": item["apiModel"], + "useCustomAPI": True + } + else: + agent_config = { + "profile": item["Profile"], + "Icon": item.get("Icon", ""), + "Classification": item.get("Classification", ""), + "apiUrl": yaml_data.get("OPENAI_API_BASE"), + "apiKey": yaml_data.get("OPENAI_API_KEY"), + "apiModel": yaml_data.get("OPENAI_API_MODEL"), + "useCustomAPI": False + } + AgentProfile_Dict[name] = agent_config - # 保存到数据库(使用 upsert,相同 user_id + agent_name 则更新,否则创建) - user_id = item.get("user_id", "default_user") - agent = UserAgentCRUD.upsert( - db=db, - user_id=user_id, - agent_name=name, - agent_config=agent_config, - ) - saved_agents.append(agent.to_dict()) + # 保存到数据库(仅当 save_to_db 为 true 时) + saved_agents = [] + if save_to_db: + with get_db_context() as db: + for item in agents_list: + name = item["Name"] + agent_config = AgentProfile_Dict[name] + # 保存到数据库(使用 upsert,相同 user_id + agent_name 则更新,否则创建) + user_id = item.get("user_id", "default_user") + agent = UserAgentCRUD.upsert( + db=db, + user_id=user_id, + agent_name=name, + agent_config=agent_config, + ) + saved_agents.append(agent.to_dict()) # 返回结果 emit('response', { @@ -1697,6 +1712,11 @@ def handle_get_agents_ws(data): with get_db_context() as db: user_agents = UserAgentCRUD.get_by_user_id(db=db, user_id=user_id) + # 如果用户没有配置,回退到 default_user 的默认配置 + if not user_agents and user_id != 'default_user': + print(f"[get_agents] 用户 {user_id} 无配置,回退到 default_user") + user_agents = UserAgentCRUD.get_by_user_id(db=db, user_id='default_user') + # 转换为前端期望的格式 agents = [] for ua in user_agents: diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 17b0a83..0331c00 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -89,8 +89,16 @@ class Api { return `hsl(${h}, ${s}%, ${l}%)` } - setAgents = (data: Pick[]) => - websocket.send('set_agents', data) + setAgents = (data: Pick[], saveToDb = false) => { + const storedUserId = localStorage.getItem('user_id') + // 为每个智能体添加 user_id + const payload = data.map(agent => ({ + ...agent, + ...(storedUserId ? { user_id: storedUserId } : {}) + })) + // saveToDb 为 true 时才写入数据库 + return websocket.send('set_agents', { agents: payload, save_to_db: saveToDb }) + } getAgents = (user_id?: string) => { // 优先使用传入的 user_id,其次使用 localStorage 存储的,首次访问时不传 diff --git a/frontend/src/layout/components/Main/TaskTemplate/AgentRepo/index.vue b/frontend/src/layout/components/Main/TaskTemplate/AgentRepo/index.vue index 80ad221..9b47ddf 100644 --- a/frontend/src/layout/components/Main/TaskTemplate/AgentRepo/index.vue +++ b/frontend/src/layout/components/Main/TaskTemplate/AgentRepo/index.vue @@ -15,16 +15,21 @@ const agentsStore = useAgentsStore() // 如果agentsStore.agents不存在就读取默认配置的json文件 onMounted(async () => { - // 先调用 getAgents,检查是否需要生成 user_id + // 先调用 getAgents,获取用户的智能体配置(后端会自动回退到 default_user) const res = await api.getAgents() if (res && res.user_id) { console.log('[AgentRepo] 获取到 user_id:', res.user_id) } - if (!agentsStore.agents.length) { - const res = await readConfig('agent.json') - agentsStore.setAgents(res) + // 使用后端返回的智能体配置(数据库有就用数据库的,没有会用 default_user 的) + if (res && res.data && res.data.agents && res.data.agents.length > 0) { + agentsStore.setAgents(res.data.agents as Agent[]) + } else if (!agentsStore.agents.length) { + // 只有在完全没有数据时才使用默认 json + const defaultAgents = await readConfig('agent.json') + agentsStore.setAgents(defaultAgents) } + await api.setAgents( agentsStore.agents.map(item => pick(item, ['Name', 'Profile', 'Icon', 'Classification', 'apiUrl', 'apiKey', 'apiModel'])) ) @@ -98,9 +103,9 @@ const readFileContent = (file: File) => { })) agentsStore.setAgents(processedAgents) - // 调用API + // 调用API,saveToDb=true 表示写入数据库 api - .setAgents(processedAgents) + .setAgents(processedAgents, true) .then(() => { success('智能体上传成功') })