microsoft/autogen · error · ValueError

model_capabilities and model_info are mutually exclusive

Error message

model_capabilities and model_info are mutually exclusive

What it means

The Ollama client's constructor accepts both the deprecated model_capabilities and the current model_info, but they are mutually exclusive — passing both raises this ValueError so there is no ambiguity about which one takes effect. The four-branch validation also shows model_capabilities alone still works but emits a DeprecationWarning.

Source

Thrown at python/packages/autogen-ext/src/autogen_ext/models/ollama/_ollama_client.py:475

class BaseOllamaChatCompletionClient(ChatCompletionClient):
    def __init__(
        self,
        client: AsyncClient,
        *,
        create_args: Dict[str, Any],
        model_capabilities: Optional[ModelCapabilities] = None,  # type: ignore
        model_info: Optional[ModelInfo] = None,
    ):
        self._client = client
        self._model_name = create_args["model"]
        if model_capabilities is None and model_info is None:
            try:
                self._model_info = _model_info.get_info(create_args["model"])
            except KeyError as err:
                raise ValueError("model_info is required when model name is not a valid OpenAI model") from err
        elif model_capabilities is not None and model_info is not None:
            raise ValueError("model_capabilities and model_info are mutually exclusive")
        elif model_capabilities is not None and model_info is None:
            warnings.warn("model_capabilities is deprecated, use model_info instead", DeprecationWarning, stacklevel=2)
            info = cast(ModelInfo, model_capabilities)
            info["family"] = ModelFamily.UNKNOWN
            self._model_info = info
        elif model_capabilities is None and model_info is not None:
            self._model_info = model_info

        self._resolved_model: Optional[str] = None
        self._model_class: Optional[str] = None
        if "model" in create_args:
            self._resolved_model = create_args["model"]
            self._model_class = _model_info.resolve_model_class(create_args["model"])

        if (
            not self._model_info["json_output"]
            and "response_format" in create_args
            and (

View on GitHub (pinned to 027ecf0a37)

Solutions

  1. Delete model_capabilities and keep only model_info
  2. If merging configs, pop the deprecated key: cfg.pop('model_capabilities', None) before construction
  3. Audit for other deprecated-capabilities usages since the whole parameter is being phased out

Example fix

# before
client = OllamaChatCompletionClient(model="llama3", model_capabilities={"vision": False}, model_info={"vision": False, "family": ModelFamily.UNKNOWN})

# after
client = OllamaChatCompletionClient(model="llama3", model_info={"vision": False, "function_calling": True, "json_output": True, "structured_output": True, "family": ModelFamily.UNKNOWN})
Defensive patterns

Strategy: validation

Validate before calling

cfg.pop("model_capabilities", None)  # drop deprecated key before construction
client = OllamaChatCompletionClient(**cfg)

Try / catch

try:
    client = OllamaChatCompletionClient(**cfg)
except ValueError as e:
    if "mutually exclusive" in str(e):
        cfg.pop("model_capabilities", None)
        client = OllamaChatCompletionClient(**cfg)
    else:
        raise

Prevention

When it happens

Trigger: OllamaChatCompletionClient(model=..., model_capabilities={...}, model_info={...}) — both keyword arguments non-None; config merging (defaults + overrides) that accumulates both keys.

Common situations: Upgrading old code: adding model_info while the legacy model_capabilities is still in the config dict; shared config templates carrying deprecated keys.

Related errors


AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15). Data as JSON: /api/errors/741e5549bd8ee2f5. Report an issue: GitHub.