{"record":{"id":"2591938584991544","repo":"BerriAI/litellm","slug":"invalid-fine-tuning-config-expected-a-list-is-not","errorCode":null,"errorMessage":"invalid fine_tuning config, expected a list is not a list","messagePattern":"invalid fine_tuning config, expected a list is not a list","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/proxy/fine_tuning_endpoints/endpoints.py","lineNumber":38,"sourceCode":"    validate_managed_id_requirement,\n)\nfrom litellm.proxy.utils import handle_exception_on_proxy\nfrom litellm.types.utils import LiteLLMFineTuningJob\n\nrouter: Final = APIRouter()\n\nfrom litellm.types.llms.openai import LiteLLMFineTuningJobCreate\n\nfine_tuning_config = None\n\n\ndef set_fine_tuning_config(config):\n    if config is None:\n        return\n\n    global fine_tuning_config\n    if not isinstance(config, list):\n        raise ValueError(\"invalid fine_tuning config, expected a list is not a list\")\n\n    for element in config:\n        if isinstance(element, dict):\n            for key, value in element.items():\n                if isinstance(value, str) and value.startswith(\"os.environ/\"):\n                    element[key] = litellm.get_secret(value)\n\n    fine_tuning_config = config\n\n\n# Function to search for specific custom_llm_provider and return its configuration\ndef get_fine_tuning_provider_config(\n    custom_llm_provider: str,\n):\n    global fine_tuning_config\n    if fine_tuning_config is None:\n        raise ValueError(\"fine_tuning_config is not set, set it on your config.yaml file.\")\n    for setting in fine_tuning_config:","sourceCodeStart":20,"sourceCodeEnd":56,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/proxy/fine_tuning_endpoints/endpoints.py#L20-L56","documentation":"Raised by set_fine_tuning_config at proxy startup when the fine_tuning_settings block in config.yaml is not a YAML list. Each list element is supposed to be a per-provider dict whose os.environ/ values are resolved into secrets; a mapping or scalar at the top level cannot represent per-provider settings, so config loading is rejected.","triggerScenarios":"Thrown at litellm/proxy/fine_tuning_endpoints/endpoints.py:38 when the library encounters an invalid state.","commonSituations":"fine_tuning_config in config.yaml is not a list (e.g. a dict or scalar).","solutions":["Define fine_tuning_config as a list in config.yaml."],"exampleFix":"fine_tuning_config:\n  - finetune_settings: {...}","handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}