# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. from __future__ import annotations from typing import List, Union, Optional from datetime import datetime from typing_extensions import Literal import httpx from ..types import message_list_params, message_search_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given from .._utils import path_template, 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.agents.message_type import MessageType from ..types.message_list_response import MessageListResponse from ..types.message_search_response import MessageSearchResponse from ..types.message_retrieve_response import MessageRetrieveResponse __all__ = ["MessagesResource", "AsyncMessagesResource"] class MessagesResource(SyncAPIResource): @cached_property def with_raw_response(self) -> MessagesResourceWithRawResponse: """ 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/letta-ai/letta-python#accessing-raw-response-data-eg-headers """ return MessagesResourceWithRawResponse(self) @cached_property def with_streaming_response(self) -> MessagesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/letta-ai/letta-python#with_streaming_response """ return MessagesResourceWithStreamingResponse(self) def retrieve( self, message_id: str, *, # 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, ) -> MessageRetrieveResponse: """ Retrieve a message by ID. Args: message_id: The ID of the message in the format 'message-' 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 message_id: raise ValueError(f"Expected a non-empty value for `message_id` but received {message_id!r}") return self._get( path_template("/v1/messages/{message_id}", message_id=message_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=MessageRetrieveResponse, ) def list( self, *, after: Optional[str] | Omit = omit, before: Optional[str] | Omit = omit, conversation_id: Optional[str] | Omit = omit, include_return_message_types: Optional[List[MessageType]] | Omit = omit, limit: Optional[int] | Omit = omit, order: Literal["asc", "desc"] | 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, ) -> MessageListResponse: """ List messages across all agents for the current user. Args: after: Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-' before: Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-' conversation_id: Conversation ID to filter messages by include_return_message_types: Message types to include in response. When null, all message types are returned. limit: Maximum number of messages to return order: Sort order for messages by creation time. 'asc' for oldest first, 'desc' for newest first 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._get( "/v1/messages/", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout, query=maybe_transform( { "after": after, "before": before, "conversation_id": conversation_id, "include_return_message_types": include_return_message_types, "limit": limit, "order": order, }, message_list_params.MessageListParams, ), ), cast_to=MessageListResponse, ) def search( self, *, query: str, agent_id: Optional[str] | Omit = omit, conversation_id: Optional[str] | Omit = omit, end_date: Union[str, datetime, None] | Omit = omit, limit: int | Omit = omit, search_mode: Literal["vector", "fts", "hybrid"] | Omit = omit, start_date: Union[str, datetime, None] | 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, ) -> MessageSearchResponse: """Search messages across the organization with optional agent filtering. Returns messages with FTS/vector ranks and total RRF score. This is a cloud-only feature. Args: query: Text query for full-text search agent_id: Filter messages by agent ID conversation_id: Filter messages by conversation ID end_date: Filter messages created on or before this date limit: Maximum number of results to return search_mode: Search mode to use start_date: Filter messages created after this date 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( "/v1/messages/search", body=maybe_transform( { "query": query, "agent_id": agent_id, "conversation_id": conversation_id, "end_date": end_date, "limit": limit, "search_mode": search_mode, "start_date": start_date, }, message_search_params.MessageSearchParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=MessageSearchResponse, ) class AsyncMessagesResource(AsyncAPIResource): @cached_property def with_raw_response(self) -> AsyncMessagesResourceWithRawResponse: """ 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/letta-ai/letta-python#accessing-raw-response-data-eg-headers """ return AsyncMessagesResourceWithRawResponse(self) @cached_property def with_streaming_response(self) -> AsyncMessagesResourceWithStreamingResponse: """ An alternative to `.with_raw_response` that doesn't eagerly read the response body. For more information, see https://www.github.com/letta-ai/letta-python#with_streaming_response """ return AsyncMessagesResourceWithStreamingResponse(self) async def retrieve( self, message_id: str, *, # 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, ) -> MessageRetrieveResponse: """ Retrieve a message by ID. Args: message_id: The ID of the message in the format 'message-' 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 message_id: raise ValueError(f"Expected a non-empty value for `message_id` but received {message_id!r}") return await self._get( path_template("/v1/messages/{message_id}", message_id=message_id), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=MessageRetrieveResponse, ) async def list( self, *, after: Optional[str] | Omit = omit, before: Optional[str] | Omit = omit, conversation_id: Optional[str] | Omit = omit, include_return_message_types: Optional[List[MessageType]] | Omit = omit, limit: Optional[int] | Omit = omit, order: Literal["asc", "desc"] | 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, ) -> MessageListResponse: """ List messages across all agents for the current user. Args: after: Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-' before: Cursor for pagination (message ID). Returns results relative to this ID in the specified sort order. Expected format: 'message-' conversation_id: Conversation ID to filter messages by include_return_message_types: Message types to include in response. When null, all message types are returned. limit: Maximum number of messages to return order: Sort order for messages by creation time. 'asc' for oldest first, 'desc' for newest first 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._get( "/v1/messages/", options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout, query=await async_maybe_transform( { "after": after, "before": before, "conversation_id": conversation_id, "include_return_message_types": include_return_message_types, "limit": limit, "order": order, }, message_list_params.MessageListParams, ), ), cast_to=MessageListResponse, ) async def search( self, *, query: str, agent_id: Optional[str] | Omit = omit, conversation_id: Optional[str] | Omit = omit, end_date: Union[str, datetime, None] | Omit = omit, limit: int | Omit = omit, search_mode: Literal["vector", "fts", "hybrid"] | Omit = omit, start_date: Union[str, datetime, None] | 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, ) -> MessageSearchResponse: """Search messages across the organization with optional agent filtering. Returns messages with FTS/vector ranks and total RRF score. This is a cloud-only feature. Args: query: Text query for full-text search agent_id: Filter messages by agent ID conversation_id: Filter messages by conversation ID end_date: Filter messages created on or before this date limit: Maximum number of results to return search_mode: Search mode to use start_date: Filter messages created after this date 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( "/v1/messages/search", body=await async_maybe_transform( { "query": query, "agent_id": agent_id, "conversation_id": conversation_id, "end_date": end_date, "limit": limit, "search_mode": search_mode, "start_date": start_date, }, message_search_params.MessageSearchParams, ), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), cast_to=MessageSearchResponse, ) class MessagesResourceWithRawResponse: def __init__(self, messages: MessagesResource) -> None: self._messages = messages self.retrieve = to_raw_response_wrapper( messages.retrieve, ) self.list = to_raw_response_wrapper( messages.list, ) self.search = to_raw_response_wrapper( messages.search, ) class AsyncMessagesResourceWithRawResponse: def __init__(self, messages: AsyncMessagesResource) -> None: self._messages = messages self.retrieve = async_to_raw_response_wrapper( messages.retrieve, ) self.list = async_to_raw_response_wrapper( messages.list, ) self.search = async_to_raw_response_wrapper( messages.search, ) class MessagesResourceWithStreamingResponse: def __init__(self, messages: MessagesResource) -> None: self._messages = messages self.retrieve = to_streamed_response_wrapper( messages.retrieve, ) self.list = to_streamed_response_wrapper( messages.list, ) self.search = to_streamed_response_wrapper( messages.search, ) class AsyncMessagesResourceWithStreamingResponse: def __init__(self, messages: AsyncMessagesResource) -> None: self._messages = messages self.retrieve = async_to_streamed_response_wrapper( messages.retrieve, ) self.list = async_to_streamed_response_wrapper( messages.list, ) self.search = async_to_streamed_response_wrapper( messages.search, )