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:
Pine
2026-08-24 19:35:18 +08:00
parent 75caab4d39
commit c723675414
+18 -32
View File
@@ -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: