diff --git a/app/infrastructure/seed.py b/app/infrastructure/seed.py index 19608c1..571a5b0 100644 --- a/app/infrastructure/seed.py +++ b/app/infrastructure/seed.py @@ -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: