fix(db): AGENT_SEED 全局固定 id 种子冲突 — 智能体幂等播种
新增 _add_agent(按 (id,user_id,port) 已存在则跳过),base 路径/_ensure_extra_demo_users/ _ensure_port_agents 三处统一调用;修复多用户/多端口复用固定 agent id 触发唯一冲突。 验证:临时库 migrate+seed 完整通过且重跑幂等(pine 已灌入)。
This commit is contained in:
+18
-32
@@ -255,6 +255,20 @@ DEMO_USERS = [
|
||||
]
|
||||
|
||||
|
||||
async def _add_agent(session: AsyncSession, seed: dict, user_id: str, port: str | None, now: str) -> None:
|
||||
"""幂等播种单个智能体:按 (id,user_id,port) 已存在则跳过(修全局固定 id 多用户/端口填重)。"""
|
||||
key = (seed["id"], user_id, port)
|
||||
if await session.get(Agent, key) is not None:
|
||||
return
|
||||
session.add(
|
||||
Agent(id=seed["id"], user_id=user_id, port=port, name=seed["name"],
|
||||
description=seed["description"], language=seed.get("language", "zh"),
|
||||
model_name=seed.get("model_name", ""), deletable=seed.get("deletable", True),
|
||||
use_fixed_soul=seed.get("use_fixed_soul", False),
|
||||
created_at=now, updated_at=now)
|
||||
)
|
||||
|
||||
|
||||
async def seed_data(session: AsyncSession) -> None:
|
||||
"""幂等种子:仅当 roles 表为空时写入全部基础数据;身份与 OPC 业务始终补种。"""
|
||||
now = utcnow_iso()
|
||||
@@ -317,19 +331,9 @@ async def seed_data(session: AsyncSession) -> None:
|
||||
status="active", token_version=0, created_at=now, updated_at=now,
|
||||
)
|
||||
)
|
||||
# 为每个用户播种默认 + QA 智能体
|
||||
# 为每个用户播种默认 + QA 智能体(幂等按 (id,user_id,port=null) 防重)
|
||||
for seed in AGENT_SEED:
|
||||
session.add(
|
||||
Agent(
|
||||
id=seed["id"], user_id=uid, name=seed["name"],
|
||||
description=seed["description"],
|
||||
language=seed.get("language", "zh"),
|
||||
model_name=seed.get("model_name", ""),
|
||||
deletable=seed.get("deletable", True),
|
||||
use_fixed_soul=seed.get("use_fixed_soul", False),
|
||||
created_at=now, updated_at=now,
|
||||
)
|
||||
)
|
||||
await _add_agent(session, seed, uid, None, now)
|
||||
|
||||
await _seed_operator_business(session, now)
|
||||
await _seed_opc_business(session, now)
|
||||
@@ -989,15 +993,7 @@ async def _ensure_extra_demo_users(session: AsyncSession, now: str) -> None:
|
||||
)
|
||||
)
|
||||
for seed in AGENT_SEED:
|
||||
session.add(
|
||||
Agent(
|
||||
id=seed["id"], user_id=uid, name=seed["name"],
|
||||
description=seed["description"], language=seed.get("language", "zh"),
|
||||
model_name=seed.get("model_name", ""), deletable=seed.get("deletable", True),
|
||||
use_fixed_soul=seed.get("use_fixed_soul", False),
|
||||
created_at=now, updated_at=now,
|
||||
)
|
||||
)
|
||||
await _add_agent(session, seed, uid, None, now)
|
||||
|
||||
|
||||
async def _seed_ecosystem(session: AsyncSession, now: str) -> None:
|
||||
@@ -1049,17 +1045,7 @@ async def _ensure_port_agents(session: AsyncSession, now: str) -> None:
|
||||
(await session.execute(select(Agent.id).where(Agent.user_id == user_id, Agent.port == port))).scalars()
|
||||
)
|
||||
for seed in AGENT_SEED:
|
||||
if seed["id"] in existing_ids:
|
||||
continue # 已存在,跳过(幂等,避免 (id,user_id,port) 唯一冲突)
|
||||
session.add(
|
||||
Agent(
|
||||
id=seed["id"], user_id=user_id, port=port, name=seed["name"],
|
||||
description=seed["description"], language=seed.get("language", "zh"),
|
||||
model_name=seed.get("model_name", ""), deletable=seed.get("deletable", True),
|
||||
use_fixed_soul=seed.get("use_fixed_soul", False),
|
||||
created_at=now, updated_at=now,
|
||||
)
|
||||
)
|
||||
await _add_agent(session, seed, user_id, port, now)
|
||||
|
||||
|
||||
async def _seed_org_members(session: AsyncSession, now: str) -> None:
|
||||
|
||||
Reference in New Issue
Block a user