feat: migrate Anthropic provider to native structured outputs API#263
Merged
Conversation
1f65317 to
677a184
Compare
Closed
Use the new output_format parameter and beta client for models that support structured outputs (claude-sonnet-4-5, claude-opus-4-1, claude-opus-4-5, claude-haiku-4-5). This enables streaming with data_model for these models. Older models fall back to the previous tool-based approach. Documentation: https://platform.claude.com/docs/en/build-with-claude/structured-outputs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
677a184 to
b268fe4
Compare
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
- Rename use_beta_structured_output to _supports_structured_outputs - Inline STRUCTURED_OUTPUT_MODELS into the function - Remove streaming fallback/warning for older models (let it fail) - Make create_data_model_tool a staticmethod - Revert unnecessary kwargs->api_kwargs rename in _token_count_args - Remove redundant comments about Beta API type signatures 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move STRUCTURED_OUTPUTS_BETA and supports_structured_outputs after TYPE_CHECKING - Make supports_structured_outputs public (remove leading underscore) - Consolidate data_model handling into single block - Add TODO for removing legacy tool-based approach 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
cpsievert
commented
Jan 6, 2026
cpsievert
commented
Jan 6, 2026
…d-data # Conflicts: # CHANGELOG.md # chatlas/_provider_anthropic.py
- Replace explicit model allowlist with regex pattern matching (claude-*-4-[5-9]) to automatically support future Claude 4.5+ models - Switch from beta endpoint (client.beta.messages.create) to regular messages.create since structured outputs are now GA - Rename output_format to output_config.format per the GA API surface - Remove STRUCTURED_OUTPUTS_BETA constant
- Remove type: ignore comments — output_config is in SubmitInputArgs - Remove cast(list, ...) by appending to tool_schemas before dict construction - Add OutputConfigParam import for proper type annotation
Add sync and async streaming tests with data_model for ChatAnthropic, mirroring the existing OpenAI tests. Re-record existing data extraction cassettes to use the GA output_config parameter.
…traction Models that don't support native structured outputs (pre-4.5) were silently attempting to stream with the tool-based approach after the guard was removed during the output_config refactor.
Widen supports_structured_outputs() regex to match all Claude 4 models (including 4.0, 4.1), not just 4.5+. Add "cookie" to VCR filter_headers and remove leaked _cfuvid cookies from cassette.
…ckAnthropic Lets users override auto-detection of native structured outputs support with "native" (force output_config API) or "tool" (force legacy approach). Defaults to "auto" which uses the model regex heuristic.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Structured data extraction with
ChatAnthropic()now uses Anthropic's native structured outputs API for Claude 4.5+ models. This means:data_model— previously disabled with a warning, now fully supportedOlder models automatically fall back to the existing tool-based approach, so this is a non-breaking change. A new
structured_output_modeparameter onChatAnthropic()andChatBedrockAnthropic()lets you override the auto-detection — set"native"to force theoutput_configAPI or"tool"to force the legacy approach.Also includes
data_modelfor AnthropicTest plan
test_data_extraction— verifies structured extraction via GA APItest_anthropic_nested_data_model_extraction— nested Pydantic models (regression test for Structured Data Not Working for ChatAnthropic() #100)test_stream_with_data_model— sync streaming withdata_modeltest_stream_async_with_data_model— async streaming withdata_model