{"record":{"id":"bf1bbac8caf341eb","repo":"microsoft/semantic-kernel","slug":"agent-with-type-type-already-exists-bf1bba","errorCode":null,"errorMessage":"Agent with type {type} already exists.","messagePattern":"Agent with type (.+?) already exists\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/semantic_kernel/agents/runtime/in_process/in_process_runtime.py","lineNumber":741,"sourceCode":"        return await (await self._get_agent(agent)).save_state()\n\n    async def agent_load_state(self, agent: AgentId, state: Mapping[str, Any]) -> None:\n        \"\"\"Load the state of a single agent.\"\"\"\n        await (await self._get_agent(agent)).load_state(state)\n\n    async def register_factory(\n        self,\n        type: str | AgentType,\n        agent_factory: Callable[[], T | Awaitable[T]],\n        *,\n        expected_class: type[T] | None = None,\n    ) -> AgentType:\n        \"\"\"Register a factory for creating agents.\"\"\"\n        if isinstance(type, str):\n            type = CoreAgentType(type)\n\n        if type.type in self._agent_factories:\n            raise ValueError(f\"Agent with type {type} already exists.\")\n\n        async def factory_wrapper() -> T:\n            maybe_agent_instance = agent_factory()\n            if inspect.isawaitable(maybe_agent_instance):\n                agent_instance = await maybe_agent_instance\n            else:\n                agent_instance = maybe_agent_instance\n\n            if expected_class is not None and type_func_alias(agent_instance) != expected_class:\n                raise ValueError(\"Factory registered using the wrong type.\")\n\n            return agent_instance\n\n        self._agent_factories[type.type] = factory_wrapper\n\n        return type\n\n    async def _invoke_agent_factory(","sourceCodeStart":723,"sourceCodeEnd":759,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/python/semantic_kernel/agents/runtime/in_process/in_process_runtime.py#L723-L759","documentation":"register_factory checks if the agent type string already exists in _agent_factories before registering. If a factory was already registered for that type, it raises ValueError. This prevents accidental shadowing of one factory by another.","triggerScenarios":"Calling register_factory('MyAgent', factory1) then register_factory('MyAgent', factory2) without the runtime being reset. Also occurs when the same registration code runs twice (e.g. in a test that doesn't tear down, or a module-level registration executed on import in a reload).","commonSituations":"Test suites that register factories in setUp without creating a fresh runtime. Application code that registers on every request or reconnect. Importing a module that performs registration at module level, twice (e.g. via test reload).","solutions":["Create a new InProcessRuntime instance for each test or session rather than re-registering on an existing one.","Check if the type is already registered before calling register_factory (though the runtime does not expose a public 'is_registered' check, you can track this in your own code).","Call runtime.stop() and create a fresh runtime if you need to re-register."],"exampleFix":"# before\nawait runtime.register_factory('my_agent', factory1)\nawait runtime.register_factory('my_agent', factory2)  # raises\n\n# after\nawait runtime.register_factory('my_agent', factory1)\n# To change factory, create a new runtime:\nruntime = InProcessRuntime()\nawait runtime.register_factory('my_agent', factory2)","handlingStrategy":"validation","validationCode":"# Track registered types in your own code\nregistered_types: set[str] = set()\nasync def safe_register_factory(runtime, type_name, factory, expected_class=None):\n    if type_name in registered_types:\n        return  # already registered, skip\n    await runtime.register_factory(type_name, factory, expected_class=expected_class)\n    registered_types.add(type_name)","typeGuard":"null","tryCatchPattern":"try:\n    await runtime.register_factory(type_name, factory)\nexcept ValueError:\n    pass  # already registered — acceptable in idempotent setup","preventionTips":["Create a fresh InProcessRuntime per test or per session.","Make registration idempotent by catching ValueError or tracking types yourself.","Avoid module-level registration that can run twice on reload."],"tags":["agent-runtime","registration","factory","duplicate","in-process-runtime","semantic-kernel"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}