feat:智能体配置加载数据库默认配置
This commit is contained in:
@@ -1604,21 +1604,29 @@ def handle_agent_select_modify_delete_aspect_ws(data):
|
|||||||
def handle_set_agents_ws(data):
|
def handle_set_agents_ws(data):
|
||||||
"""
|
"""
|
||||||
WebSocket版本:设置智能体
|
WebSocket版本:设置智能体
|
||||||
保存到 user_agents 数据库表
|
保存到 user_agents 数据库表(可选)
|
||||||
"""
|
"""
|
||||||
request_id = data.get('id')
|
request_id = data.get('id')
|
||||||
incoming_data = data.get('data', {})
|
incoming_data = data.get('data', {})
|
||||||
|
|
||||||
global AgentBoard, AgentProfile_Dict, yaml_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:
|
try:
|
||||||
AgentBoard = incoming_data
|
# 无论是否保存到数据库,都需要设置全局变量
|
||||||
|
AgentBoard = agents_list
|
||||||
AgentProfile_Dict = {}
|
AgentProfile_Dict = {}
|
||||||
|
|
||||||
# 保存到数据库
|
# 处理每个智能体配置
|
||||||
saved_agents = []
|
for item in agents_list:
|
||||||
with get_db_context() as db:
|
|
||||||
for item in AgentBoard:
|
|
||||||
name = item["Name"]
|
name = item["Name"]
|
||||||
if all(item.get(field) for field in ["apiUrl", "apiKey", "apiModel"]):
|
if all(item.get(field) for field in ["apiUrl", "apiKey", "apiModel"]):
|
||||||
agent_config = {
|
agent_config = {
|
||||||
@@ -1642,6 +1650,13 @@ def handle_set_agents_ws(data):
|
|||||||
}
|
}
|
||||||
AgentProfile_Dict[name] = agent_config
|
AgentProfile_Dict[name] = agent_config
|
||||||
|
|
||||||
|
# 保存到数据库(仅当 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 则更新,否则创建)
|
# 保存到数据库(使用 upsert,相同 user_id + agent_name 则更新,否则创建)
|
||||||
user_id = item.get("user_id", "default_user")
|
user_id = item.get("user_id", "default_user")
|
||||||
agent = UserAgentCRUD.upsert(
|
agent = UserAgentCRUD.upsert(
|
||||||
@@ -1697,6 +1712,11 @@ def handle_get_agents_ws(data):
|
|||||||
with get_db_context() as db:
|
with get_db_context() as db:
|
||||||
user_agents = UserAgentCRUD.get_by_user_id(db=db, user_id=user_id)
|
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 = []
|
agents = []
|
||||||
for ua in user_agents:
|
for ua in user_agents:
|
||||||
|
|||||||
@@ -89,8 +89,16 @@ class Api {
|
|||||||
return `hsl(${h}, ${s}%, ${l}%)`
|
return `hsl(${h}, ${s}%, ${l}%)`
|
||||||
}
|
}
|
||||||
|
|
||||||
setAgents = (data: Pick<Agent, 'Name' | 'Profile' | 'apiUrl' | 'apiKey' | 'apiModel'>[]) =>
|
setAgents = (data: Pick<Agent, 'Name' | 'Profile' | 'apiUrl' | 'apiKey' | 'apiModel'>[], saveToDb = false) => {
|
||||||
websocket.send('set_agents', data)
|
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) => {
|
getAgents = (user_id?: string) => {
|
||||||
// 优先使用传入的 user_id,其次使用 localStorage 存储的,首次访问时不传
|
// 优先使用传入的 user_id,其次使用 localStorage 存储的,首次访问时不传
|
||||||
|
|||||||
@@ -15,16 +15,21 @@ const agentsStore = useAgentsStore()
|
|||||||
|
|
||||||
// 如果agentsStore.agents不存在就读取默认配置的json文件
|
// 如果agentsStore.agents不存在就读取默认配置的json文件
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
// 先调用 getAgents,检查是否需要生成 user_id
|
// 先调用 getAgents,获取用户的智能体配置(后端会自动回退到 default_user)
|
||||||
const res = await api.getAgents()
|
const res = await api.getAgents()
|
||||||
if (res && res.user_id) {
|
if (res && res.user_id) {
|
||||||
console.log('[AgentRepo] 获取到 user_id:', res.user_id)
|
console.log('[AgentRepo] 获取到 user_id:', res.user_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!agentsStore.agents.length) {
|
// 使用后端返回的智能体配置(数据库有就用数据库的,没有会用 default_user 的)
|
||||||
const res = await readConfig<Agent[]>('agent.json')
|
if (res && res.data && res.data.agents && res.data.agents.length > 0) {
|
||||||
agentsStore.setAgents(res)
|
agentsStore.setAgents(res.data.agents as Agent[])
|
||||||
|
} else if (!agentsStore.agents.length) {
|
||||||
|
// 只有在完全没有数据时才使用默认 json
|
||||||
|
const defaultAgents = await readConfig<Agent[]>('agent.json')
|
||||||
|
agentsStore.setAgents(defaultAgents)
|
||||||
}
|
}
|
||||||
|
|
||||||
await api.setAgents(
|
await api.setAgents(
|
||||||
agentsStore.agents.map(item => pick(item, ['Name', 'Profile', 'Icon', 'Classification', 'apiUrl', 'apiKey', 'apiModel']))
|
agentsStore.agents.map(item => pick(item, ['Name', 'Profile', 'Icon', 'Classification', 'apiUrl', 'apiKey', 'apiModel']))
|
||||||
)
|
)
|
||||||
@@ -98,9 +103,9 @@ const readFileContent = (file: File) => {
|
|||||||
}))
|
}))
|
||||||
agentsStore.setAgents(processedAgents)
|
agentsStore.setAgents(processedAgents)
|
||||||
|
|
||||||
// 调用API
|
// 调用API,saveToDb=true 表示写入数据库
|
||||||
api
|
api
|
||||||
.setAgents(processedAgents)
|
.setAgents(processedAgents, true)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
success('智能体上传成功')
|
success('智能体上传成功')
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user