{"record":{"id":"e77aacb9bc520bd4","repo":"BoundaryML/baml","slug":"error-while-parsing-call-function-args-e","errorCode":null,"errorMessage":"error while parsing call_function args:\n{e}","messagePattern":"error while parsing call_function args:\n(.+?)","errorType":"exception","errorClass":"SyntaxError","httpStatus":null,"severity":"error","filePath":"engine/language_client_ruby/ext/ruby_ffi/src/lib.rs","lineNumber":124,"sourceCode":"                .create_ctx_manager(BamlValue::String(\"ruby\".to_string()), None),\n        }\n    }\n\n    pub fn call_function(\n        ruby: &Ruby,\n        rb_self: &BamlRuntimeFfi,\n        function_name: String,\n        args: RHash,\n        ctx: &RuntimeContextManager,\n        type_registry: Option<&types::type_builder::TypeBuilder>,\n        client_registry: Option<&types::client_registry::ClientRegistry>,\n        collector: RArray,\n        env_vars: HashMap<String, String>,\n    ) -> Result<FunctionResult> {\n        let args = match ruby_to_json::RubyToJson::convert_hash_to_json(args) {\n            Ok(args) => args.into_iter().collect(),\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 mut collectors = Vec::new();\n        for i in collector.into_iter() {\n            collectors.push(<&Collector>::try_convert(i)?.inner.clone());\n        }\n\n        let retval = match rb_self.t.block_on(rb_self.inner.call_function(\n            function_name.clone(),\n            &args,\n            &ctx.inner,\n            type_registry.map(|t| &t.inner),\n            client_registry.map(|c| c.inner.borrow_mut()).as_deref(),\n            Some(collectors),","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/engine/language_client_ruby/ext/ruby_ffi/src/lib.rs#L106-L142","documentation":"Raised inside BAML's call_function when the Ruby keyword arguments hash cannot be converted to JSON for the function's parameters. RubyToJson::convert_hash_to_json fails on non-serializable values, and it raises a Ruby SyntaxError (not RuntimeError).","triggerScenarios":"Baml.call_function(name, args, ctx, env_vars, collectors) where args contains values that cannot become JSON: unsupported objects, Ruby symbols, custom classes without JSON representation, deeply nested unsupported types.","commonSituations":"Passing Date/Time objects instead of ISO strings; passing Ruby symbols; passing File/IO objects; passing structs or OpenStructs the converter doesn't handle; typos leading to nested unsupported values.","solutions":["Read the {e} detail to see which argument failed conversion.","Convert unsupported values to JSON-native types (String, Integer, Float, Hash, Array, nil, true/false) before calling.","Pass plain Hashes with string keys for nested structures.","Add explicit serialization (e.g. .to_s / .iso8601 / .to_h) for domain objects."],"exampleFix":"// before\nBaml.call_function('ExtractResume', { start_date: Date.today }, ctx, ENV)\n// after\nBaml.call_function('ExtractResume', { 'start_date' => Date.today.iso8601 }, ctx, ENV)","handlingStrategy":"validation","validationCode":"JSON_GENERABLE = [NilClass, TrueClass, FalseClass, Integer, Float, String, Array, Hash]\ndef ensure_jsonable(h)\n  h.each do |k, v|\n    raise TypeError, \"#{k} is not JSON-serializable\" unless JSON_GENERABLE.any? { |c| v.is_a?(c) }\n    ensure_jsonable(v) if v.is_a?(Hash)\n  end\nend","typeGuard":"def jsonable?(v)\n  [NilClass, TrueClass, FalseClass, Integer, Float, String].any? { |c| v.is_a?(c) } ||\n    (v.is_a?(Array) && v.all? { |x| jsonable?(x) }) ||\n    (v.is_a?(Hash) && v.values.all? { |x| jsonable?(x) })\nend","tryCatchPattern":"begin\n  res = Baml.call_function(fn, args, ctx, ENV.to_h)\nrescue SyntaxError => e\n  if e.message.include?('error while parsing call_function args')\n    logger.error(\"Bad args for #{fn}: #{e.message}\")\n  end\n  raise\nend","preventionTips":["Use string keys and JSON-native types in all function args.","Pre-serialize dates/times with iso8601 and structs with to_h.","Write a shared args-normalizer used by every BAML call site.","Add a before-call JSON.generate(args) smoke test in dev."],"tags":["arguments","serialization","json","ruby"],"backgroundTag":"invalid-argument-format","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}