{"record":{"id":"439c681bb09e6f67","repo":"zylon-ai/private-gpt","slug":"unknown-scheduler-chat-mode-mode","errorCode":null,"errorMessage":"Unknown scheduler.chat.mode: {mode}","messagePattern":"Unknown scheduler\\.chat\\.mode: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"private_gpt/components/streaming/tasks/chat_scheduler.py","lineNumber":65,"sourceCode":"    async def cancel(self, correlation_id: str) -> bool:\n        return await abort_chat_job(correlation_id=correlation_id)\n\n\nregister_chat_scheduler(\"local\", LocalChatScheduler)\nregister_chat_scheduler(\"arq\", ArqChatScheduler)\n\n\n@singleton\nclass ChatSchedulerFactory:\n    @inject\n    def __init__(self, settings: Settings, injector: Injector) -> None:\n        self._settings = settings\n        self._injector = injector\n        self._scheduler: BaseChatScheduler | None = None\n\n        mode = self._settings.scheduler.chat.mode\n        if mode not in _CHAT_SCHEDULERS:\n            raise ValueError(f\"Unknown scheduler.chat.mode: {mode}\")\n\n    def get(self) -> BaseChatScheduler:\n        if self._scheduler is None:\n            mode = self._settings.scheduler.chat.mode\n            provider = _CHAT_SCHEDULERS[mode]\n            self._scheduler = (\n                self._injector.get(provider)\n                if isinstance(provider, type)\n                else provider(self._injector)\n            )\n        return self._scheduler\n","sourceCodeStart":47,"sourceCodeEnd":77,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/streaming/tasks/chat_scheduler.py#L47-L77","documentation":"Raised by ChatSchedulerFactory.__init__ when settings.scheduler.chat.mode is not a key in the _CHAT_SCHEDULERS mapping. The factory validates the mode eagerly at injection time so a bad scheduler config aborts startup rather than failing later on first use. The invalid mode value is included in the message.","triggerScenarios":"Setting scheduler.chat.mode in settings.yaml to a string that is not one of the registered scheduler names; leftover config from an older version after the scheduler registry changed.","commonSituations":"Typos or casing differences (e.g. \"Simple\" vs the registered key); enabling an experimental scheduler whose extra/deps are documented elsewhere; config drift after upgrading.","solutions":["Set scheduler.chat.mode to a key present in _CHAT_SCHEDULERS (inspect private_gpt/components/streaming/tasks/chat_scheduler.py for the registered names)","Remove the setting entirely to fall back to the default mode if one applies","If adding a custom scheduler, register it in _CHAT_SCHEDULERS with the exact key you configure"],"exampleFix":"# before\nscheduler:\n  chat:\n    mode: batch   # not registered\n# after\nscheduler:\n  chat:\n    mode: sequential   # a key present in _CHAT_SCHEDULERS","handlingStrategy":"type-guard","validationCode":"from private_gpt.components.streaming.tasks.chat_scheduler import _CHAT_SCHEDULERS\n\nmode = settings.scheduler.chat.mode\nif mode not in _CHAT_SCHEDULERS:\n    raise ValueError(\n        f\"scheduler.chat.mode must be one of {sorted(_CHAT_SCHEDULERS)}, got {mode!r}\"\n    )","typeGuard":"def is_known_chat_mode(mode: str) -> bool:\n    from private_gpt.components.streaming.tasks.chat_scheduler import _CHAT_SCHEDULERS\n    return mode in _CHAT_SCHEDULERS","tryCatchPattern":null,"preventionTips":["Re-check valid scheduler modes after upgrading private-gpt","Validate settings in a startup smoke test before serving traffic"],"tags":["scheduler","configuration","unsupported-provider","startup"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}