slack-sdk 3.36.0.dev4__tar.gz → 3.36.0.dev6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {slack_sdk-3.36.0.dev4/slack_sdk.egg-info → slack_sdk-3.36.0.dev6}/PKG-INFO +1 -1
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/version.py +1 -1
- slack_sdk-3.36.0.dev6/slack_sdk/web/async_chat_stream.py +212 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/async_client.py +66 -5
- slack_sdk-3.36.0.dev6/slack_sdk/web/chat_stream.py +202 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/client.py +66 -5
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/legacy_client.py +2 -5
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6/slack_sdk.egg-info}/PKG-INFO +1 -1
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk.egg-info/SOURCES.txt +1 -0
- slack_sdk-3.36.0.dev4/slack_sdk/web/chat_stream.py +0 -160
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/LICENSE +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/MANIFEST.in +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/README.md +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/pyproject.toml +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/requirements/optional.txt +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/setup.cfg +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/deprecation.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/errors.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/py.typed +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/rtm/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/rtm/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/signature/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/signature/verifier.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/version.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/async_base_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/async_internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/async_slack_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/base_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/actions.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/attachments.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/blocks.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/dialog_elements.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/dialogs.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/elements.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/interactions.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/messages.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/objects.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/classes/views.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/deprecation.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/web/slack_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/webhook/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/webhook/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/webhook/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/webhook/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack/webhook/webhook_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/aiohttp_version_checker.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/logs.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/audit_logs/v1/response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/errors/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/async_handler.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/builtin_async_handlers.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/builtin_handlers.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/builtin_interval_calculators.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/handler.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/interval_calculator.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/jitter.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/request.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/http_retry/state.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/attachments/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/basic_objects.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/blocks/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/blocks/basic_components.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/blocks/block_elements.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/blocks/blocks.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/dialoags.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/dialogs/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/messages/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/messages/message.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/metadata/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/models/views/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/authorize_url_generator/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/amazon_s3/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/async_cacheable_installation_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/async_installation_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/cacheable_installation_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/file/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/installation_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/internals.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/models/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/models/bot.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/models/installation.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/sqlalchemy/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/installation_store/sqlite3/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/redirect_uri_page_renderer/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/amazon_s3/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/async_state_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/file/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/sqlalchemy/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/sqlite3/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_store/state_store.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/state_utils/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/token_rotation/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/token_rotation/async_rotator.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/oauth/token_rotation/rotator.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/proxy_env_variable_loader.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/py.typed +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/rtm/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/rtm/v2/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/rtm_v2/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/default_arg.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/group.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/types.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/scim/v1/user.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/signature/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/aiohttp/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/async_listeners.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/builtin/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/builtin/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/builtin/connection.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/builtin/frame_header.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/builtin/internals.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/interval_runner.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/listeners.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/logger/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/logger/messages.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/request.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/websocket_client/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/socket_mode/websockets/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/async_base_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/async_internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/async_slack_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/base_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/deprecation.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/file_upload_v2_result.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/legacy_base_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/legacy_slack_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/web/slack_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/webhook/__init__.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/webhook/async_client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/webhook/client.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/webhook/internal_utils.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk/webhook/webhook_response.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk.egg-info/dependency_links.txt +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk.egg-info/requires.txt +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/slack_sdk.egg-info/top_level.txt +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/tests/test_aiohttp_version_checker.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/tests/test_asyncio_event_loops.py +0 -0
- {slack_sdk-3.36.0.dev4 → slack_sdk-3.36.0.dev6}/tests/test_proxy_env_variable_loader.py +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
2
|
+
#
|
|
3
|
+
# *** DO NOT EDIT THIS FILE ***
|
|
4
|
+
#
|
|
5
|
+
# 1) Modify slack_sdk/web/client.py
|
|
6
|
+
# 2) Run `python scripts/codegen.py`
|
|
7
|
+
# 3) Run `black slack_sdk/`
|
|
8
|
+
#
|
|
9
|
+
# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import logging
|
|
13
|
+
from typing import TYPE_CHECKING, Dict, Optional, Sequence, Union
|
|
14
|
+
|
|
15
|
+
import slack_sdk.errors as e
|
|
16
|
+
from slack_sdk.models.blocks.blocks import Block
|
|
17
|
+
from slack_sdk.models.metadata import Metadata
|
|
18
|
+
from slack_sdk.web.async_slack_response import AsyncSlackResponse
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from slack_sdk.web.async_client import AsyncWebClient
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AsyncChatStream:
|
|
25
|
+
"""A helper class for streaming markdown text into a conversation using the chat streaming APIs.
|
|
26
|
+
|
|
27
|
+
This class provides a convenient interface for the chat.startStream, chat.appendStream, and chat.stopStream API
|
|
28
|
+
methods, with automatic buffering and state management.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
client: "AsyncWebClient",
|
|
34
|
+
*,
|
|
35
|
+
channel: str,
|
|
36
|
+
logger: logging.Logger,
|
|
37
|
+
thread_ts: str,
|
|
38
|
+
buffer_size: int,
|
|
39
|
+
recipient_team_id: Optional[str] = None,
|
|
40
|
+
recipient_user_id: Optional[str] = None,
|
|
41
|
+
**kwargs,
|
|
42
|
+
):
|
|
43
|
+
"""Initialize a new ChatStream instance.
|
|
44
|
+
|
|
45
|
+
The __init__ method creates a unique ChatStream instance that keeps track of one chat stream.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
client: The WebClient instance to use for API calls.
|
|
49
|
+
channel: An encoded ID that represents a channel, private group, or DM.
|
|
50
|
+
logger: A logging channel for outputs.
|
|
51
|
+
thread_ts: Provide another message's ts value to reply to. Streamed messages should always be replies to a user
|
|
52
|
+
request.
|
|
53
|
+
recipient_team_id: The encoded ID of the team the user receiving the streaming text belongs to. Required when
|
|
54
|
+
streaming to channels.
|
|
55
|
+
recipient_user_id: The encoded ID of the user to receive the streaming text. Required when streaming to channels.
|
|
56
|
+
buffer_size: The length of markdown_text to buffer in-memory before calling a method. Increasing this value
|
|
57
|
+
decreases the number of method calls made for the same amount of text, which is useful to avoid rate limits.
|
|
58
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
59
|
+
"""
|
|
60
|
+
self._client = client
|
|
61
|
+
self._logger = logger
|
|
62
|
+
self._token: Optional[str] = kwargs.pop("token", None)
|
|
63
|
+
self._stream_args = {
|
|
64
|
+
"channel": channel,
|
|
65
|
+
"thread_ts": thread_ts,
|
|
66
|
+
"recipient_team_id": recipient_team_id,
|
|
67
|
+
"recipient_user_id": recipient_user_id,
|
|
68
|
+
**kwargs,
|
|
69
|
+
}
|
|
70
|
+
self._buffer = ""
|
|
71
|
+
self._state = "starting"
|
|
72
|
+
self._stream_ts: Optional[str] = None
|
|
73
|
+
self._buffer_size = buffer_size
|
|
74
|
+
|
|
75
|
+
async def append(
|
|
76
|
+
self,
|
|
77
|
+
*,
|
|
78
|
+
markdown_text: str,
|
|
79
|
+
**kwargs,
|
|
80
|
+
) -> Optional[AsyncSlackResponse]:
|
|
81
|
+
"""Append to the stream.
|
|
82
|
+
|
|
83
|
+
The "append" method appends to the chat stream being used. This method can be called multiple times. After the stream
|
|
84
|
+
is stopped this method cannot be called.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
markdown_text: Accepts message text formatted in markdown. Limit this field to 12,000 characters. This text is
|
|
88
|
+
what will be appended to the message received so far.
|
|
89
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
AsyncSlackResponse if the buffer was flushed, None if buffering.
|
|
93
|
+
|
|
94
|
+
Raises:
|
|
95
|
+
SlackRequestError: If the stream is already completed.
|
|
96
|
+
|
|
97
|
+
Example:
|
|
98
|
+
```python
|
|
99
|
+
streamer = client.chat_stream(
|
|
100
|
+
channel="C0123456789",
|
|
101
|
+
thread_ts="1700000001.123456",
|
|
102
|
+
recipient_team_id="T0123456789",
|
|
103
|
+
recipient_user_id="U0123456789",
|
|
104
|
+
)
|
|
105
|
+
streamer.append(markdown_text="**hello wo")
|
|
106
|
+
streamer.append(markdown_text="rld!**")
|
|
107
|
+
streamer.stop()
|
|
108
|
+
```
|
|
109
|
+
"""
|
|
110
|
+
if self._state == "completed":
|
|
111
|
+
raise e.SlackRequestError(f"Cannot append to stream: stream state is {self._state}")
|
|
112
|
+
if kwargs.get("token"):
|
|
113
|
+
self._token = kwargs.pop("token")
|
|
114
|
+
self._buffer += markdown_text
|
|
115
|
+
if len(self._buffer) >= self._buffer_size:
|
|
116
|
+
return await self._flush_buffer(**kwargs)
|
|
117
|
+
details = {
|
|
118
|
+
"buffer_length": len(self._buffer),
|
|
119
|
+
"buffer_size": self._buffer_size,
|
|
120
|
+
"channel": self._stream_args.get("channel"),
|
|
121
|
+
"recipient_team_id": self._stream_args.get("recipient_team_id"),
|
|
122
|
+
"recipient_user_id": self._stream_args.get("recipient_user_id"),
|
|
123
|
+
"thread_ts": self._stream_args.get("thread_ts"),
|
|
124
|
+
}
|
|
125
|
+
self._logger.debug(f"ChatStream appended to buffer: {json.dumps(details)}")
|
|
126
|
+
return None
|
|
127
|
+
|
|
128
|
+
async def stop(
|
|
129
|
+
self,
|
|
130
|
+
*,
|
|
131
|
+
markdown_text: Optional[str] = None,
|
|
132
|
+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
|
|
133
|
+
metadata: Optional[Union[Dict, Metadata]] = None,
|
|
134
|
+
**kwargs,
|
|
135
|
+
) -> AsyncSlackResponse:
|
|
136
|
+
"""Stop the stream and finalize the message.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
blocks: A list of blocks that will be rendered at the bottom of the finalized message.
|
|
140
|
+
markdown_text: Accepts message text formatted in markdown. Limit this field to 12,000 characters. This text is
|
|
141
|
+
what will be appended to the message received so far.
|
|
142
|
+
metadata: JSON object with event_type and event_payload fields, presented as a URL-encoded string. Metadata you
|
|
143
|
+
post to Slack is accessible to any app or user who is a member of that workspace.
|
|
144
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
AsyncSlackResponse from the chat.stopStream API call.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
SlackRequestError: If the stream is already completed.
|
|
151
|
+
|
|
152
|
+
Example:
|
|
153
|
+
```python
|
|
154
|
+
streamer = client.chat_stream(
|
|
155
|
+
channel="C0123456789",
|
|
156
|
+
thread_ts="1700000001.123456",
|
|
157
|
+
recipient_team_id="T0123456789",
|
|
158
|
+
recipient_user_id="U0123456789",
|
|
159
|
+
)
|
|
160
|
+
streamer.append(markdown_text="**hello wo")
|
|
161
|
+
streamer.append(markdown_text="rld!**")
|
|
162
|
+
streamer.stop()
|
|
163
|
+
```
|
|
164
|
+
"""
|
|
165
|
+
if self._state == "completed":
|
|
166
|
+
raise e.SlackRequestError(f"Cannot stop stream: stream state is {self._state}")
|
|
167
|
+
if kwargs.get("token"):
|
|
168
|
+
self._token = kwargs.pop("token")
|
|
169
|
+
if markdown_text:
|
|
170
|
+
self._buffer += markdown_text
|
|
171
|
+
if not self._stream_ts:
|
|
172
|
+
response = await self._client.chat_startStream(
|
|
173
|
+
**self._stream_args,
|
|
174
|
+
token=self._token,
|
|
175
|
+
)
|
|
176
|
+
if not response.get("ts"):
|
|
177
|
+
raise e.SlackRequestError("Failed to stop stream: stream not started")
|
|
178
|
+
self._stream_ts = str(response["ts"])
|
|
179
|
+
self._state = "in_progress"
|
|
180
|
+
response = await self._client.chat_stopStream(
|
|
181
|
+
token=self._token,
|
|
182
|
+
channel=self._stream_args["channel"],
|
|
183
|
+
ts=self._stream_ts,
|
|
184
|
+
blocks=blocks,
|
|
185
|
+
markdown_text=self._buffer,
|
|
186
|
+
metadata=metadata,
|
|
187
|
+
**kwargs,
|
|
188
|
+
)
|
|
189
|
+
self._state = "completed"
|
|
190
|
+
return response
|
|
191
|
+
|
|
192
|
+
async def _flush_buffer(self, **kwargs) -> AsyncSlackResponse:
|
|
193
|
+
"""Flush the internal buffer by making appropriate API calls."""
|
|
194
|
+
if not self._stream_ts:
|
|
195
|
+
response = await self._client.chat_startStream(
|
|
196
|
+
**self._stream_args,
|
|
197
|
+
token=self._token,
|
|
198
|
+
**kwargs,
|
|
199
|
+
markdown_text=self._buffer,
|
|
200
|
+
)
|
|
201
|
+
self._stream_ts = response.get("ts")
|
|
202
|
+
self._state = "in_progress"
|
|
203
|
+
else:
|
|
204
|
+
response = await self._client.chat_appendStream(
|
|
205
|
+
token=self._token,
|
|
206
|
+
channel=self._stream_args["channel"],
|
|
207
|
+
ts=self._stream_ts,
|
|
208
|
+
**kwargs,
|
|
209
|
+
markdown_text=self._buffer,
|
|
210
|
+
)
|
|
211
|
+
self._buffer = ""
|
|
212
|
+
return response
|
|
@@ -18,6 +18,7 @@ from typing import Any, Dict, List, Optional, Sequence, Union
|
|
|
18
18
|
|
|
19
19
|
import slack_sdk.errors as e
|
|
20
20
|
from slack_sdk.models.views import View
|
|
21
|
+
from slack_sdk.web.async_chat_stream import AsyncChatStream
|
|
21
22
|
|
|
22
23
|
from ..models.attachments import Attachment
|
|
23
24
|
from ..models.blocks import Block
|
|
@@ -2084,7 +2085,8 @@ class AsyncWebClient(AsyncBaseClient):
|
|
|
2084
2085
|
kwargs.update(
|
|
2085
2086
|
{"channel_id": channel_id, "thread_ts": thread_ts, "status": status, "loading_messages": loading_messages}
|
|
2086
2087
|
)
|
|
2087
|
-
|
|
2088
|
+
kwargs = _remove_none_values(kwargs)
|
|
2089
|
+
return await self.api_call("assistant.threads.setStatus", json=kwargs)
|
|
2088
2090
|
|
|
2089
2091
|
async def assistant_threads_setTitle(
|
|
2090
2092
|
self,
|
|
@@ -2882,8 +2884,6 @@ class AsyncWebClient(AsyncBaseClient):
|
|
|
2882
2884
|
markdown_text: Optional[str] = None,
|
|
2883
2885
|
recipient_team_id: Optional[str] = None,
|
|
2884
2886
|
recipient_user_id: Optional[str] = None,
|
|
2885
|
-
unfurl_links: Optional[bool] = None,
|
|
2886
|
-
unfurl_media: Optional[bool] = None,
|
|
2887
2887
|
**kwargs,
|
|
2888
2888
|
) -> AsyncSlackResponse:
|
|
2889
2889
|
"""Starts a new streaming conversation.
|
|
@@ -2896,8 +2896,6 @@ class AsyncWebClient(AsyncBaseClient):
|
|
|
2896
2896
|
"markdown_text": markdown_text,
|
|
2897
2897
|
"recipient_team_id": recipient_team_id,
|
|
2898
2898
|
"recipient_user_id": recipient_user_id,
|
|
2899
|
-
"unfurl_links": unfurl_links,
|
|
2900
|
-
"unfurl_media": unfurl_media,
|
|
2901
2899
|
}
|
|
2902
2900
|
)
|
|
2903
2901
|
kwargs = _remove_none_values(kwargs)
|
|
@@ -2929,6 +2927,69 @@ class AsyncWebClient(AsyncBaseClient):
|
|
|
2929
2927
|
kwargs = _remove_none_values(kwargs)
|
|
2930
2928
|
return await self.api_call("chat.stopStream", json=kwargs)
|
|
2931
2929
|
|
|
2930
|
+
async def chat_stream(
|
|
2931
|
+
self,
|
|
2932
|
+
*,
|
|
2933
|
+
buffer_size: int = 256,
|
|
2934
|
+
channel: str,
|
|
2935
|
+
thread_ts: str,
|
|
2936
|
+
recipient_team_id: Optional[str] = None,
|
|
2937
|
+
recipient_user_id: Optional[str] = None,
|
|
2938
|
+
**kwargs,
|
|
2939
|
+
) -> AsyncChatStream:
|
|
2940
|
+
"""Stream markdown text into a conversation.
|
|
2941
|
+
|
|
2942
|
+
This method starts a new chat stream in a coversation that can be appended to. After appending an entire message,
|
|
2943
|
+
the stream can be stopped with concluding arguments such as "blocks" for gathering feedback.
|
|
2944
|
+
|
|
2945
|
+
The following methods are used:
|
|
2946
|
+
|
|
2947
|
+
- chat.startStream: Starts a new streaming conversation.
|
|
2948
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.startStream).
|
|
2949
|
+
- chat.appendStream: Appends text to an existing streaming conversation.
|
|
2950
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.appendStream).
|
|
2951
|
+
- chat.stopStream: Stops a streaming conversation.
|
|
2952
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.stopStream).
|
|
2953
|
+
|
|
2954
|
+
Args:
|
|
2955
|
+
buffer_size: The length of markdown_text to buffer in-memory before calling a stream method. Increasing this
|
|
2956
|
+
value decreases the number of method calls made for the same amount of text, which is useful to avoid rate
|
|
2957
|
+
limits. Default: 256.
|
|
2958
|
+
channel: An encoded ID that represents a channel, private group, or DM.
|
|
2959
|
+
thread_ts: Provide another message's ts value to reply to. Streamed messages should always be replies to a user
|
|
2960
|
+
request.
|
|
2961
|
+
recipient_team_id: The encoded ID of the team the user receiving the streaming text belongs to. Required when
|
|
2962
|
+
streaming to channels.
|
|
2963
|
+
recipient_user_id: The encoded ID of the user to receive the streaming text. Required when streaming to channels.
|
|
2964
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
2965
|
+
|
|
2966
|
+
Returns:
|
|
2967
|
+
ChatStream instance for managing the stream
|
|
2968
|
+
|
|
2969
|
+
Example:
|
|
2970
|
+
```python
|
|
2971
|
+
streamer = await client.chat_stream(
|
|
2972
|
+
channel="C0123456789",
|
|
2973
|
+
thread_ts="1700000001.123456",
|
|
2974
|
+
recipient_team_id="T0123456789",
|
|
2975
|
+
recipient_user_id="U0123456789",
|
|
2976
|
+
)
|
|
2977
|
+
await streamer.append(markdown_text="**hello wo")
|
|
2978
|
+
await streamer.append(markdown_text="rld!**")
|
|
2979
|
+
await streamer.stop()
|
|
2980
|
+
```
|
|
2981
|
+
"""
|
|
2982
|
+
return AsyncChatStream(
|
|
2983
|
+
self,
|
|
2984
|
+
logger=self._logger,
|
|
2985
|
+
channel=channel,
|
|
2986
|
+
thread_ts=thread_ts,
|
|
2987
|
+
recipient_team_id=recipient_team_id,
|
|
2988
|
+
recipient_user_id=recipient_user_id,
|
|
2989
|
+
buffer_size=buffer_size,
|
|
2990
|
+
**kwargs,
|
|
2991
|
+
)
|
|
2992
|
+
|
|
2932
2993
|
async def chat_unfurl(
|
|
2933
2994
|
self,
|
|
2934
2995
|
*,
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import logging
|
|
3
|
+
from typing import TYPE_CHECKING, Dict, Optional, Sequence, Union
|
|
4
|
+
|
|
5
|
+
import slack_sdk.errors as e
|
|
6
|
+
from slack_sdk.models.blocks.blocks import Block
|
|
7
|
+
from slack_sdk.models.metadata import Metadata
|
|
8
|
+
from slack_sdk.web.slack_response import SlackResponse
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from slack_sdk import WebClient
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ChatStream:
|
|
15
|
+
"""A helper class for streaming markdown text into a conversation using the chat streaming APIs.
|
|
16
|
+
|
|
17
|
+
This class provides a convenient interface for the chat.startStream, chat.appendStream, and chat.stopStream API
|
|
18
|
+
methods, with automatic buffering and state management.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
client: "WebClient",
|
|
24
|
+
*,
|
|
25
|
+
channel: str,
|
|
26
|
+
logger: logging.Logger,
|
|
27
|
+
thread_ts: str,
|
|
28
|
+
buffer_size: int,
|
|
29
|
+
recipient_team_id: Optional[str] = None,
|
|
30
|
+
recipient_user_id: Optional[str] = None,
|
|
31
|
+
**kwargs,
|
|
32
|
+
):
|
|
33
|
+
"""Initialize a new ChatStream instance.
|
|
34
|
+
|
|
35
|
+
The __init__ method creates a unique ChatStream instance that keeps track of one chat stream.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
client: The WebClient instance to use for API calls.
|
|
39
|
+
channel: An encoded ID that represents a channel, private group, or DM.
|
|
40
|
+
logger: A logging channel for outputs.
|
|
41
|
+
thread_ts: Provide another message's ts value to reply to. Streamed messages should always be replies to a user
|
|
42
|
+
request.
|
|
43
|
+
recipient_team_id: The encoded ID of the team the user receiving the streaming text belongs to. Required when
|
|
44
|
+
streaming to channels.
|
|
45
|
+
recipient_user_id: The encoded ID of the user to receive the streaming text. Required when streaming to channels.
|
|
46
|
+
buffer_size: The length of markdown_text to buffer in-memory before calling a method. Increasing this value
|
|
47
|
+
decreases the number of method calls made for the same amount of text, which is useful to avoid rate limits.
|
|
48
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
49
|
+
"""
|
|
50
|
+
self._client = client
|
|
51
|
+
self._logger = logger
|
|
52
|
+
self._token: Optional[str] = kwargs.pop("token", None)
|
|
53
|
+
self._stream_args = {
|
|
54
|
+
"channel": channel,
|
|
55
|
+
"thread_ts": thread_ts,
|
|
56
|
+
"recipient_team_id": recipient_team_id,
|
|
57
|
+
"recipient_user_id": recipient_user_id,
|
|
58
|
+
**kwargs,
|
|
59
|
+
}
|
|
60
|
+
self._buffer = ""
|
|
61
|
+
self._state = "starting"
|
|
62
|
+
self._stream_ts: Optional[str] = None
|
|
63
|
+
self._buffer_size = buffer_size
|
|
64
|
+
|
|
65
|
+
def append(
|
|
66
|
+
self,
|
|
67
|
+
*,
|
|
68
|
+
markdown_text: str,
|
|
69
|
+
**kwargs,
|
|
70
|
+
) -> Optional[SlackResponse]:
|
|
71
|
+
"""Append to the stream.
|
|
72
|
+
|
|
73
|
+
The "append" method appends to the chat stream being used. This method can be called multiple times. After the stream
|
|
74
|
+
is stopped this method cannot be called.
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
markdown_text: Accepts message text formatted in markdown. Limit this field to 12,000 characters. This text is
|
|
78
|
+
what will be appended to the message received so far.
|
|
79
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
SlackResponse if the buffer was flushed, None if buffering.
|
|
83
|
+
|
|
84
|
+
Raises:
|
|
85
|
+
SlackRequestError: If the stream is already completed.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
```python
|
|
89
|
+
streamer = client.chat_stream(
|
|
90
|
+
channel="C0123456789",
|
|
91
|
+
thread_ts="1700000001.123456",
|
|
92
|
+
recipient_team_id="T0123456789",
|
|
93
|
+
recipient_user_id="U0123456789",
|
|
94
|
+
)
|
|
95
|
+
streamer.append(markdown_text="**hello wo")
|
|
96
|
+
streamer.append(markdown_text="rld!**")
|
|
97
|
+
streamer.stop()
|
|
98
|
+
```
|
|
99
|
+
"""
|
|
100
|
+
if self._state == "completed":
|
|
101
|
+
raise e.SlackRequestError(f"Cannot append to stream: stream state is {self._state}")
|
|
102
|
+
if kwargs.get("token"):
|
|
103
|
+
self._token = kwargs.pop("token")
|
|
104
|
+
self._buffer += markdown_text
|
|
105
|
+
if len(self._buffer) >= self._buffer_size:
|
|
106
|
+
return self._flush_buffer(**kwargs)
|
|
107
|
+
details = {
|
|
108
|
+
"buffer_length": len(self._buffer),
|
|
109
|
+
"buffer_size": self._buffer_size,
|
|
110
|
+
"channel": self._stream_args.get("channel"),
|
|
111
|
+
"recipient_team_id": self._stream_args.get("recipient_team_id"),
|
|
112
|
+
"recipient_user_id": self._stream_args.get("recipient_user_id"),
|
|
113
|
+
"thread_ts": self._stream_args.get("thread_ts"),
|
|
114
|
+
}
|
|
115
|
+
self._logger.debug(f"ChatStream appended to buffer: {json.dumps(details)}")
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
def stop(
|
|
119
|
+
self,
|
|
120
|
+
*,
|
|
121
|
+
markdown_text: Optional[str] = None,
|
|
122
|
+
blocks: Optional[Union[str, Sequence[Union[Dict, Block]]]] = None,
|
|
123
|
+
metadata: Optional[Union[Dict, Metadata]] = None,
|
|
124
|
+
**kwargs,
|
|
125
|
+
) -> SlackResponse:
|
|
126
|
+
"""Stop the stream and finalize the message.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
blocks: A list of blocks that will be rendered at the bottom of the finalized message.
|
|
130
|
+
markdown_text: Accepts message text formatted in markdown. Limit this field to 12,000 characters. This text is
|
|
131
|
+
what will be appended to the message received so far.
|
|
132
|
+
metadata: JSON object with event_type and event_payload fields, presented as a URL-encoded string. Metadata you
|
|
133
|
+
post to Slack is accessible to any app or user who is a member of that workspace.
|
|
134
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
SlackResponse from the chat.stopStream API call.
|
|
138
|
+
|
|
139
|
+
Raises:
|
|
140
|
+
SlackRequestError: If the stream is already completed.
|
|
141
|
+
|
|
142
|
+
Example:
|
|
143
|
+
```python
|
|
144
|
+
streamer = client.chat_stream(
|
|
145
|
+
channel="C0123456789",
|
|
146
|
+
thread_ts="1700000001.123456",
|
|
147
|
+
recipient_team_id="T0123456789",
|
|
148
|
+
recipient_user_id="U0123456789",
|
|
149
|
+
)
|
|
150
|
+
streamer.append(markdown_text="**hello wo")
|
|
151
|
+
streamer.append(markdown_text="rld!**")
|
|
152
|
+
streamer.stop()
|
|
153
|
+
```
|
|
154
|
+
"""
|
|
155
|
+
if self._state == "completed":
|
|
156
|
+
raise e.SlackRequestError(f"Cannot stop stream: stream state is {self._state}")
|
|
157
|
+
if kwargs.get("token"):
|
|
158
|
+
self._token = kwargs.pop("token")
|
|
159
|
+
if markdown_text:
|
|
160
|
+
self._buffer += markdown_text
|
|
161
|
+
if not self._stream_ts:
|
|
162
|
+
response = self._client.chat_startStream(
|
|
163
|
+
**self._stream_args,
|
|
164
|
+
token=self._token,
|
|
165
|
+
)
|
|
166
|
+
if not response.get("ts"):
|
|
167
|
+
raise e.SlackRequestError("Failed to stop stream: stream not started")
|
|
168
|
+
self._stream_ts = str(response["ts"])
|
|
169
|
+
self._state = "in_progress"
|
|
170
|
+
response = self._client.chat_stopStream(
|
|
171
|
+
token=self._token,
|
|
172
|
+
channel=self._stream_args["channel"],
|
|
173
|
+
ts=self._stream_ts,
|
|
174
|
+
blocks=blocks,
|
|
175
|
+
markdown_text=self._buffer,
|
|
176
|
+
metadata=metadata,
|
|
177
|
+
**kwargs,
|
|
178
|
+
)
|
|
179
|
+
self._state = "completed"
|
|
180
|
+
return response
|
|
181
|
+
|
|
182
|
+
def _flush_buffer(self, **kwargs) -> SlackResponse:
|
|
183
|
+
"""Flush the internal buffer by making appropriate API calls."""
|
|
184
|
+
if not self._stream_ts:
|
|
185
|
+
response = self._client.chat_startStream(
|
|
186
|
+
**self._stream_args,
|
|
187
|
+
token=self._token,
|
|
188
|
+
**kwargs,
|
|
189
|
+
markdown_text=self._buffer,
|
|
190
|
+
)
|
|
191
|
+
self._stream_ts = response.get("ts")
|
|
192
|
+
self._state = "in_progress"
|
|
193
|
+
else:
|
|
194
|
+
response = self._client.chat_appendStream(
|
|
195
|
+
token=self._token,
|
|
196
|
+
channel=self._stream_args["channel"],
|
|
197
|
+
ts=self._stream_ts,
|
|
198
|
+
**kwargs,
|
|
199
|
+
markdown_text=self._buffer,
|
|
200
|
+
)
|
|
201
|
+
self._buffer = ""
|
|
202
|
+
return response
|
|
@@ -8,6 +8,7 @@ from typing import Any, Dict, List, Optional, Sequence, Union
|
|
|
8
8
|
|
|
9
9
|
import slack_sdk.errors as e
|
|
10
10
|
from slack_sdk.models.views import View
|
|
11
|
+
from slack_sdk.web.chat_stream import ChatStream
|
|
11
12
|
|
|
12
13
|
from ..models.attachments import Attachment
|
|
13
14
|
from ..models.blocks import Block
|
|
@@ -2074,7 +2075,8 @@ class WebClient(BaseClient):
|
|
|
2074
2075
|
kwargs.update(
|
|
2075
2076
|
{"channel_id": channel_id, "thread_ts": thread_ts, "status": status, "loading_messages": loading_messages}
|
|
2076
2077
|
)
|
|
2077
|
-
|
|
2078
|
+
kwargs = _remove_none_values(kwargs)
|
|
2079
|
+
return self.api_call("assistant.threads.setStatus", json=kwargs)
|
|
2078
2080
|
|
|
2079
2081
|
def assistant_threads_setTitle(
|
|
2080
2082
|
self,
|
|
@@ -2872,8 +2874,6 @@ class WebClient(BaseClient):
|
|
|
2872
2874
|
markdown_text: Optional[str] = None,
|
|
2873
2875
|
recipient_team_id: Optional[str] = None,
|
|
2874
2876
|
recipient_user_id: Optional[str] = None,
|
|
2875
|
-
unfurl_links: Optional[bool] = None,
|
|
2876
|
-
unfurl_media: Optional[bool] = None,
|
|
2877
2877
|
**kwargs,
|
|
2878
2878
|
) -> SlackResponse:
|
|
2879
2879
|
"""Starts a new streaming conversation.
|
|
@@ -2886,8 +2886,6 @@ class WebClient(BaseClient):
|
|
|
2886
2886
|
"markdown_text": markdown_text,
|
|
2887
2887
|
"recipient_team_id": recipient_team_id,
|
|
2888
2888
|
"recipient_user_id": recipient_user_id,
|
|
2889
|
-
"unfurl_links": unfurl_links,
|
|
2890
|
-
"unfurl_media": unfurl_media,
|
|
2891
2889
|
}
|
|
2892
2890
|
)
|
|
2893
2891
|
kwargs = _remove_none_values(kwargs)
|
|
@@ -2919,6 +2917,69 @@ class WebClient(BaseClient):
|
|
|
2919
2917
|
kwargs = _remove_none_values(kwargs)
|
|
2920
2918
|
return self.api_call("chat.stopStream", json=kwargs)
|
|
2921
2919
|
|
|
2920
|
+
def chat_stream(
|
|
2921
|
+
self,
|
|
2922
|
+
*,
|
|
2923
|
+
buffer_size: int = 256,
|
|
2924
|
+
channel: str,
|
|
2925
|
+
thread_ts: str,
|
|
2926
|
+
recipient_team_id: Optional[str] = None,
|
|
2927
|
+
recipient_user_id: Optional[str] = None,
|
|
2928
|
+
**kwargs,
|
|
2929
|
+
) -> ChatStream:
|
|
2930
|
+
"""Stream markdown text into a conversation.
|
|
2931
|
+
|
|
2932
|
+
This method starts a new chat stream in a coversation that can be appended to. After appending an entire message,
|
|
2933
|
+
the stream can be stopped with concluding arguments such as "blocks" for gathering feedback.
|
|
2934
|
+
|
|
2935
|
+
The following methods are used:
|
|
2936
|
+
|
|
2937
|
+
- chat.startStream: Starts a new streaming conversation.
|
|
2938
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.startStream).
|
|
2939
|
+
- chat.appendStream: Appends text to an existing streaming conversation.
|
|
2940
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.appendStream).
|
|
2941
|
+
- chat.stopStream: Stops a streaming conversation.
|
|
2942
|
+
[Reference](https://docs.slack.dev/reference/methods/chat.stopStream).
|
|
2943
|
+
|
|
2944
|
+
Args:
|
|
2945
|
+
buffer_size: The length of markdown_text to buffer in-memory before calling a stream method. Increasing this
|
|
2946
|
+
value decreases the number of method calls made for the same amount of text, which is useful to avoid rate
|
|
2947
|
+
limits. Default: 256.
|
|
2948
|
+
channel: An encoded ID that represents a channel, private group, or DM.
|
|
2949
|
+
thread_ts: Provide another message's ts value to reply to. Streamed messages should always be replies to a user
|
|
2950
|
+
request.
|
|
2951
|
+
recipient_team_id: The encoded ID of the team the user receiving the streaming text belongs to. Required when
|
|
2952
|
+
streaming to channels.
|
|
2953
|
+
recipient_user_id: The encoded ID of the user to receive the streaming text. Required when streaming to channels.
|
|
2954
|
+
**kwargs: Additional arguments passed to the underlying API calls.
|
|
2955
|
+
|
|
2956
|
+
Returns:
|
|
2957
|
+
ChatStream instance for managing the stream
|
|
2958
|
+
|
|
2959
|
+
Example:
|
|
2960
|
+
```python
|
|
2961
|
+
streamer = client.chat_stream(
|
|
2962
|
+
channel="C0123456789",
|
|
2963
|
+
thread_ts="1700000001.123456",
|
|
2964
|
+
recipient_team_id="T0123456789",
|
|
2965
|
+
recipient_user_id="U0123456789",
|
|
2966
|
+
)
|
|
2967
|
+
streamer.append(markdown_text="**hello wo")
|
|
2968
|
+
streamer.append(markdown_text="rld!**")
|
|
2969
|
+
streamer.stop()
|
|
2970
|
+
```
|
|
2971
|
+
"""
|
|
2972
|
+
return ChatStream(
|
|
2973
|
+
self,
|
|
2974
|
+
logger=self._logger,
|
|
2975
|
+
channel=channel,
|
|
2976
|
+
thread_ts=thread_ts,
|
|
2977
|
+
recipient_team_id=recipient_team_id,
|
|
2978
|
+
recipient_user_id=recipient_user_id,
|
|
2979
|
+
buffer_size=buffer_size,
|
|
2980
|
+
**kwargs,
|
|
2981
|
+
)
|
|
2982
|
+
|
|
2922
2983
|
def chat_unfurl(
|
|
2923
2984
|
self,
|
|
2924
2985
|
*,
|
|
@@ -2086,7 +2086,8 @@ class LegacyWebClient(LegacyBaseClient):
|
|
|
2086
2086
|
kwargs.update(
|
|
2087
2087
|
{"channel_id": channel_id, "thread_ts": thread_ts, "status": status, "loading_messages": loading_messages}
|
|
2088
2088
|
)
|
|
2089
|
-
|
|
2089
|
+
kwargs = _remove_none_values(kwargs)
|
|
2090
|
+
return self.api_call("assistant.threads.setStatus", json=kwargs)
|
|
2090
2091
|
|
|
2091
2092
|
def assistant_threads_setTitle(
|
|
2092
2093
|
self,
|
|
@@ -2884,8 +2885,6 @@ class LegacyWebClient(LegacyBaseClient):
|
|
|
2884
2885
|
markdown_text: Optional[str] = None,
|
|
2885
2886
|
recipient_team_id: Optional[str] = None,
|
|
2886
2887
|
recipient_user_id: Optional[str] = None,
|
|
2887
|
-
unfurl_links: Optional[bool] = None,
|
|
2888
|
-
unfurl_media: Optional[bool] = None,
|
|
2889
2888
|
**kwargs,
|
|
2890
2889
|
) -> Union[Future, SlackResponse]:
|
|
2891
2890
|
"""Starts a new streaming conversation.
|
|
@@ -2898,8 +2897,6 @@ class LegacyWebClient(LegacyBaseClient):
|
|
|
2898
2897
|
"markdown_text": markdown_text,
|
|
2899
2898
|
"recipient_team_id": recipient_team_id,
|
|
2900
2899
|
"recipient_user_id": recipient_user_id,
|
|
2901
|
-
"unfurl_links": unfurl_links,
|
|
2902
|
-
"unfurl_media": unfurl_media,
|
|
2903
2900
|
}
|
|
2904
2901
|
)
|
|
2905
2902
|
kwargs = _remove_none_values(kwargs)
|
|
@@ -144,6 +144,7 @@ slack_sdk/socket_mode/websocket_client/__init__.py
|
|
|
144
144
|
slack_sdk/socket_mode/websockets/__init__.py
|
|
145
145
|
slack_sdk/web/__init__.py
|
|
146
146
|
slack_sdk/web/async_base_client.py
|
|
147
|
+
slack_sdk/web/async_chat_stream.py
|
|
147
148
|
slack_sdk/web/async_client.py
|
|
148
149
|
slack_sdk/web/async_internal_utils.py
|
|
149
150
|
slack_sdk/web/async_slack_response.py
|