diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index f5c7357c..c293bc58 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -726,6 +726,7 @@ async def create_channel_type( blocklists: Optional[List[BlockListOptions]] = None, commands: Optional[List[str]] = None, permissions: Optional[List[PolicyRequest]] = None, + chat_preferences: Optional[ChatPreferences] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = CreateChannelTypeRequest( @@ -760,6 +761,7 @@ async def create_channel_type( blocklists=blocklists, commands=commands, permissions=permissions, + chat_preferences=chat_preferences, grants=grants, ).to_dict() return await self.post( @@ -825,6 +827,7 @@ async def update_channel_type( commands: Optional[List[str]] = None, permissions: Optional[List[PolicyRequest]] = None, automod_thresholds: Optional[Thresholds] = None, + chat_preferences: Optional[ChatPreferences] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[UpdateChannelTypeResponse]: path_params = { @@ -864,6 +867,7 @@ async def update_channel_type( commands=commands, permissions=permissions, automod_thresholds=automod_thresholds, + chat_preferences=chat_preferences, grants=grants, ).to_dict() return await self.put( @@ -1486,6 +1490,45 @@ async def query_reminders( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json ) + @telemetry.operation_name("getstream.api.chat.get_retention_policy") + async def get_retention_policy(self) -> StreamResponse[GetRetentionPolicyResponse]: + return await self.get( + "/api/v2/chat/retention_policy", GetRetentionPolicyResponse + ) + + @telemetry.operation_name("getstream.api.chat.set_retention_policy") + async def set_retention_policy( + self, max_age_hours: Optional[int] = None, policy: Optional[str] = None + ) -> StreamResponse[SetRetentionPolicyResponse]: + json = SetRetentionPolicyRequest( + max_age_hours=max_age_hours, policy=policy + ).to_dict() + return await self.post( + "/api/v2/chat/retention_policy", SetRetentionPolicyResponse, json=json + ) + + @telemetry.operation_name("getstream.api.chat.delete_retention_policy") + async def delete_retention_policy( + self, policy: Optional[str] = None + ) -> StreamResponse[DeleteRetentionPolicyResponse]: + json = DeleteRetentionPolicyRequest(policy=policy).to_dict() + return await self.post( + "/api/v2/chat/retention_policy/delete", + DeleteRetentionPolicyResponse, + json=json, + ) + + @telemetry.operation_name("getstream.api.chat.get_retention_policy_runs") + async def get_retention_policy_runs( + self, limit: Optional[int] = None, offset: Optional[int] = None + ) -> StreamResponse[GetRetentionPolicyRunsResponse]: + query_params = build_query_param(**{"limit": limit, "offset": offset}) + return await self.get( + "/api/v2/chat/retention_policy/runs", + GetRetentionPolicyRunsResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.search") async def search( self, payload: Optional[SearchPayload] = None diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 8165c7db..e26dfbf0 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -722,6 +722,7 @@ def create_channel_type( blocklists: Optional[List[BlockListOptions]] = None, commands: Optional[List[str]] = None, permissions: Optional[List[PolicyRequest]] = None, + chat_preferences: Optional[ChatPreferences] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = CreateChannelTypeRequest( @@ -756,6 +757,7 @@ def create_channel_type( blocklists=blocklists, commands=commands, permissions=permissions, + chat_preferences=chat_preferences, grants=grants, ).to_dict() return self.post( @@ -819,6 +821,7 @@ def update_channel_type( commands: Optional[List[str]] = None, permissions: Optional[List[PolicyRequest]] = None, automod_thresholds: Optional[Thresholds] = None, + chat_preferences: Optional[ChatPreferences] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[UpdateChannelTypeResponse]: path_params = { @@ -858,6 +861,7 @@ def update_channel_type( commands=commands, permissions=permissions, automod_thresholds=automod_thresholds, + chat_preferences=chat_preferences, grants=grants, ).to_dict() return self.put( @@ -1476,6 +1480,43 @@ def query_reminders( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json ) + @telemetry.operation_name("getstream.api.chat.get_retention_policy") + def get_retention_policy(self) -> StreamResponse[GetRetentionPolicyResponse]: + return self.get("/api/v2/chat/retention_policy", GetRetentionPolicyResponse) + + @telemetry.operation_name("getstream.api.chat.set_retention_policy") + def set_retention_policy( + self, max_age_hours: Optional[int] = None, policy: Optional[str] = None + ) -> StreamResponse[SetRetentionPolicyResponse]: + json = SetRetentionPolicyRequest( + max_age_hours=max_age_hours, policy=policy + ).to_dict() + return self.post( + "/api/v2/chat/retention_policy", SetRetentionPolicyResponse, json=json + ) + + @telemetry.operation_name("getstream.api.chat.delete_retention_policy") + def delete_retention_policy( + self, policy: Optional[str] = None + ) -> StreamResponse[DeleteRetentionPolicyResponse]: + json = DeleteRetentionPolicyRequest(policy=policy).to_dict() + return self.post( + "/api/v2/chat/retention_policy/delete", + DeleteRetentionPolicyResponse, + json=json, + ) + + @telemetry.operation_name("getstream.api.chat.get_retention_policy_runs") + def get_retention_policy_runs( + self, limit: Optional[int] = None, offset: Optional[int] = None + ) -> StreamResponse[GetRetentionPolicyRunsResponse]: + query_params = build_query_param(**{"limit": limit, "offset": offset}) + return self.get( + "/api/v2/chat/retention_policy/runs", + GetRetentionPolicyRunsResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.search") def search( self, payload: Optional[SearchPayload] = None diff --git a/getstream/common/async_rest_client.py b/getstream/common/async_rest_client.py index 36e7a45e..ef6a51d9 100644 --- a/getstream/common/async_rest_client.py +++ b/getstream/common/async_rest_client.py @@ -76,6 +76,7 @@ async def update_app( image_moderation_labels: Optional[List[str]] = None, user_search_disallowed_roles: Optional[List[str]] = None, webhook_events: Optional[List[str]] = None, + activity_metrics_config: Optional[Dict[str, int]] = None, apn_config: Optional[APNConfig] = None, async_moderation_config: Optional[AsyncModerationConfiguration] = None, datadog_info: Optional[DataDogInfo] = None, @@ -129,6 +130,7 @@ async def update_app( image_moderation_labels=image_moderation_labels, user_search_disallowed_roles=user_search_disallowed_roles, webhook_events=webhook_events, + activity_metrics_config=activity_metrics_config, apn_config=apn_config, async_moderation_config=async_moderation_config, datadog_info=datadog_info, diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index cf159993..36e895e9 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -76,6 +76,7 @@ def update_app( image_moderation_labels: Optional[List[str]] = None, user_search_disallowed_roles: Optional[List[str]] = None, webhook_events: Optional[List[str]] = None, + activity_metrics_config: Optional[Dict[str, int]] = None, apn_config: Optional[APNConfig] = None, async_moderation_config: Optional[AsyncModerationConfiguration] = None, datadog_info: Optional[DataDogInfo] = None, @@ -129,6 +130,7 @@ def update_app( image_moderation_labels=image_moderation_labels, user_search_disallowed_roles=user_search_disallowed_roles, webhook_events=webhook_events, + activity_metrics_config=activity_metrics_config, apn_config=apn_config, async_moderation_config=async_moderation_config, datadog_info=datadog_info, diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index 74cfb344..824dfaa0 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -686,6 +686,30 @@ def upsert_collections( "/api/v2/feeds/collections", UpsertCollectionsResponse, json=json ) + @telemetry.operation_name("getstream.api.feeds.query_collections") + def query_collections( + self, + limit: Optional[int] = None, + next: Optional[str] = None, + prev: Optional[str] = None, + user_id: Optional[str] = None, + sort: Optional[List[SortParamRequest]] = None, + filter: Optional[Dict[str, object]] = None, + user: Optional[UserRequest] = None, + ) -> StreamResponse[QueryCollectionsResponse]: + json = QueryCollectionsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() + return self.post( + "/api/v2/feeds/collections/query", QueryCollectionsResponse, json=json + ) + @telemetry.operation_name("getstream.api.feeds.get_comments") def get_comments( self, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 732d49be..4e62da8b 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -25,6 +25,14 @@ class AIImageConfig(DataClassJsonMixin): ) +@dataclass +class AIImageLabelDefinition(DataClassJsonMixin): + description: str = dc_field(metadata=dc_config(field_name="description")) + group: str = dc_field(metadata=dc_config(field_name="group")) + key: str = dc_field(metadata=dc_config(field_name="key")) + label: str = dc_field(metadata=dc_config(field_name="label")) + + @dataclass class AITextConfig(DataClassJsonMixin): _async: Optional[bool] = dc_field( @@ -176,7 +184,7 @@ class AWSRekognitionRule(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) label: str = dc_field(metadata=dc_config(field_name="label")) min_confidence: float = dc_field(metadata=dc_config(field_name="min_confidence")) - subclassifications: "Optional[Dict[str, bool]]" = dc_field( + subclassifications: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="subclassifications") ) @@ -1538,6 +1546,9 @@ class AppResponseFields(DataClassJsonMixin): image_moderation_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_moderation_labels") ) + activity_metrics_config: "Optional[Dict[str, int]]" = dc_field( + default=None, metadata=dc_config(field_name="activity_metrics_config") + ) datadog_info: "Optional[DataDogInfo]" = dc_field( default=None, metadata=dc_config(field_name="datadog_info") ) @@ -1809,7 +1820,8 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.channels.error", metadata=dc_config(field_name="type") + default="export.bulk_image_moderation.error", + metadata=dc_config(field_name="type"), ) received_at: Optional[datetime] = dc_field( default=None, @@ -2173,6 +2185,9 @@ class BanActionRequestPayload(DataClassJsonMixin): channel_ban_only: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="channel_ban_only") ) + channel_cid: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_cid") + ) delete_messages: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="delete_messages") ) @@ -2953,6 +2968,9 @@ class CallEndedEvent(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) + members: "Optional[List[MemberResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="members") + ) user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -4911,6 +4929,9 @@ class ChannelConfig(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -4990,6 +5011,9 @@ class ChannelConfigWithInfo(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) @@ -5560,6 +5584,9 @@ class ChannelPushPreferencesResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + chat_preferences: "Optional[ChatPreferencesResponse]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -5920,6 +5947,9 @@ class ChannelTypeConfig(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -6093,6 +6123,84 @@ class ChatActivityStatsResponse(DataClassJsonMixin): ) +@dataclass +class ChatPreferences(DataClassJsonMixin): + channel_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_mentions") + ) + default_preference: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_preference") + ) + direct_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="direct_mentions") + ) + distinct_channel_messages: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="distinct_channel_messages") + ) + group_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="group_mentions") + ) + here_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="here_mentions") + ) + role_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="role_mentions") + ) + thread_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="thread_replies") + ) + + +@dataclass +class ChatPreferencesInput(DataClassJsonMixin): + channel_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_mentions") + ) + default_preference: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_preference") + ) + direct_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="direct_mentions") + ) + group_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="group_mentions") + ) + here_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="here_mentions") + ) + role_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="role_mentions") + ) + thread_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="thread_replies") + ) + + +@dataclass +class ChatPreferencesResponse(DataClassJsonMixin): + channel_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_mentions") + ) + default_preference: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="default_preference") + ) + direct_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="direct_mentions") + ) + group_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="group_mentions") + ) + here_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="here_mentions") + ) + role_mentions: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="role_mentions") + ) + thread_replies: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="thread_replies") + ) + + @dataclass class CheckExternalStorageResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -6205,6 +6313,9 @@ class CheckResponse(DataClassJsonMixin): item: "Optional[ReviewQueueItemResponse]" = dc_field( default=None, metadata=dc_config(field_name="item") ) + triggered_rule: "Optional[TriggeredRuleResponse]" = dc_field( + default=None, metadata=dc_config(field_name="triggered_rule") + ) @dataclass @@ -6713,6 +6824,9 @@ class ConfigOverridesRequest(DataClassJsonMixin): max_message_length: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="max_message_length") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) quotes: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="quotes") ) @@ -6740,6 +6854,9 @@ class ConfigOverridesRequest(DataClassJsonMixin): commands: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="commands") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) @@ -6769,6 +6886,9 @@ class ConfigResponse(DataClassJsonMixin): supported_video_call_harm_types: List[str] = dc_field( metadata=dc_config(field_name="supported_video_call_harm_types") ) + ai_image_label_definitions: "Optional[List[AIImageLabelDefinition]]" = dc_field( + default=None, metadata=dc_config(field_name="ai_image_label_definitions") + ) ai_image_config: "Optional[AIImageConfig]" = dc_field( default=None, metadata=dc_config(field_name="ai_image_config") ) @@ -6998,6 +7118,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): permissions: "Optional[List[PolicyRequest]]" = dc_field( default=None, metadata=dc_config(field_name="permissions") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) @@ -7085,6 +7208,9 @@ class CreateChannelTypeResponse(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -7436,6 +7562,12 @@ class CreateRoleResponse(DataClassJsonMixin): class CreateSIPTrunkRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) + password: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="password") + ) + allowed_ips: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="allowed_ips") + ) @dataclass @@ -7970,6 +8102,18 @@ class DeleteReminderResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) +@dataclass +class DeleteRetentionPolicyRequest(DataClassJsonMixin): + policy: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="policy") + ) + + +@dataclass +class DeleteRetentionPolicyResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + + @dataclass class DeleteSIPInboundRoutingRuleResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -9630,6 +9774,9 @@ class FilterConfigResponse(DataClassJsonMixin): ai_text_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="ai_text_labels") ) + config_keys: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="config_keys") + ) @dataclass @@ -10461,6 +10608,9 @@ class GetChannelTypeResponse(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -10939,6 +11089,20 @@ class GetRepliesResponse(DataClassJsonMixin): ) +@dataclass +class GetRetentionPolicyResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + policies: "List[RetentionPolicy]" = dc_field( + metadata=dc_config(field_name="policies") + ) + + +@dataclass +class GetRetentionPolicyRunsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + runs: "List[RetentionCleanupRun]" = dc_field(metadata=dc_config(field_name="runs")) + + @dataclass class GetReviewQueueItemResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -12845,6 +13009,9 @@ class MessageRequest(DataClassJsonMixin): attachments: "Optional[List[Attachment]]" = dc_field( default=None, metadata=dc_config(field_name="attachments") ) + mentioned_group_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_group_ids") + ) mentioned_roles: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="mentioned_roles") ) @@ -12977,6 +13144,9 @@ class MessageResponse(DataClassJsonMixin): show_in_channel: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="show_in_channel") ) + mentioned_group_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_group_ids") + ) mentioned_roles: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="mentioned_roles") ) @@ -13273,6 +13443,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): show_in_channel: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="show_in_channel") ) + mentioned_group_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_group_ids") + ) mentioned_roles: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="mentioned_roles") ) @@ -13521,6 +13694,9 @@ class ModerationDashboardPreferences(DataClassJsonMixin): allowed_moderation_action_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_moderation_action_reasons") ) + keyframe_classifications_map: "Optional[Dict[str, Dict[str, bool]]]" = dc_field( + default=None, metadata=dc_config(field_name="keyframe_classifications_map") + ) overview_dashboard: "Optional[OverviewDashboardConfig]" = dc_field( default=None, metadata=dc_config(field_name="overview_dashboard") ) @@ -14853,6 +15029,11 @@ class Policy(DataClassJsonMixin): roles: List[str] = dc_field(metadata=dc_config(field_name="roles")) +@dataclass +class PolicyConfig(DataClassJsonMixin): + max_age_hours: int = dc_field(metadata=dc_config(field_name="max_age_hours")) + + @dataclass class PolicyRequest(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -15199,6 +15380,9 @@ class PushPreferenceInput(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) + chat_preferences: "Optional[ChatPreferencesInput]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) feeds_preferences: "Optional[FeedsPreferences]" = dc_field( default=None, metadata=dc_config(field_name="feeds_preferences") ) @@ -15224,6 +15408,9 @@ class PushPreferencesResponse(DataClassJsonMixin): feeds_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="feeds_level") ) + chat_preferences: "Optional[ChatPreferencesResponse]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) feeds_preferences: "Optional[FeedsPreferencesResponse]" = dc_field( default=None, metadata=dc_config(field_name="feeds_preferences") ) @@ -16106,6 +16293,37 @@ class QueryChannelsResponse(DataClassJsonMixin): ) +@dataclass +class QueryCollectionsRequest(DataClassJsonMixin): + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + sort: "Optional[List[SortParamRequest]]" = dc_field( + default=None, metadata=dc_config(field_name="sort") + ) + filter: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="filter") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class QueryCollectionsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + collections: "List[CollectionResponse]" = dc_field( + metadata=dc_config(field_name="collections") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + + @dataclass class QueryCommentReactionsRequest(DataClassJsonMixin): limit: Optional[int] = dc_field( @@ -16567,6 +16785,9 @@ class QueryModerationRulesRequest(DataClassJsonMixin): @dataclass class QueryModerationRulesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + ai_image_label_definitions: "List[AIImageLabelDefinition]" = dc_field( + metadata=dc_config(field_name="ai_image_label_definitions") + ) closed_caption_labels: List[str] = dc_field( metadata=dc_config(field_name="closed_caption_labels") ) @@ -16576,6 +16797,9 @@ class QueryModerationRulesResponse(DataClassJsonMixin): rules: "List[ModerationRuleV2Response]" = dc_field( metadata=dc_config(field_name="rules") ) + ai_image_subclassifications: "Dict[str, List[str]]" = dc_field( + metadata=dc_config(field_name="ai_image_subclassifications") + ) default_llm_labels: "Dict[str, str]" = dc_field( metadata=dc_config(field_name="default_llm_labels") ) @@ -17386,8 +17610,6 @@ class ReadCollectionsResponse(DataClassJsonMixin): collections: "List[CollectionResponse]" = dc_field( metadata=dc_config(field_name="collections") ) - next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) - prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) @dataclass @@ -17733,17 +17955,49 @@ class ResolutionMetricsTimeSeries(DataClassJsonMixin): @dataclass -class ResolveSipInboundRequest(DataClassJsonMixin): +class ResolveSipAuthRequest(DataClassJsonMixin): sip_caller_number: str = dc_field( metadata=dc_config(field_name="sip_caller_number") ) sip_trunk_number: str = dc_field(metadata=dc_config(field_name="sip_trunk_number")) - challenge: "SIPChallengeRequest" = dc_field( - metadata=dc_config(field_name="challenge") + from_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="from_host") + ) + source_ip: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="source_ip") + ) + + +@dataclass +class ResolveSipAuthResponse(DataClassJsonMixin): + auth_result: str = dc_field(metadata=dc_config(field_name="auth_result")) + duration: str = dc_field(metadata=dc_config(field_name="duration")) + password: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="password") ) + trunk_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="trunk_id") + ) + username: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="username") + ) + + +@dataclass +class ResolveSipInboundRequest(DataClassJsonMixin): + sip_caller_number: str = dc_field( + metadata=dc_config(field_name="sip_caller_number") + ) + sip_trunk_number: str = dc_field(metadata=dc_config(field_name="sip_trunk_number")) routing_number: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="routing_number") ) + trunk_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="trunk_id") + ) + challenge: "Optional[SIPChallengeRequest]" = dc_field( + default=None, metadata=dc_config(field_name="challenge") + ) sip_headers: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="sip_headers") ) @@ -17809,6 +18063,69 @@ class RestoreUsersRequest(DataClassJsonMixin): user_ids: List[str] = dc_field(metadata=dc_config(field_name="user_ids")) +@dataclass +class RetentionCleanupRun(DataClassJsonMixin): + app_pk: int = dc_field(metadata=dc_config(field_name="app_pk")) + date: datetime = dc_field( + metadata=dc_config( + field_name="date", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + policy: str = dc_field(metadata=dc_config(field_name="policy")) + started_at: datetime = dc_field( + metadata=dc_config( + field_name="started_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + status: str = dc_field(metadata=dc_config(field_name="status")) + stats: "RunStats" = dc_field(metadata=dc_config(field_name="stats")) + cursor_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="cursor_id") + ) + cursor_ts: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="cursor_ts", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + error: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="error") + ) + finished_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="finished_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + +@dataclass +class RetentionPolicy(DataClassJsonMixin): + app_pk: int = dc_field(metadata=dc_config(field_name="app_pk")) + enabled_at: datetime = dc_field( + metadata=dc_config( + field_name="enabled_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + policy: str = dc_field(metadata=dc_config(field_name="policy")) + config: "PolicyConfig" = dc_field(metadata=dc_config(field_name="config")) + + @dataclass class ReviewQueueItemNewEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -18062,6 +18379,9 @@ class Role(DataClassJsonMixin): @dataclass class RuleBuilderAction(DataClassJsonMixin): + skip_inbox: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_inbox") + ) type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) ban_options: "Optional[BanOptions]" = dc_field( default=None, metadata=dc_config(field_name="ban_options") @@ -18184,6 +18504,16 @@ class RuleBuilderRule(DataClassJsonMixin): ) +@dataclass +class RunStats(DataClassJsonMixin): + channels_deleted: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channels_deleted") + ) + messages_deleted: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="messages_deleted") + ) + + @dataclass class S3Request(DataClassJsonMixin): s3_region: str = dc_field(metadata=dc_config(field_name="s3_region")) @@ -18476,6 +18806,7 @@ class SIPTrunkResponse(DataClassJsonMixin): ) uri: str = dc_field(metadata=dc_config(field_name="uri")) username: str = dc_field(metadata=dc_config(field_name="username")) + allowed_ips: List[str] = dc_field(metadata=dc_config(field_name="allowed_ips")) numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) @@ -18683,6 +19014,9 @@ class SearchResultMessage(DataClassJsonMixin): show_in_channel: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="show_in_channel") ) + mentioned_group_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_group_ids") + ) mentioned_roles: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="mentioned_roles") ) @@ -19021,6 +19355,22 @@ class SessionWarningResponse(DataClassJsonMixin): ) +@dataclass +class SetRetentionPolicyRequest(DataClassJsonMixin): + max_age_hours: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="max_age_hours") + ) + policy: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="policy") + ) + + +@dataclass +class SetRetentionPolicyResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + policy: "RetentionPolicy" = dc_field(metadata=dc_config(field_name="policy")) + + @dataclass class ShadowBlockActionRequestPayload(DataClassJsonMixin): reason: Optional[str] = dc_field( @@ -20174,6 +20524,21 @@ class TranslationSettings(DataClassJsonMixin): languages: List[str] = dc_field(metadata=dc_config(field_name="languages")) +@dataclass +class TriggeredRuleResponse(DataClassJsonMixin): + rule_id: str = dc_field(metadata=dc_config(field_name="rule_id")) + actions: List[str] = dc_field(metadata=dc_config(field_name="actions")) + rule_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="rule_name") + ) + violation_number: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="violation_number") + ) + call_options: "Optional[CallActionOptions]" = dc_field( + default=None, metadata=dc_config(field_name="call_options") + ) + + @dataclass class TruncateChannelRequest(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( @@ -20730,6 +21095,9 @@ class UpdateAppRequest(DataClassJsonMixin): webhook_events: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="webhook_events") ) + activity_metrics_config: "Optional[Dict[str, int]]" = dc_field( + default=None, metadata=dc_config(field_name="activity_metrics_config") + ) apn_config: "Optional[APNConfig]" = dc_field( default=None, metadata=dc_config(field_name="apn_config") ) @@ -21136,6 +21504,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) @@ -21223,6 +21594,9 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): automod_thresholds: "Optional[Thresholds]" = dc_field( default=None, metadata=dc_config(field_name="automod_thresholds") ) + chat_preferences: "Optional[ChatPreferences]" = dc_field( + default=None, metadata=dc_config(field_name="chat_preferences") + ) @dataclass @@ -21707,13 +22081,13 @@ class UpdateReminderResponse(DataClassJsonMixin): @dataclass class UpdateSIPInboundRoutingRuleRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) - called_numbers: List[str] = dc_field( - metadata=dc_config(field_name="called_numbers") - ) trunk_ids: List[str] = dc_field(metadata=dc_config(field_name="trunk_ids")) caller_configs: "SIPCallerConfigsRequest" = dc_field( metadata=dc_config(field_name="caller_configs") ) + called_numbers: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="called_numbers") + ) caller_numbers: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="caller_numbers") ) @@ -21743,6 +22117,12 @@ class UpdateSIPInboundRoutingRuleResponse(DataClassJsonMixin): class UpdateSIPTrunkRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) numbers: List[str] = dc_field(metadata=dc_config(field_name="numbers")) + password: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="password") + ) + allowed_ips: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="allowed_ips") + ) @dataclass diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 4766e143..8ad5e3cc 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -1189,6 +1189,24 @@ async def update_call_type( async def get_edges(self) -> StreamResponse[GetEdgesResponse]: return await self.get("/api/v2/video/edges", GetEdgesResponse) + @telemetry.operation_name("getstream.api.video.resolve_sip_auth") + async def resolve_sip_auth( + self, + sip_caller_number: str, + sip_trunk_number: str, + from_host: Optional[str] = None, + source_ip: Optional[str] = None, + ) -> StreamResponse[ResolveSipAuthResponse]: + json = ResolveSipAuthRequest( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + from_host=from_host, + source_ip=source_ip, + ).to_dict() + return await self.post( + "/api/v2/video/sip/auth", ResolveSipAuthResponse, json=json + ) + @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") async def list_sip_inbound_routing_rule( self, @@ -1245,9 +1263,9 @@ async def update_sip_inbound_routing_rule( self, id: str, name: str, - called_numbers: List[str], trunk_ids: List[str], caller_configs: SIPCallerConfigsRequest, + called_numbers: Optional[List[str]] = None, caller_numbers: Optional[List[str]] = None, call_configs: Optional[SIPCallConfigsRequest] = None, direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, @@ -1259,9 +1277,9 @@ async def update_sip_inbound_routing_rule( } json = UpdateSIPInboundRoutingRuleRequest( name=name, - called_numbers=called_numbers, trunk_ids=trunk_ids, caller_configs=caller_configs, + called_numbers=called_numbers, caller_numbers=caller_numbers, call_configs=call_configs, direct_routing_configs=direct_routing_configs, @@ -1281,9 +1299,15 @@ async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: @telemetry.operation_name("getstream.api.video.create_sip_trunk") async def create_sip_trunk( - self, name: str, numbers: List[str] + self, + name: str, + numbers: List[str], + password: Optional[str] = None, + allowed_ips: Optional[List[str]] = None, ) -> StreamResponse[CreateSIPTrunkResponse]: - json = CreateSIPTrunkRequest(name=name, numbers=numbers).to_dict() + json = CreateSIPTrunkRequest( + name=name, numbers=numbers, password=password, allowed_ips=allowed_ips + ).to_dict() return await self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1301,12 +1325,19 @@ async def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkRespon @telemetry.operation_name("getstream.api.video.update_sip_trunk") async def update_sip_trunk( - self, id: str, name: str, numbers: List[str] + self, + id: str, + name: str, + numbers: List[str], + password: Optional[str] = None, + allowed_ips: Optional[List[str]] = None, ) -> StreamResponse[UpdateSIPTrunkResponse]: path_params = { "id": id, } - json = UpdateSIPTrunkRequest(name=name, numbers=numbers).to_dict() + json = UpdateSIPTrunkRequest( + name=name, numbers=numbers, password=password, allowed_ips=allowed_ips + ).to_dict() return await self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1319,15 +1350,17 @@ async def resolve_sip_inbound( self, sip_caller_number: str, sip_trunk_number: str, - challenge: SIPChallengeRequest, routing_number: Optional[str] = None, + trunk_id: Optional[str] = None, + challenge: Optional[SIPChallengeRequest] = None, sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: json = ResolveSipInboundRequest( sip_caller_number=sip_caller_number, sip_trunk_number=sip_trunk_number, - challenge=challenge, routing_number=routing_number, + trunk_id=trunk_id, + challenge=challenge, sip_headers=sip_headers, ).to_dict() return await self.post( diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 279c3c6d..bcbd5453 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -1183,6 +1183,22 @@ def update_call_type( def get_edges(self) -> StreamResponse[GetEdgesResponse]: return self.get("/api/v2/video/edges", GetEdgesResponse) + @telemetry.operation_name("getstream.api.video.resolve_sip_auth") + def resolve_sip_auth( + self, + sip_caller_number: str, + sip_trunk_number: str, + from_host: Optional[str] = None, + source_ip: Optional[str] = None, + ) -> StreamResponse[ResolveSipAuthResponse]: + json = ResolveSipAuthRequest( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + from_host=from_host, + source_ip=source_ip, + ).to_dict() + return self.post("/api/v2/video/sip/auth", ResolveSipAuthResponse, json=json) + @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") def list_sip_inbound_routing_rule( self, @@ -1239,9 +1255,9 @@ def update_sip_inbound_routing_rule( self, id: str, name: str, - called_numbers: List[str], trunk_ids: List[str], caller_configs: SIPCallerConfigsRequest, + called_numbers: Optional[List[str]] = None, caller_numbers: Optional[List[str]] = None, call_configs: Optional[SIPCallConfigsRequest] = None, direct_routing_configs: Optional[SIPDirectRoutingRuleCallConfigsRequest] = None, @@ -1253,9 +1269,9 @@ def update_sip_inbound_routing_rule( } json = UpdateSIPInboundRoutingRuleRequest( name=name, - called_numbers=called_numbers, trunk_ids=trunk_ids, caller_configs=caller_configs, + called_numbers=called_numbers, caller_numbers=caller_numbers, call_configs=call_configs, direct_routing_configs=direct_routing_configs, @@ -1275,9 +1291,15 @@ def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: @telemetry.operation_name("getstream.api.video.create_sip_trunk") def create_sip_trunk( - self, name: str, numbers: List[str] + self, + name: str, + numbers: List[str], + password: Optional[str] = None, + allowed_ips: Optional[List[str]] = None, ) -> StreamResponse[CreateSIPTrunkResponse]: - json = CreateSIPTrunkRequest(name=name, numbers=numbers).to_dict() + json = CreateSIPTrunkRequest( + name=name, numbers=numbers, password=password, allowed_ips=allowed_ips + ).to_dict() return self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1295,12 +1317,19 @@ def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: @telemetry.operation_name("getstream.api.video.update_sip_trunk") def update_sip_trunk( - self, id: str, name: str, numbers: List[str] + self, + id: str, + name: str, + numbers: List[str], + password: Optional[str] = None, + allowed_ips: Optional[List[str]] = None, ) -> StreamResponse[UpdateSIPTrunkResponse]: path_params = { "id": id, } - json = UpdateSIPTrunkRequest(name=name, numbers=numbers).to_dict() + json = UpdateSIPTrunkRequest( + name=name, numbers=numbers, password=password, allowed_ips=allowed_ips + ).to_dict() return self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1313,15 +1342,17 @@ def resolve_sip_inbound( self, sip_caller_number: str, sip_trunk_number: str, - challenge: SIPChallengeRequest, routing_number: Optional[str] = None, + trunk_id: Optional[str] = None, + challenge: Optional[SIPChallengeRequest] = None, sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: json = ResolveSipInboundRequest( sip_caller_number=sip_caller_number, sip_trunk_number=sip_trunk_number, - challenge=challenge, routing_number=routing_number, + trunk_id=trunk_id, + challenge=challenge, sip_headers=sip_headers, ).to_dict() return self.post(