From bc2122927578ed528e9f1447d36987bf0c56ef26 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 19:05:59 +0000 Subject: [PATCH 01/10] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index d44995ad..b559b356 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 77 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-e0696f59ae07dc1a9c5a8fc87a4eb05eb35afabaac0b5ff0ea38810fa9dd4a74.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-887672e4d20da26b724d31b0da770624a3b296558994dde969b5784f48777e6f.yml openapi_spec_hash: 69278ebbb0d1aa0b322bbbd5128bcec5 -config_hash: b0dbd234c2752507397c139a416f6cba +config_hash: b28d789e5ee5c2419cd06c9d0497642f From 1f9eed3a953c8cef0967df8470e04f7ac8fe3235 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 17:39:03 +0000 Subject: [PATCH 02/10] perf(client): optimize file structure copying in multipart requests --- src/anthropic/_files.py | 56 ++++++++++- src/anthropic/_utils/__init__.py | 1 - src/anthropic/_utils/_utils.py | 15 --- src/anthropic/resources/beta/files.py | 15 +-- src/anthropic/resources/beta/skills/skills.py | 21 ++-- .../resources/beta/skills/versions.py | 15 +-- tests/test_deepcopy.py | 58 ----------- tests/test_files.py | 99 ++++++++++++++++++- 8 files changed, 167 insertions(+), 113 deletions(-) delete mode 100644 tests/test_deepcopy.py diff --git a/src/anthropic/_files.py b/src/anthropic/_files.py index f2a6f94e..4c74556c 100644 --- a/src/anthropic/_files.py +++ b/src/anthropic/_files.py @@ -3,8 +3,8 @@ import io import os import pathlib -from typing import overload -from typing_extensions import TypeGuard +from typing import Sequence, cast, overload +from typing_extensions import TypeVar, TypeGuard import anyio @@ -17,7 +17,9 @@ HttpxFileContent, HttpxRequestFiles, ) -from ._utils import is_tuple_t, is_mapping_t, is_sequence_t +from ._utils import is_list, is_mapping, is_tuple_t, is_mapping_t, is_sequence_t + +_T = TypeVar("_T") def is_base64_file_input(obj: object) -> TypeGuard[Base64FileInput]: @@ -121,3 +123,51 @@ async def async_read_file_content(file: FileContent) -> HttpxFileContent: return await anyio.Path(file).read_bytes() return file + + +def deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]]) -> _T: + """Copy only the containers along the given paths. + + Used to guard against mutation by extract_files without copying the entire structure. + Only dicts and lists that lie on a path are copied; everything else + is returned by reference. + + For example, given paths=[["foo", "files", "file"]] and the structure: + { + "foo": { + "bar": {"baz": {}}, + "files": {"file": } + } + } + The root dict, "foo", and "files" are copied (they lie on the path). + "bar" and "baz" are returned by reference (off the path). + """ + return _deepcopy_with_paths(item, paths, 0) + + +def _deepcopy_with_paths(item: _T, paths: Sequence[Sequence[str]], index: int) -> _T: + if not paths: + return item + if is_mapping(item): + key_to_paths: dict[str, list[Sequence[str]]] = {} + for path in paths: + if index < len(path): + key_to_paths.setdefault(path[index], []).append(path) + + # if no path continues through this mapping, it won't be mutated and copying it is redundant + if not key_to_paths: + return item + + result = dict(item) + for key, subpaths in key_to_paths.items(): + if key in result: + result[key] = _deepcopy_with_paths(result[key], subpaths, index + 1) + return cast(_T, result) + if is_list(item): + array_paths = [path for path in paths if index < len(path) and path[index] == ""] + + # if no path expects a list here, nothing will be mutated inside it - return by reference + if not array_paths: + return cast(_T, item) + return cast(_T, [_deepcopy_with_paths(entry, array_paths, index + 1) for entry in item]) + return item diff --git a/src/anthropic/_utils/__init__.py b/src/anthropic/_utils/__init__.py index 913f7e4e..420d5b67 100644 --- a/src/anthropic/_utils/__init__.py +++ b/src/anthropic/_utils/__init__.py @@ -24,7 +24,6 @@ coerce_integer as coerce_integer, file_from_path as file_from_path, strip_not_given as strip_not_given, - deepcopy_minimal as deepcopy_minimal, get_async_library as get_async_library, maybe_coerce_float as maybe_coerce_float, get_required_header as get_required_header, diff --git a/src/anthropic/_utils/_utils.py b/src/anthropic/_utils/_utils.py index 63b8cd60..771859f5 100644 --- a/src/anthropic/_utils/_utils.py +++ b/src/anthropic/_utils/_utils.py @@ -177,21 +177,6 @@ def is_iterable(obj: object) -> TypeGuard[Iterable[object]]: return isinstance(obj, Iterable) -def deepcopy_minimal(item: _T) -> _T: - """Minimal reimplementation of copy.deepcopy() that will only copy certain object types: - - - mappings, e.g. `dict` - - list - - This is done for performance reasons. - """ - if is_mapping(item): - return cast(_T, {k: deepcopy_minimal(v) for k, v in item.items()}) - if is_list(item): - return cast(_T, [deepcopy_minimal(entry) for entry in item]) - return item - - # copied from https://github.com/Rapptz/RoboDanny def human_join(seq: Sequence[str], *, delim: str = ", ", final: str = "or") -> str: size = len(seq) diff --git a/src/anthropic/resources/beta/files.py b/src/anthropic/resources/beta/files.py index e5fd29e3..0bc03801 100644 --- a/src/anthropic/resources/beta/files.py +++ b/src/anthropic/resources/beta/files.py @@ -8,16 +8,9 @@ import httpx from ... import _legacy_response +from ..._files import deepcopy_with_paths from ..._types import Body, Omit, Query, Headers, NotGiven, FileTypes, omit, not_given -from ..._utils import ( - is_given, - extract_files, - path_template, - maybe_transform, - strip_not_given, - deepcopy_minimal, - async_maybe_transform, -) +from ..._utils import is_given, extract_files, path_template, maybe_transform, strip_not_given, async_maybe_transform from ..._compat import cached_property from ..._resource import SyncAPIResource, AsyncAPIResource from ..._response import ( @@ -326,7 +319,7 @@ def upload( } extra_headers = {"anthropic-beta": "files-api-2025-04-14", **(extra_headers or {})} extra_headers = {**_stainless_helper_header_from_file(file), **extra_headers} - body = deepcopy_minimal({"file": file}) + body = deepcopy_with_paths({"file": file}, [["file"]]) files = extract_files(cast(Mapping[str, object], body), paths=[["file"]]) # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. @@ -626,7 +619,7 @@ async def upload( } extra_headers = {"anthropic-beta": "files-api-2025-04-14", **(extra_headers or {})} extra_headers = {**_stainless_helper_header_from_file(file), **extra_headers} - body = deepcopy_minimal({"file": file}) + body = deepcopy_with_paths({"file": file}, [["file"]]) files = extract_files(cast(Mapping[str, object], body), paths=[["file"]]) # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. diff --git a/src/anthropic/resources/beta/skills/skills.py b/src/anthropic/resources/beta/skills/skills.py index 861a0f93..b2241a6d 100644 --- a/src/anthropic/resources/beta/skills/skills.py +++ b/src/anthropic/resources/beta/skills/skills.py @@ -16,6 +16,7 @@ VersionsWithStreamingResponse, AsyncVersionsWithStreamingResponse, ) +from ...._files import deepcopy_with_paths from ...._types import ( Body, Omit, @@ -27,15 +28,7 @@ omit, not_given, ) -from ...._utils import ( - is_given, - extract_files, - path_template, - maybe_transform, - strip_not_given, - deepcopy_minimal, - async_maybe_transform, -) +from ...._utils import is_given, extract_files, path_template, maybe_transform, strip_not_given, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper @@ -123,11 +116,12 @@ def create( **(extra_headers or {}), } extra_headers = {"anthropic-beta": "skills-2025-10-02", **(extra_headers or {})} - body = deepcopy_minimal( + body = deepcopy_with_paths( { "display_title": display_title, "files": files, - } + }, + [["files", ""]], ) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""]]) # It should be noted that the actual Content-Type header that will be @@ -394,11 +388,12 @@ async def create( **(extra_headers or {}), } extra_headers = {"anthropic-beta": "skills-2025-10-02", **(extra_headers or {})} - body = deepcopy_minimal( + body = deepcopy_with_paths( { "display_title": display_title, "files": files, - } + }, + [["files", ""]], ) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""]]) # It should be noted that the actual Content-Type header that will be diff --git a/src/anthropic/resources/beta/skills/versions.py b/src/anthropic/resources/beta/skills/versions.py index a0cc0bd6..d849f45d 100644 --- a/src/anthropic/resources/beta/skills/versions.py +++ b/src/anthropic/resources/beta/skills/versions.py @@ -8,6 +8,7 @@ import httpx from .... import _legacy_response +from ...._files import deepcopy_with_paths from ...._types import ( Body, Omit, @@ -19,15 +20,7 @@ omit, not_given, ) -from ...._utils import ( - is_given, - extract_files, - path_template, - maybe_transform, - strip_not_given, - deepcopy_minimal, - async_maybe_transform, -) +from ...._utils import is_given, extract_files, path_template, maybe_transform, strip_not_given, async_maybe_transform from ...._compat import cached_property from ...._resource import SyncAPIResource, AsyncAPIResource from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper @@ -112,7 +105,7 @@ def create( **(extra_headers or {}), } extra_headers = {"anthropic-beta": "skills-2025-10-02", **(extra_headers or {})} - body = deepcopy_minimal({"files": files}) + body = deepcopy_with_paths({"files": files}, [["files", ""]]) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""]]) # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. @@ -384,7 +377,7 @@ async def create( **(extra_headers or {}), } extra_headers = {"anthropic-beta": "skills-2025-10-02", **(extra_headers or {})} - body = deepcopy_minimal({"files": files}) + body = deepcopy_with_paths({"files": files}, [["files", ""]]) extracted_files = extract_files(cast(Mapping[str, object], body), paths=[["files", ""]]) # It should be noted that the actual Content-Type header that will be # sent to the server will contain a `boundary` parameter, e.g. diff --git a/tests/test_deepcopy.py b/tests/test_deepcopy.py deleted file mode 100644 index edbbfb22..00000000 --- a/tests/test_deepcopy.py +++ /dev/null @@ -1,58 +0,0 @@ -from anthropic._utils import deepcopy_minimal - - -def assert_different_identities(obj1: object, obj2: object) -> None: - assert obj1 == obj2 - assert id(obj1) != id(obj2) - - -def test_simple_dict() -> None: - obj1 = {"foo": "bar"} - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - - -def test_nested_dict() -> None: - obj1 = {"foo": {"bar": True}} - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - assert_different_identities(obj1["foo"], obj2["foo"]) - - -def test_complex_nested_dict() -> None: - obj1 = {"foo": {"bar": [{"hello": "world"}]}} - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - assert_different_identities(obj1["foo"], obj2["foo"]) - assert_different_identities(obj1["foo"]["bar"], obj2["foo"]["bar"]) - assert_different_identities(obj1["foo"]["bar"][0], obj2["foo"]["bar"][0]) - - -def test_simple_list() -> None: - obj1 = ["a", "b", "c"] - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - - -def test_nested_list() -> None: - obj1 = ["a", [1, 2, 3]] - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - assert_different_identities(obj1[1], obj2[1]) - - -class MyObject: ... - - -def test_ignores_other_types() -> None: - # custom classes - my_obj = MyObject() - obj1 = {"foo": my_obj} - obj2 = deepcopy_minimal(obj1) - assert_different_identities(obj1, obj2) - assert obj1["foo"] is my_obj - - # tuples - obj3 = ("a", "b") - obj4 = deepcopy_minimal(obj3) - assert obj3 is obj4 diff --git a/tests/test_files.py b/tests/test_files.py index 4b118fe0..fc571b25 100644 --- a/tests/test_files.py +++ b/tests/test_files.py @@ -4,7 +4,8 @@ import pytest from dirty_equals import IsDict, IsList, IsBytes, IsTuple -from anthropic._files import to_httpx_files, async_to_httpx_files +from anthropic._files import to_httpx_files, deepcopy_with_paths, async_to_httpx_files +from anthropic._utils import extract_files readme_path = Path(__file__).parent.parent.joinpath("README.md") @@ -49,3 +50,99 @@ def test_string_not_allowed() -> None: "file": "foo", # type: ignore } ) + + +def assert_different_identities(obj1: object, obj2: object) -> None: + assert obj1 == obj2 + assert obj1 is not obj2 + + +class TestDeepcopyWithPaths: + def test_copies_top_level_dict(self) -> None: + original = {"file": b"data", "other": "value"} + result = deepcopy_with_paths(original, [["file"]]) + assert_different_identities(result, original) + + def test_file_value_is_same_reference(self) -> None: + file_bytes = b"contents" + original = {"file": file_bytes} + result = deepcopy_with_paths(original, [["file"]]) + assert_different_identities(result, original) + assert result["file"] is file_bytes + + def test_list_popped_wholesale(self) -> None: + files = [b"f1", b"f2"] + original = {"files": files, "title": "t"} + result = deepcopy_with_paths(original, [["files", ""]]) + assert_different_identities(result, original) + result_files = result["files"] + assert isinstance(result_files, list) + assert_different_identities(result_files, files) + + def test_nested_array_path_copies_list_and_elements(self) -> None: + elem1 = {"file": b"f1", "extra": 1} + elem2 = {"file": b"f2", "extra": 2} + original = {"items": [elem1, elem2]} + result = deepcopy_with_paths(original, [["items", "", "file"]]) + assert_different_identities(result, original) + result_items = result["items"] + assert isinstance(result_items, list) + assert_different_identities(result_items, original["items"]) + assert_different_identities(result_items[0], elem1) + assert_different_identities(result_items[1], elem2) + + def test_empty_paths_returns_same_object(self) -> None: + original = {"foo": "bar"} + result = deepcopy_with_paths(original, []) + assert result is original + + def test_multiple_paths(self) -> None: + f1 = b"file1" + f2 = b"file2" + original = {"a": f1, "b": f2, "c": "unchanged"} + result = deepcopy_with_paths(original, [["a"], ["b"]]) + assert_different_identities(result, original) + assert result["a"] is f1 + assert result["b"] is f2 + assert result["c"] is original["c"] + + def test_extract_files_does_not_mutate_original_top_level(self) -> None: + file_bytes = b"contents" + original = {"file": file_bytes, "other": "value"} + + copied = deepcopy_with_paths(original, [["file"]]) + extracted = extract_files(copied, paths=[["file"]]) + + assert extracted == [("file", file_bytes)] + assert original == {"file": file_bytes, "other": "value"} + assert copied == {"other": "value"} + + def test_extract_files_does_not_mutate_original_nested_array_path(self) -> None: + file1 = b"f1" + file2 = b"f2" + original = { + "items": [ + {"file": file1, "extra": 1}, + {"file": file2, "extra": 2}, + ], + "title": "example", + } + + copied = deepcopy_with_paths(original, [["items", "", "file"]]) + extracted = extract_files(copied, paths=[["items", "", "file"]]) + + assert extracted == [("items[][file]", file1), ("items[][file]", file2)] + assert original == { + "items": [ + {"file": file1, "extra": 1}, + {"file": file2, "extra": 2}, + ], + "title": "example", + } + assert copied == { + "items": [ + {"extra": 1}, + {"extra": 2}, + ], + "title": "example", + } From a4b7184e57410ae92a409db5ee6fec90edceaa51 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 19:55:34 +0000 Subject: [PATCH 03/10] chore(tests): bump steady to v0.22.1 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 1f84b12f..2147c2f8 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stdy/cli@0.20.2 -- steady --version + npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.20.2 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 03fce0b9..6547bc04 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.2 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=comma --validator-form-array-format=brackets --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 From 7ed737089d1f28385ee827f601ba81f1935d0b6a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 14:03:42 +0000 Subject: [PATCH 04/10] chore(internal): more robust bootstrap script --- scripts/bootstrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/bootstrap b/scripts/bootstrap index 4638ec69..5a23841b 100755 --- a/scripts/bootstrap +++ b/scripts/bootstrap @@ -4,7 +4,7 @@ set -e cd "$(dirname "$0")/.." -if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "$SKIP_BREW" != "1" ] && [ -t 0 ]; then +if [ -f "Brewfile" ] && [ "$(uname -s)" = "Darwin" ] && [ "${SKIP_BREW:-}" != "1" ] && [ -t 0 ]; then brew bundle check >/dev/null 2>&1 || { echo -n "==> Install Homebrew dependencies? (y/N): " read -r response From 1434904017d42fafb66aa73c0006c2f119bc3f3d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:14:26 +0000 Subject: [PATCH 05/10] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index b559b356..7387d88d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 77 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-887672e4d20da26b724d31b0da770624a3b296558994dde969b5784f48777e6f.yml openapi_spec_hash: 69278ebbb0d1aa0b322bbbd5128bcec5 -config_hash: b28d789e5ee5c2419cd06c9d0497642f +config_hash: 0f75c844d90999c12de1871c5dd37d2b From fc30ebe5ca81204faa0b1d756b61dad176e37dcb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 18:19:01 +0000 Subject: [PATCH 06/10] feat(api): CMA Memory public beta --- .stats.yml | 8 +- api.md | 89 +- src/anthropic/resources/beta/__init__.py | 26 +- src/anthropic/resources/beta/beta.py | 64 +- .../resources/beta/memory_stores/__init__.py | 47 + .../resources/beta/memory_stores/memories.py | 854 ++++++++++++++++++ .../memory_stores.py} | 570 ++++++++---- .../beta/memory_stores/memory_versions.py | 554 ++++++++++++ .../resources/beta/messages/messages.py | 82 +- src/anthropic/resources/completions.py | 54 +- src/anthropic/resources/messages/messages.py | 54 +- src/anthropic/types/anthropic_beta_param.py | 1 - src/anthropic/types/beta/__init__.py | 17 +- .../types/beta/beta_compaction_block.py | 3 - .../types/beta/beta_compaction_block_param.py | 3 - .../beta_compaction_content_block_delta.py | 3 - .../types/beta/beta_effort_capability.py | 5 - ...eta_managed_agents_deleted_memory_store.py | 13 + .../beta/beta_managed_agents_memory_store.py | 30 + ...aged_agents_memory_store_resource_param.py | 29 + .../types/beta/beta_output_config_param.py | 6 +- .../beta/beta_token_task_budget_param.py | 25 - src/anthropic/types/beta/beta_user_profile.py | 39 - .../beta/beta_user_profile_enrollment_url.py | 19 - .../beta/beta_user_profile_trust_grant.py | 12 - ...arams.py => memory_store_create_params.py} | 17 +- .../types/beta/memory_store_list_params.py | 32 + ...arams.py => memory_store_update_params.py} | 21 +- .../types/beta/memory_stores/__init__.py | 27 + .../beta_managed_agents_actor.py | 16 + .../beta_managed_agents_api_actor.py | 13 + .../beta_managed_agents_deleted_memory.py | 13 + .../beta_managed_agents_memory.py | 33 + .../beta_managed_agents_memory_list_item.py | 14 + .../beta_managed_agents_memory_prefix.py | 13 + .../beta_managed_agents_memory_version.py | 42 + ...managed_agents_memory_version_operation.py | 7 + .../beta_managed_agents_memory_view.py | 7 + .../beta_managed_agents_precondition_param.py | 13 + .../beta_managed_agents_session_actor.py | 13 + .../beta_managed_agents_user_actor.py | 13 + .../memory_stores/memory_create_params.py | 24 + .../memory_stores/memory_delete_params.py | 21 + .../beta/memory_stores/memory_list_params.py | 42 + .../memory_stores/memory_retrieve_params.py | 22 + .../memory_stores/memory_update_params.py | 29 + .../memory_version_list_params.py | 46 + .../memory_version_retrieve_params.py | 22 + .../types/beta/message_create_params.py | 15 +- .../beta/messages/batch_create_params.py | 1 + .../types/beta/session_create_params.py | 7 +- src/anthropic/types/beta/sessions/__init__.py | 3 + ...ta_managed_agents_memory_store_resource.py | 48 + .../beta_managed_agents_session_resource.py | 6 +- .../sessions/resource_retrieve_response.py | 6 +- .../beta/sessions/resource_update_response.py | 6 +- .../types/beta/user_profile_update_params.py | 30 - .../types/completion_create_params.py | 9 +- src/anthropic/types/effort_capability.py | 5 - src/anthropic/types/message_create_params.py | 9 +- .../types/messages/batch_create_params.py | 1 + src/anthropic/types/output_config_param.py | 2 +- .../beta/memory_stores/__init__.py | 1 + .../beta/memory_stores/test_memories.py | 619 +++++++++++++ .../memory_stores/test_memory_versions.py | 378 ++++++++ .../beta/messages/test_batches.py | 12 - .../api_resources/beta/test_memory_stores.py | 567 ++++++++++++ tests/api_resources/beta/test_messages.py | 55 +- .../api_resources/beta/test_user_profiles.py | 446 --------- 69 files changed, 4232 insertions(+), 1101 deletions(-) create mode 100644 src/anthropic/resources/beta/memory_stores/__init__.py create mode 100644 src/anthropic/resources/beta/memory_stores/memories.py rename src/anthropic/resources/beta/{user_profiles.py => memory_stores/memory_stores.py} (51%) create mode 100644 src/anthropic/resources/beta/memory_stores/memory_versions.py create mode 100644 src/anthropic/types/beta/beta_managed_agents_deleted_memory_store.py create mode 100644 src/anthropic/types/beta/beta_managed_agents_memory_store.py create mode 100644 src/anthropic/types/beta/beta_managed_agents_memory_store_resource_param.py delete mode 100644 src/anthropic/types/beta/beta_token_task_budget_param.py delete mode 100644 src/anthropic/types/beta/beta_user_profile.py delete mode 100644 src/anthropic/types/beta/beta_user_profile_enrollment_url.py delete mode 100644 src/anthropic/types/beta/beta_user_profile_trust_grant.py rename src/anthropic/types/beta/{user_profile_list_params.py => memory_store_create_params.py} (52%) create mode 100644 src/anthropic/types/beta/memory_store_list_params.py rename src/anthropic/types/beta/{user_profile_create_params.py => memory_store_update_params.py} (51%) create mode 100644 src/anthropic/types/beta/memory_stores/__init__.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_actor.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_api_actor.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_deleted_memory.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_list_item.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_prefix.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version_operation.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_view.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_precondition_param.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_session_actor.py create mode 100644 src/anthropic/types/beta/memory_stores/beta_managed_agents_user_actor.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_create_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_delete_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_list_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_retrieve_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_update_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_version_list_params.py create mode 100644 src/anthropic/types/beta/memory_stores/memory_version_retrieve_params.py create mode 100644 src/anthropic/types/beta/sessions/beta_managed_agents_memory_store_resource.py delete mode 100644 src/anthropic/types/beta/user_profile_update_params.py create mode 100644 tests/api_resources/beta/memory_stores/__init__.py create mode 100644 tests/api_resources/beta/memory_stores/test_memories.py create mode 100644 tests/api_resources/beta/memory_stores/test_memory_versions.py create mode 100644 tests/api_resources/beta/test_memory_stores.py delete mode 100644 tests/api_resources/beta/test_user_profiles.py diff --git a/.stats.yml b/.stats.yml index 7387d88d..2a99d2df 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 77 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-887672e4d20da26b724d31b0da770624a3b296558994dde969b5784f48777e6f.yml -openapi_spec_hash: 69278ebbb0d1aa0b322bbbd5128bcec5 -config_hash: 0f75c844d90999c12de1871c5dd37d2b +configured_endpoints: 86 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-78e8ea00cd66db850ab32db53b5e0037fb0b4a791b513393c03d9011406a6c78.yml +openapi_spec_hash: 3f08b4e5296e181c7243aa92f4a3073e +config_hash: 350c1adcf8bb17e1913ed80e189c5a52 diff --git a/api.md b/api.md index 0ec12114..c1efa825 100644 --- a/api.md +++ b/api.md @@ -444,7 +444,6 @@ from anthropic.types.beta import ( BetaThinkingConfigParam, BetaThinkingDelta, BetaThinkingTurns, - BetaTokenTaskBudget, BetaTool, BetaToolBash20241022, BetaToolBash20250124, @@ -628,6 +627,7 @@ from anthropic.types.beta import ( BetaManagedAgentsDeletedSession, BetaManagedAgentsFileResourceParams, BetaManagedAgentsGitHubRepositoryResourceParams, + BetaManagedAgentsMemoryStoreResourceParam, BetaManagedAgentsSession, BetaManagedAgentsSessionAgent, BetaManagedAgentsSessionStats, @@ -720,6 +720,7 @@ from anthropic.types.beta.sessions import ( BetaManagedAgentsDeleteSessionResource, BetaManagedAgentsFileResource, BetaManagedAgentsGitHubRepositoryResource, + BetaManagedAgentsMemoryStoreResource, BetaManagedAgentsSessionResource, ResourceRetrieveResponse, ResourceUpdateResponse, @@ -788,6 +789,72 @@ Methods: - client.beta.vaults.credentials.delete(credential_id, \*, vault_id) -> BetaManagedAgentsDeletedCredential - client.beta.vaults.credentials.archive(credential_id, \*, vault_id) -> BetaManagedAgentsCredential +## MemoryStores + +Types: + +```python +from anthropic.types.beta import BetaManagedAgentsDeletedMemoryStore, BetaManagedAgentsMemoryStore +``` + +Methods: + +- client.beta.memory_stores.create(\*\*params) -> BetaManagedAgentsMemoryStore +- client.beta.memory_stores.retrieve(memory_store_id) -> BetaManagedAgentsMemoryStore +- client.beta.memory_stores.update(memory_store_id, \*\*params) -> BetaManagedAgentsMemoryStore +- client.beta.memory_stores.list(\*\*params) -> SyncPageCursor[BetaManagedAgentsMemoryStore] +- client.beta.memory_stores.delete(memory_store_id) -> BetaManagedAgentsDeletedMemoryStore +- client.beta.memory_stores.archive(memory_store_id) -> BetaManagedAgentsMemoryStore + +### Memories + +Types: + +```python +from anthropic.types.beta.memory_stores import ( + BetaManagedAgentsConflictError, + BetaManagedAgentsContentSha256Precondition, + BetaManagedAgentsDeletedMemory, + BetaManagedAgentsError, + BetaManagedAgentsMemory, + BetaManagedAgentsMemoryListItem, + BetaManagedAgentsMemoryPathConflictError, + BetaManagedAgentsMemoryPreconditionFailedError, + BetaManagedAgentsMemoryPrefix, + BetaManagedAgentsMemoryView, + BetaManagedAgentsPrecondition, +) +``` + +Methods: + +- client.beta.memory_stores.memories.create(memory_store_id, \*\*params) -> BetaManagedAgentsMemory +- client.beta.memory_stores.memories.retrieve(memory_id, \*, memory_store_id, \*\*params) -> BetaManagedAgentsMemory +- client.beta.memory_stores.memories.update(memory_id, \*, memory_store_id, \*\*params) -> BetaManagedAgentsMemory +- client.beta.memory_stores.memories.list(memory_store_id, \*\*params) -> SyncPageCursor[BetaManagedAgentsMemoryListItem] +- client.beta.memory_stores.memories.delete(memory_id, \*, memory_store_id, \*\*params) -> BetaManagedAgentsDeletedMemory + +### MemoryVersions + +Types: + +```python +from anthropic.types.beta.memory_stores import ( + BetaManagedAgentsActor, + BetaManagedAgentsAPIActor, + BetaManagedAgentsMemoryVersion, + BetaManagedAgentsMemoryVersionOperation, + BetaManagedAgentsSessionActor, + BetaManagedAgentsUserActor, +) +``` + +Methods: + +- client.beta.memory_stores.memory_versions.retrieve(memory_version_id, \*, memory_store_id, \*\*params) -> BetaManagedAgentsMemoryVersion +- client.beta.memory_stores.memory_versions.list(memory_store_id, \*\*params) -> SyncPageCursor[BetaManagedAgentsMemoryVersion] +- client.beta.memory_stores.memory_versions.redact(memory_version_id, \*, memory_store_id) -> BetaManagedAgentsMemoryVersion + ## Files Types: @@ -843,23 +910,3 @@ Methods: - client.beta.skills.versions.retrieve(version, \*, skill_id) -> VersionRetrieveResponse - client.beta.skills.versions.list(skill_id, \*\*params) -> SyncPageCursor[VersionListResponse] - client.beta.skills.versions.delete(version, \*, skill_id) -> VersionDeleteResponse - -## UserProfiles - -Types: - -```python -from anthropic.types.beta import ( - BetaUserProfile, - BetaUserProfileEnrollmentURL, - BetaUserProfileTrustGrant, -) -``` - -Methods: - -- client.beta.user_profiles.create(\*\*params) -> BetaUserProfile -- client.beta.user_profiles.retrieve(user_profile_id) -> BetaUserProfile -- client.beta.user_profiles.update(user_profile_id, \*\*params) -> BetaUserProfile -- client.beta.user_profiles.list(\*\*params) -> SyncPageCursor[BetaUserProfile] -- client.beta.user_profiles.create_enrollment_url(user_profile_id) -> BetaUserProfileEnrollmentURL diff --git a/src/anthropic/resources/beta/__init__.py b/src/anthropic/resources/beta/__init__.py index e0fab122..017140d7 100644 --- a/src/anthropic/resources/beta/__init__.py +++ b/src/anthropic/resources/beta/__init__.py @@ -72,13 +72,13 @@ EnvironmentsWithStreamingResponse, AsyncEnvironmentsWithStreamingResponse, ) -from .user_profiles import ( - UserProfiles, - AsyncUserProfiles, - UserProfilesWithRawResponse, - AsyncUserProfilesWithRawResponse, - UserProfilesWithStreamingResponse, - AsyncUserProfilesWithStreamingResponse, +from .memory_stores import ( + MemoryStores, + AsyncMemoryStores, + MemoryStoresWithRawResponse, + AsyncMemoryStoresWithRawResponse, + MemoryStoresWithStreamingResponse, + AsyncMemoryStoresWithStreamingResponse, ) __all__ = [ @@ -118,6 +118,12 @@ "AsyncVaultsWithRawResponse", "VaultsWithStreamingResponse", "AsyncVaultsWithStreamingResponse", + "MemoryStores", + "AsyncMemoryStores", + "MemoryStoresWithRawResponse", + "AsyncMemoryStoresWithRawResponse", + "MemoryStoresWithStreamingResponse", + "AsyncMemoryStoresWithStreamingResponse", "Files", "AsyncFiles", "FilesWithRawResponse", @@ -130,12 +136,6 @@ "AsyncSkillsWithRawResponse", "SkillsWithStreamingResponse", "AsyncSkillsWithStreamingResponse", - "UserProfiles", - "AsyncUserProfiles", - "UserProfilesWithRawResponse", - "AsyncUserProfilesWithRawResponse", - "UserProfilesWithStreamingResponse", - "AsyncUserProfilesWithStreamingResponse", "Beta", "AsyncBeta", "BetaWithRawResponse", diff --git a/src/anthropic/resources/beta/beta.py b/src/anthropic/resources/beta/beta.py index 9a60f19a..e42a9277 100644 --- a/src/anthropic/resources/beta/beta.py +++ b/src/anthropic/resources/beta/beta.py @@ -44,14 +44,6 @@ SkillsWithStreamingResponse, AsyncSkillsWithStreamingResponse, ) -from .user_profiles import ( - UserProfiles, - AsyncUserProfiles, - UserProfilesWithRawResponse, - AsyncUserProfilesWithRawResponse, - UserProfilesWithStreamingResponse, - AsyncUserProfilesWithStreamingResponse, -) from .vaults.vaults import ( Vaults, AsyncVaults, @@ -76,6 +68,14 @@ SessionsWithStreamingResponse, AsyncSessionsWithStreamingResponse, ) +from .memory_stores.memory_stores import ( + MemoryStores, + AsyncMemoryStores, + MemoryStoresWithRawResponse, + AsyncMemoryStoresWithRawResponse, + MemoryStoresWithStreamingResponse, + AsyncMemoryStoresWithStreamingResponse, +) __all__ = ["Beta", "AsyncBeta"] @@ -105,6 +105,10 @@ def sessions(self) -> Sessions: def vaults(self) -> Vaults: return Vaults(self._client) + @cached_property + def memory_stores(self) -> MemoryStores: + return MemoryStores(self._client) + @cached_property def files(self) -> Files: return Files(self._client) @@ -113,10 +117,6 @@ def files(self) -> Files: def skills(self) -> Skills: return Skills(self._client) - @cached_property - def user_profiles(self) -> UserProfiles: - return UserProfiles(self._client) - @cached_property def with_raw_response(self) -> BetaWithRawResponse: """ @@ -162,6 +162,10 @@ def sessions(self) -> AsyncSessions: def vaults(self) -> AsyncVaults: return AsyncVaults(self._client) + @cached_property + def memory_stores(self) -> AsyncMemoryStores: + return AsyncMemoryStores(self._client) + @cached_property def files(self) -> AsyncFiles: return AsyncFiles(self._client) @@ -170,10 +174,6 @@ def files(self) -> AsyncFiles: def skills(self) -> AsyncSkills: return AsyncSkills(self._client) - @cached_property - def user_profiles(self) -> AsyncUserProfiles: - return AsyncUserProfiles(self._client) - @cached_property def with_raw_response(self) -> AsyncBetaWithRawResponse: """ @@ -222,6 +222,10 @@ def sessions(self) -> SessionsWithRawResponse: def vaults(self) -> VaultsWithRawResponse: return VaultsWithRawResponse(self._beta.vaults) + @cached_property + def memory_stores(self) -> MemoryStoresWithRawResponse: + return MemoryStoresWithRawResponse(self._beta.memory_stores) + @cached_property def files(self) -> FilesWithRawResponse: return FilesWithRawResponse(self._beta.files) @@ -230,10 +234,6 @@ def files(self) -> FilesWithRawResponse: def skills(self) -> SkillsWithRawResponse: return SkillsWithRawResponse(self._beta.skills) - @cached_property - def user_profiles(self) -> UserProfilesWithRawResponse: - return UserProfilesWithRawResponse(self._beta.user_profiles) - class AsyncBetaWithRawResponse: def __init__(self, beta: AsyncBeta) -> None: @@ -263,6 +263,10 @@ def sessions(self) -> AsyncSessionsWithRawResponse: def vaults(self) -> AsyncVaultsWithRawResponse: return AsyncVaultsWithRawResponse(self._beta.vaults) + @cached_property + def memory_stores(self) -> AsyncMemoryStoresWithRawResponse: + return AsyncMemoryStoresWithRawResponse(self._beta.memory_stores) + @cached_property def files(self) -> AsyncFilesWithRawResponse: return AsyncFilesWithRawResponse(self._beta.files) @@ -271,10 +275,6 @@ def files(self) -> AsyncFilesWithRawResponse: def skills(self) -> AsyncSkillsWithRawResponse: return AsyncSkillsWithRawResponse(self._beta.skills) - @cached_property - def user_profiles(self) -> AsyncUserProfilesWithRawResponse: - return AsyncUserProfilesWithRawResponse(self._beta.user_profiles) - class BetaWithStreamingResponse: def __init__(self, beta: Beta) -> None: @@ -304,6 +304,10 @@ def sessions(self) -> SessionsWithStreamingResponse: def vaults(self) -> VaultsWithStreamingResponse: return VaultsWithStreamingResponse(self._beta.vaults) + @cached_property + def memory_stores(self) -> MemoryStoresWithStreamingResponse: + return MemoryStoresWithStreamingResponse(self._beta.memory_stores) + @cached_property def files(self) -> FilesWithStreamingResponse: return FilesWithStreamingResponse(self._beta.files) @@ -312,10 +316,6 @@ def files(self) -> FilesWithStreamingResponse: def skills(self) -> SkillsWithStreamingResponse: return SkillsWithStreamingResponse(self._beta.skills) - @cached_property - def user_profiles(self) -> UserProfilesWithStreamingResponse: - return UserProfilesWithStreamingResponse(self._beta.user_profiles) - class AsyncBetaWithStreamingResponse: def __init__(self, beta: AsyncBeta) -> None: @@ -345,6 +345,10 @@ def sessions(self) -> AsyncSessionsWithStreamingResponse: def vaults(self) -> AsyncVaultsWithStreamingResponse: return AsyncVaultsWithStreamingResponse(self._beta.vaults) + @cached_property + def memory_stores(self) -> AsyncMemoryStoresWithStreamingResponse: + return AsyncMemoryStoresWithStreamingResponse(self._beta.memory_stores) + @cached_property def files(self) -> AsyncFilesWithStreamingResponse: return AsyncFilesWithStreamingResponse(self._beta.files) @@ -352,7 +356,3 @@ def files(self) -> AsyncFilesWithStreamingResponse: @cached_property def skills(self) -> AsyncSkillsWithStreamingResponse: return AsyncSkillsWithStreamingResponse(self._beta.skills) - - @cached_property - def user_profiles(self) -> AsyncUserProfilesWithStreamingResponse: - return AsyncUserProfilesWithStreamingResponse(self._beta.user_profiles) diff --git a/src/anthropic/resources/beta/memory_stores/__init__.py b/src/anthropic/resources/beta/memory_stores/__init__.py new file mode 100644 index 00000000..497fbfab --- /dev/null +++ b/src/anthropic/resources/beta/memory_stores/__init__.py @@ -0,0 +1,47 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from .memories import ( + Memories, + AsyncMemories, + MemoriesWithRawResponse, + AsyncMemoriesWithRawResponse, + MemoriesWithStreamingResponse, + AsyncMemoriesWithStreamingResponse, +) +from .memory_stores import ( + MemoryStores, + AsyncMemoryStores, + MemoryStoresWithRawResponse, + AsyncMemoryStoresWithRawResponse, + MemoryStoresWithStreamingResponse, + AsyncMemoryStoresWithStreamingResponse, +) +from .memory_versions import ( + MemoryVersions, + AsyncMemoryVersions, + MemoryVersionsWithRawResponse, + AsyncMemoryVersionsWithRawResponse, + MemoryVersionsWithStreamingResponse, + AsyncMemoryVersionsWithStreamingResponse, +) + +__all__ = [ + "Memories", + "AsyncMemories", + "MemoriesWithRawResponse", + "AsyncMemoriesWithRawResponse", + "MemoriesWithStreamingResponse", + "AsyncMemoriesWithStreamingResponse", + "MemoryVersions", + "AsyncMemoryVersions", + "MemoryVersionsWithRawResponse", + "AsyncMemoryVersionsWithRawResponse", + "MemoryVersionsWithStreamingResponse", + "AsyncMemoryVersionsWithStreamingResponse", + "MemoryStores", + "AsyncMemoryStores", + "MemoryStoresWithRawResponse", + "AsyncMemoryStoresWithRawResponse", + "MemoryStoresWithStreamingResponse", + "AsyncMemoryStoresWithStreamingResponse", +] diff --git a/src/anthropic/resources/beta/memory_stores/memories.py b/src/anthropic/resources/beta/memory_stores/memories.py new file mode 100644 index 00000000..d9c9a82f --- /dev/null +++ b/src/anthropic/resources/beta/memory_stores/memories.py @@ -0,0 +1,854 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Any, List, Optional, cast +from itertools import chain +from typing_extensions import Literal + +import httpx + +from .... import _legacy_response +from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from ...._utils import is_given, path_template, maybe_transform, strip_not_given, async_maybe_transform +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource +from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper +from ....pagination import SyncPageCursor, AsyncPageCursor +from ...._base_client import AsyncPaginator, make_request_options +from ....types.beta.memory_stores import ( + BetaManagedAgentsMemoryView, + memory_list_params, + memory_create_params, + memory_delete_params, + memory_update_params, + memory_retrieve_params, +) +from ....types.anthropic_beta_param import AnthropicBetaParam +from ....types.beta.memory_stores.beta_managed_agents_memory import BetaManagedAgentsMemory +from ....types.beta.memory_stores.beta_managed_agents_memory_view import BetaManagedAgentsMemoryView +from ....types.beta.memory_stores.beta_managed_agents_deleted_memory import BetaManagedAgentsDeletedMemory +from ....types.beta.memory_stores.beta_managed_agents_memory_list_item import BetaManagedAgentsMemoryListItem +from ....types.beta.memory_stores.beta_managed_agents_precondition_param import BetaManagedAgentsPreconditionParam + +__all__ = ["Memories", "AsyncMemories"] + + +class Memories(SyncAPIResource): + @cached_property + def with_raw_response(self) -> MemoriesWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return MemoriesWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> MemoriesWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return MemoriesWithStreamingResponse(self) + + def create( + self, + memory_store_id: str, + *, + content: Optional[str], + path: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + CreateMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._post( + path_template("/v1/memory_stores/{memory_store_id}/memories?beta=true", memory_store_id=memory_store_id), + body=maybe_transform( + { + "content": content, + "path": path, + }, + memory_create_params.MemoryCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"view": view}, memory_create_params.MemoryCreateParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + def retrieve( + self, + memory_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + GetMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"view": view}, memory_retrieve_params.MemoryRetrieveParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + def update( + self, + memory_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + content: Optional[str] | Omit = omit, + path: Optional[str] | Omit = omit, + precondition: BetaManagedAgentsPreconditionParam | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + UpdateMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._post( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + body=maybe_transform( + { + "content": content, + "path": path, + "precondition": precondition, + }, + memory_update_params.MemoryUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"view": view}, memory_update_params.MemoryUpdateParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + def list( + self, + memory_store_id: str, + *, + depth: int | Omit = omit, + limit: int | Omit = omit, + order: Literal["asc", "desc"] | Omit = omit, + order_by: str | Omit = omit, + page: str | Omit = omit, + path_prefix: str | Omit = omit, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> SyncPageCursor[BetaManagedAgentsMemoryListItem]: + """ + ListMemories + + Args: + depth: Query parameter for depth + + limit: Query parameter for limit + + order: Query parameter for order + + order_by: Query parameter for order_by + + page: Query parameter for page + + path_prefix: Optional path prefix filter (raw string-prefix match; include a trailing slash + for directory-scoped lists). This value appears in request URLs. Do not include + secrets or personally identifiable information. + + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get_api_list( + path_template("/v1/memory_stores/{memory_store_id}/memories?beta=true", memory_store_id=memory_store_id), + page=SyncPageCursor[BetaManagedAgentsMemoryListItem], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "depth": depth, + "limit": limit, + "order": order, + "order_by": order_by, + "page": page, + "path_prefix": path_prefix, + "view": view, + }, + memory_list_params.MemoryListParams, + ), + ), + model=cast( + Any, BetaManagedAgentsMemoryListItem + ), # Union types cannot be passed in as arguments in the type system + ) + + def delete( + self, + memory_id: str, + *, + memory_store_id: str, + expected_content_sha256: str | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsDeletedMemory: + """ + DeleteMemory + + Args: + expected_content_sha256: Query parameter for expected_content_sha256 + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._delete( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + {"expected_content_sha256": expected_content_sha256}, memory_delete_params.MemoryDeleteParams + ), + ), + cast_to=BetaManagedAgentsDeletedMemory, + ) + + +class AsyncMemories(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncMemoriesWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncMemoriesWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncMemoriesWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return AsyncMemoriesWithStreamingResponse(self) + + async def create( + self, + memory_store_id: str, + *, + content: Optional[str], + path: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + CreateMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._post( + path_template("/v1/memory_stores/{memory_store_id}/memories?beta=true", memory_store_id=memory_store_id), + body=await async_maybe_transform( + { + "content": content, + "path": path, + }, + memory_create_params.MemoryCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform({"view": view}, memory_create_params.MemoryCreateParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + async def retrieve( + self, + memory_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + GetMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._get( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform({"view": view}, memory_retrieve_params.MemoryRetrieveParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + async def update( + self, + memory_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + content: Optional[str] | Omit = omit, + path: Optional[str] | Omit = omit, + precondition: BetaManagedAgentsPreconditionParam | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemory: + """ + UpdateMemory + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._post( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + body=await async_maybe_transform( + { + "content": content, + "path": path, + "precondition": precondition, + }, + memory_update_params.MemoryUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform({"view": view}, memory_update_params.MemoryUpdateParams), + ), + cast_to=BetaManagedAgentsMemory, + ) + + def list( + self, + memory_store_id: str, + *, + depth: int | Omit = omit, + limit: int | Omit = omit, + order: Literal["asc", "desc"] | Omit = omit, + order_by: str | Omit = omit, + page: str | Omit = omit, + path_prefix: str | Omit = omit, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AsyncPaginator[BetaManagedAgentsMemoryListItem, AsyncPageCursor[BetaManagedAgentsMemoryListItem]]: + """ + ListMemories + + Args: + depth: Query parameter for depth + + limit: Query parameter for limit + + order: Query parameter for order + + order_by: Query parameter for order_by + + page: Query parameter for page + + path_prefix: Optional path prefix filter (raw string-prefix match; include a trailing slash + for directory-scoped lists). This value appears in request URLs. Do not include + secrets or personally identifiable information. + + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get_api_list( + path_template("/v1/memory_stores/{memory_store_id}/memories?beta=true", memory_store_id=memory_store_id), + page=AsyncPageCursor[BetaManagedAgentsMemoryListItem], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "depth": depth, + "limit": limit, + "order": order, + "order_by": order_by, + "page": page, + "path_prefix": path_prefix, + "view": view, + }, + memory_list_params.MemoryListParams, + ), + ), + model=cast( + Any, BetaManagedAgentsMemoryListItem + ), # Union types cannot be passed in as arguments in the type system + ) + + async def delete( + self, + memory_id: str, + *, + memory_store_id: str, + expected_content_sha256: str | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsDeletedMemory: + """ + DeleteMemory + + Args: + expected_content_sha256: Query parameter for expected_content_sha256 + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_id: + raise ValueError(f"Expected a non-empty value for `memory_id` but received {memory_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._delete( + path_template( + "/v1/memory_stores/{memory_store_id}/memories/{memory_id}?beta=true", + memory_store_id=memory_store_id, + memory_id=memory_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + {"expected_content_sha256": expected_content_sha256}, memory_delete_params.MemoryDeleteParams + ), + ), + cast_to=BetaManagedAgentsDeletedMemory, + ) + + +class MemoriesWithRawResponse: + def __init__(self, memories: Memories) -> None: + self._memories = memories + + self.create = _legacy_response.to_raw_response_wrapper( + memories.create, + ) + self.retrieve = _legacy_response.to_raw_response_wrapper( + memories.retrieve, + ) + self.update = _legacy_response.to_raw_response_wrapper( + memories.update, + ) + self.list = _legacy_response.to_raw_response_wrapper( + memories.list, + ) + self.delete = _legacy_response.to_raw_response_wrapper( + memories.delete, + ) + + +class AsyncMemoriesWithRawResponse: + def __init__(self, memories: AsyncMemories) -> None: + self._memories = memories + + self.create = _legacy_response.async_to_raw_response_wrapper( + memories.create, + ) + self.retrieve = _legacy_response.async_to_raw_response_wrapper( + memories.retrieve, + ) + self.update = _legacy_response.async_to_raw_response_wrapper( + memories.update, + ) + self.list = _legacy_response.async_to_raw_response_wrapper( + memories.list, + ) + self.delete = _legacy_response.async_to_raw_response_wrapper( + memories.delete, + ) + + +class MemoriesWithStreamingResponse: + def __init__(self, memories: Memories) -> None: + self._memories = memories + + self.create = to_streamed_response_wrapper( + memories.create, + ) + self.retrieve = to_streamed_response_wrapper( + memories.retrieve, + ) + self.update = to_streamed_response_wrapper( + memories.update, + ) + self.list = to_streamed_response_wrapper( + memories.list, + ) + self.delete = to_streamed_response_wrapper( + memories.delete, + ) + + +class AsyncMemoriesWithStreamingResponse: + def __init__(self, memories: AsyncMemories) -> None: + self._memories = memories + + self.create = async_to_streamed_response_wrapper( + memories.create, + ) + self.retrieve = async_to_streamed_response_wrapper( + memories.retrieve, + ) + self.update = async_to_streamed_response_wrapper( + memories.update, + ) + self.list = async_to_streamed_response_wrapper( + memories.list, + ) + self.delete = async_to_streamed_response_wrapper( + memories.delete, + ) diff --git a/src/anthropic/resources/beta/user_profiles.py b/src/anthropic/resources/beta/memory_stores/memory_stores.py similarity index 51% rename from src/anthropic/resources/beta/user_profiles.py rename to src/anthropic/resources/beta/memory_stores/memory_stores.py index f79e2d5c..707584af 100644 --- a/src/anthropic/resources/beta/user_profiles.py +++ b/src/anthropic/resources/beta/memory_stores/memory_stores.py @@ -2,52 +2,77 @@ from __future__ import annotations -from typing import Dict, List, Optional +from typing import Dict, List, Union, Optional +from datetime import datetime from itertools import chain -from typing_extensions import Literal import httpx -from ... import _legacy_response -from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from ..._utils import is_given, path_template, maybe_transform, strip_not_given, async_maybe_transform -from ..._compat import cached_property -from ..._resource import SyncAPIResource, AsyncAPIResource -from ..._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper -from ...pagination import SyncPageCursor, AsyncPageCursor -from ...types.beta import user_profile_list_params, user_profile_create_params, user_profile_update_params -from ..._base_client import AsyncPaginator, make_request_options -from ...types.anthropic_beta_param import AnthropicBetaParam -from ...types.beta.beta_user_profile import BetaUserProfile -from ...types.beta.beta_user_profile_enrollment_url import BetaUserProfileEnrollmentURL - -__all__ = ["UserProfiles", "AsyncUserProfiles"] +from .... import _legacy_response +from .memories import ( + Memories, + AsyncMemories, + MemoriesWithRawResponse, + AsyncMemoriesWithRawResponse, + MemoriesWithStreamingResponse, + AsyncMemoriesWithStreamingResponse, +) +from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from ...._utils import is_given, path_template, maybe_transform, strip_not_given, async_maybe_transform +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource +from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper +from ....pagination import SyncPageCursor, AsyncPageCursor +from ....types.beta import memory_store_list_params, memory_store_create_params, memory_store_update_params +from ...._base_client import AsyncPaginator, make_request_options +from .memory_versions import ( + MemoryVersions, + AsyncMemoryVersions, + MemoryVersionsWithRawResponse, + AsyncMemoryVersionsWithRawResponse, + MemoryVersionsWithStreamingResponse, + AsyncMemoryVersionsWithStreamingResponse, +) +from ....types.anthropic_beta_param import AnthropicBetaParam +from ....types.beta.beta_managed_agents_memory_store import BetaManagedAgentsMemoryStore +from ....types.beta.beta_managed_agents_deleted_memory_store import BetaManagedAgentsDeletedMemoryStore + +__all__ = ["MemoryStores", "AsyncMemoryStores"] + + +class MemoryStores(SyncAPIResource): + @cached_property + def memories(self) -> Memories: + return Memories(self._client) + @cached_property + def memory_versions(self) -> MemoryVersions: + return MemoryVersions(self._client) -class UserProfiles(SyncAPIResource): @cached_property - def with_raw_response(self) -> UserProfilesWithRawResponse: + def with_raw_response(self) -> MemoryStoresWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers """ - return UserProfilesWithRawResponse(self) + return MemoryStoresWithRawResponse(self) @cached_property - def with_streaming_response(self) -> UserProfilesWithStreamingResponse: + def with_streaming_response(self) -> MemoryStoresWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response """ - return UserProfilesWithStreamingResponse(self) + return MemoryStoresWithStreamingResponse(self) def create( self, *, - external_id: Optional[str] | Omit = omit, + name: str, + description: str | Omit = omit, metadata: Dict[str, str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -56,18 +81,11 @@ def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: + ) -> BetaManagedAgentsMemoryStore: """ - Create User Profile + CreateMemoryStore Args: - external_id: Platform's own identifier for this user. Not enforced unique. Maximum 255 - characters. - - metadata: Free-form key-value data to attach to this user profile. Maximum 16 keys, with - keys up to 64 characters and values up to 512 characters. Values must be - non-empty strings. - betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -81,32 +99,33 @@ def create( extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return self._post( - "/v1/user_profiles?beta=true", + "/v1/memory_stores?beta=true", body=maybe_transform( { - "external_id": external_id, + "name": name, + "description": description, "metadata": metadata, }, - user_profile_create_params.UserProfileCreateParams, + memory_store_create_params.MemoryStoreCreateParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) def retrieve( self, - user_profile_id: str, + memory_store_id: str, *, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -115,9 +134,9 @@ def retrieve( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: + ) -> BetaManagedAgentsMemoryStore: """ - Get User Profile + GetMemoryStore Args: betas: Optional header to specify the beta version(s) you want to use. @@ -130,33 +149,34 @@ def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return self._get( - path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) def update( self, - user_profile_id: str, + memory_store_id: str, *, - external_id: Optional[str] | Omit = omit, - metadata: Dict[str, str] | Omit = omit, + description: Optional[str] | Omit = omit, + metadata: Optional[Dict[str, Optional[str]]] | Omit = omit, + name: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -164,18 +184,15 @@ def update( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: - """ - Update User Profile + ) -> BetaManagedAgentsMemoryStore: + """UpdateMemoryStore Args: - external_id: If present, replaces the stored external_id. Omit to leave unchanged. Maximum - 255 characters. + metadata: Metadata patch. - metadata: Key-value pairs to merge into the stored metadata. Keys provided overwrite - existing values. To remove a key, set its value to an empty string. Keys not - provided are left unchanged. Maximum 16 keys, with keys up to 64 characters and - values up to 512 characters. + Set a key to a string to upsert it, or to null to delete it. + Omit the field to preserve. The stored bag is limited to 16 keys (up to 64 chars + each) with values up to 512 chars. betas: Optional header to specify the beta version(s) you want to use. @@ -187,39 +204,42 @@ def update( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return self._post( - path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), body=maybe_transform( { - "external_id": external_id, + "description": description, "metadata": metadata, + "name": name, }, - user_profile_update_params.UserProfileUpdateParams, + memory_store_update_params.MemoryStoreUpdateParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) def list( self, *, + created_at_gte: Union[str, datetime] | Omit = omit, + created_at_lte: Union[str, datetime] | Omit = omit, + include_archived: bool | Omit = omit, limit: int | Omit = omit, - order: Literal["asc", "desc"] | Omit = omit, page: str | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -228,14 +248,18 @@ def list( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> SyncPageCursor[BetaUserProfile]: + ) -> SyncPageCursor[BetaManagedAgentsMemoryStore]: """ - List User Profiles + ListMemoryStores Args: - limit: Query parameter for limit + created_at_gte: Return stores created at or after this time (inclusive). - order: Query parameter for order + created_at_lte: Return stores created at or before this time (inclusive). + + include_archived: Query parameter for include_archived + + limit: Query parameter for limit page: Query parameter for page @@ -252,17 +276,17 @@ def list( extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return self._get_api_list( - "/v1/user_profiles?beta=true", - page=SyncPageCursor[BetaUserProfile], + "/v1/memory_stores?beta=true", + page=SyncPageCursor[BetaManagedAgentsMemoryStore], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -270,19 +294,21 @@ def list( timeout=timeout, query=maybe_transform( { + "created_at_gte": created_at_gte, + "created_at_lte": created_at_lte, + "include_archived": include_archived, "limit": limit, - "order": order, "page": page, }, - user_profile_list_params.UserProfileListParams, + memory_store_list_params.MemoryStoreListParams, ), ), - model=BetaUserProfile, + model=BetaManagedAgentsMemoryStore, ) - def create_enrollment_url( + def delete( self, - user_profile_id: str, + memory_store_id: str, *, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -291,9 +317,9 @@ def create_enrollment_url( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfileEnrollmentURL: + ) -> BetaManagedAgentsDeletedMemoryStore: """ - Create Enrollment URL + DeleteMemoryStore Args: betas: Optional header to specify the beta version(s) you want to use. @@ -306,54 +332,108 @@ def create_enrollment_url( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} - return self._post( - path_template( - "/v1/user_profiles/{user_profile_id}/enrollment_url?beta=true", user_profile_id=user_profile_id + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._delete( + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), + cast_to=BetaManagedAgentsDeletedMemoryStore, + ) + + def archive( + self, + memory_store_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryStore: + """ + ArchiveMemoryStore + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._post( + path_template("/v1/memory_stores/{memory_store_id}/archive?beta=true", memory_store_id=memory_store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfileEnrollmentURL, + cast_to=BetaManagedAgentsMemoryStore, ) -class AsyncUserProfiles(AsyncAPIResource): +class AsyncMemoryStores(AsyncAPIResource): + @cached_property + def memories(self) -> AsyncMemories: + return AsyncMemories(self._client) + + @cached_property + def memory_versions(self) -> AsyncMemoryVersions: + return AsyncMemoryVersions(self._client) + @cached_property - def with_raw_response(self) -> AsyncUserProfilesWithRawResponse: + def with_raw_response(self) -> AsyncMemoryStoresWithRawResponse: """ This property can be used as a prefix for any HTTP method call to return the raw response object instead of the parsed content. For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers """ - return AsyncUserProfilesWithRawResponse(self) + return AsyncMemoryStoresWithRawResponse(self) @cached_property - def with_streaming_response(self) -> AsyncUserProfilesWithStreamingResponse: + def with_streaming_response(self) -> AsyncMemoryStoresWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response """ - return AsyncUserProfilesWithStreamingResponse(self) + return AsyncMemoryStoresWithStreamingResponse(self) async def create( self, *, - external_id: Optional[str] | Omit = omit, + name: str, + description: str | Omit = omit, metadata: Dict[str, str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -362,18 +442,11 @@ async def create( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: + ) -> BetaManagedAgentsMemoryStore: """ - Create User Profile + CreateMemoryStore Args: - external_id: Platform's own identifier for this user. Not enforced unique. Maximum 255 - characters. - - metadata: Free-form key-value data to attach to this user profile. Maximum 16 keys, with - keys up to 64 characters and values up to 512 characters. Values must be - non-empty strings. - betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -387,32 +460,33 @@ async def create( extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return await self._post( - "/v1/user_profiles?beta=true", + "/v1/memory_stores?beta=true", body=await async_maybe_transform( { - "external_id": external_id, + "name": name, + "description": description, "metadata": metadata, }, - user_profile_create_params.UserProfileCreateParams, + memory_store_create_params.MemoryStoreCreateParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) async def retrieve( self, - user_profile_id: str, + memory_store_id: str, *, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -421,9 +495,9 @@ async def retrieve( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: + ) -> BetaManagedAgentsMemoryStore: """ - Get User Profile + GetMemoryStore Args: betas: Optional header to specify the beta version(s) you want to use. @@ -436,33 +510,34 @@ async def retrieve( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return await self._get( - path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) async def update( self, - user_profile_id: str, + memory_store_id: str, *, - external_id: Optional[str] | Omit = omit, - metadata: Dict[str, str] | Omit = omit, + description: Optional[str] | Omit = omit, + metadata: Optional[Dict[str, Optional[str]]] | Omit = omit, + name: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -470,18 +545,15 @@ async def update( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfile: - """ - Update User Profile + ) -> BetaManagedAgentsMemoryStore: + """UpdateMemoryStore Args: - external_id: If present, replaces the stored external_id. Omit to leave unchanged. Maximum - 255 characters. + metadata: Metadata patch. - metadata: Key-value pairs to merge into the stored metadata. Keys provided overwrite - existing values. To remove a key, set its value to an empty string. Keys not - provided are left unchanged. Maximum 16 keys, with keys up to 64 characters and - values up to 512 characters. + Set a key to a string to upsert it, or to null to delete it. + Omit the field to preserve. The stored bag is limited to 16 keys (up to 64 chars + each) with values up to 512 chars. betas: Optional header to specify the beta version(s) you want to use. @@ -493,39 +565,42 @@ async def update( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return await self._post( - path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), body=await async_maybe_transform( { - "external_id": external_id, + "description": description, "metadata": metadata, + "name": name, }, - user_profile_update_params.UserProfileUpdateParams, + memory_store_update_params.MemoryStoreUpdateParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfile, + cast_to=BetaManagedAgentsMemoryStore, ) def list( self, *, + created_at_gte: Union[str, datetime] | Omit = omit, + created_at_lte: Union[str, datetime] | Omit = omit, + include_archived: bool | Omit = omit, limit: int | Omit = omit, - order: Literal["asc", "desc"] | Omit = omit, page: str | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -534,14 +609,18 @@ def list( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> AsyncPaginator[BetaUserProfile, AsyncPageCursor[BetaUserProfile]]: + ) -> AsyncPaginator[BetaManagedAgentsMemoryStore, AsyncPageCursor[BetaManagedAgentsMemoryStore]]: """ - List User Profiles + ListMemoryStores Args: - limit: Query parameter for limit + created_at_gte: Return stores created at or after this time (inclusive). + + created_at_lte: Return stores created at or before this time (inclusive). - order: Query parameter for order + include_archived: Query parameter for include_archived + + limit: Query parameter for limit page: Query parameter for page @@ -558,17 +637,17 @@ def list( extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} return self._get_api_list( - "/v1/user_profiles?beta=true", - page=AsyncPageCursor[BetaUserProfile], + "/v1/memory_stores?beta=true", + page=AsyncPageCursor[BetaManagedAgentsMemoryStore], options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -576,19 +655,21 @@ def list( timeout=timeout, query=maybe_transform( { + "created_at_gte": created_at_gte, + "created_at_lte": created_at_lte, + "include_archived": include_archived, "limit": limit, - "order": order, "page": page, }, - user_profile_list_params.UserProfileListParams, + memory_store_list_params.MemoryStoreListParams, ), ), - model=BetaUserProfile, + model=BetaManagedAgentsMemoryStore, ) - async def create_enrollment_url( + async def delete( self, - user_profile_id: str, + memory_store_id: str, *, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -597,9 +678,9 @@ async def create_enrollment_url( extra_query: Query | None = None, extra_body: Body | None = None, timeout: float | httpx.Timeout | None | NotGiven = not_given, - ) -> BetaUserProfileEnrollmentURL: + ) -> BetaManagedAgentsDeletedMemoryStore: """ - Create Enrollment URL + DeleteMemoryStore Args: betas: Optional header to specify the beta version(s) you want to use. @@ -612,109 +693,198 @@ async def create_enrollment_url( timeout: Override the client-level default timeout for this request, in seconds """ - if not user_profile_id: - raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") extra_headers = { **strip_not_given( { - "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) if is_given(betas) else not_given } ), **(extra_headers or {}), } - extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} - return await self._post( - path_template( - "/v1/user_profiles/{user_profile_id}/enrollment_url?beta=true", user_profile_id=user_profile_id + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._delete( + path_template("/v1/memory_stores/{memory_store_id}?beta=true", memory_store_id=memory_store_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaManagedAgentsDeletedMemoryStore, + ) + + async def archive( + self, + memory_store_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryStore: + """ + ArchiveMemoryStore + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._post( + path_template("/v1/memory_stores/{memory_store_id}/archive?beta=true", memory_store_id=memory_store_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), - cast_to=BetaUserProfileEnrollmentURL, + cast_to=BetaManagedAgentsMemoryStore, ) -class UserProfilesWithRawResponse: - def __init__(self, user_profiles: UserProfiles) -> None: - self._user_profiles = user_profiles +class MemoryStoresWithRawResponse: + def __init__(self, memory_stores: MemoryStores) -> None: + self._memory_stores = memory_stores self.create = _legacy_response.to_raw_response_wrapper( - user_profiles.create, + memory_stores.create, ) self.retrieve = _legacy_response.to_raw_response_wrapper( - user_profiles.retrieve, + memory_stores.retrieve, ) self.update = _legacy_response.to_raw_response_wrapper( - user_profiles.update, + memory_stores.update, ) self.list = _legacy_response.to_raw_response_wrapper( - user_profiles.list, + memory_stores.list, + ) + self.delete = _legacy_response.to_raw_response_wrapper( + memory_stores.delete, ) - self.create_enrollment_url = _legacy_response.to_raw_response_wrapper( - user_profiles.create_enrollment_url, + self.archive = _legacy_response.to_raw_response_wrapper( + memory_stores.archive, ) + @cached_property + def memories(self) -> MemoriesWithRawResponse: + return MemoriesWithRawResponse(self._memory_stores.memories) -class AsyncUserProfilesWithRawResponse: - def __init__(self, user_profiles: AsyncUserProfiles) -> None: - self._user_profiles = user_profiles + @cached_property + def memory_versions(self) -> MemoryVersionsWithRawResponse: + return MemoryVersionsWithRawResponse(self._memory_stores.memory_versions) + + +class AsyncMemoryStoresWithRawResponse: + def __init__(self, memory_stores: AsyncMemoryStores) -> None: + self._memory_stores = memory_stores self.create = _legacy_response.async_to_raw_response_wrapper( - user_profiles.create, + memory_stores.create, ) self.retrieve = _legacy_response.async_to_raw_response_wrapper( - user_profiles.retrieve, + memory_stores.retrieve, ) self.update = _legacy_response.async_to_raw_response_wrapper( - user_profiles.update, + memory_stores.update, ) self.list = _legacy_response.async_to_raw_response_wrapper( - user_profiles.list, + memory_stores.list, + ) + self.delete = _legacy_response.async_to_raw_response_wrapper( + memory_stores.delete, ) - self.create_enrollment_url = _legacy_response.async_to_raw_response_wrapper( - user_profiles.create_enrollment_url, + self.archive = _legacy_response.async_to_raw_response_wrapper( + memory_stores.archive, ) + @cached_property + def memories(self) -> AsyncMemoriesWithRawResponse: + return AsyncMemoriesWithRawResponse(self._memory_stores.memories) + + @cached_property + def memory_versions(self) -> AsyncMemoryVersionsWithRawResponse: + return AsyncMemoryVersionsWithRawResponse(self._memory_stores.memory_versions) + -class UserProfilesWithStreamingResponse: - def __init__(self, user_profiles: UserProfiles) -> None: - self._user_profiles = user_profiles +class MemoryStoresWithStreamingResponse: + def __init__(self, memory_stores: MemoryStores) -> None: + self._memory_stores = memory_stores self.create = to_streamed_response_wrapper( - user_profiles.create, + memory_stores.create, ) self.retrieve = to_streamed_response_wrapper( - user_profiles.retrieve, + memory_stores.retrieve, ) self.update = to_streamed_response_wrapper( - user_profiles.update, + memory_stores.update, ) self.list = to_streamed_response_wrapper( - user_profiles.list, + memory_stores.list, ) - self.create_enrollment_url = to_streamed_response_wrapper( - user_profiles.create_enrollment_url, + self.delete = to_streamed_response_wrapper( + memory_stores.delete, ) + self.archive = to_streamed_response_wrapper( + memory_stores.archive, + ) + + @cached_property + def memories(self) -> MemoriesWithStreamingResponse: + return MemoriesWithStreamingResponse(self._memory_stores.memories) + + @cached_property + def memory_versions(self) -> MemoryVersionsWithStreamingResponse: + return MemoryVersionsWithStreamingResponse(self._memory_stores.memory_versions) -class AsyncUserProfilesWithStreamingResponse: - def __init__(self, user_profiles: AsyncUserProfiles) -> None: - self._user_profiles = user_profiles +class AsyncMemoryStoresWithStreamingResponse: + def __init__(self, memory_stores: AsyncMemoryStores) -> None: + self._memory_stores = memory_stores self.create = async_to_streamed_response_wrapper( - user_profiles.create, + memory_stores.create, ) self.retrieve = async_to_streamed_response_wrapper( - user_profiles.retrieve, + memory_stores.retrieve, ) self.update = async_to_streamed_response_wrapper( - user_profiles.update, + memory_stores.update, ) self.list = async_to_streamed_response_wrapper( - user_profiles.list, + memory_stores.list, ) - self.create_enrollment_url = async_to_streamed_response_wrapper( - user_profiles.create_enrollment_url, + self.delete = async_to_streamed_response_wrapper( + memory_stores.delete, ) + self.archive = async_to_streamed_response_wrapper( + memory_stores.archive, + ) + + @cached_property + def memories(self) -> AsyncMemoriesWithStreamingResponse: + return AsyncMemoriesWithStreamingResponse(self._memory_stores.memories) + + @cached_property + def memory_versions(self) -> AsyncMemoryVersionsWithStreamingResponse: + return AsyncMemoryVersionsWithStreamingResponse(self._memory_stores.memory_versions) diff --git a/src/anthropic/resources/beta/memory_stores/memory_versions.py b/src/anthropic/resources/beta/memory_stores/memory_versions.py new file mode 100644 index 00000000..36cb5a23 --- /dev/null +++ b/src/anthropic/resources/beta/memory_stores/memory_versions.py @@ -0,0 +1,554 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union +from datetime import datetime +from itertools import chain + +import httpx + +from .... import _legacy_response +from ...._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from ...._utils import is_given, path_template, maybe_transform, strip_not_given, async_maybe_transform +from ...._compat import cached_property +from ...._resource import SyncAPIResource, AsyncAPIResource +from ...._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper +from ....pagination import SyncPageCursor, AsyncPageCursor +from ...._base_client import AsyncPaginator, make_request_options +from ....types.beta.memory_stores import ( + BetaManagedAgentsMemoryView, + BetaManagedAgentsMemoryVersionOperation, + memory_version_list_params, + memory_version_retrieve_params, +) +from ....types.anthropic_beta_param import AnthropicBetaParam +from ....types.beta.memory_stores.beta_managed_agents_memory_view import BetaManagedAgentsMemoryView +from ....types.beta.memory_stores.beta_managed_agents_memory_version import BetaManagedAgentsMemoryVersion +from ....types.beta.memory_stores.beta_managed_agents_memory_version_operation import ( + BetaManagedAgentsMemoryVersionOperation, +) + +__all__ = ["MemoryVersions", "AsyncMemoryVersions"] + + +class MemoryVersions(SyncAPIResource): + @cached_property + def with_raw_response(self) -> MemoryVersionsWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return MemoryVersionsWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> MemoryVersionsWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return MemoryVersionsWithStreamingResponse(self) + + def retrieve( + self, + memory_version_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryVersion: + """ + GetMemoryVersion + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_version_id: + raise ValueError(f"Expected a non-empty value for `memory_version_id` but received {memory_version_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}?beta=true", + memory_store_id=memory_store_id, + memory_version_id=memory_version_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform({"view": view}, memory_version_retrieve_params.MemoryVersionRetrieveParams), + ), + cast_to=BetaManagedAgentsMemoryVersion, + ) + + def list( + self, + memory_store_id: str, + *, + api_key_id: str | Omit = omit, + created_at_gte: Union[str, datetime] | Omit = omit, + created_at_lte: Union[str, datetime] | Omit = omit, + limit: int | Omit = omit, + memory_id: str | Omit = omit, + operation: BetaManagedAgentsMemoryVersionOperation | Omit = omit, + page: str | Omit = omit, + session_id: str | Omit = omit, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> SyncPageCursor[BetaManagedAgentsMemoryVersion]: + """ + ListMemoryVersions + + Args: + api_key_id: Query parameter for api_key_id + + created_at_gte: Return versions created at or after this time (inclusive). + + created_at_lte: Return versions created at or before this time (inclusive). + + limit: Query parameter for limit + + memory_id: Query parameter for memory_id + + operation: Query parameter for operation + + page: Query parameter for page + + session_id: Query parameter for session_id + + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get_api_list( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions?beta=true", memory_store_id=memory_store_id + ), + page=SyncPageCursor[BetaManagedAgentsMemoryVersion], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "api_key_id": api_key_id, + "created_at_gte": created_at_gte, + "created_at_lte": created_at_lte, + "limit": limit, + "memory_id": memory_id, + "operation": operation, + "page": page, + "session_id": session_id, + "view": view, + }, + memory_version_list_params.MemoryVersionListParams, + ), + ), + model=BetaManagedAgentsMemoryVersion, + ) + + def redact( + self, + memory_version_id: str, + *, + memory_store_id: str, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryVersion: + """ + RedactMemoryVersion + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_version_id: + raise ValueError(f"Expected a non-empty value for `memory_version_id` but received {memory_version_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._post( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}/redact?beta=true", + memory_store_id=memory_store_id, + memory_version_id=memory_version_id, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaManagedAgentsMemoryVersion, + ) + + +class AsyncMemoryVersions(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncMemoryVersionsWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncMemoryVersionsWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncMemoryVersionsWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return AsyncMemoryVersionsWithStreamingResponse(self) + + async def retrieve( + self, + memory_version_id: str, + *, + memory_store_id: str, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryVersion: + """ + GetMemoryVersion + + Args: + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_version_id: + raise ValueError(f"Expected a non-empty value for `memory_version_id` but received {memory_version_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._get( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}?beta=true", + memory_store_id=memory_store_id, + memory_version_id=memory_version_id, + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + {"view": view}, memory_version_retrieve_params.MemoryVersionRetrieveParams + ), + ), + cast_to=BetaManagedAgentsMemoryVersion, + ) + + def list( + self, + memory_store_id: str, + *, + api_key_id: str | Omit = omit, + created_at_gte: Union[str, datetime] | Omit = omit, + created_at_lte: Union[str, datetime] | Omit = omit, + limit: int | Omit = omit, + memory_id: str | Omit = omit, + operation: BetaManagedAgentsMemoryVersionOperation | Omit = omit, + page: str | Omit = omit, + session_id: str | Omit = omit, + view: BetaManagedAgentsMemoryView | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AsyncPaginator[BetaManagedAgentsMemoryVersion, AsyncPageCursor[BetaManagedAgentsMemoryVersion]]: + """ + ListMemoryVersions + + Args: + api_key_id: Query parameter for api_key_id + + created_at_gte: Return versions created at or after this time (inclusive). + + created_at_lte: Return versions created at or before this time (inclusive). + + limit: Query parameter for limit + + memory_id: Query parameter for memory_id + + operation: Query parameter for operation + + page: Query parameter for page + + session_id: Query parameter for session_id + + view: Query parameter for view + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return self._get_api_list( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions?beta=true", memory_store_id=memory_store_id + ), + page=AsyncPageCursor[BetaManagedAgentsMemoryVersion], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "api_key_id": api_key_id, + "created_at_gte": created_at_gte, + "created_at_lte": created_at_lte, + "limit": limit, + "memory_id": memory_id, + "operation": operation, + "page": page, + "session_id": session_id, + "view": view, + }, + memory_version_list_params.MemoryVersionListParams, + ), + ), + model=BetaManagedAgentsMemoryVersion, + ) + + async def redact( + self, + memory_version_id: str, + *, + memory_store_id: str, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaManagedAgentsMemoryVersion: + """ + RedactMemoryVersion + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not memory_store_id: + raise ValueError(f"Expected a non-empty value for `memory_store_id` but received {memory_store_id!r}") + if not memory_version_id: + raise ValueError(f"Expected a non-empty value for `memory_version_id` but received {memory_version_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["managed-agents-2026-04-01"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "managed-agents-2026-04-01", **(extra_headers or {})} + return await self._post( + path_template( + "/v1/memory_stores/{memory_store_id}/memory_versions/{memory_version_id}/redact?beta=true", + memory_store_id=memory_store_id, + memory_version_id=memory_version_id, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaManagedAgentsMemoryVersion, + ) + + +class MemoryVersionsWithRawResponse: + def __init__(self, memory_versions: MemoryVersions) -> None: + self._memory_versions = memory_versions + + self.retrieve = _legacy_response.to_raw_response_wrapper( + memory_versions.retrieve, + ) + self.list = _legacy_response.to_raw_response_wrapper( + memory_versions.list, + ) + self.redact = _legacy_response.to_raw_response_wrapper( + memory_versions.redact, + ) + + +class AsyncMemoryVersionsWithRawResponse: + def __init__(self, memory_versions: AsyncMemoryVersions) -> None: + self._memory_versions = memory_versions + + self.retrieve = _legacy_response.async_to_raw_response_wrapper( + memory_versions.retrieve, + ) + self.list = _legacy_response.async_to_raw_response_wrapper( + memory_versions.list, + ) + self.redact = _legacy_response.async_to_raw_response_wrapper( + memory_versions.redact, + ) + + +class MemoryVersionsWithStreamingResponse: + def __init__(self, memory_versions: MemoryVersions) -> None: + self._memory_versions = memory_versions + + self.retrieve = to_streamed_response_wrapper( + memory_versions.retrieve, + ) + self.list = to_streamed_response_wrapper( + memory_versions.list, + ) + self.redact = to_streamed_response_wrapper( + memory_versions.redact, + ) + + +class AsyncMemoryVersionsWithStreamingResponse: + def __init__(self, memory_versions: AsyncMemoryVersions) -> None: + self._memory_versions = memory_versions + + self.retrieve = async_to_streamed_response_wrapper( + memory_versions.retrieve, + ) + self.list = async_to_streamed_response_wrapper( + memory_versions.list, + ) + self.redact = async_to_streamed_response_wrapper( + memory_versions.redact, + ) diff --git a/src/anthropic/resources/beta/messages/messages.py b/src/anthropic/resources/beta/messages/messages.py index 6a38078d..cd8d1b0f 100644 --- a/src/anthropic/resources/beta/messages/messages.py +++ b/src/anthropic/resources/beta/messages/messages.py @@ -131,7 +131,6 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -386,21 +385,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -440,7 +433,6 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -695,21 +687,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -749,7 +735,6 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -1004,21 +989,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -1058,7 +1037,6 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -1123,7 +1101,6 @@ def create( "tools": tools, "top_k": top_k, "top_p": top_p, - "user_profile_id": user_profile_id, }, message_create_params.MessageCreateParamsStreaming if stream @@ -1968,7 +1945,6 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2223,21 +2199,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -2277,7 +2247,6 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2532,21 +2501,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -2586,7 +2549,6 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2841,21 +2803,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. - - Recommended for advanced use cases only. You usually only need to use - `temperature`. + reaches a particular probability specified by `top_p`. - user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a - party other than your organization. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -2895,7 +2851,6 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, - user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2960,7 +2915,6 @@ async def create( "tools": tools, "top_k": top_k, "top_p": top_p, - "user_profile_id": user_profile_id, }, message_create_params.MessageCreateParamsStreaming if stream diff --git a/src/anthropic/resources/completions.py b/src/anthropic/resources/completions.py index 563491f8..6162e168 100644 --- a/src/anthropic/resources/completions.py +++ b/src/anthropic/resources/completions.py @@ -126,18 +126,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -232,18 +229,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -338,18 +332,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -518,18 +509,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -624,18 +612,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. @@ -730,18 +715,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. betas: Optional header to specify the beta version(s) you want to use. diff --git a/src/anthropic/resources/messages/messages.py b/src/anthropic/resources/messages/messages.py index 52378bd9..35471ea4 100644 --- a/src/anthropic/resources/messages/messages.py +++ b/src/anthropic/resources/messages/messages.py @@ -362,18 +362,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers @@ -644,18 +641,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers @@ -926,18 +920,15 @@ def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers @@ -1809,18 +1800,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers @@ -2091,18 +2079,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers @@ -2373,18 +2358,15 @@ async def create( Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. top_p: Use nucleus sampling. In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. extra_headers: Send extra headers diff --git a/src/anthropic/types/anthropic_beta_param.py b/src/anthropic/types/anthropic_beta_param.py index eb084e89..05b68065 100644 --- a/src/anthropic/types/anthropic_beta_param.py +++ b/src/anthropic/types/anthropic_beta_param.py @@ -32,6 +32,5 @@ "fast-mode-2026-02-01", "output-300k-2026-03-24", "advisor-tool-2026-03-01", - "user-profiles-2026-03-24", ], ] diff --git a/src/anthropic/types/beta/__init__.py b/src/anthropic/types/beta/__init__.py index c18c0fb2..306b20f7 100644 --- a/src/anthropic/types/beta/__init__.py +++ b/src/anthropic/types/beta/__init__.py @@ -20,7 +20,6 @@ from .agent_list_params import AgentListParams as AgentListParams from .beta_cloud_config import BetaCloudConfig as BetaCloudConfig from .beta_skill_params import BetaSkillParams as BetaSkillParams -from .beta_user_profile import BetaUserProfile as BetaUserProfile from .model_list_params import ModelListParams as ModelListParams from .skill_list_params import SkillListParams as SkillListParams from .vault_list_params import VaultListParams as VaultListParams @@ -82,7 +81,7 @@ from .beta_text_citation_param import BetaTextCitationParam as BetaTextCitationParam from .beta_thinking_capability import BetaThinkingCapability as BetaThinkingCapability from .beta_user_location_param import BetaUserLocationParam as BetaUserLocationParam -from .user_profile_list_params import UserProfileListParams as UserProfileListParams +from .memory_store_list_params import MemoryStoreListParams as MemoryStoreListParams from .beta_advisor_result_block import BetaAdvisorResultBlock as BetaAdvisorResultBlock from .beta_managed_agents_agent import BetaManagedAgentsAgent as BetaManagedAgentsAgent from .beta_managed_agents_model import BetaManagedAgentsModel as BetaManagedAgentsModel @@ -104,8 +103,8 @@ from .beta_thinking_config_param import BetaThinkingConfigParam as BetaThinkingConfigParam from .beta_tool_choice_any_param import BetaToolChoiceAnyParam as BetaToolChoiceAnyParam from .beta_web_fetch_block_param import BetaWebFetchBlockParam as BetaWebFetchBlockParam -from .user_profile_create_params import UserProfileCreateParams as UserProfileCreateParams -from .user_profile_update_params import UserProfileUpdateParams as UserProfileUpdateParams +from .memory_store_create_params import MemoryStoreCreateParams as MemoryStoreCreateParams +from .memory_store_update_params import MemoryStoreUpdateParams as MemoryStoreUpdateParams 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 @@ -128,7 +127,6 @@ from .beta_raw_message_delta_event import BetaRawMessageDeltaEvent as BetaRawMessageDeltaEvent from .beta_raw_message_start_event import BetaRawMessageStartEvent as BetaRawMessageStartEvent from .beta_redacted_thinking_block import BetaRedactedThinkingBlock as BetaRedactedThinkingBlock -from .beta_token_task_budget_param import BetaTokenTaskBudgetParam as BetaTokenTaskBudgetParam from .beta_tool_result_block_param import BetaToolResultBlockParam as BetaToolResultBlockParam from .beta_tool_uses_trigger_param import BetaToolUsesTriggerParam as BetaToolUsesTriggerParam from .beta_web_search_result_block import BetaWebSearchResultBlock as BetaWebSearchResultBlock @@ -139,7 +137,6 @@ from .beta_server_tool_caller_param import BetaServerToolCallerParam as BetaServerToolCallerParam from .beta_tool_bash_20241022_param import BetaToolBash20241022Param as BetaToolBash20241022Param from .beta_tool_bash_20250124_param import BetaToolBash20250124Param as BetaToolBash20250124Param -from .beta_user_profile_trust_grant import BetaUserProfileTrustGrant as BetaUserProfileTrustGrant from .beta_advisor_tool_result_block import BetaAdvisorToolResultBlock as BetaAdvisorToolResultBlock from .beta_advisor_tool_result_error import BetaAdvisorToolResultError as BetaAdvisorToolResultError from .beta_base64_image_source_param import BetaBase64ImageSourceParam as BetaBase64ImageSourceParam @@ -163,11 +160,11 @@ from .beta_environment_delete_response import BetaEnvironmentDeleteResponse as BetaEnvironmentDeleteResponse from .beta_managed_agents_agent_params import BetaManagedAgentsAgentParams as BetaManagedAgentsAgentParams from .beta_managed_agents_custom_skill import BetaManagedAgentsCustomSkill as BetaManagedAgentsCustomSkill +from .beta_managed_agents_memory_store import BetaManagedAgentsMemoryStore as BetaManagedAgentsMemoryStore from .beta_managed_agents_model_config import BetaManagedAgentsModelConfig as BetaManagedAgentsModelConfig from .beta_managed_agents_skill_params import BetaManagedAgentsSkillParams as BetaManagedAgentsSkillParams from .beta_server_tool_caller_20260120 import BetaServerToolCaller20260120 as BetaServerToolCaller20260120 from .beta_server_tool_use_block_param import BetaServerToolUseBlockParam as BetaServerToolUseBlockParam -from .beta_user_profile_enrollment_url import BetaUserProfileEnrollmentURL as BetaUserProfileEnrollmentURL from .beta_web_fetch_tool_result_block import BetaWebFetchToolResultBlock as BetaWebFetchToolResultBlock from .beta_citation_char_location_param import BetaCitationCharLocationParam as BetaCitationCharLocationParam from .beta_citation_page_location_param import BetaCitationPageLocationParam as BetaCitationPageLocationParam @@ -283,6 +280,9 @@ from .beta_managed_agents_cache_creation_usage import ( BetaManagedAgentsCacheCreationUsage as BetaManagedAgentsCacheCreationUsage, ) +from .beta_managed_agents_deleted_memory_store import ( + BetaManagedAgentsDeletedMemoryStore as BetaManagedAgentsDeletedMemoryStore, +) from .beta_managed_agents_file_resource_params import ( BetaManagedAgentsFileResourceParams as BetaManagedAgentsFileResourceParams, ) @@ -415,6 +415,9 @@ from .beta_managed_agents_mcp_toolset_default_config import ( BetaManagedAgentsMCPToolsetDefaultConfig as BetaManagedAgentsMCPToolsetDefaultConfig, ) +from .beta_managed_agents_memory_store_resource_param import ( + BetaManagedAgentsMemoryStoreResourceParam as BetaManagedAgentsMemoryStoreResourceParam, +) from .beta_tool_search_tool_search_result_block_param import ( BetaToolSearchToolSearchResultBlockParam as BetaToolSearchToolSearchResultBlockParam, ) diff --git a/src/anthropic/types/beta/beta_compaction_block.py b/src/anthropic/types/beta/beta_compaction_block.py index 53da79fa..f4c9374f 100644 --- a/src/anthropic/types/beta/beta_compaction_block.py +++ b/src/anthropic/types/beta/beta_compaction_block.py @@ -19,7 +19,4 @@ class BetaCompactionBlock(BaseModel): content: Optional[str] = None """Summary of compacted content, or null if compaction failed""" - encrypted_content: Optional[str] = None - """Opaque metadata from prior compaction, to be round-tripped verbatim""" - type: Literal["compaction"] diff --git a/src/anthropic/types/beta/beta_compaction_block_param.py b/src/anthropic/types/beta/beta_compaction_block_param.py index 39d4ed82..032c9cd2 100644 --- a/src/anthropic/types/beta/beta_compaction_block_param.py +++ b/src/anthropic/types/beta/beta_compaction_block_param.py @@ -27,6 +27,3 @@ class BetaCompactionBlockParam(TypedDict, total=False): cache_control: Optional[BetaCacheControlEphemeralParam] """Create a cache control breakpoint at this content block.""" - - encrypted_content: Optional[str] - """Opaque metadata from prior compaction, to be round-tripped verbatim""" diff --git a/src/anthropic/types/beta/beta_compaction_content_block_delta.py b/src/anthropic/types/beta/beta_compaction_content_block_delta.py index 84887de9..8cf5aa87 100644 --- a/src/anthropic/types/beta/beta_compaction_content_block_delta.py +++ b/src/anthropic/types/beta/beta_compaction_content_block_delta.py @@ -11,7 +11,4 @@ class BetaCompactionContentBlockDelta(BaseModel): content: Optional[str] = None - encrypted_content: Optional[str] = None - """Opaque metadata from prior compaction, to be round-tripped verbatim""" - type: Literal["compaction_delta"] diff --git a/src/anthropic/types/beta/beta_effort_capability.py b/src/anthropic/types/beta/beta_effort_capability.py index 6f33062d..38f26d4b 100644 --- a/src/anthropic/types/beta/beta_effort_capability.py +++ b/src/anthropic/types/beta/beta_effort_capability.py @@ -1,7 +1,5 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Optional - from ..._models import BaseModel from .beta_capability_support import BetaCapabilitySupport @@ -25,6 +23,3 @@ class BetaEffortCapability(BaseModel): supported: bool """Whether this capability is supported by the model.""" - - xhigh: Optional[BetaCapabilitySupport] = None - """Indicates whether a capability is supported.""" diff --git a/src/anthropic/types/beta/beta_managed_agents_deleted_memory_store.py b/src/anthropic/types/beta/beta_managed_agents_deleted_memory_store.py new file mode 100644 index 00000000..03e81c63 --- /dev/null +++ b/src/anthropic/types/beta/beta_managed_agents_deleted_memory_store.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ..._models import BaseModel + +__all__ = ["BetaManagedAgentsDeletedMemoryStore"] + + +class BetaManagedAgentsDeletedMemoryStore(BaseModel): + id: str + + type: Literal["memory_store_deleted"] diff --git a/src/anthropic/types/beta/beta_managed_agents_memory_store.py b/src/anthropic/types/beta/beta_managed_agents_memory_store.py new file mode 100644 index 00000000..0e3338a3 --- /dev/null +++ b/src/anthropic/types/beta/beta_managed_agents_memory_store.py @@ -0,0 +1,30 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict, Optional +from datetime import datetime +from typing_extensions import Literal + +from ..._models import BaseModel + +__all__ = ["BetaManagedAgentsMemoryStore"] + + +class BetaManagedAgentsMemoryStore(BaseModel): + id: str + + created_at: datetime + """A timestamp in RFC 3339 format""" + + name: str + + type: Literal["memory_store"] + + updated_at: datetime + """A timestamp in RFC 3339 format""" + + archived_at: Optional[datetime] = None + """A timestamp in RFC 3339 format""" + + description: Optional[str] = None + + metadata: Optional[Dict[str, str]] = None diff --git a/src/anthropic/types/beta/beta_managed_agents_memory_store_resource_param.py b/src/anthropic/types/beta/beta_managed_agents_memory_store_resource_param.py new file mode 100644 index 00000000..31170e63 --- /dev/null +++ b/src/anthropic/types/beta/beta_managed_agents_memory_store_resource_param.py @@ -0,0 +1,29 @@ +# 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__ = ["BetaManagedAgentsMemoryStoreResourceParam"] + + +class BetaManagedAgentsMemoryStoreResourceParam(TypedDict, total=False): + """Parameters for attaching a memory store to an agent session.""" + + memory_store_id: Required[str] + """The memory store ID (memstore\\__...). + + Must belong to the caller's organization and workspace. + """ + + type: Required[Literal["memory_store"]] + + access: Optional[Literal["read_write", "read_only"]] + """Access mode for an attached memory store.""" + + instructions: Optional[str] + """Per-attachment guidance for the agent on how to use this store. + + Rendered into the memory section of the system prompt. Max 4096 chars. + """ diff --git a/src/anthropic/types/beta/beta_output_config_param.py b/src/anthropic/types/beta/beta_output_config_param.py index ec926693..210b868e 100644 --- a/src/anthropic/types/beta/beta_output_config_param.py +++ b/src/anthropic/types/beta/beta_output_config_param.py @@ -5,14 +5,13 @@ from typing import Optional from typing_extensions import Literal, TypedDict -from .beta_token_task_budget_param import BetaTokenTaskBudgetParam from .beta_json_output_format_param import BetaJSONOutputFormatParam __all__ = ["BetaOutputConfigParam"] class BetaOutputConfigParam(TypedDict, total=False): - effort: Optional[Literal["low", "medium", "high", "xhigh", "max"]] + effort: Optional[Literal["low", "medium", "high", "max"]] """All possible effort levels.""" format: Optional[BetaJSONOutputFormatParam] @@ -21,6 +20,3 @@ class BetaOutputConfigParam(TypedDict, total=False): See [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) """ - - task_budget: Optional[BetaTokenTaskBudgetParam] - """User-configurable total token budget across contexts.""" diff --git a/src/anthropic/types/beta/beta_token_task_budget_param.py b/src/anthropic/types/beta/beta_token_task_budget_param.py deleted file mode 100644 index ec9f5869..00000000 --- a/src/anthropic/types/beta/beta_token_task_budget_param.py +++ /dev/null @@ -1,25 +0,0 @@ -# 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__ = ["BetaTokenTaskBudgetParam"] - - -class BetaTokenTaskBudgetParam(TypedDict, total=False): - """User-configurable total token budget across contexts.""" - - total: Required[int] - """Total token budget across all contexts in the session.""" - - type: Required[Literal["tokens"]] - """The budget type. Currently only 'tokens' is supported.""" - - remaining: Optional[int] - """Remaining tokens in the budget. - - Use this to track usage across contexts when implementing compaction - client-side. Defaults to total if not provided. - """ diff --git a/src/anthropic/types/beta/beta_user_profile.py b/src/anthropic/types/beta/beta_user_profile.py deleted file mode 100644 index b3805720..00000000 --- a/src/anthropic/types/beta/beta_user_profile.py +++ /dev/null @@ -1,39 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Dict, Optional -from datetime import datetime -from typing_extensions import Literal - -from ..._models import BaseModel -from .beta_user_profile_trust_grant import BetaUserProfileTrustGrant - -__all__ = ["BetaUserProfile"] - - -class BetaUserProfile(BaseModel): - id: str - """Unique identifier for this user profile, prefixed `uprof_`.""" - - created_at: datetime - """A timestamp in RFC 3339 format""" - - metadata: Dict[str, str] - """Arbitrary key-value metadata. - - Maximum 16 pairs, keys up to 64 chars, values up to 512 chars. - """ - - trust_grants: Dict[str, BetaUserProfileTrustGrant] - """Trust grants for this profile, keyed by grant name. - - Key omitted when no grant is active or in flight. - """ - - type: Literal["user_profile"] - """Object type. Always `user_profile`.""" - - updated_at: datetime - """A timestamp in RFC 3339 format""" - - external_id: Optional[str] = None - """Platform's own identifier for this user. Not enforced unique.""" diff --git a/src/anthropic/types/beta/beta_user_profile_enrollment_url.py b/src/anthropic/types/beta/beta_user_profile_enrollment_url.py deleted file mode 100644 index 41fd555a..00000000 --- a/src/anthropic/types/beta/beta_user_profile_enrollment_url.py +++ /dev/null @@ -1,19 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from datetime import datetime -from typing_extensions import Literal - -from ..._models import BaseModel - -__all__ = ["BetaUserProfileEnrollmentURL"] - - -class BetaUserProfileEnrollmentURL(BaseModel): - expires_at: datetime - """A timestamp in RFC 3339 format""" - - type: Literal["enrollment_url"] - """Object type. Always `enrollment_url`.""" - - url: str - """Enrollment URL to send to the end user. Valid until `expires_at`.""" diff --git a/src/anthropic/types/beta/beta_user_profile_trust_grant.py b/src/anthropic/types/beta/beta_user_profile_trust_grant.py deleted file mode 100644 index 6d590232..00000000 --- a/src/anthropic/types/beta/beta_user_profile_trust_grant.py +++ /dev/null @@ -1,12 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing_extensions import Literal - -from ..._models import BaseModel - -__all__ = ["BetaUserProfileTrustGrant"] - - -class BetaUserProfileTrustGrant(BaseModel): - status: Literal["active", "pending", "rejected"] - """Status of the trust grant.""" diff --git a/src/anthropic/types/beta/user_profile_list_params.py b/src/anthropic/types/beta/memory_store_create_params.py similarity index 52% rename from src/anthropic/types/beta/user_profile_list_params.py rename to src/anthropic/types/beta/memory_store_create_params.py index 0cf2a3df..e95e325f 100644 --- a/src/anthropic/types/beta/user_profile_list_params.py +++ b/src/anthropic/types/beta/memory_store_create_params.py @@ -2,24 +2,21 @@ from __future__ import annotations -from typing import List -from typing_extensions import Literal, Annotated, TypedDict +from typing import Dict, List +from typing_extensions import Required, Annotated, TypedDict from ..._utils import PropertyInfo from ..anthropic_beta_param import AnthropicBetaParam -__all__ = ["UserProfileListParams"] +__all__ = ["MemoryStoreCreateParams"] -class UserProfileListParams(TypedDict, total=False): - limit: int - """Query parameter for limit""" +class MemoryStoreCreateParams(TypedDict, total=False): + name: Required[str] - order: Literal["asc", "desc"] - """Query parameter for order""" + description: str - page: str - """Query parameter for page""" + metadata: Dict[str, str] betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_store_list_params.py b/src/anthropic/types/beta/memory_store_list_params.py new file mode 100644 index 00000000..c546bbc9 --- /dev/null +++ b/src/anthropic/types/beta/memory_store_list_params.py @@ -0,0 +1,32 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union +from datetime import datetime +from typing_extensions import Annotated, TypedDict + +from ..._utils import PropertyInfo +from ..anthropic_beta_param import AnthropicBetaParam + +__all__ = ["MemoryStoreListParams"] + + +class MemoryStoreListParams(TypedDict, total=False): + created_at_gte: Annotated[Union[str, datetime], PropertyInfo(alias="created_at[gte]", format="iso8601")] + """Return stores created at or after this time (inclusive).""" + + created_at_lte: Annotated[Union[str, datetime], PropertyInfo(alias="created_at[lte]", format="iso8601")] + """Return stores created at or before this time (inclusive).""" + + include_archived: bool + """Query parameter for include_archived""" + + limit: int + """Query parameter for limit""" + + page: str + """Query parameter for page""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/user_profile_create_params.py b/src/anthropic/types/beta/memory_store_update_params.py similarity index 51% rename from src/anthropic/types/beta/user_profile_create_params.py rename to src/anthropic/types/beta/memory_store_update_params.py index b84f622f..43ba4076 100644 --- a/src/anthropic/types/beta/user_profile_create_params.py +++ b/src/anthropic/types/beta/memory_store_update_params.py @@ -8,22 +8,21 @@ from ..._utils import PropertyInfo from ..anthropic_beta_param import AnthropicBetaParam -__all__ = ["UserProfileCreateParams"] +__all__ = ["MemoryStoreUpdateParams"] -class UserProfileCreateParams(TypedDict, total=False): - external_id: Optional[str] - """Platform's own identifier for this user. +class MemoryStoreUpdateParams(TypedDict, total=False): + description: Optional[str] - Not enforced unique. Maximum 255 characters. - """ - - metadata: Dict[str, str] - """Free-form key-value data to attach to this user profile. + metadata: Optional[Dict[str, Optional[str]]] + """Metadata patch. - Maximum 16 keys, with keys up to 64 characters and values up to 512 characters. - Values must be non-empty strings. + Set a key to a string to upsert it, or to null to delete it. Omit the field to + preserve. The stored bag is limited to 16 keys (up to 64 chars each) with values + up to 512 chars. """ + name: Optional[str] + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/__init__.py b/src/anthropic/types/beta/memory_stores/__init__.py new file mode 100644 index 00000000..536a7693 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/__init__.py @@ -0,0 +1,27 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from .memory_list_params import MemoryListParams as MemoryListParams +from .memory_create_params import MemoryCreateParams as MemoryCreateParams +from .memory_delete_params import MemoryDeleteParams as MemoryDeleteParams +from .memory_update_params import MemoryUpdateParams as MemoryUpdateParams +from .memory_retrieve_params import MemoryRetrieveParams as MemoryRetrieveParams +from .beta_managed_agents_actor import BetaManagedAgentsActor as BetaManagedAgentsActor +from .beta_managed_agents_memory import BetaManagedAgentsMemory as BetaManagedAgentsMemory +from .memory_version_list_params import MemoryVersionListParams as MemoryVersionListParams +from .beta_managed_agents_api_actor import BetaManagedAgentsAPIActor as BetaManagedAgentsAPIActor +from .beta_managed_agents_user_actor import BetaManagedAgentsUserActor as BetaManagedAgentsUserActor +from .memory_version_retrieve_params import MemoryVersionRetrieveParams as MemoryVersionRetrieveParams +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView as BetaManagedAgentsMemoryView +from .beta_managed_agents_memory_prefix import BetaManagedAgentsMemoryPrefix as BetaManagedAgentsMemoryPrefix +from .beta_managed_agents_session_actor import BetaManagedAgentsSessionActor as BetaManagedAgentsSessionActor +from .beta_managed_agents_deleted_memory import BetaManagedAgentsDeletedMemory as BetaManagedAgentsDeletedMemory +from .beta_managed_agents_memory_version import BetaManagedAgentsMemoryVersion as BetaManagedAgentsMemoryVersion +from .beta_managed_agents_memory_list_item import BetaManagedAgentsMemoryListItem as BetaManagedAgentsMemoryListItem +from .beta_managed_agents_precondition_param import ( + BetaManagedAgentsPreconditionParam as BetaManagedAgentsPreconditionParam, +) +from .beta_managed_agents_memory_version_operation import ( + BetaManagedAgentsMemoryVersionOperation as BetaManagedAgentsMemoryVersionOperation, +) diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_actor.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_actor.py new file mode 100644 index 00000000..06edaa7e --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_actor.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_managed_agents_api_actor import BetaManagedAgentsAPIActor +from .beta_managed_agents_user_actor import BetaManagedAgentsUserActor +from .beta_managed_agents_session_actor import BetaManagedAgentsSessionActor + +__all__ = ["BetaManagedAgentsActor"] + +BetaManagedAgentsActor: TypeAlias = Annotated[ + Union[BetaManagedAgentsSessionActor, BetaManagedAgentsAPIActor, BetaManagedAgentsUserActor], + PropertyInfo(discriminator="type"), +] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_api_actor.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_api_actor.py new file mode 100644 index 00000000..5b0b17e5 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_api_actor.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsAPIActor"] + + +class BetaManagedAgentsAPIActor(BaseModel): + api_key_id: str + + type: Literal["api_actor"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_deleted_memory.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_deleted_memory.py new file mode 100644 index 00000000..8d56a703 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_deleted_memory.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsDeletedMemory"] + + +class BetaManagedAgentsDeletedMemory(BaseModel): + id: str + + type: Literal["memory_deleted"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory.py new file mode 100644 index 00000000..c36955ef --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory.py @@ -0,0 +1,33 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional +from datetime import datetime +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsMemory"] + + +class BetaManagedAgentsMemory(BaseModel): + id: str + + content_sha256: str + + content_size_bytes: int + + created_at: datetime + """A timestamp in RFC 3339 format""" + + memory_store_id: str + + memory_version_id: str + + path: str + + type: Literal["memory"] + + updated_at: datetime + """A timestamp in RFC 3339 format""" + + content: Optional[str] = None diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_list_item.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_list_item.py new file mode 100644 index 00000000..eb849ec0 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_list_item.py @@ -0,0 +1,14 @@ +# 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_managed_agents_memory import BetaManagedAgentsMemory +from .beta_managed_agents_memory_prefix import BetaManagedAgentsMemoryPrefix + +__all__ = ["BetaManagedAgentsMemoryListItem"] + +BetaManagedAgentsMemoryListItem: TypeAlias = Annotated[ + Union[BetaManagedAgentsMemory, BetaManagedAgentsMemoryPrefix], PropertyInfo(discriminator="type") +] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_prefix.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_prefix.py new file mode 100644 index 00000000..e160e5ef --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_prefix.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsMemoryPrefix"] + + +class BetaManagedAgentsMemoryPrefix(BaseModel): + path: str + + type: Literal["memory_prefix"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version.py new file mode 100644 index 00000000..c6539c43 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version.py @@ -0,0 +1,42 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Optional +from datetime import datetime +from typing_extensions import Literal + +from ...._models import BaseModel +from .beta_managed_agents_actor import BetaManagedAgentsActor +from .beta_managed_agents_memory_version_operation import BetaManagedAgentsMemoryVersionOperation + +__all__ = ["BetaManagedAgentsMemoryVersion"] + + +class BetaManagedAgentsMemoryVersion(BaseModel): + id: str + + created_at: datetime + """A timestamp in RFC 3339 format""" + + memory_id: str + + memory_store_id: str + + operation: BetaManagedAgentsMemoryVersionOperation + """MemoryVersionOperation enum""" + + type: Literal["memory_version"] + + content: Optional[str] = None + + content_sha256: Optional[str] = None + + content_size_bytes: Optional[int] = None + + created_by: Optional[BetaManagedAgentsActor] = None + + path: Optional[str] = None + + redacted_at: Optional[datetime] = None + """A timestamp in RFC 3339 format""" + + redacted_by: Optional[BetaManagedAgentsActor] = None diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version_operation.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version_operation.py new file mode 100644 index 00000000..611b136c --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_version_operation.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["BetaManagedAgentsMemoryVersionOperation"] + +BetaManagedAgentsMemoryVersionOperation: TypeAlias = Literal["created", "modified", "deleted"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_view.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_view.py new file mode 100644 index 00000000..b869ebdc --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_memory_view.py @@ -0,0 +1,7 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal, TypeAlias + +__all__ = ["BetaManagedAgentsMemoryView"] + +BetaManagedAgentsMemoryView: TypeAlias = Literal["basic", "full"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_precondition_param.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_precondition_param.py new file mode 100644 index 00000000..2b38bec1 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_precondition_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_extensions import Literal, Required, TypedDict + +__all__ = ["BetaManagedAgentsPreconditionParam"] + + +class BetaManagedAgentsPreconditionParam(TypedDict, total=False): + type: Required[Literal["content_sha256"]] + + content_sha256: str diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_session_actor.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_session_actor.py new file mode 100644 index 00000000..45839671 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_session_actor.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsSessionActor"] + + +class BetaManagedAgentsSessionActor(BaseModel): + session_id: str + + type: Literal["session_actor"] diff --git a/src/anthropic/types/beta/memory_stores/beta_managed_agents_user_actor.py b/src/anthropic/types/beta/memory_stores/beta_managed_agents_user_actor.py new file mode 100644 index 00000000..6730a28e --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/beta_managed_agents_user_actor.py @@ -0,0 +1,13 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ...._models import BaseModel + +__all__ = ["BetaManagedAgentsUserActor"] + + +class BetaManagedAgentsUserActor(BaseModel): + type: Literal["user_actor"] + + user_id: str diff --git a/src/anthropic/types/beta/memory_stores/memory_create_params.py b/src/anthropic/types/beta/memory_stores/memory_create_params.py new file mode 100644 index 00000000..093784d0 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_create_params.py @@ -0,0 +1,24 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Optional +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView + +__all__ = ["MemoryCreateParams"] + + +class MemoryCreateParams(TypedDict, total=False): + content: Required[Optional[str]] + + path: Required[str] + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_delete_params.py b/src/anthropic/types/beta/memory_stores/memory_delete_params.py new file mode 100644 index 00000000..fdf5f320 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_delete_params.py @@ -0,0 +1,21 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam + +__all__ = ["MemoryDeleteParams"] + + +class MemoryDeleteParams(TypedDict, total=False): + memory_store_id: Required[str] + + expected_content_sha256: str + """Query parameter for expected_content_sha256""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_list_params.py b/src/anthropic/types/beta/memory_stores/memory_list_params.py new file mode 100644 index 00000000..39c7650c --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_list_params.py @@ -0,0 +1,42 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List +from typing_extensions import Literal, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView + +__all__ = ["MemoryListParams"] + + +class MemoryListParams(TypedDict, total=False): + depth: int + """Query parameter for depth""" + + limit: int + """Query parameter for limit""" + + order: Literal["asc", "desc"] + """Query parameter for order""" + + order_by: str + """Query parameter for order_by""" + + page: str + """Query parameter for page""" + + path_prefix: str + """ + Optional path prefix filter (raw string-prefix match; include a trailing slash + for directory-scoped lists). This value appears in request URLs. Do not include + secrets or personally identifiable information. + """ + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_retrieve_params.py b/src/anthropic/types/beta/memory_stores/memory_retrieve_params.py new file mode 100644 index 00000000..5408384b --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_retrieve_params.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 List +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView + +__all__ = ["MemoryRetrieveParams"] + + +class MemoryRetrieveParams(TypedDict, total=False): + memory_store_id: Required[str] + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_update_params.py b/src/anthropic/types/beta/memory_stores/memory_update_params.py new file mode 100644 index 00000000..ec2a4183 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_update_params.py @@ -0,0 +1,29 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Optional +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView +from .beta_managed_agents_precondition_param import BetaManagedAgentsPreconditionParam + +__all__ = ["MemoryUpdateParams"] + + +class MemoryUpdateParams(TypedDict, total=False): + memory_store_id: Required[str] + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + content: Optional[str] + + path: Optional[str] + + precondition: BetaManagedAgentsPreconditionParam + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_version_list_params.py b/src/anthropic/types/beta/memory_stores/memory_version_list_params.py new file mode 100644 index 00000000..dbcb6f45 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_version_list_params.py @@ -0,0 +1,46 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union +from datetime import datetime +from typing_extensions import Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView +from .beta_managed_agents_memory_version_operation import BetaManagedAgentsMemoryVersionOperation + +__all__ = ["MemoryVersionListParams"] + + +class MemoryVersionListParams(TypedDict, total=False): + api_key_id: str + """Query parameter for api_key_id""" + + created_at_gte: Annotated[Union[str, datetime], PropertyInfo(alias="created_at[gte]", format="iso8601")] + """Return versions created at or after this time (inclusive).""" + + created_at_lte: Annotated[Union[str, datetime], PropertyInfo(alias="created_at[lte]", format="iso8601")] + """Return versions created at or before this time (inclusive).""" + + limit: int + """Query parameter for limit""" + + memory_id: str + """Query parameter for memory_id""" + + operation: BetaManagedAgentsMemoryVersionOperation + """Query parameter for operation""" + + page: str + """Query parameter for page""" + + session_id: str + """Query parameter for session_id""" + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/memory_stores/memory_version_retrieve_params.py b/src/anthropic/types/beta/memory_stores/memory_version_retrieve_params.py new file mode 100644 index 00000000..0eb20891 --- /dev/null +++ b/src/anthropic/types/beta/memory_stores/memory_version_retrieve_params.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 List +from typing_extensions import Required, Annotated, TypedDict + +from ...._utils import PropertyInfo +from ...anthropic_beta_param import AnthropicBetaParam +from .beta_managed_agents_memory_view import BetaManagedAgentsMemoryView + +__all__ = ["MemoryVersionRetrieveParams"] + + +class MemoryVersionRetrieveParams(TypedDict, total=False): + memory_store_id: Required[str] + + view: BetaManagedAgentsMemoryView + """Query parameter for view""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/message_create_params.py b/src/anthropic/types/beta/message_create_params.py index 5dbad14f..031db06c 100644 --- a/src/anthropic/types/beta/message_create_params.py +++ b/src/anthropic/types/beta/message_create_params.py @@ -308,8 +308,7 @@ class MessageCreateParamsBase(TypedDict, total=False): Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. """ top_p: float @@ -317,17 +316,9 @@ class MessageCreateParamsBase(TypedDict, total=False): In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. - """ - - user_profile_id: Optional[str] - """The user profile ID to attribute this request to. - - Use when acting on behalf of a party other than your organization. + Recommended for advanced use cases only. """ betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] diff --git a/src/anthropic/types/beta/messages/batch_create_params.py b/src/anthropic/types/beta/messages/batch_create_params.py index 9fcd90fb..f56498a7 100644 --- a/src/anthropic/types/beta/messages/batch_create_params.py +++ b/src/anthropic/types/beta/messages/batch_create_params.py @@ -24,6 +24,7 @@ class BatchCreateParams(TypedDict, total=False): + class Request(TypedDict, total=False): custom_id: Required[str] """Developer-provided ID created for each request in a Message Batch. diff --git a/src/anthropic/types/beta/session_create_params.py b/src/anthropic/types/beta/session_create_params.py index b334be61..4156a5b3 100644 --- a/src/anthropic/types/beta/session_create_params.py +++ b/src/anthropic/types/beta/session_create_params.py @@ -10,6 +10,7 @@ from ..anthropic_beta_param import AnthropicBetaParam from .beta_managed_agents_agent_params import BetaManagedAgentsAgentParams from .beta_managed_agents_file_resource_params import BetaManagedAgentsFileResourceParams +from .beta_managed_agents_memory_store_resource_param import BetaManagedAgentsMemoryStoreResourceParam from .beta_managed_agents_github_repository_resource_params import BetaManagedAgentsGitHubRepositoryResourceParams __all__ = ["SessionCreateParams", "Agent", "Resource"] @@ -47,4 +48,8 @@ class SessionCreateParams(TypedDict, total=False): Agent: TypeAlias = Union[str, BetaManagedAgentsAgentParams] -Resource: TypeAlias = Union[BetaManagedAgentsGitHubRepositoryResourceParams, BetaManagedAgentsFileResourceParams] +Resource: TypeAlias = Union[ + BetaManagedAgentsGitHubRepositoryResourceParams, + BetaManagedAgentsFileResourceParams, + BetaManagedAgentsMemoryStoreResourceParam, +] diff --git a/src/anthropic/types/beta/sessions/__init__.py b/src/anthropic/types/beta/sessions/__init__.py index 47de3d4f..2fe6257d 100644 --- a/src/anthropic/types/beta/sessions/__init__.py +++ b/src/anthropic/types/beta/sessions/__init__.py @@ -57,6 +57,9 @@ from .beta_managed_agents_user_interrupt_event import ( BetaManagedAgentsUserInterruptEvent as BetaManagedAgentsUserInterruptEvent, ) +from .beta_managed_agents_memory_store_resource import ( + BetaManagedAgentsMemoryStoreResource as BetaManagedAgentsMemoryStoreResource, +) from .beta_managed_agents_retry_status_retrying import ( BetaManagedAgentsRetryStatusRetrying as BetaManagedAgentsRetryStatusRetrying, ) diff --git a/src/anthropic/types/beta/sessions/beta_managed_agents_memory_store_resource.py b/src/anthropic/types/beta/sessions/beta_managed_agents_memory_store_resource.py new file mode 100644 index 00000000..8740d6e1 --- /dev/null +++ b/src/anthropic/types/beta/sessions/beta_managed_agents_memory_store_resource.py @@ -0,0 +1,48 @@ +# 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__ = ["BetaManagedAgentsMemoryStoreResource"] + + +class BetaManagedAgentsMemoryStoreResource(BaseModel): + """A memory store attached to an agent session.""" + + memory_store_id: str + """The memory store ID (memstore\\__...). + + Must belong to the caller's organization and workspace. + """ + + type: Literal["memory_store"] + + access: Optional[Literal["read_write", "read_only"]] = None + """Access mode for an attached memory store.""" + + description: Optional[str] = None + """Description of the memory store, snapshotted at attach time. + + Rendered into the agent's system prompt. Empty string when the store has no + description. + """ + + instructions: Optional[str] = None + """Per-attachment guidance for the agent on how to use this store. + + Rendered into the memory section of the system prompt. Max 4096 chars. + """ + + mount_path: Optional[str] = None + """Filesystem path where the store is mounted in the session container, e.g. + + /mnt/memory/user-preferences. Derived from the store's name. Output-only. + """ + + name: Optional[str] = None + """Display name of the memory store, snapshotted at attach time. + + Later edits to the store's name do not propagate to this resource. + """ diff --git a/src/anthropic/types/beta/sessions/beta_managed_agents_session_resource.py b/src/anthropic/types/beta/sessions/beta_managed_agents_session_resource.py index 93d9fce7..47f26cfd 100644 --- a/src/anthropic/types/beta/sessions/beta_managed_agents_session_resource.py +++ b/src/anthropic/types/beta/sessions/beta_managed_agents_session_resource.py @@ -5,10 +5,14 @@ from ...._utils import PropertyInfo from .beta_managed_agents_file_resource import BetaManagedAgentsFileResource +from .beta_managed_agents_memory_store_resource import BetaManagedAgentsMemoryStoreResource from .beta_managed_agents_github_repository_resource import BetaManagedAgentsGitHubRepositoryResource __all__ = ["BetaManagedAgentsSessionResource"] BetaManagedAgentsSessionResource: TypeAlias = Annotated[ - Union[BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource], PropertyInfo(discriminator="type") + Union[ + BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource, BetaManagedAgentsMemoryStoreResource + ], + PropertyInfo(discriminator="type"), ] diff --git a/src/anthropic/types/beta/sessions/resource_retrieve_response.py b/src/anthropic/types/beta/sessions/resource_retrieve_response.py index d65417ec..a956ba17 100644 --- a/src/anthropic/types/beta/sessions/resource_retrieve_response.py +++ b/src/anthropic/types/beta/sessions/resource_retrieve_response.py @@ -5,10 +5,14 @@ from ...._utils import PropertyInfo from .beta_managed_agents_file_resource import BetaManagedAgentsFileResource +from .beta_managed_agents_memory_store_resource import BetaManagedAgentsMemoryStoreResource from .beta_managed_agents_github_repository_resource import BetaManagedAgentsGitHubRepositoryResource __all__ = ["ResourceRetrieveResponse"] ResourceRetrieveResponse: TypeAlias = Annotated[ - Union[BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource], PropertyInfo(discriminator="type") + Union[ + BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource, BetaManagedAgentsMemoryStoreResource + ], + PropertyInfo(discriminator="type"), ] diff --git a/src/anthropic/types/beta/sessions/resource_update_response.py b/src/anthropic/types/beta/sessions/resource_update_response.py index 0981e9ec..d20f0a34 100644 --- a/src/anthropic/types/beta/sessions/resource_update_response.py +++ b/src/anthropic/types/beta/sessions/resource_update_response.py @@ -5,10 +5,14 @@ from ...._utils import PropertyInfo from .beta_managed_agents_file_resource import BetaManagedAgentsFileResource +from .beta_managed_agents_memory_store_resource import BetaManagedAgentsMemoryStoreResource from .beta_managed_agents_github_repository_resource import BetaManagedAgentsGitHubRepositoryResource __all__ = ["ResourceUpdateResponse"] ResourceUpdateResponse: TypeAlias = Annotated[ - Union[BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource], PropertyInfo(discriminator="type") + Union[ + BetaManagedAgentsGitHubRepositoryResource, BetaManagedAgentsFileResource, BetaManagedAgentsMemoryStoreResource + ], + PropertyInfo(discriminator="type"), ] diff --git a/src/anthropic/types/beta/user_profile_update_params.py b/src/anthropic/types/beta/user_profile_update_params.py deleted file mode 100644 index 51f42865..00000000 --- a/src/anthropic/types/beta/user_profile_update_params.py +++ /dev/null @@ -1,30 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Dict, List, Optional -from typing_extensions import Annotated, TypedDict - -from ..._utils import PropertyInfo -from ..anthropic_beta_param import AnthropicBetaParam - -__all__ = ["UserProfileUpdateParams"] - - -class UserProfileUpdateParams(TypedDict, total=False): - external_id: Optional[str] - """If present, replaces the stored external_id. - - Omit to leave unchanged. Maximum 255 characters. - """ - - metadata: Dict[str, str] - """Key-value pairs to merge into the stored metadata. - - Keys provided overwrite existing values. To remove a key, set its value to an - empty string. Keys not provided are left unchanged. Maximum 16 keys, with keys - up to 64 characters and values up to 512 characters. - """ - - betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] - """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/completion_create_params.py b/src/anthropic/types/completion_create_params.py index 5164682d..9f337e8f 100644 --- a/src/anthropic/types/completion_create_params.py +++ b/src/anthropic/types/completion_create_params.py @@ -81,8 +81,7 @@ class CompletionCreateParamsBase(TypedDict, total=False): Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. """ top_p: float @@ -90,11 +89,9 @@ class CompletionCreateParamsBase(TypedDict, total=False): In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. """ betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] diff --git a/src/anthropic/types/effort_capability.py b/src/anthropic/types/effort_capability.py index 26b61ef7..0d26b35c 100644 --- a/src/anthropic/types/effort_capability.py +++ b/src/anthropic/types/effort_capability.py @@ -1,7 +1,5 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import Optional - from .._models import BaseModel from .capability_support import CapabilitySupport @@ -25,6 +23,3 @@ class EffortCapability(BaseModel): supported: bool """Whether this capability is supported by the model.""" - - xhigh: Optional[CapabilitySupport] = None - """Indicates whether a capability is supported.""" diff --git a/src/anthropic/types/message_create_params.py b/src/anthropic/types/message_create_params.py index 464a0ae4..09c79491 100644 --- a/src/anthropic/types/message_create_params.py +++ b/src/anthropic/types/message_create_params.py @@ -281,8 +281,7 @@ class MessageCreateParamsBase(TypedDict, total=False): Used to remove "long tail" low probability responses. [Learn more technical details here](https://towardsdatascience.com/how-to-sample-from-language-models-682bceb97277). - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. """ top_p: float @@ -290,11 +289,9 @@ class MessageCreateParamsBase(TypedDict, total=False): In nucleus sampling, we compute the cumulative distribution over all the options for each subsequent token in decreasing probability order and cut it off once it - reaches a particular probability specified by `top_p`. You should either alter - `temperature` or `top_p`, but not both. + reaches a particular probability specified by `top_p`. - Recommended for advanced use cases only. You usually only need to use - `temperature`. + Recommended for advanced use cases only. """ diff --git a/src/anthropic/types/messages/batch_create_params.py b/src/anthropic/types/messages/batch_create_params.py index e60c74f1..880136e2 100644 --- a/src/anthropic/types/messages/batch_create_params.py +++ b/src/anthropic/types/messages/batch_create_params.py @@ -18,6 +18,7 @@ class BatchCreateParams(TypedDict, total=False): """ + class Request(TypedDict, total=False): custom_id: Required[str] """Developer-provided ID created for each request in a Message Batch. diff --git a/src/anthropic/types/output_config_param.py b/src/anthropic/types/output_config_param.py index 4c8fad0e..760a46a0 100644 --- a/src/anthropic/types/output_config_param.py +++ b/src/anthropic/types/output_config_param.py @@ -11,7 +11,7 @@ class OutputConfigParam(TypedDict, total=False): - effort: Optional[Literal["low", "medium", "high", "xhigh", "max"]] + effort: Optional[Literal["low", "medium", "high", "max"]] """All possible effort levels.""" format: Optional[JSONOutputFormatParam] diff --git a/tests/api_resources/beta/memory_stores/__init__.py b/tests/api_resources/beta/memory_stores/__init__.py new file mode 100644 index 00000000..fd8019a9 --- /dev/null +++ b/tests/api_resources/beta/memory_stores/__init__.py @@ -0,0 +1 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. diff --git a/tests/api_resources/beta/memory_stores/test_memories.py b/tests/api_resources/beta/memory_stores/test_memories.py new file mode 100644 index 00000000..8d86a1d0 --- /dev/null +++ b/tests/api_resources/beta/memory_stores/test_memories.py @@ -0,0 +1,619 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from anthropic import Anthropic, AsyncAnthropic +from tests.utils import assert_matches_type +from anthropic.pagination import SyncPageCursor, AsyncPageCursor +from anthropic.types.beta.memory_stores import ( + BetaManagedAgentsMemory, + BetaManagedAgentsDeletedMemory, + BetaManagedAgentsMemoryListItem, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestMemories: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_create(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_method_create_with_all_params(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_raw_response_create(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memories.with_raw_response.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_streaming_response_create(self, client: Anthropic) -> None: + with client.beta.memory_stores.memories.with_streaming_response.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_create(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.create( + memory_store_id="", + content="content", + path="xx", + ) + + @parametrize + def test_method_retrieve(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: Anthropic) -> None: + with client.beta.memory_stores.memories.with_streaming_response.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="", + memory_store_id="memory_store_id", + ) + + @parametrize + def test_method_update(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + view="basic", + content="content", + path="xx", + precondition={ + "type": "content_sha256", + "content_sha256": "content_sha256", + }, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_raw_response_update(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memories.with_raw_response.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + def test_streaming_response_update(self, client: Anthropic) -> None: + with client.beta.memory_stores.memories.with_streaming_response.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_update(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.update( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.update( + memory_id="", + memory_store_id="memory_store_id", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.list( + memory_store_id="memory_store_id", + ) + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list_with_all_params(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.list( + memory_store_id="memory_store_id", + depth=0, + limit=0, + order="asc", + order_by="order_by", + page="page", + path_prefix="path_prefix", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_raw_response_list(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memories.with_raw_response.list( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_streaming_response_list(self, client: Anthropic) -> None: + with client.beta.memory_stores.memories.with_streaming_response.list( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_path_params_list(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.list( + memory_store_id="", + ) + + @parametrize + def test_method_delete(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + def test_method_delete_with_all_params(self, client: Anthropic) -> None: + memory = client.beta.memory_stores.memories.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + expected_content_sha256="expected_content_sha256", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + def test_raw_response_delete(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + def test_streaming_response_delete(self, client: Anthropic) -> None: + with client.beta.memory_stores.memories.with_streaming_response.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_delete(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="", + memory_store_id="memory_store_id", + ) + + +class TestAsyncMemories: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_raw_response_create(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memories.with_raw_response.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_streaming_response_create(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memories.with_streaming_response.create( + memory_store_id="memory_store_id", + content="content", + path="xx", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = await response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_create(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.create( + memory_store_id="", + content="content", + path="xx", + ) + + @parametrize + async def test_method_retrieve(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memories.with_streaming_response.retrieve( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = await response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.retrieve( + memory_id="", + memory_store_id="memory_store_id", + ) + + @parametrize + async def test_method_update(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + view="basic", + content="content", + path="xx", + precondition={ + "type": "content_sha256", + "content_sha256": "content_sha256", + }, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_raw_response_update(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memories.with_raw_response.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + @parametrize + async def test_streaming_response_update(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memories.with_streaming_response.update( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = await response.parse() + assert_matches_type(BetaManagedAgentsMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_update(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.update( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.update( + memory_id="", + memory_store_id="memory_store_id", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.list( + memory_store_id="memory_store_id", + ) + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.list( + memory_store_id="memory_store_id", + depth=0, + limit=0, + order="asc", + order_by="order_by", + page="page", + path_prefix="path_prefix", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_raw_response_list(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memories.with_raw_response.list( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_streaming_response_list(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memories.with_streaming_response.list( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = await response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryListItem], memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_path_params_list(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.list( + memory_store_id="", + ) + + @parametrize + async def test_method_delete(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + async def test_method_delete_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory = await async_client.beta.memory_stores.memories.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + expected_content_sha256="expected_content_sha256", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + async def test_raw_response_delete(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + @parametrize + async def test_streaming_response_delete(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memories.with_streaming_response.delete( + memory_id="memory_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory = await response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemory, memory, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_delete(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="memory_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_id` but received ''"): + await async_client.beta.memory_stores.memories.with_raw_response.delete( + memory_id="", + memory_store_id="memory_store_id", + ) diff --git a/tests/api_resources/beta/memory_stores/test_memory_versions.py b/tests/api_resources/beta/memory_stores/test_memory_versions.py new file mode 100644 index 00000000..f4318584 --- /dev/null +++ b/tests/api_resources/beta/memory_stores/test_memory_versions.py @@ -0,0 +1,378 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from anthropic import Anthropic, AsyncAnthropic +from tests.utils import assert_matches_type +from anthropic._utils import parse_datetime +from anthropic.pagination import SyncPageCursor, AsyncPageCursor +from anthropic.types.beta.memory_stores import ( + BetaManagedAgentsMemoryVersion, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestMemoryVersions: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_retrieve(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: Anthropic) -> None: + with client.beta.memory_stores.memory_versions.with_streaming_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_version_id` but received ''"): + client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="", + memory_store_id="memory_store_id", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.list( + memory_store_id="memory_store_id", + ) + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list_with_all_params(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.list( + memory_store_id="memory_store_id", + api_key_id="api_key_id", + created_at_gte=parse_datetime("2019-12-27T18:11:19.117Z"), + created_at_lte=parse_datetime("2019-12-27T18:11:19.117Z"), + limit=0, + memory_id="memory_id", + operation="created", + page="page", + session_id="session_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_raw_response_list(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memory_versions.with_raw_response.list( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_streaming_response_list(self, client: Anthropic) -> None: + with client.beta.memory_stores.memory_versions.with_streaming_response.list( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_path_params_list(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memory_versions.with_raw_response.list( + memory_store_id="", + ) + + @parametrize + def test_method_redact(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_method_redact_with_all_params(self, client: Anthropic) -> None: + memory_version = client.beta.memory_stores.memory_versions.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_raw_response_redact(self, client: Anthropic) -> None: + response = client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + def test_streaming_response_redact(self, client: Anthropic) -> None: + with client.beta.memory_stores.memory_versions.with_streaming_response.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_redact(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="memory_version_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_version_id` but received ''"): + client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="", + memory_store_id="memory_store_id", + ) + + +class TestAsyncMemoryVersions: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_retrieve(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memory_versions.with_streaming_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="memory_version_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_version_id` but received ''"): + await async_client.beta.memory_stores.memory_versions.with_raw_response.retrieve( + memory_version_id="", + memory_store_id="memory_store_id", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.list( + memory_store_id="memory_store_id", + ) + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.list( + memory_store_id="memory_store_id", + api_key_id="api_key_id", + created_at_gte=parse_datetime("2019-12-27T18:11:19.117Z"), + created_at_lte=parse_datetime("2019-12-27T18:11:19.117Z"), + limit=0, + memory_id="memory_id", + operation="created", + page="page", + session_id="session_id", + view="basic", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_raw_response_list(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memory_versions.with_raw_response.list( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_streaming_response_list(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memory_versions.with_streaming_response.list( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = await response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryVersion], memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_path_params_list(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memory_versions.with_raw_response.list( + memory_store_id="", + ) + + @parametrize + async def test_method_redact(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_method_redact_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_version = await async_client.beta.memory_stores.memory_versions.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_raw_response_redact(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_version = response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + @parametrize + async def test_streaming_response_redact(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.memory_versions.with_streaming_response.redact( + memory_version_id="memory_version_id", + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_version = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryVersion, memory_version, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_redact(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="memory_version_id", + memory_store_id="", + ) + + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_version_id` but received ''"): + await async_client.beta.memory_stores.memory_versions.with_raw_response.redact( + memory_version_id="", + memory_store_id="memory_store_id", + ) diff --git a/tests/api_resources/beta/messages/test_batches.py b/tests/api_resources/beta/messages/test_batches.py index 11684f23..c3a09934 100644 --- a/tests/api_resources/beta/messages/test_batches.py +++ b/tests/api_resources/beta/messages/test_batches.py @@ -116,11 +116,6 @@ def test_method_create_with_all_params(self, client: Anthropic) -> None: "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, "output_format": { "schema": {"foo": "bar"}, @@ -185,7 +180,6 @@ def test_method_create_with_all_params(self, client: Anthropic) -> None: ], "top_k": 5, "top_p": 0.7, - "user_profile_id": "user_profile_id", }, } ], @@ -580,11 +574,6 @@ async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, "output_format": { "schema": {"foo": "bar"}, @@ -649,7 +638,6 @@ async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) ], "top_k": 5, "top_p": 0.7, - "user_profile_id": "user_profile_id", }, } ], diff --git a/tests/api_resources/beta/test_memory_stores.py b/tests/api_resources/beta/test_memory_stores.py new file mode 100644 index 00000000..8ed9e9de --- /dev/null +++ b/tests/api_resources/beta/test_memory_stores.py @@ -0,0 +1,567 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from anthropic import Anthropic, AsyncAnthropic +from tests.utils import assert_matches_type +from anthropic._utils import parse_datetime +from anthropic.pagination import SyncPageCursor, AsyncPageCursor +from anthropic.types.beta import ( + BetaManagedAgentsMemoryStore, + BetaManagedAgentsDeletedMemoryStore, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestMemoryStores: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_create(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.create( + name="x", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_method_create_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.create( + name="x", + description="description", + metadata={"foo": "string"}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_raw_response_create(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.create( + name="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_streaming_response_create(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.create( + name="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_retrieve(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.retrieve( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.retrieve( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.retrieve( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.retrieve( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.with_raw_response.retrieve( + memory_store_id="", + ) + + @parametrize + def test_method_update(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.update( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.update( + memory_store_id="memory_store_id", + description="description", + metadata={"foo": "string"}, + name="x", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_raw_response_update(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.update( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_streaming_response_update(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.update( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_update(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.with_raw_response.update( + memory_store_id="", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.list() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_method_list_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.list( + created_at_gte=parse_datetime("2019-12-27T18:11:19.117Z"), + created_at_lte=parse_datetime("2019-12-27T18:11:19.117Z"), + include_archived=True, + limit=0, + page="page", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_raw_response_list(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + def test_streaming_response_list(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(SyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_delete(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.delete( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_method_delete_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.delete( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_raw_response_delete(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.delete( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_streaming_response_delete(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.delete( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_delete(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.with_raw_response.delete( + memory_store_id="", + ) + + @parametrize + def test_method_archive(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.archive( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_method_archive_with_all_params(self, client: Anthropic) -> None: + memory_store = client.beta.memory_stores.archive( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_raw_response_archive(self, client: Anthropic) -> None: + response = client.beta.memory_stores.with_raw_response.archive( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + def test_streaming_response_archive(self, client: Anthropic) -> None: + with client.beta.memory_stores.with_streaming_response.archive( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_archive(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + client.beta.memory_stores.with_raw_response.archive( + memory_store_id="", + ) + + +class TestAsyncMemoryStores: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.create( + name="x", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.create( + name="x", + description="description", + metadata={"foo": "string"}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_raw_response_create(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.create( + name="x", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_streaming_response_create(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.create( + name="x", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_retrieve(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.retrieve( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.retrieve( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.retrieve( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.retrieve( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.with_raw_response.retrieve( + memory_store_id="", + ) + + @parametrize + async def test_method_update(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.update( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.update( + memory_store_id="memory_store_id", + description="description", + metadata={"foo": "string"}, + name="x", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_raw_response_update(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.update( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_streaming_response_update(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.update( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_update(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.with_raw_response.update( + memory_store_id="", + ) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.list() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.list( + created_at_gte=parse_datetime("2019-12-27T18:11:19.117Z"), + created_at_lte=parse_datetime("2019-12-27T18:11:19.117Z"), + include_archived=True, + limit=0, + page="page", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_raw_response_list(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + @pytest.mark.skip(reason="buildURL drops path-level query params (SDK-4349)") + @parametrize + async def test_streaming_response_list(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(AsyncPageCursor[BetaManagedAgentsMemoryStore], memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_delete(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.delete( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_method_delete_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.delete( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_raw_response_delete(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.delete( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_streaming_response_delete(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.delete( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(BetaManagedAgentsDeletedMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_delete(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.with_raw_response.delete( + memory_store_id="", + ) + + @parametrize + async def test_method_archive(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.archive( + memory_store_id="memory_store_id", + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_method_archive_with_all_params(self, async_client: AsyncAnthropic) -> None: + memory_store = await async_client.beta.memory_stores.archive( + memory_store_id="memory_store_id", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_raw_response_archive(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.memory_stores.with_raw_response.archive( + memory_store_id="memory_store_id", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + memory_store = response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + @parametrize + async def test_streaming_response_archive(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.memory_stores.with_streaming_response.archive( + memory_store_id="memory_store_id", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + memory_store = await response.parse() + assert_matches_type(BetaManagedAgentsMemoryStore, memory_store, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_archive(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `memory_store_id` but received ''"): + await async_client.beta.memory_stores.with_raw_response.archive( + memory_store_id="", + ) diff --git a/tests/api_resources/beta/test_messages.py b/tests/api_resources/beta/test_messages.py index 621930fd..a5f4de37 100644 --- a/tests/api_resources/beta/test_messages.py +++ b/tests/api_resources/beta/test_messages.py @@ -101,11 +101,6 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, service_tier="auto", speed="standard", @@ -165,6 +160,11 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No } ], top_k=5, + top_p=0.7, + "type": "custom", + } + ], + top_k=5, top_p=0.7, user_profile_id="user_profile_id", betas=["string"], @@ -291,11 +291,6 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, service_tier="auto", speed="standard", @@ -354,6 +349,11 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No } ], top_k=5, + top_p=0.7, + "type": "custom", + } + ], + top_k=5, top_p=0.7, user_profile_id="user_profile_id", betas=["string"], @@ -465,11 +465,6 @@ def test_method_count_tokens_with_all_params(self, client: Anthropic) -> None: "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, speed="fast", system=[ @@ -667,11 +662,6 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, service_tier="auto", speed="standard", @@ -731,6 +721,16 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn } ], top_k=5, + top_p=0.7, + "defer_loading": True, + "description": "Get the current weather in a given location", + "eager_input_streaming": True, + "input_examples": [{"foo": "bar"}], + "strict": True, + "type": "custom", + } + ], + top_k=5, top_p=0.7, user_profile_id="user_profile_id", betas=["string"], @@ -857,11 +857,6 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, service_tier="auto", speed="standard", @@ -920,6 +915,11 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn } ], top_k=5, + top_p=0.7, + "type": "custom", + } + ], + top_k=5, top_p=0.7, user_profile_id="user_profile_id", betas=["string"], @@ -1031,11 +1031,6 @@ async def test_method_count_tokens_with_all_params(self, async_client: AsyncAnth "schema": {"foo": "bar"}, "type": "json_schema", }, - "task_budget": { - "total": 1024, - "type": "tokens", - "remaining": 0, - }, }, speed="fast", system=[ diff --git a/tests/api_resources/beta/test_user_profiles.py b/tests/api_resources/beta/test_user_profiles.py deleted file mode 100644 index dc22bcdc..00000000 --- a/tests/api_resources/beta/test_user_profiles.py +++ /dev/null @@ -1,446 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from anthropic import Anthropic, AsyncAnthropic -from tests.utils import assert_matches_type -from anthropic.pagination import SyncPageCursor, AsyncPageCursor -from anthropic.types.beta import ( - BetaUserProfile, - BetaUserProfileEnrollmentURL, -) - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestUserProfiles: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_create(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.create() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_method_create_with_all_params(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.create( - external_id="user_12345", - metadata={}, - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_raw_response_create(self, client: Anthropic) -> None: - response = client.beta.user_profiles.with_raw_response.create() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_streaming_response_create(self, client: Anthropic) -> None: - with client.beta.user_profiles.with_streaming_response.create() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_retrieve(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_method_retrieve_with_all_params(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_raw_response_retrieve(self, client: Anthropic) -> None: - response = client.beta.user_profiles.with_raw_response.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_streaming_response_retrieve(self, client: Anthropic) -> None: - with client.beta.user_profiles.with_streaming_response.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_retrieve(self, client: Anthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - client.beta.user_profiles.with_raw_response.retrieve( - user_profile_id="", - ) - - @parametrize - def test_method_update(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_method_update_with_all_params(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - external_id="user_12345", - metadata={"foo": "string"}, - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_raw_response_update(self, client: Anthropic) -> None: - response = client.beta.user_profiles.with_raw_response.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - def test_streaming_response_update(self, client: Anthropic) -> None: - with client.beta.user_profiles.with_streaming_response.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_update(self, client: Anthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - client.beta.user_profiles.with_raw_response.update( - user_profile_id="", - ) - - @parametrize - def test_method_list(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.list() - assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - def test_method_list_with_all_params(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.list( - limit=0, - order="asc", - page="page", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - def test_raw_response_list(self, client: Anthropic) -> None: - response = client.beta.user_profiles.with_raw_response.list() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - def test_streaming_response_list(self, client: Anthropic) -> None: - with client.beta.user_profiles.with_streaming_response.list() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = response.parse() - assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_method_create_enrollment_url(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - def test_method_create_enrollment_url_with_all_params(self, client: Anthropic) -> None: - user_profile = client.beta.user_profiles.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - def test_raw_response_create_enrollment_url(self, client: Anthropic) -> None: - response = client.beta.user_profiles.with_raw_response.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - def test_streaming_response_create_enrollment_url(self, client: Anthropic) -> None: - with client.beta.user_profiles.with_streaming_response.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = response.parse() - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_create_enrollment_url(self, client: Anthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - client.beta.user_profiles.with_raw_response.create_enrollment_url( - user_profile_id="", - ) - - -class TestAsyncUserProfiles: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_create(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.create() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.create( - external_id="user_12345", - metadata={}, - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_raw_response_create(self, async_client: AsyncAnthropic) -> None: - response = await async_client.beta.user_profiles.with_raw_response.create() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_streaming_response_create(self, async_client: AsyncAnthropic) -> None: - async with async_client.beta.user_profiles.with_streaming_response.create() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = await response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_retrieve(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_method_retrieve_with_all_params(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_raw_response_retrieve(self, async_client: AsyncAnthropic) -> None: - response = await async_client.beta.user_profiles.with_raw_response.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_streaming_response_retrieve(self, async_client: AsyncAnthropic) -> None: - async with async_client.beta.user_profiles.with_streaming_response.retrieve( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = await response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_retrieve(self, async_client: AsyncAnthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - await async_client.beta.user_profiles.with_raw_response.retrieve( - user_profile_id="", - ) - - @parametrize - async def test_method_update(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_method_update_with_all_params(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - external_id="user_12345", - metadata={"foo": "string"}, - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_raw_response_update(self, async_client: AsyncAnthropic) -> None: - response = await async_client.beta.user_profiles.with_raw_response.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - @parametrize - async def test_streaming_response_update(self, async_client: AsyncAnthropic) -> None: - async with async_client.beta.user_profiles.with_streaming_response.update( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = await response.parse() - assert_matches_type(BetaUserProfile, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_update(self, async_client: AsyncAnthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - await async_client.beta.user_profiles.with_raw_response.update( - user_profile_id="", - ) - - @parametrize - async def test_method_list(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.list() - assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - async def test_method_list_with_all_params(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.list( - limit=0, - order="asc", - page="page", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - async def test_raw_response_list(self, async_client: AsyncAnthropic) -> None: - response = await async_client.beta.user_profiles.with_raw_response.list() - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - @parametrize - async def test_streaming_response_list(self, async_client: AsyncAnthropic) -> None: - async with async_client.beta.user_profiles.with_streaming_response.list() as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = await response.parse() - assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_method_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - async def test_method_create_enrollment_url_with_all_params(self, async_client: AsyncAnthropic) -> None: - user_profile = await async_client.beta.user_profiles.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - betas=["message-batches-2024-09-24"], - ) - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - async def test_raw_response_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: - response = await async_client.beta.user_profiles.with_raw_response.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - user_profile = response.parse() - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - @parametrize - async def test_streaming_response_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: - async with async_client.beta.user_profiles.with_streaming_response.create_enrollment_url( - user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - user_profile = await response.parse() - assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): - await async_client.beta.user_profiles.with_raw_response.create_enrollment_url( - user_profile_id="", - ) From 72212ab8408af389981e9e6b111c00460b2b17e4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:33:39 +0000 Subject: [PATCH 07/10] fix(api): restore missing features --- .stats.yml | 8 +- api.md | 21 + src/anthropic/resources/beta/__init__.py | 14 + src/anthropic/resources/beta/beta.py | 32 + .../resources/beta/messages/messages.py | 28 + src/anthropic/resources/beta/user_profiles.py | 720 ++++++++++++++++++ src/anthropic/types/anthropic_beta_param.py | 1 + src/anthropic/types/beta/__init__.py | 7 + .../types/beta/beta_compaction_block.py | 3 + .../types/beta/beta_compaction_block_param.py | 3 + .../beta_compaction_content_block_delta.py | 3 + .../types/beta/beta_output_config_param.py | 4 + .../beta/beta_token_task_budget_param.py | 25 + src/anthropic/types/beta/beta_user_profile.py | 39 + .../beta/beta_user_profile_enrollment_url.py | 19 + .../beta/beta_user_profile_trust_grant.py | 12 + .../types/beta/message_create_params.py | 6 + .../beta/messages/batch_create_params.py | 6 + .../types/beta/user_profile_create_params.py | 29 + .../types/beta/user_profile_list_params.py | 25 + .../types/beta/user_profile_update_params.py | 30 + .../beta/messages/test_batches.py | 12 + tests/api_resources/beta/test_messages.py | 63 +- .../api_resources/beta/test_user_profiles.py | 446 +++++++++++ 24 files changed, 1523 insertions(+), 33 deletions(-) create mode 100644 src/anthropic/resources/beta/user_profiles.py create mode 100644 src/anthropic/types/beta/beta_token_task_budget_param.py create mode 100644 src/anthropic/types/beta/beta_user_profile.py create mode 100644 src/anthropic/types/beta/beta_user_profile_enrollment_url.py create mode 100644 src/anthropic/types/beta/beta_user_profile_trust_grant.py create mode 100644 src/anthropic/types/beta/user_profile_create_params.py create mode 100644 src/anthropic/types/beta/user_profile_list_params.py create mode 100644 src/anthropic/types/beta/user_profile_update_params.py create mode 100644 tests/api_resources/beta/test_user_profiles.py diff --git a/.stats.yml b/.stats.yml index 2a99d2df..2f31a127 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 86 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-78e8ea00cd66db850ab32db53b5e0037fb0b4a791b513393c03d9011406a6c78.yml -openapi_spec_hash: 3f08b4e5296e181c7243aa92f4a3073e -config_hash: 350c1adcf8bb17e1913ed80e189c5a52 +configured_endpoints: 91 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-d4d7fd5ad7272db2902decf5c405e138a16b1fed45a697faea32af12a126b782.yml +openapi_spec_hash: d3c28f7234c8c93e3b945bb76c9d57c0 +config_hash: c7cdab4e4eb2befb0d99f6db5c3d4737 diff --git a/api.md b/api.md index c1efa825..a5cd0e64 100644 --- a/api.md +++ b/api.md @@ -444,6 +444,7 @@ from anthropic.types.beta import ( BetaThinkingConfigParam, BetaThinkingDelta, BetaThinkingTurns, + BetaTokenTaskBudget, BetaTool, BetaToolBash20241022, BetaToolBash20250124, @@ -910,3 +911,23 @@ Methods: - client.beta.skills.versions.retrieve(version, \*, skill_id) -> VersionRetrieveResponse - client.beta.skills.versions.list(skill_id, \*\*params) -> SyncPageCursor[VersionListResponse] - client.beta.skills.versions.delete(version, \*, skill_id) -> VersionDeleteResponse + +## UserProfiles + +Types: + +```python +from anthropic.types.beta import ( + BetaUserProfile, + BetaUserProfileEnrollmentURL, + BetaUserProfileTrustGrant, +) +``` + +Methods: + +- client.beta.user_profiles.create(\*\*params) -> BetaUserProfile +- client.beta.user_profiles.retrieve(user_profile_id) -> BetaUserProfile +- client.beta.user_profiles.update(user_profile_id, \*\*params) -> BetaUserProfile +- client.beta.user_profiles.list(\*\*params) -> SyncPageCursor[BetaUserProfile] +- client.beta.user_profiles.create_enrollment_url(user_profile_id) -> BetaUserProfileEnrollmentURL diff --git a/src/anthropic/resources/beta/__init__.py b/src/anthropic/resources/beta/__init__.py index 017140d7..9c74f2e5 100644 --- a/src/anthropic/resources/beta/__init__.py +++ b/src/anthropic/resources/beta/__init__.py @@ -80,6 +80,14 @@ MemoryStoresWithStreamingResponse, AsyncMemoryStoresWithStreamingResponse, ) +from .user_profiles import ( + UserProfiles, + AsyncUserProfiles, + UserProfilesWithRawResponse, + AsyncUserProfilesWithRawResponse, + UserProfilesWithStreamingResponse, + AsyncUserProfilesWithStreamingResponse, +) __all__ = [ "Models", @@ -136,6 +144,12 @@ "AsyncSkillsWithRawResponse", "SkillsWithStreamingResponse", "AsyncSkillsWithStreamingResponse", + "UserProfiles", + "AsyncUserProfiles", + "UserProfilesWithRawResponse", + "AsyncUserProfilesWithRawResponse", + "UserProfilesWithStreamingResponse", + "AsyncUserProfilesWithStreamingResponse", "Beta", "AsyncBeta", "BetaWithRawResponse", diff --git a/src/anthropic/resources/beta/beta.py b/src/anthropic/resources/beta/beta.py index e42a9277..a0ef6387 100644 --- a/src/anthropic/resources/beta/beta.py +++ b/src/anthropic/resources/beta/beta.py @@ -44,6 +44,14 @@ SkillsWithStreamingResponse, AsyncSkillsWithStreamingResponse, ) +from .user_profiles import ( + UserProfiles, + AsyncUserProfiles, + UserProfilesWithRawResponse, + AsyncUserProfilesWithRawResponse, + UserProfilesWithStreamingResponse, + AsyncUserProfilesWithStreamingResponse, +) from .vaults.vaults import ( Vaults, AsyncVaults, @@ -117,6 +125,10 @@ def files(self) -> Files: def skills(self) -> Skills: return Skills(self._client) + @cached_property + def user_profiles(self) -> UserProfiles: + return UserProfiles(self._client) + @cached_property def with_raw_response(self) -> BetaWithRawResponse: """ @@ -174,6 +186,10 @@ def files(self) -> AsyncFiles: def skills(self) -> AsyncSkills: return AsyncSkills(self._client) + @cached_property + def user_profiles(self) -> AsyncUserProfiles: + return AsyncUserProfiles(self._client) + @cached_property def with_raw_response(self) -> AsyncBetaWithRawResponse: """ @@ -234,6 +250,10 @@ def files(self) -> FilesWithRawResponse: def skills(self) -> SkillsWithRawResponse: return SkillsWithRawResponse(self._beta.skills) + @cached_property + def user_profiles(self) -> UserProfilesWithRawResponse: + return UserProfilesWithRawResponse(self._beta.user_profiles) + class AsyncBetaWithRawResponse: def __init__(self, beta: AsyncBeta) -> None: @@ -275,6 +295,10 @@ def files(self) -> AsyncFilesWithRawResponse: def skills(self) -> AsyncSkillsWithRawResponse: return AsyncSkillsWithRawResponse(self._beta.skills) + @cached_property + def user_profiles(self) -> AsyncUserProfilesWithRawResponse: + return AsyncUserProfilesWithRawResponse(self._beta.user_profiles) + class BetaWithStreamingResponse: def __init__(self, beta: Beta) -> None: @@ -316,6 +340,10 @@ def files(self) -> FilesWithStreamingResponse: def skills(self) -> SkillsWithStreamingResponse: return SkillsWithStreamingResponse(self._beta.skills) + @cached_property + def user_profiles(self) -> UserProfilesWithStreamingResponse: + return UserProfilesWithStreamingResponse(self._beta.user_profiles) + class AsyncBetaWithStreamingResponse: def __init__(self, beta: AsyncBeta) -> None: @@ -356,3 +384,7 @@ def files(self) -> AsyncFilesWithStreamingResponse: @cached_property def skills(self) -> AsyncSkillsWithStreamingResponse: return AsyncSkillsWithStreamingResponse(self._beta.skills) + + @cached_property + def user_profiles(self) -> AsyncUserProfilesWithStreamingResponse: + return AsyncUserProfilesWithStreamingResponse(self._beta.user_profiles) diff --git a/src/anthropic/resources/beta/messages/messages.py b/src/anthropic/resources/beta/messages/messages.py index cd8d1b0f..e3e10e09 100644 --- a/src/anthropic/resources/beta/messages/messages.py +++ b/src/anthropic/resources/beta/messages/messages.py @@ -131,6 +131,7 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -395,6 +396,9 @@ def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -433,6 +437,7 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -697,6 +702,9 @@ def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -735,6 +743,7 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -999,6 +1008,9 @@ def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -1037,6 +1049,7 @@ def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -1101,6 +1114,7 @@ def create( "tools": tools, "top_k": top_k, "top_p": top_p, + "user_profile_id": user_profile_id, }, message_create_params.MessageCreateParamsStreaming if stream @@ -1945,6 +1959,7 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2209,6 +2224,9 @@ async def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -2247,6 +2265,7 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2511,6 +2530,9 @@ async def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -2549,6 +2571,7 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2813,6 +2836,9 @@ async def create( Recommended for advanced use cases only. + user_profile_id: The user profile ID to attribute this request to. Use when acting on behalf of a + party other than your organization. + betas: Optional header to specify the beta version(s) you want to use. extra_headers: Send extra headers @@ -2851,6 +2877,7 @@ async def create( tools: Iterable[BetaToolUnionParam] | Omit = omit, top_k: int | Omit = omit, top_p: float | Omit = omit, + user_profile_id: Optional[str] | Omit = omit, betas: List[AnthropicBetaParam] | Omit = omit, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -2915,6 +2942,7 @@ async def create( "tools": tools, "top_k": top_k, "top_p": top_p, + "user_profile_id": user_profile_id, }, message_create_params.MessageCreateParamsStreaming if stream diff --git a/src/anthropic/resources/beta/user_profiles.py b/src/anthropic/resources/beta/user_profiles.py new file mode 100644 index 00000000..f79e2d5c --- /dev/null +++ b/src/anthropic/resources/beta/user_profiles.py @@ -0,0 +1,720 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict, List, Optional +from itertools import chain +from typing_extensions import Literal + +import httpx + +from ... import _legacy_response +from ..._types import Body, Omit, Query, Headers, NotGiven, omit, not_given +from ..._utils import is_given, path_template, maybe_transform, strip_not_given, async_maybe_transform +from ..._compat import cached_property +from ..._resource import SyncAPIResource, AsyncAPIResource +from ..._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper +from ...pagination import SyncPageCursor, AsyncPageCursor +from ...types.beta import user_profile_list_params, user_profile_create_params, user_profile_update_params +from ..._base_client import AsyncPaginator, make_request_options +from ...types.anthropic_beta_param import AnthropicBetaParam +from ...types.beta.beta_user_profile import BetaUserProfile +from ...types.beta.beta_user_profile_enrollment_url import BetaUserProfileEnrollmentURL + +__all__ = ["UserProfiles", "AsyncUserProfiles"] + + +class UserProfiles(SyncAPIResource): + @cached_property + def with_raw_response(self) -> UserProfilesWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return UserProfilesWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> UserProfilesWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return UserProfilesWithStreamingResponse(self) + + def create( + self, + *, + external_id: Optional[str] | Omit = omit, + metadata: Dict[str, str] | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Create User Profile + + Args: + external_id: Platform's own identifier for this user. Not enforced unique. Maximum 255 + characters. + + metadata: Free-form key-value data to attach to this user profile. Maximum 16 keys, with + keys up to 64 characters and values up to 512 characters. Values must be + non-empty strings. + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._post( + "/v1/user_profiles?beta=true", + body=maybe_transform( + { + "external_id": external_id, + "metadata": metadata, + }, + user_profile_create_params.UserProfileCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + def retrieve( + self, + user_profile_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Get User Profile + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._get( + path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + def update( + self, + user_profile_id: str, + *, + external_id: Optional[str] | Omit = omit, + metadata: Dict[str, str] | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Update User Profile + + Args: + external_id: If present, replaces the stored external_id. Omit to leave unchanged. Maximum + 255 characters. + + metadata: Key-value pairs to merge into the stored metadata. Keys provided overwrite + existing values. To remove a key, set its value to an empty string. Keys not + provided are left unchanged. Maximum 16 keys, with keys up to 64 characters and + values up to 512 characters. + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._post( + path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + body=maybe_transform( + { + "external_id": external_id, + "metadata": metadata, + }, + user_profile_update_params.UserProfileUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + def list( + self, + *, + limit: int | Omit = omit, + order: Literal["asc", "desc"] | Omit = omit, + page: str | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> SyncPageCursor[BetaUserProfile]: + """ + List User Profiles + + Args: + limit: Query parameter for limit + + order: Query parameter for order + + page: Query parameter for page + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._get_api_list( + "/v1/user_profiles?beta=true", + page=SyncPageCursor[BetaUserProfile], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "limit": limit, + "order": order, + "page": page, + }, + user_profile_list_params.UserProfileListParams, + ), + ), + model=BetaUserProfile, + ) + + def create_enrollment_url( + self, + user_profile_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfileEnrollmentURL: + """ + Create Enrollment URL + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._post( + path_template( + "/v1/user_profiles/{user_profile_id}/enrollment_url?beta=true", user_profile_id=user_profile_id + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfileEnrollmentURL, + ) + + +class AsyncUserProfiles(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncUserProfilesWithRawResponse: + """ + This property can be used as a prefix for any HTTP method call to return + the raw response object instead of the parsed content. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#accessing-raw-response-data-eg-headers + """ + return AsyncUserProfilesWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncUserProfilesWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/anthropics/anthropic-sdk-python#with_streaming_response + """ + return AsyncUserProfilesWithStreamingResponse(self) + + async def create( + self, + *, + external_id: Optional[str] | Omit = omit, + metadata: Dict[str, str] | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Create User Profile + + Args: + external_id: Platform's own identifier for this user. Not enforced unique. Maximum 255 + characters. + + metadata: Free-form key-value data to attach to this user profile. Maximum 16 keys, with + keys up to 64 characters and values up to 512 characters. Values must be + non-empty strings. + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return await self._post( + "/v1/user_profiles?beta=true", + body=await async_maybe_transform( + { + "external_id": external_id, + "metadata": metadata, + }, + user_profile_create_params.UserProfileCreateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + async def retrieve( + self, + user_profile_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Get User Profile + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return await self._get( + path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + async def update( + self, + user_profile_id: str, + *, + external_id: Optional[str] | Omit = omit, + metadata: Dict[str, str] | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfile: + """ + Update User Profile + + Args: + external_id: If present, replaces the stored external_id. Omit to leave unchanged. Maximum + 255 characters. + + metadata: Key-value pairs to merge into the stored metadata. Keys provided overwrite + existing values. To remove a key, set its value to an empty string. Keys not + provided are left unchanged. Maximum 16 keys, with keys up to 64 characters and + values up to 512 characters. + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return await self._post( + path_template("/v1/user_profiles/{user_profile_id}?beta=true", user_profile_id=user_profile_id), + body=await async_maybe_transform( + { + "external_id": external_id, + "metadata": metadata, + }, + user_profile_update_params.UserProfileUpdateParams, + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfile, + ) + + def list( + self, + *, + limit: int | Omit = omit, + order: Literal["asc", "desc"] | Omit = omit, + page: str | Omit = omit, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> AsyncPaginator[BetaUserProfile, AsyncPageCursor[BetaUserProfile]]: + """ + List User Profiles + + Args: + limit: Query parameter for limit + + order: Query parameter for order + + page: Query parameter for page + + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return self._get_api_list( + "/v1/user_profiles?beta=true", + page=AsyncPageCursor[BetaUserProfile], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "limit": limit, + "order": order, + "page": page, + }, + user_profile_list_params.UserProfileListParams, + ), + ), + model=BetaUserProfile, + ) + + async def create_enrollment_url( + self, + user_profile_id: str, + *, + betas: List[AnthropicBetaParam] | Omit = omit, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = not_given, + ) -> BetaUserProfileEnrollmentURL: + """ + Create Enrollment URL + + Args: + betas: Optional header to specify the beta version(s) you want to use. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + if not user_profile_id: + raise ValueError(f"Expected a non-empty value for `user_profile_id` but received {user_profile_id!r}") + extra_headers = { + **strip_not_given( + { + "anthropic-beta": ",".join(chain((str(e) for e in betas), ["user-profiles-2026-03-24"])) + if is_given(betas) + else not_given + } + ), + **(extra_headers or {}), + } + extra_headers = {"anthropic-beta": "user-profiles-2026-03-24", **(extra_headers or {})} + return await self._post( + path_template( + "/v1/user_profiles/{user_profile_id}/enrollment_url?beta=true", user_profile_id=user_profile_id + ), + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=BetaUserProfileEnrollmentURL, + ) + + +class UserProfilesWithRawResponse: + def __init__(self, user_profiles: UserProfiles) -> None: + self._user_profiles = user_profiles + + self.create = _legacy_response.to_raw_response_wrapper( + user_profiles.create, + ) + self.retrieve = _legacy_response.to_raw_response_wrapper( + user_profiles.retrieve, + ) + self.update = _legacy_response.to_raw_response_wrapper( + user_profiles.update, + ) + self.list = _legacy_response.to_raw_response_wrapper( + user_profiles.list, + ) + self.create_enrollment_url = _legacy_response.to_raw_response_wrapper( + user_profiles.create_enrollment_url, + ) + + +class AsyncUserProfilesWithRawResponse: + def __init__(self, user_profiles: AsyncUserProfiles) -> None: + self._user_profiles = user_profiles + + self.create = _legacy_response.async_to_raw_response_wrapper( + user_profiles.create, + ) + self.retrieve = _legacy_response.async_to_raw_response_wrapper( + user_profiles.retrieve, + ) + self.update = _legacy_response.async_to_raw_response_wrapper( + user_profiles.update, + ) + self.list = _legacy_response.async_to_raw_response_wrapper( + user_profiles.list, + ) + self.create_enrollment_url = _legacy_response.async_to_raw_response_wrapper( + user_profiles.create_enrollment_url, + ) + + +class UserProfilesWithStreamingResponse: + def __init__(self, user_profiles: UserProfiles) -> None: + self._user_profiles = user_profiles + + self.create = to_streamed_response_wrapper( + user_profiles.create, + ) + self.retrieve = to_streamed_response_wrapper( + user_profiles.retrieve, + ) + self.update = to_streamed_response_wrapper( + user_profiles.update, + ) + self.list = to_streamed_response_wrapper( + user_profiles.list, + ) + self.create_enrollment_url = to_streamed_response_wrapper( + user_profiles.create_enrollment_url, + ) + + +class AsyncUserProfilesWithStreamingResponse: + def __init__(self, user_profiles: AsyncUserProfiles) -> None: + self._user_profiles = user_profiles + + self.create = async_to_streamed_response_wrapper( + user_profiles.create, + ) + self.retrieve = async_to_streamed_response_wrapper( + user_profiles.retrieve, + ) + self.update = async_to_streamed_response_wrapper( + user_profiles.update, + ) + self.list = async_to_streamed_response_wrapper( + user_profiles.list, + ) + self.create_enrollment_url = async_to_streamed_response_wrapper( + user_profiles.create_enrollment_url, + ) diff --git a/src/anthropic/types/anthropic_beta_param.py b/src/anthropic/types/anthropic_beta_param.py index 05b68065..b54a7968 100644 --- a/src/anthropic/types/anthropic_beta_param.py +++ b/src/anthropic/types/anthropic_beta_param.py @@ -31,6 +31,7 @@ "skills-2025-10-02", "fast-mode-2026-02-01", "output-300k-2026-03-24", + "user-profiles-2026-03-24", "advisor-tool-2026-03-01", ], ] diff --git a/src/anthropic/types/beta/__init__.py b/src/anthropic/types/beta/__init__.py index 306b20f7..cb192466 100644 --- a/src/anthropic/types/beta/__init__.py +++ b/src/anthropic/types/beta/__init__.py @@ -20,6 +20,7 @@ from .agent_list_params import AgentListParams as AgentListParams from .beta_cloud_config import BetaCloudConfig as BetaCloudConfig from .beta_skill_params import BetaSkillParams as BetaSkillParams +from .beta_user_profile import BetaUserProfile as BetaUserProfile from .model_list_params import ModelListParams as ModelListParams from .skill_list_params import SkillListParams as SkillListParams from .vault_list_params import VaultListParams as VaultListParams @@ -82,6 +83,7 @@ from .beta_thinking_capability import BetaThinkingCapability as BetaThinkingCapability from .beta_user_location_param import BetaUserLocationParam as BetaUserLocationParam from .memory_store_list_params import MemoryStoreListParams as MemoryStoreListParams +from .user_profile_list_params import UserProfileListParams as UserProfileListParams from .beta_advisor_result_block import BetaAdvisorResultBlock as BetaAdvisorResultBlock from .beta_managed_agents_agent import BetaManagedAgentsAgent as BetaManagedAgentsAgent from .beta_managed_agents_model import BetaManagedAgentsModel as BetaManagedAgentsModel @@ -105,6 +107,8 @@ from .beta_web_fetch_block_param import BetaWebFetchBlockParam as BetaWebFetchBlockParam from .memory_store_create_params import MemoryStoreCreateParams as MemoryStoreCreateParams from .memory_store_update_params import MemoryStoreUpdateParams as MemoryStoreUpdateParams +from .user_profile_create_params import UserProfileCreateParams as UserProfileCreateParams +from .user_profile_update_params import UserProfileUpdateParams as UserProfileUpdateParams 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 @@ -127,6 +131,7 @@ from .beta_raw_message_delta_event import BetaRawMessageDeltaEvent as BetaRawMessageDeltaEvent from .beta_raw_message_start_event import BetaRawMessageStartEvent as BetaRawMessageStartEvent from .beta_redacted_thinking_block import BetaRedactedThinkingBlock as BetaRedactedThinkingBlock +from .beta_token_task_budget_param import BetaTokenTaskBudgetParam as BetaTokenTaskBudgetParam from .beta_tool_result_block_param import BetaToolResultBlockParam as BetaToolResultBlockParam from .beta_tool_uses_trigger_param import BetaToolUsesTriggerParam as BetaToolUsesTriggerParam from .beta_web_search_result_block import BetaWebSearchResultBlock as BetaWebSearchResultBlock @@ -137,6 +142,7 @@ from .beta_server_tool_caller_param import BetaServerToolCallerParam as BetaServerToolCallerParam from .beta_tool_bash_20241022_param import BetaToolBash20241022Param as BetaToolBash20241022Param from .beta_tool_bash_20250124_param import BetaToolBash20250124Param as BetaToolBash20250124Param +from .beta_user_profile_trust_grant import BetaUserProfileTrustGrant as BetaUserProfileTrustGrant from .beta_advisor_tool_result_block import BetaAdvisorToolResultBlock as BetaAdvisorToolResultBlock from .beta_advisor_tool_result_error import BetaAdvisorToolResultError as BetaAdvisorToolResultError from .beta_base64_image_source_param import BetaBase64ImageSourceParam as BetaBase64ImageSourceParam @@ -165,6 +171,7 @@ from .beta_managed_agents_skill_params import BetaManagedAgentsSkillParams as BetaManagedAgentsSkillParams from .beta_server_tool_caller_20260120 import BetaServerToolCaller20260120 as BetaServerToolCaller20260120 from .beta_server_tool_use_block_param import BetaServerToolUseBlockParam as BetaServerToolUseBlockParam +from .beta_user_profile_enrollment_url import BetaUserProfileEnrollmentURL as BetaUserProfileEnrollmentURL from .beta_web_fetch_tool_result_block import BetaWebFetchToolResultBlock as BetaWebFetchToolResultBlock from .beta_citation_char_location_param import BetaCitationCharLocationParam as BetaCitationCharLocationParam from .beta_citation_page_location_param import BetaCitationPageLocationParam as BetaCitationPageLocationParam diff --git a/src/anthropic/types/beta/beta_compaction_block.py b/src/anthropic/types/beta/beta_compaction_block.py index f4c9374f..53da79fa 100644 --- a/src/anthropic/types/beta/beta_compaction_block.py +++ b/src/anthropic/types/beta/beta_compaction_block.py @@ -19,4 +19,7 @@ class BetaCompactionBlock(BaseModel): content: Optional[str] = None """Summary of compacted content, or null if compaction failed""" + encrypted_content: Optional[str] = None + """Opaque metadata from prior compaction, to be round-tripped verbatim""" + type: Literal["compaction"] diff --git a/src/anthropic/types/beta/beta_compaction_block_param.py b/src/anthropic/types/beta/beta_compaction_block_param.py index 032c9cd2..39d4ed82 100644 --- a/src/anthropic/types/beta/beta_compaction_block_param.py +++ b/src/anthropic/types/beta/beta_compaction_block_param.py @@ -27,3 +27,6 @@ class BetaCompactionBlockParam(TypedDict, total=False): cache_control: Optional[BetaCacheControlEphemeralParam] """Create a cache control breakpoint at this content block.""" + + encrypted_content: Optional[str] + """Opaque metadata from prior compaction, to be round-tripped verbatim""" diff --git a/src/anthropic/types/beta/beta_compaction_content_block_delta.py b/src/anthropic/types/beta/beta_compaction_content_block_delta.py index 8cf5aa87..84887de9 100644 --- a/src/anthropic/types/beta/beta_compaction_content_block_delta.py +++ b/src/anthropic/types/beta/beta_compaction_content_block_delta.py @@ -11,4 +11,7 @@ class BetaCompactionContentBlockDelta(BaseModel): content: Optional[str] = None + encrypted_content: Optional[str] = None + """Opaque metadata from prior compaction, to be round-tripped verbatim""" + type: Literal["compaction_delta"] diff --git a/src/anthropic/types/beta/beta_output_config_param.py b/src/anthropic/types/beta/beta_output_config_param.py index 210b868e..e449c03d 100644 --- a/src/anthropic/types/beta/beta_output_config_param.py +++ b/src/anthropic/types/beta/beta_output_config_param.py @@ -5,6 +5,7 @@ from typing import Optional from typing_extensions import Literal, TypedDict +from .beta_token_task_budget_param import BetaTokenTaskBudgetParam from .beta_json_output_format_param import BetaJSONOutputFormatParam __all__ = ["BetaOutputConfigParam"] @@ -20,3 +21,6 @@ class BetaOutputConfigParam(TypedDict, total=False): See [structured outputs](https://platform.claude.com/docs/en/build-with-claude/structured-outputs) """ + + task_budget: Optional[BetaTokenTaskBudgetParam] + """User-configurable total token budget across contexts.""" diff --git a/src/anthropic/types/beta/beta_token_task_budget_param.py b/src/anthropic/types/beta/beta_token_task_budget_param.py new file mode 100644 index 00000000..ec9f5869 --- /dev/null +++ b/src/anthropic/types/beta/beta_token_task_budget_param.py @@ -0,0 +1,25 @@ +# 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__ = ["BetaTokenTaskBudgetParam"] + + +class BetaTokenTaskBudgetParam(TypedDict, total=False): + """User-configurable total token budget across contexts.""" + + total: Required[int] + """Total token budget across all contexts in the session.""" + + type: Required[Literal["tokens"]] + """The budget type. Currently only 'tokens' is supported.""" + + remaining: Optional[int] + """Remaining tokens in the budget. + + Use this to track usage across contexts when implementing compaction + client-side. Defaults to total if not provided. + """ diff --git a/src/anthropic/types/beta/beta_user_profile.py b/src/anthropic/types/beta/beta_user_profile.py new file mode 100644 index 00000000..b3805720 --- /dev/null +++ b/src/anthropic/types/beta/beta_user_profile.py @@ -0,0 +1,39 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import Dict, Optional +from datetime import datetime +from typing_extensions import Literal + +from ..._models import BaseModel +from .beta_user_profile_trust_grant import BetaUserProfileTrustGrant + +__all__ = ["BetaUserProfile"] + + +class BetaUserProfile(BaseModel): + id: str + """Unique identifier for this user profile, prefixed `uprof_`.""" + + created_at: datetime + """A timestamp in RFC 3339 format""" + + metadata: Dict[str, str] + """Arbitrary key-value metadata. + + Maximum 16 pairs, keys up to 64 chars, values up to 512 chars. + """ + + trust_grants: Dict[str, BetaUserProfileTrustGrant] + """Trust grants for this profile, keyed by grant name. + + Key omitted when no grant is active or in flight. + """ + + type: Literal["user_profile"] + """Object type. Always `user_profile`.""" + + updated_at: datetime + """A timestamp in RFC 3339 format""" + + external_id: Optional[str] = None + """Platform's own identifier for this user. Not enforced unique.""" diff --git a/src/anthropic/types/beta/beta_user_profile_enrollment_url.py b/src/anthropic/types/beta/beta_user_profile_enrollment_url.py new file mode 100644 index 00000000..41fd555a --- /dev/null +++ b/src/anthropic/types/beta/beta_user_profile_enrollment_url.py @@ -0,0 +1,19 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from datetime import datetime +from typing_extensions import Literal + +from ..._models import BaseModel + +__all__ = ["BetaUserProfileEnrollmentURL"] + + +class BetaUserProfileEnrollmentURL(BaseModel): + expires_at: datetime + """A timestamp in RFC 3339 format""" + + type: Literal["enrollment_url"] + """Object type. Always `enrollment_url`.""" + + url: str + """Enrollment URL to send to the end user. Valid until `expires_at`.""" diff --git a/src/anthropic/types/beta/beta_user_profile_trust_grant.py b/src/anthropic/types/beta/beta_user_profile_trust_grant.py new file mode 100644 index 00000000..6d590232 --- /dev/null +++ b/src/anthropic/types/beta/beta_user_profile_trust_grant.py @@ -0,0 +1,12 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing_extensions import Literal + +from ..._models import BaseModel + +__all__ = ["BetaUserProfileTrustGrant"] + + +class BetaUserProfileTrustGrant(BaseModel): + status: Literal["active", "pending", "rejected"] + """Status of the trust grant.""" diff --git a/src/anthropic/types/beta/message_create_params.py b/src/anthropic/types/beta/message_create_params.py index 031db06c..419e921b 100644 --- a/src/anthropic/types/beta/message_create_params.py +++ b/src/anthropic/types/beta/message_create_params.py @@ -321,6 +321,12 @@ class MessageCreateParamsBase(TypedDict, total=False): Recommended for advanced use cases only. """ + user_profile_id: Optional[str] + """The user profile ID to attribute this request to. + + Use when acting on behalf of a party other than your organization. + """ + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/messages/batch_create_params.py b/src/anthropic/types/beta/messages/batch_create_params.py index f56498a7..736adc65 100644 --- a/src/anthropic/types/beta/messages/batch_create_params.py +++ b/src/anthropic/types/beta/messages/batch_create_params.py @@ -24,6 +24,12 @@ class BatchCreateParams(TypedDict, total=False): + user_profile_id: Optional[str] + """The user profile ID to attribute this request to. + + Use when acting on behalf of a party other than your organization. + """ + class Request(TypedDict, total=False): custom_id: Required[str] diff --git a/src/anthropic/types/beta/user_profile_create_params.py b/src/anthropic/types/beta/user_profile_create_params.py new file mode 100644 index 00000000..b84f622f --- /dev/null +++ b/src/anthropic/types/beta/user_profile_create_params.py @@ -0,0 +1,29 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict, List, Optional +from typing_extensions import Annotated, TypedDict + +from ..._utils import PropertyInfo +from ..anthropic_beta_param import AnthropicBetaParam + +__all__ = ["UserProfileCreateParams"] + + +class UserProfileCreateParams(TypedDict, total=False): + external_id: Optional[str] + """Platform's own identifier for this user. + + Not enforced unique. Maximum 255 characters. + """ + + metadata: Dict[str, str] + """Free-form key-value data to attach to this user profile. + + Maximum 16 keys, with keys up to 64 characters and values up to 512 characters. + Values must be non-empty strings. + """ + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/user_profile_list_params.py b/src/anthropic/types/beta/user_profile_list_params.py new file mode 100644 index 00000000..0cf2a3df --- /dev/null +++ b/src/anthropic/types/beta/user_profile_list_params.py @@ -0,0 +1,25 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List +from typing_extensions import Literal, Annotated, TypedDict + +from ..._utils import PropertyInfo +from ..anthropic_beta_param import AnthropicBetaParam + +__all__ = ["UserProfileListParams"] + + +class UserProfileListParams(TypedDict, total=False): + limit: int + """Query parameter for limit""" + + order: Literal["asc", "desc"] + """Query parameter for order""" + + page: str + """Query parameter for page""" + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/src/anthropic/types/beta/user_profile_update_params.py b/src/anthropic/types/beta/user_profile_update_params.py new file mode 100644 index 00000000..51f42865 --- /dev/null +++ b/src/anthropic/types/beta/user_profile_update_params.py @@ -0,0 +1,30 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Dict, List, Optional +from typing_extensions import Annotated, TypedDict + +from ..._utils import PropertyInfo +from ..anthropic_beta_param import AnthropicBetaParam + +__all__ = ["UserProfileUpdateParams"] + + +class UserProfileUpdateParams(TypedDict, total=False): + external_id: Optional[str] + """If present, replaces the stored external_id. + + Omit to leave unchanged. Maximum 255 characters. + """ + + metadata: Dict[str, str] + """Key-value pairs to merge into the stored metadata. + + Keys provided overwrite existing values. To remove a key, set its value to an + empty string. Keys not provided are left unchanged. Maximum 16 keys, with keys + up to 64 characters and values up to 512 characters. + """ + + betas: Annotated[List[AnthropicBetaParam], PropertyInfo(alias="anthropic-beta")] + """Optional header to specify the beta version(s) you want to use.""" diff --git a/tests/api_resources/beta/messages/test_batches.py b/tests/api_resources/beta/messages/test_batches.py index c3a09934..11684f23 100644 --- a/tests/api_resources/beta/messages/test_batches.py +++ b/tests/api_resources/beta/messages/test_batches.py @@ -116,6 +116,11 @@ def test_method_create_with_all_params(self, client: Anthropic) -> None: "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, "output_format": { "schema": {"foo": "bar"}, @@ -180,6 +185,7 @@ def test_method_create_with_all_params(self, client: Anthropic) -> None: ], "top_k": 5, "top_p": 0.7, + "user_profile_id": "user_profile_id", }, } ], @@ -574,6 +580,11 @@ async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, "output_format": { "schema": {"foo": "bar"}, @@ -638,6 +649,7 @@ async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) ], "top_k": 5, "top_p": 0.7, + "user_profile_id": "user_profile_id", }, } ], diff --git a/tests/api_resources/beta/test_messages.py b/tests/api_resources/beta/test_messages.py index a5f4de37..53048924 100644 --- a/tests/api_resources/beta/test_messages.py +++ b/tests/api_resources/beta/test_messages.py @@ -101,6 +101,11 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, service_tier="auto", speed="standard", @@ -160,14 +165,9 @@ def test_method_create_with_all_params_overload_1(self, client: Anthropic) -> No } ], top_k=5, - top_p=0.7, - "type": "custom", - } - ], - top_k=5, top_p=0.7, user_profile_id="user_profile_id", - betas=["string"], + betas=["message-batches-2024-09-24"], ) assert_matches_type(BetaMessage, message, path=["response"]) @@ -291,6 +291,11 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, service_tier="auto", speed="standard", @@ -349,14 +354,9 @@ def test_method_create_with_all_params_overload_2(self, client: Anthropic) -> No } ], top_k=5, - top_p=0.7, - "type": "custom", - } - ], - top_k=5, top_p=0.7, user_profile_id="user_profile_id", - betas=["string"], + betas=["message-batches-2024-09-24"], ) message_stream.response.close() @@ -465,6 +465,11 @@ def test_method_count_tokens_with_all_params(self, client: Anthropic) -> None: "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, speed="fast", system=[ @@ -662,6 +667,11 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, service_tier="auto", speed="standard", @@ -721,19 +731,9 @@ async def test_method_create_with_all_params_overload_1(self, async_client: Asyn } ], top_k=5, - top_p=0.7, - "defer_loading": True, - "description": "Get the current weather in a given location", - "eager_input_streaming": True, - "input_examples": [{"foo": "bar"}], - "strict": True, - "type": "custom", - } - ], - top_k=5, top_p=0.7, user_profile_id="user_profile_id", - betas=["string"], + betas=["message-batches-2024-09-24"], ) assert_matches_type(BetaMessage, message, path=["response"]) @@ -857,6 +857,11 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, service_tier="auto", speed="standard", @@ -915,14 +920,9 @@ async def test_method_create_with_all_params_overload_2(self, async_client: Asyn } ], top_k=5, - top_p=0.7, - "type": "custom", - } - ], - top_k=5, top_p=0.7, user_profile_id="user_profile_id", - betas=["string"], + betas=["message-batches-2024-09-24"], ) await message_stream.response.aclose() @@ -1031,6 +1031,11 @@ async def test_method_count_tokens_with_all_params(self, async_client: AsyncAnth "schema": {"foo": "bar"}, "type": "json_schema", }, + "task_budget": { + "total": 1024, + "type": "tokens", + "remaining": 0, + }, }, speed="fast", system=[ diff --git a/tests/api_resources/beta/test_user_profiles.py b/tests/api_resources/beta/test_user_profiles.py new file mode 100644 index 00000000..dc22bcdc --- /dev/null +++ b/tests/api_resources/beta/test_user_profiles.py @@ -0,0 +1,446 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +import os +from typing import Any, cast + +import pytest + +from anthropic import Anthropic, AsyncAnthropic +from tests.utils import assert_matches_type +from anthropic.pagination import SyncPageCursor, AsyncPageCursor +from anthropic.types.beta import ( + BetaUserProfile, + BetaUserProfileEnrollmentURL, +) + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestUserProfiles: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_create(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.create() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_method_create_with_all_params(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.create( + external_id="user_12345", + metadata={}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_raw_response_create(self, client: Anthropic) -> None: + response = client.beta.user_profiles.with_raw_response.create() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_streaming_response_create(self, client: Anthropic) -> None: + with client.beta.user_profiles.with_streaming_response.create() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_retrieve(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_method_retrieve_with_all_params(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_raw_response_retrieve(self, client: Anthropic) -> None: + response = client.beta.user_profiles.with_raw_response.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_streaming_response_retrieve(self, client: Anthropic) -> None: + with client.beta.user_profiles.with_streaming_response.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + client.beta.user_profiles.with_raw_response.retrieve( + user_profile_id="", + ) + + @parametrize + def test_method_update(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + external_id="user_12345", + metadata={"foo": "string"}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_raw_response_update(self, client: Anthropic) -> None: + response = client.beta.user_profiles.with_raw_response.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + def test_streaming_response_update(self, client: Anthropic) -> None: + with client.beta.user_profiles.with_streaming_response.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_update(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + client.beta.user_profiles.with_raw_response.update( + user_profile_id="", + ) + + @parametrize + def test_method_list(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.list() + assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + def test_method_list_with_all_params(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.list( + limit=0, + order="asc", + page="page", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + def test_raw_response_list(self, client: Anthropic) -> None: + response = client.beta.user_profiles.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + def test_streaming_response_list(self, client: Anthropic) -> None: + with client.beta.user_profiles.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = response.parse() + assert_matches_type(SyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_create_enrollment_url(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + def test_method_create_enrollment_url_with_all_params(self, client: Anthropic) -> None: + user_profile = client.beta.user_profiles.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + def test_raw_response_create_enrollment_url(self, client: Anthropic) -> None: + response = client.beta.user_profiles.with_raw_response.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + def test_streaming_response_create_enrollment_url(self, client: Anthropic) -> None: + with client.beta.user_profiles.with_streaming_response.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = response.parse() + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_create_enrollment_url(self, client: Anthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + client.beta.user_profiles.with_raw_response.create_enrollment_url( + user_profile_id="", + ) + + +class TestAsyncUserProfiles: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_create(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.create() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_method_create_with_all_params(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.create( + external_id="user_12345", + metadata={}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_raw_response_create(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.user_profiles.with_raw_response.create() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_streaming_response_create(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.user_profiles.with_streaming_response.create() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = await response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_retrieve(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_method_retrieve_with_all_params(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_raw_response_retrieve(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.user_profiles.with_raw_response.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.user_profiles.with_streaming_response.retrieve( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = await response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + await async_client.beta.user_profiles.with_raw_response.retrieve( + user_profile_id="", + ) + + @parametrize + async def test_method_update(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + external_id="user_12345", + metadata={"foo": "string"}, + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_raw_response_update(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.user_profiles.with_raw_response.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + @parametrize + async def test_streaming_response_update(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.user_profiles.with_streaming_response.update( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = await response.parse() + assert_matches_type(BetaUserProfile, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_update(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + await async_client.beta.user_profiles.with_raw_response.update( + user_profile_id="", + ) + + @parametrize + async def test_method_list(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.list() + assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.list( + limit=0, + order="asc", + page="page", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + async def test_raw_response_list(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.user_profiles.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + @parametrize + async def test_streaming_response_list(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.user_profiles.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = await response.parse() + assert_matches_type(AsyncPageCursor[BetaUserProfile], user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + async def test_method_create_enrollment_url_with_all_params(self, async_client: AsyncAnthropic) -> None: + user_profile = await async_client.beta.user_profiles.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + betas=["message-batches-2024-09-24"], + ) + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + async def test_raw_response_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: + response = await async_client.beta.user_profiles.with_raw_response.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + user_profile = response.parse() + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + @parametrize + async def test_streaming_response_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: + async with async_client.beta.user_profiles.with_streaming_response.create_enrollment_url( + user_profile_id="uprof_011CZkZCu8hGbp5mYRQgUmz9", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + user_profile = await response.parse() + assert_matches_type(BetaUserProfileEnrollmentURL, user_profile, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_create_enrollment_url(self, async_client: AsyncAnthropic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `user_profile_id` but received ''"): + await async_client.beta.user_profiles.with_raw_response.create_enrollment_url( + user_profile_id="", + ) From f946de8da00748b472489e93ab4920d64d1cb22d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:42:32 +0000 Subject: [PATCH 08/10] fix(api): fix errors in api spec --- .stats.yml | 4 ++-- src/anthropic/types/beta/beta_effort_capability.py | 5 +++++ src/anthropic/types/beta/beta_output_config_param.py | 2 +- src/anthropic/types/effort_capability.py | 5 +++++ src/anthropic/types/output_config_param.py | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2f31a127..129aa034 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 91 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-d4d7fd5ad7272db2902decf5c405e138a16b1fed45a697faea32af12a126b782.yml -openapi_spec_hash: d3c28f7234c8c93e3b945bb76c9d57c0 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/anthropic%2Fanthropic-6811827071199207cf69c4e64cae1b41e7e74cdb14048e9c748701e474c694a7.yml +openapi_spec_hash: 0feddcbb70c1d373b305f9c95f7df8e6 config_hash: c7cdab4e4eb2befb0d99f6db5c3d4737 diff --git a/src/anthropic/types/beta/beta_effort_capability.py b/src/anthropic/types/beta/beta_effort_capability.py index 38f26d4b..6f33062d 100644 --- a/src/anthropic/types/beta/beta_effort_capability.py +++ b/src/anthropic/types/beta/beta_effort_capability.py @@ -1,5 +1,7 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +from typing import Optional + from ..._models import BaseModel from .beta_capability_support import BetaCapabilitySupport @@ -23,3 +25,6 @@ class BetaEffortCapability(BaseModel): supported: bool """Whether this capability is supported by the model.""" + + xhigh: Optional[BetaCapabilitySupport] = None + """Indicates whether a capability is supported.""" diff --git a/src/anthropic/types/beta/beta_output_config_param.py b/src/anthropic/types/beta/beta_output_config_param.py index e449c03d..ec926693 100644 --- a/src/anthropic/types/beta/beta_output_config_param.py +++ b/src/anthropic/types/beta/beta_output_config_param.py @@ -12,7 +12,7 @@ class BetaOutputConfigParam(TypedDict, total=False): - effort: Optional[Literal["low", "medium", "high", "max"]] + effort: Optional[Literal["low", "medium", "high", "xhigh", "max"]] """All possible effort levels.""" format: Optional[BetaJSONOutputFormatParam] diff --git a/src/anthropic/types/effort_capability.py b/src/anthropic/types/effort_capability.py index 0d26b35c..26b61ef7 100644 --- a/src/anthropic/types/effort_capability.py +++ b/src/anthropic/types/effort_capability.py @@ -1,5 +1,7 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +from typing import Optional + from .._models import BaseModel from .capability_support import CapabilitySupport @@ -23,3 +25,6 @@ class EffortCapability(BaseModel): supported: bool """Whether this capability is supported by the model.""" + + xhigh: Optional[CapabilitySupport] = None + """Indicates whether a capability is supported.""" diff --git a/src/anthropic/types/output_config_param.py b/src/anthropic/types/output_config_param.py index 760a46a0..4c8fad0e 100644 --- a/src/anthropic/types/output_config_param.py +++ b/src/anthropic/types/output_config_param.py @@ -11,7 +11,7 @@ class OutputConfigParam(TypedDict, total=False): - effort: Optional[Literal["low", "medium", "high", "max"]] + effort: Optional[Literal["low", "medium", "high", "xhigh", "max"]] """All possible effort levels.""" format: Optional[JSONOutputFormatParam] From 4b12f5e0f4c29a234cd05f93c603b9cae2011aaa Mon Sep 17 00:00:00 2001 From: Cameron McAteer <246350779+cameron-mcateer@users.noreply.github.com> Date: Thu, 23 Apr 2026 16:47:55 -0400 Subject: [PATCH 09/10] chore: add missing import --- src/anthropic/types/beta/messages/batch_create_params.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/anthropic/types/beta/messages/batch_create_params.py b/src/anthropic/types/beta/messages/batch_create_params.py index 736adc65..a24181f4 100644 --- a/src/anthropic/types/beta/messages/batch_create_params.py +++ b/src/anthropic/types/beta/messages/batch_create_params.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import List, Iterable +from typing import List, Iterable, Optional from typing_extensions import Required, Annotated, TypedDict from ...._utils import PropertyInfo From 3d86dbb42a8fbfe204a44327e9fb756241160cc6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:48:41 +0000 Subject: [PATCH 10/10] release: 0.97.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 26 ++++++++++++++++++++++++++ pyproject.toml | 2 +- src/anthropic/_version.py | 2 +- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d486cde7..ca93fdaa 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.96.0" + ".": "0.97.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 827c6774..8ed12792 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,31 @@ # Changelog +## 0.97.0 (2026-04-23) + +Full Changelog: [v0.96.0...v0.97.0](https://github.com/anthropics/anthropic-sdk-python/compare/v0.96.0...v0.97.0) + +### Features + +* **api:** CMA Memory public beta ([fc30ebe](https://github.com/anthropics/anthropic-sdk-python/commit/fc30ebe5ca81204faa0b1d756b61dad176e37dcb)) + + +### Bug Fixes + +* **api:** fix errors in api spec ([f946de8](https://github.com/anthropics/anthropic-sdk-python/commit/f946de8da00748b472489e93ab4920d64d1cb22d)) +* **api:** restore missing features ([72212ab](https://github.com/anthropics/anthropic-sdk-python/commit/72212ab8408af389981e9e6b111c00460b2b17e4)) + + +### Performance Improvements + +* **client:** optimize file structure copying in multipart requests ([1f9eed3](https://github.com/anthropics/anthropic-sdk-python/commit/1f9eed3a953c8cef0967df8470e04f7ac8fe3235)) + + +### Chores + +* add missing import ([4b12f5e](https://github.com/anthropics/anthropic-sdk-python/commit/4b12f5e0f4c29a234cd05f93c603b9cae2011aaa)) +* **internal:** more robust bootstrap script ([7ed7370](https://github.com/anthropics/anthropic-sdk-python/commit/7ed737089d1f28385ee827f601ba81f1935d0b6a)) +* **tests:** bump steady to v0.22.1 ([a4b7184](https://github.com/anthropics/anthropic-sdk-python/commit/a4b7184e57410ae92a409db5ee6fec90edceaa51)) + ## 0.96.0 (2026-04-16) Full Changelog: [v0.95.0...v0.96.0](https://github.com/anthropics/anthropic-sdk-python/compare/v0.95.0...v0.96.0) diff --git a/pyproject.toml b/pyproject.toml index 544ae501..ffe7b8f5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "anthropic" -version = "0.96.0" +version = "0.97.0" description = "The official Python library for the anthropic API" dynamic = ["readme"] license = "MIT" diff --git a/src/anthropic/_version.py b/src/anthropic/_version.py index a820f00f..92734611 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.96.0" # x-release-please-version +__version__ = "0.97.0" # x-release-please-version