fix(anthropic): hand output_config to the effort helper as a known type

Cast output_config to object before handing it to the explicit effort
reader, since a Final[object] annotation still let basedpyright narrow it
to Unknown. Expose that reader under a public name, since the Bedrock
invoke config calls it from another class.
This commit is contained in:
hx 2026-10-03 00:36:08 +08:00
parent d25088715d
commit 210e489968
2 changed files with 12 additions and 7 deletions

View file

@ -1,5 +1,5 @@
from collections.abc import AsyncIterator, Mapping, Sequence
from typing import ClassVar, Final
from typing import ClassVar, Final, cast
import httpx
@ -429,8 +429,10 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig):
),
status_code=400,
)
existing_output_config: Final = optional_params.get("output_config")
explicit_effort: Final = AnthropicMessagesConfig._explicit_output_config_effort(existing_output_config)
existing_output_config: Final = cast( # cast-ok: optional_params is an untyped dict
object, optional_params.get("output_config")
)
explicit_effort: Final = AnthropicMessagesConfig.explicit_output_config_effort(existing_output_config)
resolved_effort: Final = (
explicit_effort
if explicit_effort is not None
@ -446,7 +448,7 @@ class AnthropicMessagesConfig(BaseAnthropicMessagesConfig):
)
@staticmethod
def _explicit_output_config_effort(output_config: object) -> str | None:
def explicit_output_config_effort(output_config: object) -> str | None:
match output_config:
case {"effort": str() as effort}:
return effort

View file

@ -676,14 +676,17 @@ class AmazonAnthropicClaudeMessagesConfig(
clamped: Final = {"effort": effort}
normalize_bedrock_opus_output_config_effort(model=model, output_config=clamped)
optional_params["reasoning_effort"] = clamped["effort"]
explicit_effort: Final = AnthropicMessagesConfig._explicit_output_config_effort(
optional_params.get("output_config")
explicit_effort: Final = AnthropicMessagesConfig.explicit_output_config_effort(
cast(object, optional_params.get("output_config")) # cast-ok: optional_params is an untyped dict
)
if explicit_effort is None:
return
clamped_explicit: Final = {"effort": explicit_effort}
normalize_bedrock_opus_output_config_effort(model=model, output_config=clamped_explicit)
optional_params["output_config"] = {**optional_params["output_config"], **clamped_explicit}
optional_params["output_config"] = { # rebind-ok: in-place fill is this method's contract
**optional_params["output_config"],
**clamped_explicit,
}
def transform_anthropic_messages_request(
self,