{"record":{"id":"f1f1b34f82a332e1","repo":"apache/beam","slug":"unknown-type-or-missing-provider-for-type-spec-type-for","errorCode":null,"errorMessage":"Unknown type or missing provider for type {spec[\"type\"]} for {identify_object(spec)}","messagePattern":"Unknown type or missing provider for type (.+?) for (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/yaml/yaml_transform.py","lineNumber":1331,"sourceCode":"def apply_phase(phase, spec):\n  spec = phase(spec)\n  if spec['type'] in {'composite', 'chain'} and 'transforms' in spec:\n    spec = dict(\n        spec, transforms=[apply_phase(phase, t) for t in spec['transforms']])\n  return spec\n\n\ndef preprocess(spec, verbose=False, known_transforms=None):\n  if verbose:\n    pprint.pprint(spec)\n\n  if known_transforms:\n    known_transforms = set(known_transforms).union(['chain', 'composite'])\n\n  def ensure_transforms_have_providers(spec):\n    if known_transforms:\n      if spec['type'] not in known_transforms:\n        raise ValueError(\n            'Unknown type or missing provider '\n            f'for type {spec[\"type\"]} for {identify_object(spec)}')\n    return spec\n\n  def preprocess_languages(spec):\n    if spec['type'] in ('AssignTimestamps',\n                        'Combine',\n                        'Filter',\n                        'MapToFields',\n                        'Partition'):\n      language = spec.get('config', {}).get('language', 'generic')\n      new_type = spec['type'] + '-' + language\n      if known_transforms and new_type not in known_transforms:\n        if language == 'generic':\n          raise ValueError(f'Missing language for {identify_object(spec)}')\n        else:\n          raise ValueError(\n              f'Unknown language {language} for {identify_object(spec)}')","sourceCodeStart":1313,"sourceCodeEnd":1349,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/yaml/yaml_transform.py#L1313-L1349","documentation":"During expansion, ensure_transforms_have_providers checks each transform's type against the set of known transforms (those with registered providers, plus 'chain' and 'composite'). An unknown type means either a typo or a valid type whose provider/plugin was not loaded, so expansion cannot proceed and this ValueError is raised.","triggerScenarios":"Calling the pipeline expansion path with known_transforms non-empty and a spec whose spec['type'] is not in that set — e.g. type: ReadFromCsv when no standard/provider for it is registered, or a custom transform provider not passed via providers.","commonSituations":"Typo in the transform type; using a premium/optional transform whose provider jar/plugin was not supplied; running with a Beam version lacking the transform; forgetting to pass --extraProviderConfig or the providers parameter.","solutions":["Check spelling of spec['type'] against the Beam YAML transform catalog.","Register or pass the required provider (e.g. via providers argument or provider config files) so the type becomes known.","Upgrade apache_beam to a version that includes the transform, or replace it with an equivalent built-in transform."],"exampleFix":"# before (no provider registered)\n- type: JdbcRead\n  config: {url: ..., driver_class_name: ...}\n# after (register provider / use standard transform)\n- type: ReadFromJdbc\n  config: {url: ..., driver_class_name: ...}\n# and run with the jdbc provider config supplied","handlingStrategy":"validation","validationCode":"def validate_types(spec, known):\n    for t in spec.get('transforms', []):\n        if t.get('type') not in known | {'chain', 'composite'}:\n            raise ValueError(f\"unknown transform type: {t.get('type')}\")","typeGuard":"def type_is_known(t, known):\n    return t.get('type') in known or t.get('type') in ('chain', 'composite')","tryCatchPattern":"try:\n    spec = expand_pipeline(spec, providers=providers)\nexcept ValueError as e:\n    if 'Unknown type or missing provider' in str(e):\n        raise SystemExit(f\"{e} — check spelling or register the provider\")\n    raise","preventionTips":["Verify each type against the Beam YAML transform catalog","Pass provider configs for custom/premium transforms","Pin a Beam version that includes all transforms you use"],"tags":["python","apache-beam","yaml","provider","unknown-type"],"backgroundTag":"unsupported-operation","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-15T02:17:10.978Z"}