| from __future__ import annotations |
|
|
| from typing_extensions import TypeVar |
|
|
| from ..._types import NotGiven |
| from ..._models import TypeAdapter, construct_type_unchecked |
| from ..._utils._utils import is_given |
| from ...types.message import Message |
| from ...types.parsed_message import ParsedMessage, ParsedTextBlock, ParsedContentBlock |
| from ...types.beta.beta_message import BetaMessage |
| from ...types.beta.parsed_beta_message import ParsedBetaMessage, ParsedBetaTextBlock, ParsedBetaContentBlock |
|
|
| ResponseFormatT = TypeVar("ResponseFormatT", default=None) |
|
|
|
|
| def parse_text(text: str, output_format: ResponseFormatT | NotGiven) -> ResponseFormatT | None: |
| if is_given(output_format): |
| adapted_type: TypeAdapter[ResponseFormatT] = TypeAdapter(output_format) |
| return adapted_type.validate_json(text) |
| return None |
|
|
|
|
| def parse_beta_response( |
| *, |
| output_format: ResponseFormatT | NotGiven, |
| response: BetaMessage, |
| ) -> ParsedBetaMessage[ResponseFormatT]: |
| content_list: list[ParsedBetaContentBlock[ResponseFormatT]] = [] |
| for content in response.content: |
| if content.type == "text": |
| content_list.append( |
| construct_type_unchecked( |
| type_=ParsedBetaTextBlock[ResponseFormatT], |
| value={**content.to_dict(), "parsed_output": parse_text(content.text, output_format)}, |
| ) |
| ) |
| else: |
| content_list.append(content) |
|
|
| return construct_type_unchecked( |
| type_=ParsedBetaMessage[ResponseFormatT], |
| value={ |
| **response.to_dict(), |
| "content": content_list, |
| }, |
| ) |
|
|
|
|
| def parse_response( |
| *, |
| output_format: ResponseFormatT | NotGiven, |
| response: Message, |
| ) -> ParsedMessage[ResponseFormatT]: |
| content_list: list[ParsedContentBlock[ResponseFormatT]] = [] |
| for content in response.content: |
| if content.type == "text": |
| content_list.append( |
| construct_type_unchecked( |
| type_=ParsedTextBlock[ResponseFormatT], |
| value={**content.to_dict(), "parsed_output": parse_text(content.text, output_format)}, |
| ) |
| ) |
| else: |
| content_list.append(content) |
|
|
| return construct_type_unchecked( |
| type_=ParsedMessage[ResponseFormatT], |
| value={ |
| **response.to_dict(), |
| "content": content_list, |
| }, |
| ) |
|
|