{"record":{"id":"7d327c8291be2536","repo":"apache/beam","slug":"missing-required-in-provider-at-line-safelineloader-get-line","errorCode":null,"errorMessage":"Missing {required} in provider at line {SafeLineLoader.get_line(spec)}","messagePattern":"Missing (.+?) in provider at line (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_provider.py","lineNumber":266,"sourceCode":"          self._service,\n          rearrange_based_on_discovery=True,\n          managed_replacement=managed_replacement,\n          **args)\n    else:\n      return type >> self.create_external_transform(urn, args)\n\n  def create_external_transform(self, urn, args):\n    return external.ExternalTransform(\n        urn,\n        external.ImplicitSchemaPayloadBuilder(args).payload(),\n        self._service)\n\n  @classmethod\n  def provider_from_spec(cls, source_path, spec):\n    from apache_beam.yaml.yaml_transform import SafeLineLoader\n    for required in ('type', 'transforms'):\n      if required not in spec:\n        raise ValueError(\n            f'Missing {required} in provider '\n            f'at line {SafeLineLoader.get_line(spec)}')\n    urns = SafeLineLoader.strip_metadata(spec['transforms'])\n    type = spec['type']\n    config = SafeLineLoader.strip_metadata(spec.get('config', {}))\n    extra_params = set(SafeLineLoader.strip_metadata(spec).keys()) - {\n        'transforms', 'type', 'config'\n    }\n    if extra_params:\n      raise ValueError(\n          f'Unexpected parameters in provider of type {type} '\n          f'at line {SafeLineLoader.get_line(spec)}: {extra_params}')\n    if config.get('version', None) == 'BEAM_VERSION':\n      config['version'] = beam_version\n    if type in cls._provider_types:\n      try:\n        constructor = cls._provider_types[type]\n        if 'provider_base_path' in inspect.signature(constructor).parameters:","sourceCodeStart":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_provider.py#L248-L284","documentation":"ExternalProvider.provider_from_spec (yaml_provider.py:266) validates that every provider spec has both 'type' and 'transforms' keys before dispatching to a registered provider constructor. If either is missing it raises a ValueError naming the offending key and the YAML line.","triggerScenarios":"A provider block in a YAML pipeline (or included spec) like {config: ...} without 'type', or a typed provider without the 'transforms' mapping, parsed via provider_from_spec.","commonSituations":"Hand-written YAML provider sections with indentation mistakes that drop a key; copying a provider template and deleting the transforms section; YAML anchors merging away 'type'.","solutions":["Add the missing key ('type' or 'transforms') to the provider spec at the reported line.","Check indentation so the keys are siblings at the provider level, not nested under config.","Validate the spec with a YAML linter / schema check before running the pipeline."],"exampleFix":"# before\nproviders:\n  - transforms:\n      MyTransform: ...\n# after\nproviders:\n  - type: python\n    transforms:\n      MyTransform: ...","handlingStrategy":"validation","validationCode":"def validate_provider_spec(spec):\n    missing = [k for k in ('type', 'transforms') if k not in spec]\n    if missing:\n        raise SystemExit(f'provider spec missing keys: {missing}')","typeGuard":"def is_valid_provider_spec(spec) -> bool:\n    return isinstance(spec, dict) and 'type' in spec and 'transforms' in spec","tryCatchPattern":"try:\n    provider = ExternalProvider.provider_from_spec(src, spec)\nexcept ValueError as e:\n    raise SpecError(f'Bad provider spec: {e}') from e","preventionTips":["Validate YAML provider specs against the Beam schema in CI.","Keep 'type' and 'transforms' at the same indentation level as 'config'.","Avoid YAML anchors/merges that can silently drop keys."],"tags":["python","apache-beam","yaml","provider","validation"],"backgroundTag":"missing-required-config-field","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}