diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 978fcecd..02e0b6d2 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,6 +30,7 @@ jobs:
- name: Run lints
run: ./scripts/lint
+
test:
name: test
runs-on: ubuntu-latest
@@ -51,4 +52,3 @@ jobs:
- name: Run tests
run: ./scripts/test
-
diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index cc51f6f8..fc0d7ff8 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.44.0"
+ ".": "0.45.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 239e17b7..e7d06698 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,2 +1,2 @@
configured_endpoints: 21
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic-fd67aea6883f1ee9e46f31a42d3940f0acb1749e787055bd9b9f278b20fa53ec.yml
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic-7270ee0a79d885681ee507414608229f61c27f47c40f355dcd210b38aa7cddf1.yml
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dcffb969..0dfc5d7a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## 0.45.0 (2025-01-23)
+
+Full Changelog: [v0.44.0...v0.45.0](https://github.com/anthropics/anthropic-sdk-python/compare/v0.44.0...v0.45.0)
+
+### Features
+
+* **api:** add citations ([#839](https://github.com/anthropics/anthropic-sdk-python/issues/839)) ([2ec74b6](https://github.com/anthropics/anthropic-sdk-python/commit/2ec74b6ff106c6e3d7d55e3c189e345098f8575e))
+* **client:** support results endpoint ([#835](https://github.com/anthropics/anthropic-sdk-python/issues/835)) ([5dd88bf](https://github.com/anthropics/anthropic-sdk-python/commit/5dd88bf2d20b8909736cc0bc1e81296ba6e322a9))
+
+
+### Chores
+
+* **internal:** minor formatting changes ([#838](https://github.com/anthropics/anthropic-sdk-python/issues/838)) ([31eb826](https://github.com/anthropics/anthropic-sdk-python/commit/31eb826deb96a17d3c0bb953c728f39412c12ada))
+
## 0.44.0 (2025-01-21)
Full Changelog: [v0.43.1...v0.44.0](https://github.com/anthropics/anthropic-sdk-python/compare/v0.43.1...v0.44.0)
diff --git a/api.md b/api.md
index 44f97ac8..10b0770c 100644
--- a/api.md
+++ b/api.md
@@ -24,9 +24,19 @@ Types:
from anthropic.types import (
Base64PDFSource,
CacheControlEphemeral,
+ CitationCharLocation,
+ CitationCharLocationParam,
+ CitationContentBlockLocation,
+ CitationContentBlockLocationParam,
+ CitationPageLocation,
+ CitationPageLocationParam,
+ CitationsConfigParam,
+ CitationsDelta,
ContentBlock,
ContentBlockDeltaEvent,
ContentBlockParam,
+ ContentBlockSource,
+ ContentBlockSourceContent,
ContentBlockStartEvent,
ContentBlockStopEvent,
DocumentBlockParam,
@@ -42,6 +52,7 @@ from anthropic.types import (
MessageTokensCount,
Metadata,
Model,
+ PlainTextSource,
RawContentBlockDeltaEvent,
RawContentBlockStartEvent,
RawContentBlockStopEvent,
@@ -51,6 +62,8 @@ from anthropic.types import (
RawMessageStreamEvent,
TextBlock,
TextBlockParam,
+ TextCitation,
+ TextCitationParam,
TextDelta,
Tool,
ToolChoice,
@@ -95,7 +108,7 @@ Methods:
- client.messages.batches.list(\*\*params) -> SyncPage[MessageBatch]
- client.messages.batches.delete(message_batch_id) -> DeletedMessageBatch
- client.messages.batches.cancel(message_batch_id) -> MessageBatch
-- client.messages.batches.results(message_batch_id) -> JSONLDecoder[MessageBatchIndividualResponse]
+- client.messages.batches.results(message_batch_id) -> JSONLDecoder[MessageBatchIndividualResponse]
# Models
@@ -153,8 +166,18 @@ from anthropic.types.beta import (
BetaBase64PDFBlock,
BetaBase64PDFSource,
BetaCacheControlEphemeral,
+ BetaCitationCharLocation,
+ BetaCitationCharLocationParam,
+ BetaCitationContentBlockLocation,
+ BetaCitationContentBlockLocationParam,
+ BetaCitationPageLocation,
+ BetaCitationPageLocationParam,
+ BetaCitationsConfigParam,
+ BetaCitationsDelta,
BetaContentBlock,
BetaContentBlockParam,
+ BetaContentBlockSource,
+ BetaContentBlockSourceContent,
BetaImageBlockParam,
BetaInputJSONDelta,
BetaMessage,
@@ -162,6 +185,7 @@ from anthropic.types.beta import (
BetaMessageParam,
BetaMessageTokensCount,
BetaMetadata,
+ BetaPlainTextSource,
BetaRawContentBlockDeltaEvent,
BetaRawContentBlockStartEvent,
BetaRawContentBlockStopEvent,
@@ -171,6 +195,8 @@ from anthropic.types.beta import (
BetaRawMessageStreamEvent,
BetaTextBlock,
BetaTextBlockParam,
+ BetaTextCitation,
+ BetaTextCitationParam,
BetaTextDelta,
BetaTool,
BetaToolBash20241022,
@@ -218,4 +244,4 @@ Methods:
- client.beta.messages.batches.list(\*\*params) -> SyncPage[BetaMessageBatch]
- client.beta.messages.batches.delete(message_batch_id) -> BetaDeletedMessageBatch
- client.beta.messages.batches.cancel(message_batch_id) -> BetaMessageBatch
-- client.beta.messages.batches.results(message_batch_id) -> JSONLDecoder[MessageBatchIndividualResponse]
+- client.beta.messages.batches.results(message_batch_id) -> JSONLDecoder[BetaMessageBatchIndividualResponse]
diff --git a/pyproject.toml b/pyproject.toml
index ba848c39..2fdb7854 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "anthropic"
-version = "0.44.0"
+version = "0.45.0"
description = "The official Python library for the anthropic API"
dynamic = ["readme"]
license = "MIT"
diff --git a/scripts/bootstrap b/scripts/bootstrap
index 8c5c60eb..e84fe62c 100755
--- a/scripts/bootstrap
+++ b/scripts/bootstrap
@@ -4,7 +4,7 @@ set -e
cd "$(dirname "$0")/.."
-if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then
+if ! command -v rye >/dev/null 2>&1 && [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ]; then
brew bundle check >/dev/null 2>&1 || {
echo "==> Installing Homebrew dependencies…"
brew bundle
diff --git a/scripts/lint b/scripts/lint
index 34be4345..159fd68a 100755
--- a/scripts/lint
+++ b/scripts/lint
@@ -9,4 +9,3 @@ rye run lint
echo "==> Making sure it imports"
rye run python -c 'import anthropic'
-
diff --git a/src/anthropic/_response.py b/src/anthropic/_response.py
index 830bee51..40f79958 100644
--- a/src/anthropic/_response.py
+++ b/src/anthropic/_response.py
@@ -140,7 +140,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
origin = get_origin(cast_to) or cast_to
if inspect.isclass(origin):
- if issubclass(origin, (JSONLDecoder)):
+ if issubclass(cast(Any, origin), JSONLDecoder):
return cast(
R,
cast("type[JSONLDecoder[Any]]", cast_to)(
@@ -150,7 +150,7 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
),
)
- if issubclass(origin, AsyncJSONLDecoder):
+ if issubclass(cast(Any, origin), AsyncJSONLDecoder):
return cast(
R,
cast("type[AsyncJSONLDecoder[Any]]", cast_to)(
diff --git a/src/anthropic/_version.py b/src/anthropic/_version.py
index 3527ab6a..29afc8be 100644
--- a/src/anthropic/_version.py
+++ b/src/anthropic/_version.py
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
__title__ = "anthropic"
-__version__ = "0.44.0" # x-release-please-version
+__version__ = "0.45.0" # x-release-please-version
diff --git a/src/anthropic/resources/beta/messages/batches.py b/src/anthropic/resources/beta/messages/batches.py
index 3a138122..63ea0d10 100644
--- a/src/anthropic/resources/beta/messages/batches.py
+++ b/src/anthropic/resources/beta/messages/batches.py
@@ -239,11 +239,11 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> BetaDeletedMessageBatch:
- """This endpoint is idempotent and can be used to poll for Message Batch
- completion.
+ """
+ Delete a Message Batch.
- To access the results of a Message Batch, make a request to the
- `results_url` field in the response.
+ Message Batches can only be deleted once they've finished processing. If you'd
+ like to delete an in-progress batch, you must first cancel it.
Args:
message_batch_id: ID of the Message Batch.
@@ -395,8 +395,8 @@ def results(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- stream=True,
cast_to=JSONLDecoder[BetaMessageBatchIndividualResponse],
+ stream=True,
)
@@ -608,11 +608,11 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> BetaDeletedMessageBatch:
- """This endpoint is idempotent and can be used to poll for Message Batch
- completion.
+ """
+ Delete a Message Batch.
- To access the results of a Message Batch, make a request to the
- `results_url` field in the response.
+ Message Batches can only be deleted once they've finished processing. If you'd
+ like to delete an in-progress batch, you must first cancel it.
Args:
message_batch_id: ID of the Message Batch.
@@ -764,8 +764,8 @@ async def results(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- stream=True,
cast_to=AsyncJSONLDecoder[BetaMessageBatchIndividualResponse],
+ stream=True,
)
diff --git a/src/anthropic/resources/messages/batches.py b/src/anthropic/resources/messages/batches.py
index 7092730e..3cb72600 100644
--- a/src/anthropic/resources/messages/batches.py
+++ b/src/anthropic/resources/messages/batches.py
@@ -14,25 +14,15 @@
)
from ..._compat import cached_property
from ..._resource import SyncAPIResource, AsyncAPIResource
-from ..._response import (
- BinaryAPIResponse,
- AsyncBinaryAPIResponse,
- StreamedBinaryAPIResponse,
- AsyncStreamedBinaryAPIResponse,
- to_streamed_response_wrapper,
- to_custom_raw_response_wrapper,
- async_to_streamed_response_wrapper,
- to_custom_streamed_response_wrapper,
- async_to_custom_raw_response_wrapper,
- async_to_custom_streamed_response_wrapper,
-)
+from ..._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper
from ...pagination import SyncPage, AsyncPage
from ..._exceptions import AnthropicError
from ..._base_client import AsyncPaginator, make_request_options
-from ...types.messages import MessageBatchIndividualResponse, batch_list_params, batch_create_params
+from ...types.messages import batch_list_params, batch_create_params
from ..._decoders.jsonl import JSONLDecoder, AsyncJSONLDecoder
from ...types.messages.message_batch import MessageBatch
from ...types.messages.deleted_message_batch import DeletedMessageBatch
+from ...types.messages.message_batch_individual_response import MessageBatchIndividualResponse
__all__ = ["Batches", "AsyncBatches"]
@@ -202,11 +192,11 @@ def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> DeletedMessageBatch:
- """This endpoint is idempotent and can be used to poll for Message Batch
- completion.
+ """
+ Delete a Message Batch.
- To access the results of a Message Batch, make a request to the
- `results_url` field in the response.
+ Message Batches can only be deleted once they've finished processing. If you'd
+ like to delete an in-progress batch, you must first cancel it.
Args:
message_batch_id: ID of the Message Batch.
@@ -317,8 +307,8 @@ def results(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- stream=True,
cast_to=JSONLDecoder[MessageBatchIndividualResponse],
+ stream=True,
)
@@ -487,11 +477,11 @@ async def delete(
extra_body: Body | None = None,
timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
) -> DeletedMessageBatch:
- """This endpoint is idempotent and can be used to poll for Message Batch
- completion.
+ """
+ Delete a Message Batch.
- To access the results of a Message Batch, make a request to the
- `results_url` field in the response.
+ Message Batches can only be deleted once they've finished processing. If you'd
+ like to delete an in-progress batch, you must first cancel it.
Args:
message_batch_id: ID of the Message Batch.
@@ -602,8 +592,8 @@ async def results(
options=make_request_options(
extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
),
- stream=True,
cast_to=AsyncJSONLDecoder[MessageBatchIndividualResponse],
+ stream=True,
)
@@ -626,10 +616,6 @@ def __init__(self, batches: Batches) -> None:
self.cancel = _legacy_response.to_raw_response_wrapper(
batches.cancel,
)
- self.results = to_custom_raw_response_wrapper(
- batches.results,
- BinaryAPIResponse,
- )
class AsyncBatchesWithRawResponse:
@@ -651,10 +637,6 @@ def __init__(self, batches: AsyncBatches) -> None:
self.cancel = _legacy_response.async_to_raw_response_wrapper(
batches.cancel,
)
- self.results = async_to_custom_raw_response_wrapper(
- batches.results,
- AsyncBinaryAPIResponse,
- )
class BatchesWithStreamingResponse:
@@ -676,10 +658,6 @@ def __init__(self, batches: Batches) -> None:
self.cancel = to_streamed_response_wrapper(
batches.cancel,
)
- self.results = to_custom_streamed_response_wrapper(
- batches.results,
- StreamedBinaryAPIResponse,
- )
class AsyncBatchesWithStreamingResponse:
@@ -701,7 +679,3 @@ def __init__(self, batches: AsyncBatches) -> None:
self.cancel = async_to_streamed_response_wrapper(
batches.cancel,
)
- self.results = async_to_custom_streamed_response_wrapper(
- batches.results,
- AsyncStreamedBinaryAPIResponse,
- )
diff --git a/src/anthropic/types/__init__.py b/src/anthropic/types/__init__.py
index a880b827..5d7d3d7f 100644
--- a/src/anthropic/types/__init__.py
+++ b/src/anthropic/types/__init__.py
@@ -27,9 +27,11 @@
from .model_param import ModelParam as ModelParam
from .content_block import ContentBlock as ContentBlock
from .message_param import MessageParam as MessageParam
+from .text_citation import TextCitation as TextCitation
from .beta_api_error import BetaAPIError as BetaAPIError
from .metadata_param import MetadataParam as MetadataParam
from .tool_use_block import ToolUseBlock as ToolUseBlock
+from .citations_delta import CitationsDelta as CitationsDelta
from .input_json_delta import InputJSONDelta as InputJSONDelta
from .text_block_param import TextBlockParam as TextBlockParam
from .image_block_param import ImageBlockParam as ImageBlockParam
@@ -42,6 +44,7 @@
from .message_delta_event import MessageDeltaEvent as MessageDeltaEvent
from .message_delta_usage import MessageDeltaUsage as MessageDeltaUsage
from .message_start_event import MessageStartEvent as MessageStartEvent
+from .text_citation_param import TextCitationParam as TextCitationParam
from .anthropic_beta_param import AnthropicBetaParam as AnthropicBetaParam
from .beta_not_found_error import BetaNotFoundError as BetaNotFoundError
from .document_block_param import DocumentBlockParam as DocumentBlockParam
@@ -53,10 +56,14 @@
from .beta_rate_limit_error import BetaRateLimitError as BetaRateLimitError
from .message_create_params import MessageCreateParams as MessageCreateParams
from .tool_choice_any_param import ToolChoiceAnyParam as ToolChoiceAnyParam
+from .citation_char_location import CitationCharLocation as CitationCharLocation
+from .citation_page_location import CitationPageLocation as CitationPageLocation
+from .citations_config_param import CitationsConfigParam as CitationsConfigParam
from .raw_message_stop_event import RawMessageStopEvent as RawMessageStopEvent
from .tool_choice_auto_param import ToolChoiceAutoParam as ToolChoiceAutoParam
from .tool_choice_tool_param import ToolChoiceToolParam as ToolChoiceToolParam
from .base64_pdf_source_param import Base64PDFSourceParam as Base64PDFSourceParam
+from .plain_text_source_param import PlainTextSourceParam as PlainTextSourceParam
from .raw_message_delta_event import RawMessageDeltaEvent as RawMessageDeltaEvent
from .raw_message_start_event import RawMessageStartEvent as RawMessageStartEvent
from .tool_result_block_param import ToolResultBlockParam as ToolResultBlockParam
@@ -68,8 +75,16 @@
from .content_block_start_event import ContentBlockStartEvent as ContentBlockStartEvent
from .beta_gateway_timeout_error import BetaGatewayTimeoutError as BetaGatewayTimeoutError
from .beta_invalid_request_error import BetaInvalidRequestError as BetaInvalidRequestError
+from .content_block_source_param import ContentBlockSourceParam as ContentBlockSourceParam
from .message_count_tokens_params import MessageCountTokensParams as MessageCountTokensParams
+from .citation_char_location_param import CitationCharLocationParam as CitationCharLocationParam
+from .citation_page_location_param import CitationPageLocationParam as CitationPageLocationParam
from .raw_content_block_stop_event import RawContentBlockStopEvent as RawContentBlockStopEvent
from .cache_control_ephemeral_param import CacheControlEphemeralParam as CacheControlEphemeralParam
from .raw_content_block_delta_event import RawContentBlockDeltaEvent as RawContentBlockDeltaEvent
from .raw_content_block_start_event import RawContentBlockStartEvent as RawContentBlockStartEvent
+from .citation_content_block_location import CitationContentBlockLocation as CitationContentBlockLocation
+from .content_block_source_content_param import ContentBlockSourceContentParam as ContentBlockSourceContentParam
+from .citation_content_block_location_param import (
+ CitationContentBlockLocationParam as CitationContentBlockLocationParam,
+)
diff --git a/src/anthropic/types/beta/__init__.py b/src/anthropic/types/beta/__init__.py
index c233d9c7..142f24a1 100644
--- a/src/anthropic/types/beta/__init__.py
+++ b/src/anthropic/types/beta/__init__.py
@@ -11,8 +11,10 @@
from .model_list_params import ModelListParams as ModelListParams
from .beta_content_block import BetaContentBlock as BetaContentBlock
from .beta_message_param import BetaMessageParam as BetaMessageParam
+from .beta_text_citation import BetaTextCitation as BetaTextCitation
from .beta_metadata_param import BetaMetadataParam as BetaMetadataParam
from .beta_tool_use_block import BetaToolUseBlock as BetaToolUseBlock
+from .beta_citations_delta import BetaCitationsDelta as BetaCitationsDelta
from .beta_input_json_delta import BetaInputJSONDelta as BetaInputJSONDelta
from .beta_text_block_param import BetaTextBlockParam as BetaTextBlockParam
from .beta_tool_union_param import BetaToolUnionParam as BetaToolUnionParam
@@ -21,23 +23,38 @@
from .beta_tool_choice_param import BetaToolChoiceParam as BetaToolChoiceParam
from .beta_content_block_param import BetaContentBlockParam as BetaContentBlockParam
from .beta_message_delta_usage import BetaMessageDeltaUsage as BetaMessageDeltaUsage
+from .beta_text_citation_param import BetaTextCitationParam as BetaTextCitationParam
from .beta_message_tokens_count import BetaMessageTokensCount as BetaMessageTokensCount
from .beta_tool_use_block_param import BetaToolUseBlockParam as BetaToolUseBlockParam
from .beta_tool_choice_any_param import BetaToolChoiceAnyParam as BetaToolChoiceAnyParam
from .beta_base64_pdf_block_param import BetaBase64PDFBlockParam as BetaBase64PDFBlockParam
+from .beta_citation_char_location import BetaCitationCharLocation as BetaCitationCharLocation
+from .beta_citation_page_location import BetaCitationPageLocation as BetaCitationPageLocation
+from .beta_citations_config_param import BetaCitationsConfigParam as BetaCitationsConfigParam
from .beta_raw_message_stop_event import BetaRawMessageStopEvent as BetaRawMessageStopEvent
from .beta_tool_choice_auto_param import BetaToolChoiceAutoParam as BetaToolChoiceAutoParam
from .beta_tool_choice_tool_param import BetaToolChoiceToolParam as BetaToolChoiceToolParam
from .message_count_tokens_params import MessageCountTokensParams as MessageCountTokensParams
from .beta_base64_pdf_source_param import BetaBase64PDFSourceParam as BetaBase64PDFSourceParam
+from .beta_plain_text_source_param import BetaPlainTextSourceParam as BetaPlainTextSourceParam
from .beta_raw_message_delta_event import BetaRawMessageDeltaEvent as BetaRawMessageDeltaEvent
from .beta_raw_message_start_event import BetaRawMessageStartEvent as BetaRawMessageStartEvent
from .beta_tool_result_block_param import BetaToolResultBlockParam as BetaToolResultBlockParam
from .beta_raw_message_stream_event import BetaRawMessageStreamEvent as BetaRawMessageStreamEvent
from .beta_tool_bash_20241022_param import BetaToolBash20241022Param as BetaToolBash20241022Param
+from .beta_content_block_source_param import BetaContentBlockSourceParam as BetaContentBlockSourceParam
+from .beta_citation_char_location_param import BetaCitationCharLocationParam as BetaCitationCharLocationParam
+from .beta_citation_page_location_param import BetaCitationPageLocationParam as BetaCitationPageLocationParam
from .beta_raw_content_block_stop_event import BetaRawContentBlockStopEvent as BetaRawContentBlockStopEvent
from .beta_cache_control_ephemeral_param import BetaCacheControlEphemeralParam as BetaCacheControlEphemeralParam
from .beta_raw_content_block_delta_event import BetaRawContentBlockDeltaEvent as BetaRawContentBlockDeltaEvent
from .beta_raw_content_block_start_event import BetaRawContentBlockStartEvent as BetaRawContentBlockStartEvent
+from .beta_citation_content_block_location import BetaCitationContentBlockLocation as BetaCitationContentBlockLocation
from .beta_tool_text_editor_20241022_param import BetaToolTextEditor20241022Param as BetaToolTextEditor20241022Param
from .beta_tool_computer_use_20241022_param import BetaToolComputerUse20241022Param as BetaToolComputerUse20241022Param
+from .beta_content_block_source_content_param import (
+ BetaContentBlockSourceContentParam as BetaContentBlockSourceContentParam,
+)
+from .beta_citation_content_block_location_param import (
+ BetaCitationContentBlockLocationParam as BetaCitationContentBlockLocationParam,
+)
diff --git a/src/anthropic/types/beta/beta_base64_pdf_block_param.py b/src/anthropic/types/beta/beta_base64_pdf_block_param.py
index 43a21329..dba83177 100644
--- a/src/anthropic/types/beta/beta_base64_pdf_block_param.py
+++ b/src/anthropic/types/beta/beta_base64_pdf_block_param.py
@@ -2,18 +2,29 @@
from __future__ import annotations
-from typing import Optional
-from typing_extensions import Literal, Required, TypedDict
+from typing import Union, Optional
+from typing_extensions import Literal, Required, TypeAlias, TypedDict
+from .beta_citations_config_param import BetaCitationsConfigParam
from .beta_base64_pdf_source_param import BetaBase64PDFSourceParam
+from .beta_plain_text_source_param import BetaPlainTextSourceParam
+from .beta_content_block_source_param import BetaContentBlockSourceParam
from .beta_cache_control_ephemeral_param import BetaCacheControlEphemeralParam
-__all__ = ["BetaBase64PDFBlockParam"]
+__all__ = ["BetaBase64PDFBlockParam", "Source"]
+
+Source: TypeAlias = Union[BetaBase64PDFSourceParam, BetaPlainTextSourceParam, BetaContentBlockSourceParam]
class BetaBase64PDFBlockParam(TypedDict, total=False):
- source: Required[BetaBase64PDFSourceParam]
+ source: Required[Source]
type: Required[Literal["document"]]
cache_control: Optional[BetaCacheControlEphemeralParam]
+
+ citations: BetaCitationsConfigParam
+
+ context: Optional[str]
+
+ title: Optional[str]
diff --git a/src/anthropic/types/beta/beta_citation_char_location.py b/src/anthropic/types/beta/beta_citation_char_location.py
new file mode 100644
index 00000000..2109949a
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_char_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from ..._models import BaseModel
+
+__all__ = ["BetaCitationCharLocation"]
+
+
+class BetaCitationCharLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_char_index: int
+
+ start_char_index: int
+
+ type: Literal["char_location"]
diff --git a/src/anthropic/types/beta/beta_citation_char_location_param.py b/src/anthropic/types/beta/beta_citation_char_location_param.py
new file mode 100644
index 00000000..8c09f5a7
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_char_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["BetaCitationCharLocationParam"]
+
+
+class BetaCitationCharLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_char_index: Required[int]
+
+ start_char_index: Required[int]
+
+ type: Required[Literal["char_location"]]
diff --git a/src/anthropic/types/beta/beta_citation_content_block_location.py b/src/anthropic/types/beta/beta_citation_content_block_location.py
new file mode 100644
index 00000000..8fde76f9
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_content_block_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from ..._models import BaseModel
+
+__all__ = ["BetaCitationContentBlockLocation"]
+
+
+class BetaCitationContentBlockLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_block_index: int
+
+ start_block_index: int
+
+ type: Literal["content_block_location"]
diff --git a/src/anthropic/types/beta/beta_citation_content_block_location_param.py b/src/anthropic/types/beta/beta_citation_content_block_location_param.py
new file mode 100644
index 00000000..9e378a78
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_content_block_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["BetaCitationContentBlockLocationParam"]
+
+
+class BetaCitationContentBlockLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_block_index: Required[int]
+
+ start_block_index: Required[int]
+
+ type: Required[Literal["content_block_location"]]
diff --git a/src/anthropic/types/beta/beta_citation_page_location.py b/src/anthropic/types/beta/beta_citation_page_location.py
new file mode 100644
index 00000000..9e6f60dd
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_page_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from ..._models import BaseModel
+
+__all__ = ["BetaCitationPageLocation"]
+
+
+class BetaCitationPageLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_page_number: int
+
+ start_page_number: int
+
+ type: Literal["page_location"]
diff --git a/src/anthropic/types/beta/beta_citation_page_location_param.py b/src/anthropic/types/beta/beta_citation_page_location_param.py
new file mode 100644
index 00000000..60e5b1c2
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citation_page_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["BetaCitationPageLocationParam"]
+
+
+class BetaCitationPageLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_page_number: Required[int]
+
+ start_page_number: Required[int]
+
+ type: Required[Literal["page_location"]]
diff --git a/src/anthropic/types/beta/beta_citations_config_param.py b/src/anthropic/types/beta/beta_citations_config_param.py
new file mode 100644
index 00000000..409cfde7
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citations_config_param.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["BetaCitationsConfigParam"]
+
+
+class BetaCitationsConfigParam(TypedDict, total=False):
+ enabled: bool
diff --git a/src/anthropic/types/beta/beta_citations_delta.py b/src/anthropic/types/beta/beta_citations_delta.py
new file mode 100644
index 00000000..2c6c02b2
--- /dev/null
+++ b/src/anthropic/types/beta/beta_citations_delta.py
@@ -0,0 +1,23 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Literal, Annotated, TypeAlias
+
+from ..._utils import PropertyInfo
+from ..._models import BaseModel
+from .beta_citation_char_location import BetaCitationCharLocation
+from .beta_citation_page_location import BetaCitationPageLocation
+from .beta_citation_content_block_location import BetaCitationContentBlockLocation
+
+__all__ = ["BetaCitationsDelta", "Citation"]
+
+Citation: TypeAlias = Annotated[
+ Union[BetaCitationCharLocation, BetaCitationPageLocation, BetaCitationContentBlockLocation],
+ PropertyInfo(discriminator="type"),
+]
+
+
+class BetaCitationsDelta(BaseModel):
+ citation: Citation
+
+ type: Literal["citations_delta"]
diff --git a/src/anthropic/types/beta/beta_content_block_source_content_param.py b/src/anthropic/types/beta/beta_content_block_source_content_param.py
new file mode 100644
index 00000000..bc13b146
--- /dev/null
+++ b/src/anthropic/types/beta/beta_content_block_source_content_param.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import TypeAlias
+
+from .beta_text_block_param import BetaTextBlockParam
+from .beta_image_block_param import BetaImageBlockParam
+
+__all__ = ["BetaContentBlockSourceContentParam"]
+
+BetaContentBlockSourceContentParam: TypeAlias = Union[BetaTextBlockParam, BetaImageBlockParam]
diff --git a/src/anthropic/types/beta/beta_content_block_source_param.py b/src/anthropic/types/beta/beta_content_block_source_param.py
new file mode 100644
index 00000000..512cf0db
--- /dev/null
+++ b/src/anthropic/types/beta/beta_content_block_source_param.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union, Iterable
+from typing_extensions import Literal, Required, TypedDict
+
+from .beta_content_block_source_content_param import BetaContentBlockSourceContentParam
+
+__all__ = ["BetaContentBlockSourceParam"]
+
+
+class BetaContentBlockSourceParam(TypedDict, total=False):
+ content: Required[Union[str, Iterable[BetaContentBlockSourceContentParam]]]
+
+ type: Required[Literal["content"]]
diff --git a/src/anthropic/types/beta/beta_plain_text_source_param.py b/src/anthropic/types/beta/beta_plain_text_source_param.py
new file mode 100644
index 00000000..187a2386
--- /dev/null
+++ b/src/anthropic/types/beta/beta_plain_text_source_param.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["BetaPlainTextSourceParam"]
+
+
+class BetaPlainTextSourceParam(TypedDict, total=False):
+ data: Required[str]
+
+ media_type: Required[Literal["text/plain"]]
+
+ type: Required[Literal["text"]]
diff --git a/src/anthropic/types/beta/beta_raw_content_block_delta_event.py b/src/anthropic/types/beta/beta_raw_content_block_delta_event.py
index 03ce6557..cfe0a3b2 100644
--- a/src/anthropic/types/beta/beta_raw_content_block_delta_event.py
+++ b/src/anthropic/types/beta/beta_raw_content_block_delta_event.py
@@ -1,15 +1,19 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from typing import Union
-from typing_extensions import Literal, TypeAlias
+from typing_extensions import Literal, Annotated, TypeAlias
+from ..._utils import PropertyInfo
from ..._models import BaseModel
from .beta_text_delta import BetaTextDelta
+from .beta_citations_delta import BetaCitationsDelta
from .beta_input_json_delta import BetaInputJSONDelta
__all__ = ["BetaRawContentBlockDeltaEvent", "Delta"]
-Delta: TypeAlias = Union[BetaTextDelta, BetaInputJSONDelta]
+Delta: TypeAlias = Annotated[
+ Union[BetaTextDelta, BetaInputJSONDelta, BetaCitationsDelta], PropertyInfo(discriminator="type")
+]
class BetaRawContentBlockDeltaEvent(BaseModel):
diff --git a/src/anthropic/types/beta/beta_text_block.py b/src/anthropic/types/beta/beta_text_block.py
index 8c95d7a7..f6374b41 100644
--- a/src/anthropic/types/beta/beta_text_block.py
+++ b/src/anthropic/types/beta/beta_text_block.py
@@ -1,13 +1,23 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from typing import List, Optional
from typing_extensions import Literal
from ..._models import BaseModel
+from .beta_text_citation import BetaTextCitation
__all__ = ["BetaTextBlock"]
class BetaTextBlock(BaseModel):
+ citations: Optional[List[BetaTextCitation]] = None
+ """Citations supporting the text block.
+
+ The type of citation returned will depend on the type of document being cited.
+ Citing a PDF results in `page_location`, plain text results in `char_location`,
+ and content document results in `content_block_location`.
+ """
+
text: str
type: Literal["text"]
diff --git a/src/anthropic/types/beta/beta_text_block_param.py b/src/anthropic/types/beta/beta_text_block_param.py
index 4dea5572..e40b03a5 100644
--- a/src/anthropic/types/beta/beta_text_block_param.py
+++ b/src/anthropic/types/beta/beta_text_block_param.py
@@ -2,9 +2,10 @@
from __future__ import annotations
-from typing import Optional
+from typing import Iterable, Optional
from typing_extensions import Literal, Required, TypedDict
+from .beta_text_citation_param import BetaTextCitationParam
from .beta_cache_control_ephemeral_param import BetaCacheControlEphemeralParam
__all__ = ["BetaTextBlockParam"]
@@ -16,3 +17,5 @@ class BetaTextBlockParam(TypedDict, total=False):
type: Required[Literal["text"]]
cache_control: Optional[BetaCacheControlEphemeralParam]
+
+ citations: Optional[Iterable[BetaTextCitationParam]]
diff --git a/src/anthropic/types/beta/beta_text_citation.py b/src/anthropic/types/beta/beta_text_citation.py
new file mode 100644
index 00000000..538878b6
--- /dev/null
+++ b/src/anthropic/types/beta/beta_text_citation.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Annotated, TypeAlias
+
+from ..._utils import PropertyInfo
+from .beta_citation_char_location import BetaCitationCharLocation
+from .beta_citation_page_location import BetaCitationPageLocation
+from .beta_citation_content_block_location import BetaCitationContentBlockLocation
+
+__all__ = ["BetaTextCitation"]
+
+BetaTextCitation: TypeAlias = Annotated[
+ Union[BetaCitationCharLocation, BetaCitationPageLocation, BetaCitationContentBlockLocation],
+ PropertyInfo(discriminator="type"),
+]
diff --git a/src/anthropic/types/beta/beta_text_citation_param.py b/src/anthropic/types/beta/beta_text_citation_param.py
new file mode 100644
index 00000000..b04c3305
--- /dev/null
+++ b/src/anthropic/types/beta/beta_text_citation_param.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import TypeAlias
+
+from .beta_citation_char_location_param import BetaCitationCharLocationParam
+from .beta_citation_page_location_param import BetaCitationPageLocationParam
+from .beta_citation_content_block_location_param import BetaCitationContentBlockLocationParam
+
+__all__ = ["BetaTextCitationParam"]
+
+BetaTextCitationParam: TypeAlias = Union[
+ BetaCitationCharLocationParam, BetaCitationPageLocationParam, BetaCitationContentBlockLocationParam
+]
diff --git a/src/anthropic/types/citation_char_location.py b/src/anthropic/types/citation_char_location.py
new file mode 100644
index 00000000..011b1066
--- /dev/null
+++ b/src/anthropic/types/citation_char_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["CitationCharLocation"]
+
+
+class CitationCharLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_char_index: int
+
+ start_char_index: int
+
+ type: Literal["char_location"]
diff --git a/src/anthropic/types/citation_char_location_param.py b/src/anthropic/types/citation_char_location_param.py
new file mode 100644
index 00000000..1cc1dfb1
--- /dev/null
+++ b/src/anthropic/types/citation_char_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["CitationCharLocationParam"]
+
+
+class CitationCharLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_char_index: Required[int]
+
+ start_char_index: Required[int]
+
+ type: Required[Literal["char_location"]]
diff --git a/src/anthropic/types/citation_content_block_location.py b/src/anthropic/types/citation_content_block_location.py
new file mode 100644
index 00000000..0df0ce57
--- /dev/null
+++ b/src/anthropic/types/citation_content_block_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["CitationContentBlockLocation"]
+
+
+class CitationContentBlockLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_block_index: int
+
+ start_block_index: int
+
+ type: Literal["content_block_location"]
diff --git a/src/anthropic/types/citation_content_block_location_param.py b/src/anthropic/types/citation_content_block_location_param.py
new file mode 100644
index 00000000..ee0a6a23
--- /dev/null
+++ b/src/anthropic/types/citation_content_block_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["CitationContentBlockLocationParam"]
+
+
+class CitationContentBlockLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_block_index: Required[int]
+
+ start_block_index: Required[int]
+
+ type: Required[Literal["content_block_location"]]
diff --git a/src/anthropic/types/citation_page_location.py b/src/anthropic/types/citation_page_location.py
new file mode 100644
index 00000000..94c4d509
--- /dev/null
+++ b/src/anthropic/types/citation_page_location.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Optional
+from typing_extensions import Literal
+
+from .._models import BaseModel
+
+__all__ = ["CitationPageLocation"]
+
+
+class CitationPageLocation(BaseModel):
+ cited_text: str
+
+ document_index: int
+
+ document_title: Optional[str] = None
+
+ end_page_number: int
+
+ start_page_number: int
+
+ type: Literal["page_location"]
diff --git a/src/anthropic/types/citation_page_location_param.py b/src/anthropic/types/citation_page_location_param.py
new file mode 100644
index 00000000..483837b5
--- /dev/null
+++ b/src/anthropic/types/citation_page_location_param.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Optional
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["CitationPageLocationParam"]
+
+
+class CitationPageLocationParam(TypedDict, total=False):
+ cited_text: Required[str]
+
+ document_index: Required[int]
+
+ document_title: Required[Optional[str]]
+
+ end_page_number: Required[int]
+
+ start_page_number: Required[int]
+
+ type: Required[Literal["page_location"]]
diff --git a/src/anthropic/types/citations_config_param.py b/src/anthropic/types/citations_config_param.py
new file mode 100644
index 00000000..817397f8
--- /dev/null
+++ b/src/anthropic/types/citations_config_param.py
@@ -0,0 +1,11 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import TypedDict
+
+__all__ = ["CitationsConfigParam"]
+
+
+class CitationsConfigParam(TypedDict, total=False):
+ enabled: bool
diff --git a/src/anthropic/types/citations_delta.py b/src/anthropic/types/citations_delta.py
new file mode 100644
index 00000000..3eab03d1
--- /dev/null
+++ b/src/anthropic/types/citations_delta.py
@@ -0,0 +1,22 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Literal, Annotated, TypeAlias
+
+from .._utils import PropertyInfo
+from .._models import BaseModel
+from .citation_char_location import CitationCharLocation
+from .citation_page_location import CitationPageLocation
+from .citation_content_block_location import CitationContentBlockLocation
+
+__all__ = ["CitationsDelta", "Citation"]
+
+Citation: TypeAlias = Annotated[
+ Union[CitationCharLocation, CitationPageLocation, CitationContentBlockLocation], PropertyInfo(discriminator="type")
+]
+
+
+class CitationsDelta(BaseModel):
+ citation: Citation
+
+ type: Literal["citations_delta"]
diff --git a/src/anthropic/types/content_block_source_content_param.py b/src/anthropic/types/content_block_source_content_param.py
new file mode 100644
index 00000000..0e70cd25
--- /dev/null
+++ b/src/anthropic/types/content_block_source_content_param.py
@@ -0,0 +1,13 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import TypeAlias
+
+from .text_block_param import TextBlockParam
+from .image_block_param import ImageBlockParam
+
+__all__ = ["ContentBlockSourceContentParam"]
+
+ContentBlockSourceContentParam: TypeAlias = Union[TextBlockParam, ImageBlockParam]
diff --git a/src/anthropic/types/content_block_source_param.py b/src/anthropic/types/content_block_source_param.py
new file mode 100644
index 00000000..8050f3e6
--- /dev/null
+++ b/src/anthropic/types/content_block_source_param.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union, Iterable
+from typing_extensions import Literal, Required, TypedDict
+
+from .content_block_source_content_param import ContentBlockSourceContentParam
+
+__all__ = ["ContentBlockSourceParam"]
+
+
+class ContentBlockSourceParam(TypedDict, total=False):
+ content: Required[Union[str, Iterable[ContentBlockSourceContentParam]]]
+
+ type: Required[Literal["content"]]
diff --git a/src/anthropic/types/document_block_param.py b/src/anthropic/types/document_block_param.py
index 57522e93..e116fa75 100644
--- a/src/anthropic/types/document_block_param.py
+++ b/src/anthropic/types/document_block_param.py
@@ -2,18 +2,29 @@
from __future__ import annotations
-from typing import Optional
-from typing_extensions import Literal, Required, TypedDict
+from typing import Union, Optional
+from typing_extensions import Literal, Required, TypeAlias, TypedDict
+from .citations_config_param import CitationsConfigParam
from .base64_pdf_source_param import Base64PDFSourceParam
+from .plain_text_source_param import PlainTextSourceParam
+from .content_block_source_param import ContentBlockSourceParam
from .cache_control_ephemeral_param import CacheControlEphemeralParam
-__all__ = ["DocumentBlockParam"]
+__all__ = ["DocumentBlockParam", "Source"]
+
+Source: TypeAlias = Union[Base64PDFSourceParam, PlainTextSourceParam, ContentBlockSourceParam]
class DocumentBlockParam(TypedDict, total=False):
- source: Required[Base64PDFSourceParam]
+ source: Required[Source]
type: Required[Literal["document"]]
cache_control: Optional[CacheControlEphemeralParam]
+
+ citations: CitationsConfigParam
+
+ context: Optional[str]
+
+ title: Optional[str]
diff --git a/src/anthropic/types/plain_text_source_param.py b/src/anthropic/types/plain_text_source_param.py
new file mode 100644
index 00000000..a2a3b8de
--- /dev/null
+++ b/src/anthropic/types/plain_text_source_param.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing_extensions import Literal, Required, TypedDict
+
+__all__ = ["PlainTextSourceParam"]
+
+
+class PlainTextSourceParam(TypedDict, total=False):
+ data: Required[str]
+
+ media_type: Required[Literal["text/plain"]]
+
+ type: Required[Literal["text"]]
diff --git a/src/anthropic/types/raw_content_block_delta_event.py b/src/anthropic/types/raw_content_block_delta_event.py
index 8785197f..b8e7b811 100644
--- a/src/anthropic/types/raw_content_block_delta_event.py
+++ b/src/anthropic/types/raw_content_block_delta_event.py
@@ -1,15 +1,17 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
from typing import Union
-from typing_extensions import Literal, TypeAlias
+from typing_extensions import Literal, Annotated, TypeAlias
+from .._utils import PropertyInfo
from .._models import BaseModel
from .text_delta import TextDelta
+from .citations_delta import CitationsDelta
from .input_json_delta import InputJSONDelta
__all__ = ["RawContentBlockDeltaEvent", "Delta"]
-Delta: TypeAlias = Union[TextDelta, InputJSONDelta]
+Delta: TypeAlias = Annotated[Union[TextDelta, InputJSONDelta, CitationsDelta], PropertyInfo(discriminator="type")]
class RawContentBlockDeltaEvent(BaseModel):
diff --git a/src/anthropic/types/text_block.py b/src/anthropic/types/text_block.py
index f06083d2..ecdddb69 100644
--- a/src/anthropic/types/text_block.py
+++ b/src/anthropic/types/text_block.py
@@ -1,13 +1,23 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+from typing import List, Optional
from typing_extensions import Literal
from .._models import BaseModel
+from .text_citation import TextCitation
__all__ = ["TextBlock"]
class TextBlock(BaseModel):
+ citations: Optional[List[TextCitation]] = None
+ """Citations supporting the text block.
+
+ The type of citation returned will depend on the type of document being cited.
+ Citing a PDF results in `page_location`, plain text results in `char_location`,
+ and content document results in `content_block_location`.
+ """
+
text: str
type: Literal["text"]
diff --git a/src/anthropic/types/text_block_param.py b/src/anthropic/types/text_block_param.py
index 0b27ee2b..92151733 100644
--- a/src/anthropic/types/text_block_param.py
+++ b/src/anthropic/types/text_block_param.py
@@ -2,9 +2,10 @@
from __future__ import annotations
-from typing import Optional
+from typing import Iterable, Optional
from typing_extensions import Literal, Required, TypedDict
+from .text_citation_param import TextCitationParam
from .cache_control_ephemeral_param import CacheControlEphemeralParam
__all__ = ["TextBlockParam"]
@@ -16,3 +17,5 @@ class TextBlockParam(TypedDict, total=False):
type: Required[Literal["text"]]
cache_control: Optional[CacheControlEphemeralParam]
+
+ citations: Optional[Iterable[TextCitationParam]]
diff --git a/src/anthropic/types/text_citation.py b/src/anthropic/types/text_citation.py
new file mode 100644
index 00000000..159771ae
--- /dev/null
+++ b/src/anthropic/types/text_citation.py
@@ -0,0 +1,15 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from typing import Union
+from typing_extensions import Annotated, TypeAlias
+
+from .._utils import PropertyInfo
+from .citation_char_location import CitationCharLocation
+from .citation_page_location import CitationPageLocation
+from .citation_content_block_location import CitationContentBlockLocation
+
+__all__ = ["TextCitation"]
+
+TextCitation: TypeAlias = Annotated[
+ Union[CitationCharLocation, CitationPageLocation, CitationContentBlockLocation], PropertyInfo(discriminator="type")
+]
diff --git a/src/anthropic/types/text_citation_param.py b/src/anthropic/types/text_citation_param.py
new file mode 100644
index 00000000..8e988141
--- /dev/null
+++ b/src/anthropic/types/text_citation_param.py
@@ -0,0 +1,16 @@
+# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+from __future__ import annotations
+
+from typing import Union
+from typing_extensions import TypeAlias
+
+from .citation_char_location_param import CitationCharLocationParam
+from .citation_page_location_param import CitationPageLocationParam
+from .citation_content_block_location_param import CitationContentBlockLocationParam
+
+__all__ = ["TextCitationParam"]
+
+TextCitationParam: TypeAlias = Union[
+ CitationCharLocationParam, CitationPageLocationParam, CitationContentBlockLocationParam
+]
diff --git a/tests/api_resources/beta/messages/test_batches.py b/tests/api_resources/beta/messages/test_batches.py
index 1e5e8569..3c06576f 100644
--- a/tests/api_resources/beta/messages/test_batches.py
+++ b/tests/api_resources/beta/messages/test_batches.py
@@ -18,8 +18,6 @@
BetaDeletedMessageBatch,
)
-# pyright: reportDeprecated=false
-
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -70,6 +68,16 @@ def test_method_create_with_all_params(self, client: Anthropic) -> None:
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
"temperature": 1,
@@ -363,8 +371,8 @@ def test_method_results(self, client: Anthropic, respx_mock: MockRouter) -> None
assert i == 1
assert results.http_response.is_stream_consumed
+ @pytest.mark.skip(reason="Prism doesn't support JSONL responses yet")
@parametrize
- @pytest.mark.respx(base_url=base_url)
def test_path_params_results(self, client: Anthropic) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `message_batch_id` but received ''"):
client.beta.messages.batches.results(
@@ -419,6 +427,16 @@ async def test_method_create_with_all_params(self, async_client: AsyncAnthropic)
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
"temperature": 1,
@@ -713,8 +731,8 @@ async def test_method_results(self, async_client: AsyncAnthropic, respx_mock: Mo
assert i == 1
assert results.http_response.is_stream_consumed
+ @pytest.mark.skip(reason="Prism doesn't support JSONL responses yet")
@parametrize
- @pytest.mark.respx(base_url=base_url)
async def test_path_params_results(self, async_client: AsyncAnthropic) -> None:
with pytest.raises(ValueError, match=r"Expected a non-empty value for `message_batch_id` but received ''"):
await async_client.beta.messages.batches.results(
diff --git a/tests/api_resources/beta/test_messages.py b/tests/api_resources/beta/test_messages.py
index e203f745..1d6fae2d 100644
--- a/tests/api_resources/beta/test_messages.py
+++ b/tests/api_resources/beta/test_messages.py
@@ -53,6 +53,16 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -159,6 +169,16 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -260,6 +280,16 @@ def test_method_count_tokens_with_all_params(self, client: Anthropic) -> None:
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
tool_choice={
@@ -364,6 +394,16 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -470,6 +510,16 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -571,6 +621,16 @@ async def test_method_count_tokens_with_all_params(self, async_client: AsyncAnth
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
tool_choice={
diff --git a/tests/api_resources/messages/test_batches.py b/tests/api_resources/messages/test_batches.py
index 96bb529b..de84b3c3 100644
--- a/tests/api_resources/messages/test_batches.py
+++ b/tests/api_resources/messages/test_batches.py
@@ -12,9 +12,10 @@
from anthropic import Anthropic, AsyncAnthropic
from tests.utils import assert_matches_type
from anthropic.pagination import SyncPage, AsyncPage
-from anthropic.types.messages import MessageBatch, DeletedMessageBatch
-
-# pyright: reportDeprecated=false
+from anthropic.types.messages import (
+ MessageBatch,
+ DeletedMessageBatch,
+)
base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010")
@@ -273,14 +274,6 @@ def test_method_results(self, client: Anthropic, respx_mock: MockRouter) -> None
assert i == 1
assert results.http_response.is_stream_consumed
- @parametrize
- @pytest.mark.respx(base_url=base_url)
- def test_path_params_results(self, client: Anthropic) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `message_batch_id` but received ''"):
- client.messages.batches.with_raw_response.results(
- "",
- )
-
class TestAsyncBatches:
parametrize = pytest.mark.parametrize("async_client", [False, True], indirect=True, ids=["loose", "strict"])
@@ -535,11 +528,3 @@ async def test_method_results(self, async_client: AsyncAnthropic, respx_mock: Mo
assert i == 1
assert results.http_response.is_stream_consumed
-
- @parametrize
- @pytest.mark.respx(base_url=base_url)
- async def test_path_params_results(self, async_client: AsyncAnthropic) -> None:
- with pytest.raises(ValueError, match=r"Expected a non-empty value for `message_batch_id` but received ''"):
- await async_client.messages.batches.with_raw_response.results(
- "",
- )
diff --git a/tests/api_resources/test_messages.py b/tests/api_resources/test_messages.py
index eb8bafdd..9fa312d5 100644
--- a/tests/api_resources/test_messages.py
+++ b/tests/api_resources/test_messages.py
@@ -54,6 +54,16 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -158,6 +168,16 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -267,6 +287,16 @@ def test_method_count_tokens_with_all_params(self, client: Anthropic) -> None:
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
tool_choice={
@@ -369,6 +399,16 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -473,6 +513,16 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
temperature=1,
@@ -582,6 +632,16 @@ async def test_method_count_tokens_with_all_params(self, async_client: AsyncAnth
"text": "Today's date is 2024-06-01.",
"type": "text",
"cache_control": {"type": "ephemeral"},
+ "citations": [
+ {
+ "cited_text": "cited_text",
+ "document_index": 0,
+ "document_title": "x",
+ "end_char_index": 0,
+ "start_char_index": 0,
+ "type": "char_location",
+ }
+ ],
}
],
tool_choice={