{"record":{"id":"f1657afb7702424e","repo":"HumanSignal/label-studio","slug":"when-feature-flags-from-file-is-set-you-have-to","errorCode":null,"errorMessage":"When \"FEATURE_FLAGS_FROM_FILE\" is set, you have to specify a valid path for feature flags file, e.g.FEATURE_FLAGS_FILE=my_flags.yml","messagePattern":"When \"FEATURE_FLAGS_FROM_FILE\" is set, you have to specify a valid path for feature flags file, e\\.g\\.FEATURE_FLAGS_FILE=my_flags\\.yml","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"label_studio/core/feature_flags/base.py","lineNumber":34,"sourceCode":"\nlogger = logging.getLogger(__name__)\n\nget_user_repr = load_func(settings.FEATURE_FLAGS_GET_USER_REPR)\nget_user_repr_from_organization = load_func(settings.FEATURE_FLAGS_GET_USER_REPR_FROM_ORGANIZATION)\n\n\ndef get_feature_file_path():\n    package_name = 'label_studio' if settings.VERSION_EDITION == 'Community' else 'label_studio_enterprise'\n    if settings.FEATURE_FLAGS_FILE.startswith('/'):\n        return settings.FEATURE_FLAGS_FILE\n    else:\n        return find_node(package_name, settings.FEATURE_FLAGS_FILE, 'file')\n\n\nif settings.FEATURE_FLAGS_FROM_FILE:\n    # Feature flags from file\n    if not settings.FEATURE_FLAGS_FILE:\n        raise ValueError(\n            'When \"FEATURE_FLAGS_FROM_FILE\" is set, you have to specify a valid path for feature flags file, e.g.'\n            'FEATURE_FLAGS_FILE=my_flags.yml'\n        )\n\n    feature_flags_file = get_feature_file_path()\n\n    logger.info(f'Read flags from file {feature_flags_file}')\n    data_source = Files.new_data_source(paths=[feature_flags_file])\n    config = Config(\n        sdk_key=settings.FEATURE_FLAGS_API_KEY or 'whatever', update_processor_class=data_source, send_events=False\n    )\n    ldclient.set_config(config)\n    client = ldclient.get()\nelif settings.FEATURE_FLAGS_OFFLINE:\n    # On-prem usage, without feature flags file\n    ldclient.set_config(Config(settings.FEATURE_FLAGS_API_KEY or 'whatever', offline=True))\n    client = ldclient.get()\nelse:","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/HumanSignal/label-studio/blob/0b49e9b53917880baf1dd85d574fe5541a9aafb2/label_studio/core/feature_flags/base.py#L16-L52","documentation":"Label Studio raises this ValueError at startup when the FEATURE_FLAGS_FROM_FILE setting is truthy but FEATURE_FLAGS_FILE is empty or unset. The feature-flag loader needs a concrete file path to read flags from, and refuses to continue with a default. It is a fail-fast configuration sanity check in label_studio/core/feature_flags/base.py.","triggerScenarios":"Running Label Studio with env FEATURE_FLAGS_FROM_FILE set (truthy) while FEATURE_FLAGS_FILE is empty/unset; the check `if not settings.FEATURE_FLAGS_FILE` fires and ValueError is raised.","commonSituations":"Deployments enabling file-based feature flags (e.g. docker-compose with FEATURE_FLAGS_FROM_FILE=true) but forgetting to mount/copy the flags file or set FEATURE_FLAGS_FILE; renaming the env var or file without updating both settings; typos in the env var name.","solutions":["Set the FEATURE_FLAGS_FILE environment variable to a valid path to your flags file (e.g. FEATURE_FLAGS_FILE=my_flags.yml).","Ensure the file exists and is readable inside the container/pod (mount a volume or copy it into the image).","If you don't intend file-based flags, unset FEATURE_FLAGS_FROM_FILE (or set it to false/empty).","Verify the setting is picked up correctly — check for stray whitespace/typos in env config or values like '\"\"' that look set but are empty."],"exampleFix":"// before (docker-compose)\nenvironment:\n  - FEATURE_FLAGS_FROM_FILE=true\n// after\nenvironment:\n  - FEATURE_FLAGS_FROM_FILE=true\n  - FEATURE_FLAGS_FILE=/label_studio/my_flags.yml","handlingStrategy":"validation","validationCode":"import os\nif os.environ.get('FEATURE_FLAGS_FROM_FILE', '').lower() in ('1','true','yes','on') and not os.environ.get('FEATURE_FLAGS_FILE'):\n    raise SystemExit('FEATURE_FLAGS_FROM_FILE is set but FEATURE_FLAGS_FILE is missing')","typeGuard":"def has_feature_flags_file() -> bool:\n    return bool(getattr(settings, 'FEATURE_FLAGS_FILE', None))","tryCatchPattern":"try:\n    from core.feature_flags import flags\nexcept ValueError as e:\n    logger.error('Feature flags misconfigured: %s', e)\n    raise SystemExit(1)","preventionTips":["Always set FEATURE_FLAGS_FILE alongside FEATURE_FLAGS_FROM_FILE in deployment templates.","Add a startup healthcheck that fails fast on missing env vars.","Mount the flags file as a volume and verify it exists in entrypoint scripts.","Lint docker-compose/k8s env files for paired variables."],"tags":["configuration","environment-variables","feature-flags","startup"],"backgroundTag":"missing-env-var","analyzedSha":"0b49e9b53917880baf1dd85d574fe5541a9aafb2","analyzedAt":"2026-08-29T00:39:52.578Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}