106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
from __future__ import annotations # type: ignore
|
|
|
|
from typing import Any, Literal, overload
|
|
import warnings
|
|
|
|
from botocore.client import BaseClient
|
|
|
|
import instructor
|
|
from ...core.client import AsyncInstructor, Instructor
|
|
|
|
|
|
@overload # type: ignore
|
|
def from_bedrock(
|
|
client: BaseClient,
|
|
mode: instructor.Mode = instructor.Mode.BEDROCK_TOOLS,
|
|
async_client: Literal[False] = False,
|
|
**kwargs: Any,
|
|
) -> Instructor: ...
|
|
|
|
|
|
@overload # type: ignore
|
|
def from_bedrock(
|
|
client: BaseClient,
|
|
mode: instructor.Mode = instructor.Mode.BEDROCK_TOOLS,
|
|
async_client: Literal[True] = True,
|
|
**kwargs: Any,
|
|
) -> AsyncInstructor: ...
|
|
|
|
|
|
def handle_bedrock_json(
|
|
response_model: Any,
|
|
new_kwargs: Any,
|
|
) -> tuple[Any, Any]:
|
|
"""
|
|
This function is deprecated and no longer used.
|
|
Bedrock JSON handling is now done in process_response.py via handle_bedrock_json().
|
|
"""
|
|
return response_model, new_kwargs
|
|
|
|
|
|
def from_bedrock(
|
|
client: BaseClient,
|
|
mode: instructor.Mode = instructor.Mode.BEDROCK_JSON,
|
|
async_client: bool = False,
|
|
_async: bool | None = None, # Deprecated, use async_client
|
|
**kwargs: Any,
|
|
) -> Instructor | AsyncInstructor:
|
|
"""
|
|
Accepts both 'async_client' (preferred) and '_async' (deprecated) for async mode.
|
|
"""
|
|
valid_modes = {
|
|
instructor.Mode.BEDROCK_TOOLS,
|
|
instructor.Mode.BEDROCK_JSON,
|
|
instructor.Mode.MD_JSON,
|
|
}
|
|
|
|
if mode not in valid_modes:
|
|
from ...core.exceptions import ModeError
|
|
|
|
raise ModeError(
|
|
mode=str(mode),
|
|
provider="Bedrock",
|
|
valid_modes=[str(m) for m in valid_modes],
|
|
)
|
|
|
|
if not isinstance(client, BaseClient):
|
|
from ...core.exceptions import ClientError
|
|
|
|
raise ClientError(
|
|
f"Client must be an instance of boto3.client (BaseClient). "
|
|
f"Got: {type(client).__name__}"
|
|
)
|
|
|
|
# Deprecation warning for _async usage
|
|
if _async is not None and not async_client:
|
|
warnings.warn(
|
|
"The '_async' argument to from_bedrock is deprecated. Use 'async_client' instead.",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
|
|
# Prefer async_client, fallback to _async for backward compatibility
|
|
use_async = async_client or (_async is not None and _async is True)
|
|
|
|
async def async_wrapper(**kwargs: Any):
|
|
return client.converse(**kwargs)
|
|
|
|
create = client.converse
|
|
|
|
if use_async:
|
|
return AsyncInstructor(
|
|
client=client,
|
|
create=instructor.patch(create=async_wrapper, mode=mode),
|
|
provider=instructor.Provider.BEDROCK,
|
|
mode=mode,
|
|
**kwargs,
|
|
)
|
|
else:
|
|
return Instructor(
|
|
client=client,
|
|
create=instructor.patch(create=create, mode=mode),
|
|
provider=instructor.Provider.BEDROCK,
|
|
mode=mode,
|
|
**kwargs,
|
|
)
|