{"record":{"id":"8f9f41109d0c1ff5","repo":"OpenBMB/ChatDev","slug":"invalid-function-calling-configuration-payload","errorCode":null,"errorMessage":"Invalid function calling configuration payload","messagePattern":"Invalid function calling configuration payload","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"runtime/node/agent/providers/gemini_provider.py","lineNumber":665,"sourceCode":"\n    def _coerce_tool_config(self, payload: Any) -> genai_types.ToolConfig:\n        if isinstance(payload, genai_types.ToolConfig):\n            return payload\n        kwargs: Dict[str, Any] = {}\n        if isinstance(payload, dict):\n            fn_payload = payload.get(\"function_calling_config\")\n            if fn_payload:\n                kwargs[\"function_calling_config\"] = self._coerce_function_calling_config(fn_payload)\n        return genai_types.ToolConfig(**kwargs)\n\n    def _coerce_function_calling_config(self, payload: Any) -> genai_types.FunctionCallingConfig:\n        if isinstance(payload, genai_types.FunctionCallingConfig):\n            return payload\n        if isinstance(payload, str):\n            return genai_types.FunctionCallingConfig(mode=payload)\n        if isinstance(payload, dict):\n            return genai_types.FunctionCallingConfig(**payload)\n        raise ValueError(\"Invalid function calling configuration payload\")\n\n    def _coerce_automatic_function_calling(self, payload: Any) -> Any:\n        config_cls = getattr(genai_types, \"AutomaticFunctionCallingConfig\", None)\n        if config_cls is None:\n            raise ValueError(\"Automatic function calling config not supported in current SDK version\")\n        if isinstance(payload, config_cls):\n            return payload\n        if isinstance(payload, dict):\n            return config_cls(**payload)\n        raise ValueError(\"Invalid automatic function calling config payload\")\n\n    # ---------------------------------------------------------------------\n    # Response parsing\n    # ---------------------------------------------------------------------\n\n    def _deserialize_response(self, response: Any) -> Message:\n        candidate = self._select_primary_candidate(response)\n        if not candidate:","sourceCodeStart":647,"sourceCodeEnd":683,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/runtime/node/agent/providers/gemini_provider.py#L647-L683","documentation":"Gemini provider _coerce_function_calling_config accepts only a genai_types.FunctionCallingConfig instance, a mode string (e.g. 'AUTO', 'ANY', 'NONE'), or a dict of FunctionCallingConfig kwargs. Any other payload type raises this ValueError while coercing tool_config for a Gemini agent.","triggerScenarios":"Passing tool_config.function_calling_config as a non-string/dict object (e.g. a custom dataclass, a Pydantic model, a list, or None-labeled placeholder), or a dict containing keys that don't exist on FunctionCallingConfig (which surfaces similarly during coercion).","commonSituations":"Translating configs between providers (OpenAI tool choice objects passed straight through); SDK version differences where FunctionCallingConfig moved; YAML configs feeding arbitrary objects into function_calling_config.","solutions":["Pass a plain mode string like 'AUTO' or 'ANY'","Or pass a dict of valid FunctionCallingConfig fields, e.g. {'mode': 'ANY', 'allowed_function_names': [...]}, dropping unknown keys before passing","Ensure you're sending a str or dict, not a custom object; sanitize converted configs from other providers"],"exampleFix":"# before\ntool_config = {'function_calling_config': {'mode': 'ANY', 'tool_choice': 'auto'}}\n\n# after\ntool_config = {'function_calling_config': {'mode': 'ANY', 'allowed_function_names': ['search']}}","handlingStrategy":"type-guard","validationCode":"def is_valid_fcc(payload) -> bool:\n    if isinstance(payload, str):\n        return payload in ('AUTO', 'ANY', 'NONE')\n    if isinstance(payload, dict):\n        valid = {'mode', 'allowed_function_names'}\n        return set(payload) <= valid\n    return hasattr(payload, 'mode')  # SDK instance\n\nif not is_valid_fcc(tool_config.get('function_calling_config')):\n    tool_config['function_calling_config'] = 'AUTO'","typeGuard":"def is_valid_fcc(payload) -> bool:\n    if isinstance(payload, str):\n        return payload in ('AUTO', 'ANY', 'NONE')\n    if isinstance(payload, dict):\n        return set(payload) <= {'mode', 'allowed_function_names'}\n    return hasattr(payload, 'mode')","tryCatchPattern":"try:\n    agent = build_gemini_agent(cfg)\nexcept ValueError as e:\n    if 'Invalid function calling configuration payload' in str(e):\n        cfg.tool_config['function_calling_config'] = 'AUTO'\n        agent = build_gemini_agent(cfg)\n    else:\n        raise","preventionTips":["Pass mode strings or minimal dicts","Sanitize provider-converted configs before reuse"],"tags":["gemini","function-calling","configuration","type-coercion"],"backgroundTag":"invalid-config-payload","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}