{"record":{"id":"fdc8b4dc2fee16cb","repo":"BoundaryML/baml","slug":"invalid-provider-e","errorCode":null,"errorMessage":"Invalid provider: {e:?}","messagePattern":"Invalid provider: (.+?)","errorType":"exception","errorClass":"SyntaxError","httpStatus":null,"severity":"error","filePath":"engine/language_client_ruby/ext/ruby_ffi/src/types/client_registry.rs","lineNumber":41,"sourceCode":"    pub fn add_llm_client(ruby: &Ruby, rb_self: &Self, args: &[Value]) -> Result<()> {\n        let args = scan_args::<_, _, (), (), (), ()>(args)?;\n        let (name, provider, options): (String, String, RHash) = args.required;\n        let (retry_policy,): (Option<String>,) = args.optional;\n\n        let options = match ruby_to_json::RubyToJson::convert_hash_to_json(options) {\n            Ok(options) => options,\n            Err(e) => {\n                return Err(Error::new(\n                    ruby.exception_syntax_error(),\n                    format!(\"error while parsing call_function args:\\n{e}\"),\n                ));\n            }\n        };\n\n        let provider = match client_registry::ClientProvider::from_str(&provider) {\n            Ok(provider) => provider,\n            Err(e) => {\n                return Err(Error::new(\n                    ruby.exception_syntax_error(),\n                    format!(\"Invalid provider: {e:?}\"),\n                ));\n            }\n        };\n\n        let client_property =\n            client_registry::ClientProperty::new(name, provider, retry_policy, options);\n\n        rb_self.inner.borrow_mut().add_client(client_property);\n        Ok(())\n    }\n\n    pub fn set_primary(&self, primary: String) {\n        self.inner.borrow_mut().set_primary(primary);\n    }\n\n    pub fn define_in_ruby(module: &magnus::RModule) -> Result<()> {","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_ruby/ext/ruby_ffi/src/types/client_registry.rs#L23-L59","documentation":"A Ruby SyntaxError raised by ClientRegistry.add_llm_client when the provider string cannot be parsed into a ClientProvider via from_str. The parse error is debug-formatted into 'Invalid provider: {e:?}'. It means the provider name is not one BAML's registry recognizes.","triggerScenarios":"Calling add_llm_client (or with_client overrides) with a provider string that isn't a known ClientProvider — e.g. \"OpenAI\" (wrong case), \"openai-chat\" (wrong variant), or a typo like \"anthropicc\".","commonSituations":"Using the human model name (e.g. \"gpt-4o\") instead of the provider name (\"openai\"); capitalization mismatches; switching providers after a BAML version change that renamed or added provider variants; dynamically built provider strings from config.","solutions":["Use an exact, lowercase provider name BAML knows: \"openai\", \"anthropic\", \"aws\", \"google\", \"azure-openai\", etc.","Check the ClientProvider enum in your BAML version (baml-cli docs or generated Sorbet types) for valid values.","Ensure you are passing the provider, not the model name — the model goes in options['model'].","Trim whitespace/case-normalize the provider string built from config before calling.","Upgrade the baml gem if the provider you need is newer than your installed version."],"exampleFix":"// before\nregistry.add_llm_client(\"gpt\", \"GPT-4o\", { \"model\" => \"gpt-4o\" })\n\n// after\nregistry.add_llm_client(\"gpt\", \"openai\", { \"model\" => \"gpt-4o\" })","handlingStrategy":"validation","validationCode":"KNOWN_PROVIDERS = %w[openai anthropic aws google azure-openai]\nraise \"unknown provider #{provider}\" unless KNOWN_PROVIDERS.include?(provider.strip.downcase)","typeGuard":null,"tryCatchPattern":"begin\n  registry.add_llm_client(name, provider, options)\nrescue SyntaxError => e\n  raise ArgumentError, \"bad provider #{provider.inspect}: #{e.message}\" if e.message.start_with?('Invalid provider')\n  raise\nend","preventionTips":["Keep a whitelist constant of valid provider strings and validate against it.","Pass the provider name (lowercase), never the model name.","Normalize provider strings: provider.to_s.strip.downcase.","Regenerate client types after BAML upgrades in case provider enums changed."],"tags":["ruby","client-registry","provider","validation"],"backgroundTag":"invalid-enum-value","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}