{"record":{"id":"75aa642d20c2ebac","repo":"HumanSignal/label-studio","slug":"no-state-model-registered-for-entity-meta-model-75aa64","errorCode":null,"errorMessage":"No state model registered for {entity._meta.model_name} when getting states in time range","messagePattern":"No state model registered for (.+?) when getting states in time range","errorType":"exception","errorClass":"StateManagerError","httpStatus":null,"severity":"error","filePath":"label_studio/fsm/state_manager.py","lineNumber":465,"sourceCode":"\n    @classmethod\n    def get_states_in_time_range(\n        cls, entity: Model, start_time: datetime, end_time: Optional[datetime] = None\n    ) -> List[BaseState]:\n        \"\"\"\n        Get states within a time range using UUID7 time-based queries.\n\n        Args:\n            entity: Entity to get states for\n            start_time: Start of time range\n            end_time: End of time range (defaults to now)\n\n        Returns:\n            List of states within the time range\n        \"\"\"\n        state_model = get_state_model_for_entity(entity)\n        if not state_model:\n            raise StateManagerError(\n                f'No state model registered for {entity._meta.model_name} when getting states in time range'\n            )\n\n        return state_model.get_states_in_range(entity, start_time, end_time or datetime.now())\n\n    @classmethod\n    def invalidate_cache(cls, entity: Model):\n        \"\"\"Invalidate cached state for an entity\"\"\"\n        cache_key = cls.get_cache_key(entity)\n        fsm_cache = get_fsm_cache()\n        fsm_cache.delete(cache_key)\n        organization_id = CurrentContext.get_organization_id()\n        logger.info(\n            'FSM: Cache invalidated',\n            extra={\n                'event': 'fsm.cache_invalidated',\n                'entity_type': entity._meta.label_lower,\n                'entity_id': entity.pk,","sourceCodeStart":447,"sourceCodeEnd":483,"githubUrl":"https://github.com/HumanSignal/label-studio/blob/0b49e9b53917880baf1dd85d574fe5541a9aafb2/label_studio/fsm/state_manager.py#L447-L483","documentation":"StateManager.get_states_in_time_range raises StateManagerError when the entity's model has no FSM state model registered in the state model registry. The time-range query (UUID7-based) can only run against a registered state model, so without registration it refuses to proceed.","triggerScenarios":"Calling StateManager.get_states_in_time_range(entity, start, end) for a model type that was never passed to register_state_model (or on an unsaved/mock entity whose model_name has no registry entry).","commonSituations":"Developers add a new model but forget the state model registration in app initialization; tests call get_states_in_time_range on plain mock models (e.g. MagicMock) whose model_name isn't registered; typos in the registered model_name.","solutions":["Register a state model for the entity type via the FSM registry (register_state_model) before querying.","Confirm the entity is an actual Django model instance of the registered type, not a mock or unrelated model.","If the entity should not have FSM states, guard the call: only query time ranges for entity types known to have state models.","Check get_state_model_for_entity / the registry setup at app startup for typos or missing imports that prevent registration."],"exampleFix":"// before\nstates = StateManager.get_states_in_time_range(some_model, start, end)\n# after\nfrom label_studio.fsm.state_registry import get_state_model_for_entity\nif get_state_model_for_entity(some_model):\n    states = StateManager.get_states_in_time_range(some_model, start, end)","handlingStrategy":"validation","validationCode":"from label_studio.fsm.state_registry import get_state_model_for_entity\nif not get_state_model_for_entity(entity):\n    raise LookupError(f'No FSM state model for {entity._meta.model_name}; register it before querying history')","typeGuard":"def has_state_model(entity) -> bool:\n    return get_state_model_for_entity(entity) is not None","tryCatchPattern":"try:\n    states = StateManager.get_states_in_time_range(entity, start, end)\nexcept StateManagerError as e:\n    logger.warning('FSM time-range query unavailable: %s', e)\n    states = []","preventionTips":["Register every entity's state model in the app's ready()/startup module.","Add a startup assertion that iterates expected models and verifies registration.","Never pass mock/unsaved models into StateManager classmethods in tests."],"tags":["fsm","state-management","configuration"],"backgroundTag":"unregistered-state-model","analyzedSha":"0b49e9b53917880baf1dd85d574fe5541a9aafb2","analyzedAt":"2026-08-29T00:39:52.578Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}