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
- Delete model_capabilities and keep only model_info
- If merging configs, pop the deprecated key: cfg.pop('model_capabilities', None) before construction
- 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
- Migrate configs off model_capabilities entirely; keep only model_info
- Treat DeprecationWarnings from model_capabilities as fix-now signals
- Validate config dicts against a schema that forbids both keys simultaneously
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
- model_info is required when model name is not a valid OpenAI
- response_format and json_output cannot be set to a Pydantic
- Unsupported config type {config.GetType()}
- Cannot save screenshots without a debug directory. Set it us
- Timeout must be greater than or equal to 1.
AI-assisted analysis of microsoft/autogen@027ecf0a37 (2026-08-15).
Data as JSON: /api/errors/741e5549bd8ee2f5.
Report an issue: GitHub.