Files
AI/참고/instructor-main/instructor/providers/anthropic/client.py
2026-05-12 19:40:31 +09:00

119 lines
3.4 KiB
Python

from __future__ import annotations
import anthropic
import instructor
from typing import overload, Any
@overload
def from_anthropic(
client: (
anthropic.Anthropic | anthropic.AnthropicBedrock | anthropic.AnthropicVertex
),
mode: instructor.Mode = instructor.Mode.ANTHROPIC_TOOLS,
beta: bool = False,
**kwargs: Any,
) -> instructor.Instructor: ...
@overload
def from_anthropic(
client: (
anthropic.AsyncAnthropic
| anthropic.AsyncAnthropicBedrock
| anthropic.AsyncAnthropicVertex
),
mode: instructor.Mode = instructor.Mode.ANTHROPIC_TOOLS,
beta: bool = False,
**kwargs: Any,
) -> instructor.AsyncInstructor: ...
def from_anthropic(
client: (
anthropic.Anthropic
| anthropic.AsyncAnthropic
| anthropic.AnthropicBedrock
| anthropic.AsyncAnthropicBedrock
| anthropic.AsyncAnthropicVertex
| anthropic.AnthropicVertex
),
mode: instructor.Mode = instructor.Mode.ANTHROPIC_TOOLS,
beta: bool = False,
**kwargs: Any,
) -> instructor.Instructor | instructor.AsyncInstructor:
"""Create an Instructor instance from an Anthropic client.
Args:
client: An instance of Anthropic client (sync or async)
mode: The mode to use for the client (ANTHROPIC_JSON or ANTHROPIC_TOOLS)
beta: Whether to use beta API features (uses client.beta.messages.create)
**kwargs: Additional keyword arguments to pass to the Instructor constructor
Returns:
An Instructor instance (sync or async depending on the client type)
Raises:
ModeError: If mode is not one of the valid Anthropic modes
ClientError: If client is not a valid Anthropic client instance
"""
valid_modes = {
instructor.Mode.ANTHROPIC_JSON,
instructor.Mode.ANTHROPIC_TOOLS,
instructor.Mode.ANTHROPIC_REASONING_TOOLS,
instructor.Mode.ANTHROPIC_PARALLEL_TOOLS,
}
if mode not in valid_modes:
from ...core.exceptions import ModeError
raise ModeError(
mode=str(mode),
provider="Anthropic",
valid_modes=[str(m) for m in valid_modes],
)
valid_client_types = (
anthropic.Anthropic,
anthropic.AsyncAnthropic,
anthropic.AnthropicBedrock,
anthropic.AnthropicVertex,
anthropic.AsyncAnthropicBedrock,
anthropic.AsyncAnthropicVertex,
)
if not isinstance(client, valid_client_types):
from ...core.exceptions import ClientError
raise ClientError(
f"Client must be an instance of one of: {', '.join(t.__name__ for t in valid_client_types)}. "
f"Got: {type(client).__name__}"
)
if beta:
create = client.beta.messages.create
else:
create = client.messages.create
if isinstance(
client,
(anthropic.Anthropic, anthropic.AnthropicBedrock, anthropic.AnthropicVertex),
):
return instructor.Instructor(
client=client,
create=instructor.patch(create=create, mode=mode),
provider=instructor.Provider.ANTHROPIC,
mode=mode,
**kwargs,
)
else:
return instructor.AsyncInstructor(
client=client,
create=instructor.patch(create=create, mode=mode),
provider=instructor.Provider.ANTHROPIC,
mode=mode,
**kwargs,
)