18/19 models affected:
claude-sonnet-4.6, claude-sonnet-4.5, claude-haiku-4.5,
claude-opus-4.7, claude-opus-4.7-1m-internal, claude-opus-4.7-high,
claude-opus-4.7-xhigh, claude-opus-4.6, claude-opus-4.6-1m,
claude-opus-4.5, gpt-5.5, gpt-5.4, gpt-5.4-mini, gpt-5.3-codex,
gpt-5.2-codex, gpt-5.2, gpt-5-mini, gpt-4.1
(Only
Summary
CopilotClient.list_models()raisesValueError("Missing required field 'multiplier' in ModelBilling")against the current production backend (SDK 0.3.0). Because the SDK parses the entire response in a list-comprehension, a single malformed entry takes downlist_models()for every consumer — and right now every named model in the response triggers it. Onlyauto(which hasbilling: None) is parseable.Reproduction
Why it's broken
ModelBilling.from_dict(client.py:496-507) treatsmultiplieras required:list_models()(client.py:1811) parses the whole response eagerly:billingobject on every named model but omitsmultiplierfrom all of them — observed today against SDK 0.3.0:autois parseable, because itsbillingisNoneand the parser short-circuits.)Why this is doubly fragile
#1188 notes that
multiplieris being deprecated as of June 1 (except for legacy annual-plan users). Making itrequiredin the parser turns a planned backend cleanup into a hard breakage for every SDK consumer.Suggested fixes (any one of these would resolve the consumer-side breakage)
multiplieroptional inModelBilling.from_dict— returnModelBilling(multiplier=None)(or skip the billing block entirely) when the field is absent. This matches the deprecation direction in Please add token cost properties to Models/Billing #1188.list_models(): wrap eachModelInfo.from_dict(model)in its owntry/except, log a warning, and skip the malformed entry. This protects consumers from any future schema drift on individual models, not just this one field.Impact on consumers
We hit this in
microsoft/conductor(workflow orchestration tool built on the Copilot SDK). Any workflow that configures areasoning_effortvalidates the model's advertised capabilities by callinglist_models()first, so every such workflow fails with an opaqueDialog turn failed: Missing required field 'multiplier' in ModelBillingafter the retry loop exhausts. Consumers can defensively wraplist_models()in a broadexcept Exception(which is what we ended up doing in microsoft/conductor#193), but that loses all model metadata for the lifetime of the session and treats a recoverable parser issue as a total blackout.Happy to send a PR if you'd like — option 1 is a 2-line change.