diff --git a/.release-please-manifest.json b/.release-please-manifest.json index bf0d0361..f391d416 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "3.5.0" + ".": "3.6.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 19a9a0b1..0b389cd6 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 19 +configured_endpoints: 18 openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/supermemory--inc%2Fsupermemory-new-ebd5e757d0e76cb83013e01a1e0bb3dba62beb83b2a2ffa28d148ea032e96fd0.yml openapi_spec_hash: f930474a6ad230545154244045cc602e -config_hash: 5761a0b4f8c53c72efab21d41c00012b +config_hash: 5bc39292a7e2f871b35cdebbecd9f022 diff --git a/CHANGELOG.md b/CHANGELOG.md index abe4f578..8e3dbe79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 3.6.0 (2025-11-26) + +Full Changelog: [v3.5.0...v3.6.0](https://github.com/supermemoryai/python-sdk/compare/v3.5.0...v3.6.0) + +### Features + +* **api:** manual updates ([a46347c](https://github.com/supermemoryai/python-sdk/commit/a46347c8640b2442d0f8ffbe4c5f948a9c5edb1b)) + ## 3.5.0 (2025-11-26) Full Changelog: [v3.4.0...v3.5.0](https://github.com/supermemoryai/python-sdk/compare/v3.4.0...v3.5.0) diff --git a/api.md b/api.md index 0e4a1b7c..4451d8b1 100644 --- a/api.md +++ b/api.md @@ -50,18 +50,6 @@ Methods: - client.documents.get(id) -> DocumentGetResponse - client.documents.upload_file(\*\*params) -> DocumentUploadFileResponse -# Profile - -Types: - -```python -from supermemory.types import ProfilePropertyResponse -``` - -Methods: - -- client.profile.property(\*\*params) -> ProfilePropertyResponse - # Search Types: diff --git a/pyproject.toml b/pyproject.toml index 9d073d2e..ac4ed2c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "supermemory" -version = "3.5.0" +version = "3.6.0" description = "The official Python library for the supermemory API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/supermemory/_client.py b/src/supermemory/_client.py index 6982c404..0de41593 100644 --- a/src/supermemory/_client.py +++ b/src/supermemory/_client.py @@ -21,7 +21,7 @@ ) from ._utils import is_given, get_async_library from ._version import __version__ -from .resources import search, profile, memories, settings, documents, connections +from .resources import search, memories, settings, documents, connections from ._streaming import Stream as Stream, AsyncStream as AsyncStream from ._exceptions import APIStatusError, SupermemoryError from ._base_client import ( @@ -45,7 +45,6 @@ class Supermemory(SyncAPIClient): memories: memories.MemoriesResource documents: documents.DocumentsResource - profile: profile.ProfileResource search: search.SearchResource settings: settings.SettingsResource connections: connections.ConnectionsResource @@ -108,7 +107,6 @@ def __init__( self.memories = memories.MemoriesResource(self) self.documents = documents.DocumentsResource(self) - self.profile = profile.ProfileResource(self) self.search = search.SearchResource(self) self.settings = settings.SettingsResource(self) self.connections = connections.ConnectionsResource(self) @@ -223,7 +221,6 @@ def _make_status_error( class AsyncSupermemory(AsyncAPIClient): memories: memories.AsyncMemoriesResource documents: documents.AsyncDocumentsResource - profile: profile.AsyncProfileResource search: search.AsyncSearchResource settings: settings.AsyncSettingsResource connections: connections.AsyncConnectionsResource @@ -286,7 +283,6 @@ def __init__( self.memories = memories.AsyncMemoriesResource(self) self.documents = documents.AsyncDocumentsResource(self) - self.profile = profile.AsyncProfileResource(self) self.search = search.AsyncSearchResource(self) self.settings = settings.AsyncSettingsResource(self) self.connections = connections.AsyncConnectionsResource(self) @@ -402,7 +398,6 @@ class SupermemoryWithRawResponse: def __init__(self, client: Supermemory) -> None: self.memories = memories.MemoriesResourceWithRawResponse(client.memories) self.documents = documents.DocumentsResourceWithRawResponse(client.documents) - self.profile = profile.ProfileResourceWithRawResponse(client.profile) self.search = search.SearchResourceWithRawResponse(client.search) self.settings = settings.SettingsResourceWithRawResponse(client.settings) self.connections = connections.ConnectionsResourceWithRawResponse(client.connections) @@ -412,7 +407,6 @@ class AsyncSupermemoryWithRawResponse: def __init__(self, client: AsyncSupermemory) -> None: self.memories = memories.AsyncMemoriesResourceWithRawResponse(client.memories) self.documents = documents.AsyncDocumentsResourceWithRawResponse(client.documents) - self.profile = profile.AsyncProfileResourceWithRawResponse(client.profile) self.search = search.AsyncSearchResourceWithRawResponse(client.search) self.settings = settings.AsyncSettingsResourceWithRawResponse(client.settings) self.connections = connections.AsyncConnectionsResourceWithRawResponse(client.connections) @@ -422,7 +416,6 @@ class SupermemoryWithStreamedResponse: def __init__(self, client: Supermemory) -> None: self.memories = memories.MemoriesResourceWithStreamingResponse(client.memories) self.documents = documents.DocumentsResourceWithStreamingResponse(client.documents) - self.profile = profile.ProfileResourceWithStreamingResponse(client.profile) self.search = search.SearchResourceWithStreamingResponse(client.search) self.settings = settings.SettingsResourceWithStreamingResponse(client.settings) self.connections = connections.ConnectionsResourceWithStreamingResponse(client.connections) @@ -432,7 +425,6 @@ class AsyncSupermemoryWithStreamedResponse: def __init__(self, client: AsyncSupermemory) -> None: self.memories = memories.AsyncMemoriesResourceWithStreamingResponse(client.memories) self.documents = documents.AsyncDocumentsResourceWithStreamingResponse(client.documents) - self.profile = profile.AsyncProfileResourceWithStreamingResponse(client.profile) self.search = search.AsyncSearchResourceWithStreamingResponse(client.search) self.settings = settings.AsyncSettingsResourceWithStreamingResponse(client.settings) self.connections = connections.AsyncConnectionsResourceWithStreamingResponse(client.connections) diff --git a/src/supermemory/_version.py b/src/supermemory/_version.py index 8d8aec6f..859e0c9e 100644 --- a/src/supermemory/_version.py +++ b/src/supermemory/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "supermemory" -__version__ = "3.5.0" # x-release-please-version +__version__ = "3.6.0" # x-release-please-version diff --git a/src/supermemory/resources/__init__.py b/src/supermemory/resources/__init__.py index 14a2c145..ca24f73f 100644 --- a/src/supermemory/resources/__init__.py +++ b/src/supermemory/resources/__init__.py @@ -8,14 +8,6 @@ SearchResourceWithStreamingResponse, AsyncSearchResourceWithStreamingResponse, ) -from .profile import ( - ProfileResource, - AsyncProfileResource, - ProfileResourceWithRawResponse, - AsyncProfileResourceWithRawResponse, - ProfileResourceWithStreamingResponse, - AsyncProfileResourceWithStreamingResponse, -) from .memories import ( MemoriesResource, AsyncMemoriesResource, @@ -62,12 +54,6 @@ "AsyncDocumentsResourceWithRawResponse", "DocumentsResourceWithStreamingResponse", "AsyncDocumentsResourceWithStreamingResponse", - "ProfileResource", - "AsyncProfileResource", - "ProfileResourceWithRawResponse", - "AsyncProfileResourceWithRawResponse", - "ProfileResourceWithStreamingResponse", - "AsyncProfileResourceWithStreamingResponse", "SearchResource", "AsyncSearchResource", "SearchResourceWithRawResponse", diff --git a/src/supermemory/resources/profile.py b/src/supermemory/resources/profile.py deleted file mode 100644 index 23ec2733..00000000 --- a/src/supermemory/resources/profile.py +++ /dev/null @@ -1,187 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import httpx - -from ..types import profile_property_params -from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform, async_maybe_transform -from .._compat import cached_property -from .._resource import SyncAPIResource, AsyncAPIResource -from .._response import ( - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - async_to_streamed_response_wrapper, -) -from .._base_client import make_request_options -from ..types.profile_property_response import ProfilePropertyResponse - -__all__ = ["ProfileResource", "AsyncProfileResource"] - - -class ProfileResource(SyncAPIResource): - @cached_property - def with_raw_response(self) -> ProfileResourceWithRawResponse: - """ - 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/supermemoryai/python-sdk#accessing-raw-response-data-eg-headers - """ - return ProfileResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> ProfileResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/supermemoryai/python-sdk#with_streaming_response - """ - return ProfileResourceWithStreamingResponse(self) - - def property( - self, - *, - container_tag: str, - q: str | 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, - ) -> ProfilePropertyResponse: - """ - Get user profile with optional search results - - Args: - container_tag: Tag to filter the profile by. This can be an ID for your user, a project ID, or - any other identifier you wish to use to filter memories. - - q: Optional search query to include search results in the response - - 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 - """ - return self._post( - "/v4/profile", - body=maybe_transform( - { - "container_tag": container_tag, - "q": q, - }, - profile_property_params.ProfilePropertyParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ProfilePropertyResponse, - ) - - -class AsyncProfileResource(AsyncAPIResource): - @cached_property - def with_raw_response(self) -> AsyncProfileResourceWithRawResponse: - """ - 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/supermemoryai/python-sdk#accessing-raw-response-data-eg-headers - """ - return AsyncProfileResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncProfileResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/supermemoryai/python-sdk#with_streaming_response - """ - return AsyncProfileResourceWithStreamingResponse(self) - - async def property( - self, - *, - container_tag: str, - q: str | 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, - ) -> ProfilePropertyResponse: - """ - Get user profile with optional search results - - Args: - container_tag: Tag to filter the profile by. This can be an ID for your user, a project ID, or - any other identifier you wish to use to filter memories. - - q: Optional search query to include search results in the response - - 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 - """ - return await self._post( - "/v4/profile", - body=await async_maybe_transform( - { - "container_tag": container_tag, - "q": q, - }, - profile_property_params.ProfilePropertyParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=ProfilePropertyResponse, - ) - - -class ProfileResourceWithRawResponse: - def __init__(self, profile: ProfileResource) -> None: - self._profile = profile - - self.property = to_raw_response_wrapper( - profile.property, - ) - - -class AsyncProfileResourceWithRawResponse: - def __init__(self, profile: AsyncProfileResource) -> None: - self._profile = profile - - self.property = async_to_raw_response_wrapper( - profile.property, - ) - - -class ProfileResourceWithStreamingResponse: - def __init__(self, profile: ProfileResource) -> None: - self._profile = profile - - self.property = to_streamed_response_wrapper( - profile.property, - ) - - -class AsyncProfileResourceWithStreamingResponse: - def __init__(self, profile: AsyncProfileResource) -> None: - self._profile = profile - - self.property = async_to_streamed_response_wrapper( - profile.property, - ) diff --git a/src/supermemory/types/__init__.py b/src/supermemory/types/__init__.py index cf59ae71..54bc0e85 100644 --- a/src/supermemory/types/__init__.py +++ b/src/supermemory/types/__init__.py @@ -21,7 +21,6 @@ from .document_update_params import DocumentUpdateParams as DocumentUpdateParams from .memory_update_response import MemoryUpdateResponse as MemoryUpdateResponse from .search_memories_params import SearchMemoriesParams as SearchMemoriesParams -from .profile_property_params import ProfilePropertyParams as ProfilePropertyParams from .search_documents_params import SearchDocumentsParams as SearchDocumentsParams from .search_execute_response import SearchExecuteResponse as SearchExecuteResponse from .setting_update_response import SettingUpdateResponse as SettingUpdateResponse @@ -31,7 +30,6 @@ from .document_update_response import DocumentUpdateResponse as DocumentUpdateResponse from .search_memories_response import SearchMemoriesResponse as SearchMemoriesResponse from .memory_upload_file_params import MemoryUploadFileParams as MemoryUploadFileParams -from .profile_property_response import ProfilePropertyResponse as ProfilePropertyResponse from .search_documents_response import SearchDocumentsResponse as SearchDocumentsResponse from .connection_create_response import ConnectionCreateResponse as ConnectionCreateResponse from .connection_import_response import ConnectionImportResponse as ConnectionImportResponse diff --git a/src/supermemory/types/profile_property_params.py b/src/supermemory/types/profile_property_params.py deleted file mode 100644 index 46cb736d..00000000 --- a/src/supermemory/types/profile_property_params.py +++ /dev/null @@ -1,21 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import Required, Annotated, TypedDict - -from .._utils import PropertyInfo - -__all__ = ["ProfilePropertyParams"] - - -class ProfilePropertyParams(TypedDict, total=False): - container_tag: Required[Annotated[str, PropertyInfo(alias="containerTag")]] - """Tag to filter the profile by. - - This can be an ID for your user, a project ID, or any other identifier you wish - to use to filter memories. - """ - - q: str - """Optional search query to include search results in the response""" diff --git a/src/supermemory/types/profile_property_response.py b/src/supermemory/types/profile_property_response.py deleted file mode 100644 index 6e7e1383..00000000 --- a/src/supermemory/types/profile_property_response.py +++ /dev/null @@ -1,35 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List, Optional - -from pydantic import Field as FieldInfo - -from .._models import BaseModel - -__all__ = ["ProfilePropertyResponse", "Profile", "SearchResults"] - - -class Profile(BaseModel): - dynamic: List[str] - """Dynamic profile information (recent memories)""" - - static: List[str] - """Static profile information that remains relevant long-term""" - - -class SearchResults(BaseModel): - results: List[object] - """Search results for the provided query""" - - timing: float - """Search timing in milliseconds""" - - total: float - """Total number of search results""" - - -class ProfilePropertyResponse(BaseModel): - profile: Profile - - search_results: Optional[SearchResults] = FieldInfo(alias="searchResults", default=None) - """Search results if a search query was provided""" diff --git a/tests/api_resources/test_profile.py b/tests/api_resources/test_profile.py deleted file mode 100644 index 4312ae78..00000000 --- a/tests/api_resources/test_profile.py +++ /dev/null @@ -1,110 +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 supermemory import Supermemory, AsyncSupermemory -from tests.utils import assert_matches_type -from supermemory.types import ProfilePropertyResponse - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestProfile: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - def test_method_property(self, client: Supermemory) -> None: - profile = client.profile.property( - container_tag="containerTag", - ) - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - def test_method_property_with_all_params(self, client: Supermemory) -> None: - profile = client.profile.property( - container_tag="containerTag", - q="q", - ) - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - def test_raw_response_property(self, client: Supermemory) -> None: - response = client.profile.with_raw_response.property( - container_tag="containerTag", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - profile = response.parse() - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - def test_streaming_response_property(self, client: Supermemory) -> None: - with client.profile.with_streaming_response.property( - container_tag="containerTag", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - profile = response.parse() - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - assert cast(Any, response.is_closed) is True - - -class TestAsyncProfile: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - async def test_method_property(self, async_client: AsyncSupermemory) -> None: - profile = await async_client.profile.property( - container_tag="containerTag", - ) - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - async def test_method_property_with_all_params(self, async_client: AsyncSupermemory) -> None: - profile = await async_client.profile.property( - container_tag="containerTag", - q="q", - ) - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - async def test_raw_response_property(self, async_client: AsyncSupermemory) -> None: - response = await async_client.profile.with_raw_response.property( - container_tag="containerTag", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - profile = await response.parse() - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - @pytest.mark.skip(reason="Prism tests are disabled") - @parametrize - async def test_streaming_response_property(self, async_client: AsyncSupermemory) -> None: - async with async_client.profile.with_streaming_response.property( - container_tag="containerTag", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - profile = await response.parse() - assert_matches_type(ProfilePropertyResponse, profile, path=["response"]) - - assert cast(Any, response.is_closed) is True