python-slack-agents 0.6.0__tar.gz → 0.6.2__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.
Files changed (111) hide show
  1. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/AGENTS.md +9 -5
  2. python_slack_agents-0.6.2/CHANGELOG.md +80 -0
  3. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/PKG-INFO +12 -13
  4. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/README.md +11 -12
  5. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/kitchen-sink/config.yaml +9 -1
  6. python_slack_agents-0.6.2/docs/canvas.md +118 -0
  7. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/private-repo.md +3 -0
  8. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/setup.md +25 -8
  9. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/llms-full.txt +97 -30
  10. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/pyproject.toml +1 -1
  11. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/__init__.py +2 -1
  12. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/build_docker.py +22 -0
  13. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/init.py +40 -6
  14. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/config.py +6 -0
  15. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/files.py +3 -0
  16. python_slack_agents-0.6.2/src/slack_agents/slack/canvas_auth.py +58 -0
  17. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/canvases.py +4 -47
  18. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/files.py +6 -1
  19. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/canvas.py +109 -88
  20. python_slack_agents-0.6.2/src/slack_agents/tools/canvas_importer.py +88 -0
  21. python_slack_agents-0.6.2/tests/test_canvas_auth.py +217 -0
  22. python_slack_agents-0.6.2/tests/test_canvas_importer.py +108 -0
  23. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/uv.lock +1 -1
  24. python_slack_agents-0.6.0/CHANGELOG.md +0 -22
  25. python_slack_agents-0.6.0/docs/canvas.md +0 -83
  26. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.dockerignore +0 -0
  27. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.env.example +0 -0
  28. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.github/workflows/ci.yml +0 -0
  29. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.github/workflows/publish.yml +0 -0
  30. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.gitignore +0 -0
  31. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/.pre-commit-config.yaml +0 -0
  32. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/CODE_OF_CONDUCT.md +0 -0
  33. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/CONTRIBUTING.md +0 -0
  34. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/LICENSE +0 -0
  35. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/SECURITY.md +0 -0
  36. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/README.md +0 -0
  37. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/docs-assistant/config.yaml +0 -0
  38. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/docs-assistant/system_prompt.txt +0 -0
  39. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/hello-world/config.yaml +0 -0
  40. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/hello-world/system_prompt.txt +0 -0
  41. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/agents/kitchen-sink/system_prompt.txt +0 -0
  42. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/access-control.md +0 -0
  43. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/agents.md +0 -0
  44. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/cli.md +0 -0
  45. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/deployment.md +0 -0
  46. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/llm.md +0 -0
  47. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/media/demo.gif +0 -0
  48. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/observability.md +0 -0
  49. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/slack-app-manifest.json +0 -0
  50. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/storage.md +0 -0
  51. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/tools.md +0 -0
  52. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/docs/user-context.md +0 -0
  53. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/llms.txt +0 -0
  54. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/Dockerfile +0 -0
  55. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/access/__init__.py +0 -0
  56. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/access/allow_all.py +0 -0
  57. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/access/allow_list.py +0 -0
  58. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/access/base.py +0 -0
  59. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/agent_loop.py +0 -0
  60. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/__init__.py +0 -0
  61. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/export_conversations.py +0 -0
  62. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/export_conversations_html.py +0 -0
  63. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/export_usage.py +0 -0
  64. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/export_usage_csv.py +0 -0
  65. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/healthcheck.py +0 -0
  66. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/cli/run.py +0 -0
  67. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/conversations.py +0 -0
  68. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/llm/__init__.py +0 -0
  69. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/llm/anthropic.py +0 -0
  70. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/llm/base.py +0 -0
  71. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/llm/openai.py +0 -0
  72. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/main.py +0 -0
  73. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/observability.py +0 -0
  74. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/py.typed +0 -0
  75. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/scripts/__init__.py +0 -0
  76. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/scripts/download_fonts.py +0 -0
  77. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/scripts/generate_llms_full.py +0 -0
  78. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/__init__.py +0 -0
  79. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/actions.py +0 -0
  80. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/agent.py +0 -0
  81. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/format.py +0 -0
  82. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/streaming.py +0 -0
  83. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/streaming_formatter.py +0 -0
  84. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/slack/tool_blocks.py +0 -0
  85. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/__init__.py +0 -0
  86. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/base.py +0 -0
  87. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/postgres.py +0 -0
  88. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/postgres.sql +0 -0
  89. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/sqlite.py +0 -0
  90. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/storage/sqlite.sql +0 -0
  91. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/__init__.py +0 -0
  92. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/base.py +0 -0
  93. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/file_exporter.py +0 -0
  94. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/file_importer.py +0 -0
  95. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/mcp_http.py +0 -0
  96. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/src/slack_agents/tools/user_context.py +0 -0
  97. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/__init__.py +0 -0
  98. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_access.py +0 -0
  99. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_agent_loop.py +0 -0
  100. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_cli.py +0 -0
  101. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_config.py +0 -0
  102. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_conversations.py +0 -0
  103. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_cost.py +0 -0
  104. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_export_documents.py +0 -0
  105. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_export_usage.py +0 -0
  106. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_file_extractors.py +0 -0
  107. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_format.py +0 -0
  108. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_llm_factory.py +0 -0
  109. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_mcp_client.py +0 -0
  110. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_openai_convert.py +0 -0
  111. {python_slack_agents-0.6.0 → python_slack_agents-0.6.2}/tests/test_tool_blocks.py +0 -0
@@ -103,16 +103,20 @@ The project includes AI-agent-friendly documentation following the llms.txt conv
103
103
  ## Releasing
104
104
 
105
105
  1. Update `version` in `pyproject.toml`
106
- 2. Update the minimum version in `src/slack_agents/cli/init.py` (`python-slack-agents>=X.Y,<2`)
107
- 3. Commit and push to `main`
108
- 3. Create a GitHub Release (which creates a git tag)
109
- 4. The `publish.yml` workflow automatically builds and publishes to PyPI via trusted publishing
106
+ 2. Update `CHANGELOG.md` with the new version and changes
107
+ 3. Run `python3 src/slack_agents/scripts/generate_llms_full.py` to regenerate `llms-full.txt`
108
+ 4. Commit and push to `main`
109
+ 5. Create a GitHub Release (which creates a git tag)
110
+ 6. The `publish.yml` workflow automatically builds and publishes to PyPI via trusted publishing
110
111
 
111
- Do NOT publish to PyPI manually — the GitHub Release trigger handles it.
112
+ The PyPI deployment requires manual approval in the GitHub Actions UI. Do NOT publish to PyPI manually — the GitHub Release trigger handles it.
112
113
 
113
114
  ## Style
114
115
 
116
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for full coding and commit conventions.
117
+
115
118
  - Python 3.12+, line length 100
116
119
  - Ruff rules: E, F, I (errors, pyflakes, isort)
117
120
  - Keep it simple. Minimal abstractions, no unnecessary indirection.
118
121
  - Commit messages: Conventional Commits — `feat:`, `fix:`, `docs:`, `chore:`, `test:`, `refactor:`. Lowercase, imperative, under 72 chars.
122
+ - **NEVER run `git commit` or `git push` without explicit user approval.** Always propose the commit message and file list, then STOP and wait for the user to say "go", "commit", "yes", or similar. This is non-negotiable — even if the user says "prepare a release" or "let's commit", you must present the plan and wait. "Prepare" ≠ "execute".
@@ -0,0 +1,80 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/), and this project adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.6.2] - 2026-03-19
10
+
11
+ ### Added
12
+
13
+ - Canvas user-level authorization — tools enforce requesting user's access level via `files.info` metadata
14
+ - Canvas file importer (`application/vnd.slack-docs`) — users can attach canvases to messages
15
+ - `file_id` field on `InputFile` — file import pipeline now passes Slack file IDs to handlers
16
+ - `org_access` parameter on `canvas_access_add` for workspace-wide access
17
+
18
+ ### Changed
19
+
20
+ - Canvas tool descriptions instruct the LLM to guide users to attach canvases via Slack's + button (never ask for IDs)
21
+ - Canvas tool errors now return structured JSON instead of plain text
22
+
23
+ ### Removed
24
+
25
+ - `canvas_list` tool (scaling concern with batch `files.info`; users discover canvases via Slack UI)
26
+ - `channel_id` parameter from `canvas_create` (standalone canvases only)
27
+ - `channel_ids` parameter from `canvas_access_add` and `canvas_access_remove`
28
+
29
+ ## [0.6.1] - 2026-03-19
30
+
31
+ ### Added
32
+
33
+ - `slack-agents init` now generates `.gitignore`
34
+ - `.env.example` template includes comments explaining where to get each token and links to setup guide
35
+ - `build-docker` lists required environment variables after build completes
36
+ - `build-docker` errors if `req*.txt` files are found (dependencies must be in `pyproject.toml`)
37
+ - `init` warns when `req*.txt` files are found with migration instructions
38
+
39
+ ### Changed
40
+
41
+ - `pyproject.toml` template uses `python-slack-agents<2` (no minimum pin)
42
+ - Setup flow uses venv-first approach: create venv, install package, then `slack-agents init`
43
+ - Updated README, docs/setup.md, and docs/private-repo.md with new setup flow
44
+
45
+ ### Fixed
46
+
47
+ - Config loader now strips YAML comments before env var interpolation — commented-out `{ENV_VAR}` patterns no longer cause `KeyError`
48
+ - `init` shows proposed file content when skipping existing files
49
+
50
+ ## [0.6.0] - 2026-03-18
51
+
52
+ ### Added
53
+
54
+ - `slack-agents init <project_name>` CLI command to scaffold new projects
55
+ - `llms.txt` and `llms-full.txt` for AI agent discoverability
56
+ - `llms-full.txt` bundled in PyPI wheel
57
+ - Script to generate `llms-full.txt` from docs (`src/slack_agents/scripts/generate_llms_full.py`)
58
+ - "Project Structure" section in README
59
+ - Release process documentation in AGENTS.md
60
+
61
+ ### Changed
62
+
63
+ - Simplified Dockerfile: empty placeholders for README.md and llms-full.txt so builds work for both framework and user projects
64
+ - Updated docs/private-repo.md to use `slack-agents init`
65
+ - Updated docs/cli.md with `init` command reference
66
+
67
+ ## [0.5.0] - 2025-03-13
68
+
69
+ ### Added
70
+
71
+ - Plugin architecture for LLM providers, storage backends, and tools
72
+ - Anthropic and OpenAI LLM providers
73
+ - SQLite and PostgreSQL storage providers
74
+ - MCP over HTTP tool provider
75
+ - Built-in document export tools (PDF, DOCX, XLSX, CSV, PPTX)
76
+ - Streaming output with native Slack table rendering
77
+ - Socket Mode support (no public URL required)
78
+ - OpenTelemetry observability
79
+ - `{ENV_VAR}` interpolation in agent configs
80
+ - Per-agent Docker builds via `docker-build-and-push.sh`
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-slack-agents
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: A Python framework for deploying AI agents as Slack bots
5
5
  Project-URL: Homepage, https://github.com/CompareNetworks/python-slack-agents
6
6
  Project-URL: Repository, https://github.com/CompareNetworks/python-slack-agents
@@ -82,17 +82,16 @@ Each agent is a directory with two files: a `config.yaml` and a `system_prompt.t
82
82
  ## Quick Start
83
83
 
84
84
  ```bash
85
+ mkdir my-agents && cd my-agents
86
+ python3 -m venv .venv
87
+ source .venv/bin/activate
85
88
  pip install python-slack-agents
86
89
 
87
- # Scaffold a new project
88
- mkdir my-agents && cd my-agents
90
+ # Scaffold the project
89
91
  slack-agents init my-agents
90
92
 
91
- # Add your tokens
92
- cp .env.example .env
93
- # Edit .env: SLACK_BOT_TOKEN, SLACK_APP_TOKEN, ANTHROPIC_API_KEY
94
-
95
- # Install for development (makes custom providers importable)
93
+ # Add your tokens and install for development
94
+ cp .env.example .env # add your Slack and LLM tokens
96
95
  pip install -e .
97
96
 
98
97
  # Run the hello-world agent
@@ -330,13 +329,13 @@ If you're an AI agent or coding assistant, see [`llms-full.txt`](https://raw.git
330
329
 
331
330
  ## Related Projects
332
331
 
333
- If this framework isn't the right fit, here are some good alternatives:
332
+ Other projects in this space:
334
333
 
335
334
  - **[Bolt for Python](https://github.com/slackapi/bolt-python)** — The official Slack SDK. python-slack-agents uses it internally. Use Bolt directly if you want full control over Slack interactions without an agent abstraction.
336
- - **[Slack Machine](https://github.com/DonDebonair/slack-machine)** — A mature Slack bot framework with a great plugin system for traditional chatops. No AI/LLM layer, but solid if you don't need agents.
337
- - **[bolt-python-ai-chatbot](https://github.com/slack-samples/bolt-python-ai-chatbot)** — Official Slack sample app for AI chatbots. Good starting point if you want to build from scratch rather than use a framework.
338
- - **[OpenAI Agents SDK](https://github.com/openai/openai-agents-python)**, **[Pydantic AI](https://github.com/pydantic/pydantic-ai)**, **[MCP Agent](https://github.com/lastmile-ai/mcp-agent)** — Powerful general-purpose agent frameworks. None include Slack integration, but if you already use one and want to wire it up to Slack yourself, they're excellent.
339
- - **[slack-mcp-client](https://github.com/tuannvm/slack-mcp-client)** — A Go application bridging Slack and MCP servers. Deployed app rather than a library, but well-built if you prefer Go.
335
+ - **[bolt-python-ai-chatbot](https://github.com/slack-samples/bolt-python-ai-chatbot)** — Official Slack sample app for AI chatbots. A starting point if you want to build from scratch rather than use a framework.
336
+ - **[bolt-python-assistant-template](https://github.com/slack-samples/bolt-python-assistant-template)** — Official Slack template for building Agents & Assistants with Bolt and OpenAI.
337
+ - **[langgraph-messaging-integrations](https://github.com/langchain-ai/langgraph-messaging-integrations)** — Connects LangGraph agents to Slack and other messaging platforms.
338
+ - **[slack-mcp-client](https://github.com/tuannvm/slack-mcp-client)** — A Go application bridging Slack and MCP servers. Deployed app rather than a library.
340
339
 
341
340
  ## Disclaimer
342
341
 
@@ -36,17 +36,16 @@ Each agent is a directory with two files: a `config.yaml` and a `system_prompt.t
36
36
  ## Quick Start
37
37
 
38
38
  ```bash
39
+ mkdir my-agents && cd my-agents
40
+ python3 -m venv .venv
41
+ source .venv/bin/activate
39
42
  pip install python-slack-agents
40
43
 
41
- # Scaffold a new project
42
- mkdir my-agents && cd my-agents
44
+ # Scaffold the project
43
45
  slack-agents init my-agents
44
46
 
45
- # Add your tokens
46
- cp .env.example .env
47
- # Edit .env: SLACK_BOT_TOKEN, SLACK_APP_TOKEN, ANTHROPIC_API_KEY
48
-
49
- # Install for development (makes custom providers importable)
47
+ # Add your tokens and install for development
48
+ cp .env.example .env # add your Slack and LLM tokens
50
49
  pip install -e .
51
50
 
52
51
  # Run the hello-world agent
@@ -284,13 +283,13 @@ If you're an AI agent or coding assistant, see [`llms-full.txt`](https://raw.git
284
283
 
285
284
  ## Related Projects
286
285
 
287
- If this framework isn't the right fit, here are some good alternatives:
286
+ Other projects in this space:
288
287
 
289
288
  - **[Bolt for Python](https://github.com/slackapi/bolt-python)** — The official Slack SDK. python-slack-agents uses it internally. Use Bolt directly if you want full control over Slack interactions without an agent abstraction.
290
- - **[Slack Machine](https://github.com/DonDebonair/slack-machine)** — A mature Slack bot framework with a great plugin system for traditional chatops. No AI/LLM layer, but solid if you don't need agents.
291
- - **[bolt-python-ai-chatbot](https://github.com/slack-samples/bolt-python-ai-chatbot)** — Official Slack sample app for AI chatbots. Good starting point if you want to build from scratch rather than use a framework.
292
- - **[OpenAI Agents SDK](https://github.com/openai/openai-agents-python)**, **[Pydantic AI](https://github.com/pydantic/pydantic-ai)**, **[MCP Agent](https://github.com/lastmile-ai/mcp-agent)** — Powerful general-purpose agent frameworks. None include Slack integration, but if you already use one and want to wire it up to Slack yourself, they're excellent.
293
- - **[slack-mcp-client](https://github.com/tuannvm/slack-mcp-client)** — A Go application bridging Slack and MCP servers. Deployed app rather than a library, but well-built if you prefer Go.
289
+ - **[bolt-python-ai-chatbot](https://github.com/slack-samples/bolt-python-ai-chatbot)** — Official Slack sample app for AI chatbots. A starting point if you want to build from scratch rather than use a framework.
290
+ - **[bolt-python-assistant-template](https://github.com/slack-samples/bolt-python-assistant-template)** — Official Slack template for building Agents & Assistants with Bolt and OpenAI.
291
+ - **[langgraph-messaging-integrations](https://github.com/langchain-ai/langgraph-messaging-integrations)** — Connects LangGraph agents to Slack and other messaging platforms.
292
+ - **[slack-mcp-client](https://github.com/tuannvm/slack-mcp-client)** — A Go application bridging Slack and MCP servers. Deployed app rather than a library.
294
293
 
295
294
  ## Disclaimer
296
295
 
@@ -95,13 +95,21 @@ tools:
95
95
  # - "export_csv"
96
96
  # - "export_pptx"
97
97
 
98
- # Slack canvases (create, read, edit, list, delete)
98
+ # Slack canvases (create, read, update, delete + access management)
99
99
  # Requires Slack scopes: canvases:read, canvases:write, files:read
100
+ # Enforces user-level authorization — agent acts as delegate for the requesting user
100
101
  # canvas:
101
102
  # type: slack_agents.tools.canvas
102
103
  # bot_token: "{SLACK_BOT_TOKEN}"
103
104
  # allowed_functions: [".*"]
104
105
 
106
+ # Canvas file importer — reads canvases attached to messages
107
+ # Requires Slack scopes: canvases:read, files:read
108
+ # canvas-importer:
109
+ # type: slack_agents.tools.canvas_importer
110
+ # bot_token: "{SLACK_BOT_TOKEN}"
111
+ # allowed_functions: [".*"]
112
+
105
113
  # Per-user memory backed by Slack canvases
106
114
  # Remembers user preferences and context across conversations.
107
115
  # Requires Slack scopes: canvases:read, canvases:write, files:read
@@ -0,0 +1,118 @@
1
+ # Canvas Tool
2
+
3
+ The canvas tool lets your agent create, read, update, and delete [Slack canvases](https://slack.com/features/canvas) — rich documents that live inside Slack. It exposes a simple file-like API: no section IDs or low-level operations needed.
4
+
5
+ ## Setup
6
+
7
+ ### 1. Add Slack scopes
8
+
9
+ In your Slack app settings (**OAuth & Permissions → Scopes → Bot Token Scopes**), add:
10
+
11
+ | Scope | Purpose |
12
+ |-------|---------|
13
+ | `canvases:read` | Read canvas content |
14
+ | `canvases:write` | Create, update, delete canvases and manage access |
15
+ | `files:read` | Read canvas content and check user access (uses `files.info` API) |
16
+
17
+ After adding scopes, reinstall the app to your workspace.
18
+
19
+ ### 2. Configure the tool
20
+
21
+ Add the canvas tool to your agent's `config.yaml`:
22
+
23
+ ```yaml
24
+ tools:
25
+ canvas:
26
+ type: slack_agents.tools.canvas
27
+ bot_token: "{SLACK_BOT_TOKEN}"
28
+ allowed_functions: [".*"] # all canvas tools
29
+ ```
30
+
31
+ To expose only specific tools:
32
+
33
+ ```yaml
34
+ allowed_functions:
35
+ - "canvas_create"
36
+ - "canvas_get"
37
+ - "canvas_update"
38
+ ```
39
+
40
+ ### 3. Canvas file importer (optional)
41
+
42
+ To let users attach canvases to messages and have the agent read them automatically, add the canvas importer:
43
+
44
+ ```yaml
45
+ tools:
46
+ canvas-importer:
47
+ type: slack_agents.tools.canvas_importer
48
+ bot_token: "{SLACK_BOT_TOKEN}"
49
+ allowed_functions: [".*"]
50
+ ```
51
+
52
+ When a user attaches a canvas (mimetype `application/vnd.slack-docs`) to a message, the importer reads its markdown content via the Slack API and includes it in the conversation context. Authorization is enforced — the agent only reads canvases the requesting user can access.
53
+
54
+ ## Authorization model
55
+
56
+ All canvas operations enforce **user-level permissions**. The agent acts as a delegate for the requesting user — it will not access canvases the user can't access themselves.
57
+
58
+ Access is resolved from `files.info` metadata (no extra storage or scopes needed):
59
+
60
+ | Check | Source field |
61
+ |-------|-------------|
62
+ | Is user the creator? | `user` / `canvas_creator_id` |
63
+ | Per-user access | `dm_mpdm_users_with_file_access` |
64
+ | Workspace-wide access | `org_or_workspace_access` |
65
+
66
+ **Access levels** (higher includes lower): `owner` > `write` > `read`
67
+
68
+ **Required access per tool:**
69
+
70
+ | Tool | Required |
71
+ |------|----------|
72
+ | `canvas_create` | — (no existing canvas) |
73
+ | `canvas_get` | read |
74
+ | `canvas_update` | write |
75
+ | `canvas_delete` | owner |
76
+ | `canvas_access_get` | read |
77
+ | `canvas_access_add` | owner |
78
+ | `canvas_access_remove` | owner |
79
+
80
+ If the user lacks sufficient access, the tool returns an error message explaining what access level is needed.
81
+
82
+ ## Canvas content format
83
+
84
+ Canvas content is **markdown**. Supported elements:
85
+
86
+ - Headings (`#`, `##`, `###`)
87
+ - Bullet and numbered lists
88
+ - Tables
89
+ - Code blocks
90
+ - Block quotes
91
+ - Links
92
+ - Mentions (`<@U1234567890>`)
93
+ - Unfurls / embeds (`![](URL)`)
94
+
95
+ Block Kit is **not** supported in canvases.
96
+
97
+ ## Available tools
98
+
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `canvas_create` | Create a standalone canvas with title + content. |
102
+ | `canvas_get` | Get a canvas by ID. Returns title, full markdown content, and permalink. |
103
+ | `canvas_update` | Update a canvas — replace content, rename title, or both. |
104
+ | `canvas_delete` | Permanently delete a canvas. |
105
+ | `canvas_access_get` | Get sharing/access info for a canvas. |
106
+ | `canvas_access_add` | Grant read/write/owner access to users. Optionally set `org_access` for workspace-wide access. |
107
+ | `canvas_access_remove` | Remove access for users. |
108
+
109
+ ## Example usage
110
+
111
+ **Create a canvas:**
112
+ > "Create a canvas titled 'Q1 Roadmap' with our milestone list"
113
+
114
+ **Read and update a canvas:**
115
+ > "Get the canvas F12345 and update it with the latest status"
116
+
117
+ **Share a canvas with specific users:**
118
+ > "Give users U123 and U456 write access to canvas F12345"
@@ -16,6 +16,9 @@ For production agents with company-specific prompts, tools, and configs, create
16
16
 
17
17
  ```bash
18
18
  mkdir my-agents && cd my-agents
19
+ python3 -m venv .venv
20
+ source .venv/bin/activate
21
+ pip install python-slack-agents
19
22
  slack-agents init my-agents
20
23
  pip install -e .
21
24
  ```
@@ -6,9 +6,32 @@
6
6
  - A Slack workspace (all plans supported, including free)
7
7
  - API key for your LLM provider (Anthropic and/or OpenAI)
8
8
 
9
- ## Installation
9
+ ## New Project
10
10
 
11
11
  ```bash
12
+ mkdir my-agents && cd my-agents
13
+ python3 -m venv .venv
14
+ source .venv/bin/activate
15
+ pip install python-slack-agents
16
+
17
+ # Scaffold the project
18
+ slack-agents init my-agents
19
+
20
+ # Add your tokens and install for development
21
+ cp .env.example .env # add your Slack and LLM tokens (see below)
22
+ pip install -e .
23
+
24
+ # Run the hello-world agent
25
+ slack-agents run agents/hello-world
26
+ ```
27
+
28
+ ## Framework Development
29
+
30
+ If you're working on the framework itself:
31
+
32
+ ```bash
33
+ git clone https://github.com/CompareNetworks/python-slack-agents.git
34
+ cd python-slack-agents
12
35
  python3 -m venv .venv
13
36
  source .venv/bin/activate
14
37
  pip install -e ".[dev]"
@@ -40,7 +63,7 @@ ANTHROPIC_API_KEY=sk-ant-...
40
63
  - Copy: App Token (eg, SLACK_APP_TOKEN=xapp-...)
41
64
  - Settings > Install App
42
65
  - Copy: Bot User OAuth Token (eg, SLACK_BOT_TOKEN=xoxb-...)
43
- 3. If App does not appeat in your Slack client:
66
+ 3. If App does not appear in your Slack client:
44
67
  - ... > Tools > Apps > (search by name and add the app)
45
68
 
46
69
  ## Download Fonts
@@ -53,12 +76,6 @@ python -m slack_agents.scripts.download_fonts
53
76
 
54
77
  This downloads `DejaVuSans.ttf` and `DejaVuSans-Bold.ttf` into `fonts/` (~700KB total). Without these fonts, PDF generation falls back to Helvetica (latin-1 only).
55
78
 
56
- ## Running an Agent
57
-
58
- ```bash
59
- slack-agents run agents/hello-world
60
- ```
61
-
62
79
  ## Optional: PostgreSQL
63
80
 
64
81
  For conversation persistence via PostgreSQL, update your agent's `config.yaml`:
@@ -1,7 +1,8 @@
1
1
  # python-slack-agents: Complete Reference
2
2
 
3
3
  > A Python framework for deploying AI agents as Slack bots.
4
- > Each agent is a YAML config and a system prompt — pick your LLM, connect some MCP tools, and `slack-agents run`.
4
+ > Each agent is a YAML config and a system prompt — pick your LLM,
5
+ > connect some MCP tools, and `slack-agents run`.
5
6
 
6
7
  - **Package:** `pip install python-slack-agents`
7
8
  - **CLI entry point:** `slack-agents`
@@ -11,15 +12,26 @@
11
12
 
12
13
  ## How to read this document
13
14
 
14
- This file is a concatenation of all documentation files, designed to be consumed in a single read.
15
- The sections below correspond to individual doc files in the `docs/` directory.
15
+ This file is a concatenation of all documentation files,
16
+ designed to be consumed in a single read.
17
+ The sections below correspond to individual doc files
18
+ in the `docs/` directory.
16
19
 
17
20
  ### Key concepts
18
21
 
19
- - **Config-driven:** each agent is a directory with `config.yaml` + `system_prompt.txt`. All behavior is configured in YAML.
20
- - **Plugin pattern:** every pluggable component (LLM, storage, tools, access) uses a `type` field with a dotted Python import path pointing to a module with a `Provider` class. All other config keys are passed as kwargs to `Provider.__init__`.
21
- - **Two kinds of tool providers:** `BaseToolProvider` (tools the LLM calls) and `BaseFileImporterProvider` (file handlers the *framework* calls automatically — invisible to the LLM). Both are configured under `tools:` in config.yaml.
22
- - **Environment variables:** `{ENV_VAR}` patterns in config values are resolved from environment variables at startup.
22
+ - **Config-driven:** each agent is a directory with
23
+ `config.yaml` + `system_prompt.txt`.
24
+ All behavior is configured in YAML.
25
+ - **Plugin pattern:** every pluggable component (LLM, storage,
26
+ tools, access) uses a `type` field with a dotted Python import
27
+ path pointing to a module with a `Provider` class. All other
28
+ config keys are passed as kwargs to `Provider.__init__`.
29
+ - **Two kinds of tool providers:** `BaseToolProvider` (tools the
30
+ LLM calls) and `BaseFileImporterProvider` (file handlers the
31
+ *framework* calls automatically — invisible to the LLM). Both
32
+ are configured under `tools:` in config.yaml.
33
+ - **Environment variables:** `{ENV_VAR}` patterns in config values
34
+ are resolved from environment variables at startup.
23
35
 
24
36
  ---
25
37
 
@@ -31,9 +43,32 @@ The sections below correspond to individual doc files in the `docs/` directory.
31
43
  - A Slack workspace (all plans supported, including free)
32
44
  - API key for your LLM provider (Anthropic and/or OpenAI)
33
45
 
34
- ## Installation
46
+ ## New Project
35
47
 
36
48
  ```bash
49
+ mkdir my-agents && cd my-agents
50
+ python3 -m venv .venv
51
+ source .venv/bin/activate
52
+ pip install python-slack-agents
53
+
54
+ # Scaffold the project
55
+ slack-agents init my-agents
56
+
57
+ # Add your tokens and install for development
58
+ cp .env.example .env # add your Slack and LLM tokens (see below)
59
+ pip install -e .
60
+
61
+ # Run the hello-world agent
62
+ slack-agents run agents/hello-world
63
+ ```
64
+
65
+ ## Framework Development
66
+
67
+ If you're working on the framework itself:
68
+
69
+ ```bash
70
+ git clone https://github.com/CompareNetworks/python-slack-agents.git
71
+ cd python-slack-agents
37
72
  python3 -m venv .venv
38
73
  source .venv/bin/activate
39
74
  pip install -e ".[dev]"
@@ -65,7 +100,7 @@ ANTHROPIC_API_KEY=sk-ant-...
65
100
  - Copy: App Token (eg, SLACK_APP_TOKEN=xapp-...)
66
101
  - Settings > Install App
67
102
  - Copy: Bot User OAuth Token (eg, SLACK_BOT_TOKEN=xoxb-...)
68
- 3. If App does not appeat in your Slack client:
103
+ 3. If App does not appear in your Slack client:
69
104
  - ... > Tools > Apps > (search by name and add the app)
70
105
 
71
106
  ## Download Fonts
@@ -78,12 +113,6 @@ python -m slack_agents.scripts.download_fonts
78
113
 
79
114
  This downloads `DejaVuSans.ttf` and `DejaVuSans-Bold.ttf` into `fonts/` (~700KB total). Without these fonts, PDF generation falls back to Helvetica (latin-1 only).
80
115
 
81
- ## Running an Agent
82
-
83
- ```bash
84
- slack-agents run agents/hello-world
85
- ```
86
-
87
116
  ## Optional: PostgreSQL
88
117
 
89
118
  For conversation persistence via PostgreSQL, update your agent's `config.yaml`:
@@ -573,7 +602,7 @@ Any extra keys beyond `type` are passed as keyword arguments to the `Provider` c
573
602
 
574
603
  # Canvas Tool
575
604
 
576
- The canvas tool lets your agent create, read, update, list, and delete [Slack canvases](https://slack.com/features/canvas) — rich documents that live inside Slack. It exposes a simple file-like API: no section IDs or low-level operations needed.
605
+ The canvas tool lets your agent create, read, update, and delete [Slack canvases](https://slack.com/features/canvas) — rich documents that live inside Slack. It exposes a simple file-like API: no section IDs or low-level operations needed.
577
606
 
578
607
  ## Setup
579
608
 
@@ -583,9 +612,9 @@ In your Slack app settings (**OAuth & Permissions → Scopes → Bot Token Scope
583
612
 
584
613
  | Scope | Purpose |
585
614
  |-------|---------|
586
- | `canvases:read` | Read canvas content and list canvases |
615
+ | `canvases:read` | Read canvas content |
587
616
  | `canvases:write` | Create, update, delete canvases and manage access |
588
- | `files:read` | List canvases and read content (uses `files.list` / `files.info` APIs) |
617
+ | `files:read` | Read canvas content and check user access (uses `files.info` API) |
589
618
 
590
619
  After adding scopes, reinstall the app to your workspace.
591
620
 
@@ -608,13 +637,49 @@ To expose only specific tools:
608
637
  - "canvas_create"
609
638
  - "canvas_get"
610
639
  - "canvas_update"
611
- - "canvas_list"
612
640
  ```
613
641
 
614
- ## Slack plan requirements
642
+ ### 3. Canvas file importer (optional)
643
+
644
+ To let users attach canvases to messages and have the agent read them automatically, add the canvas importer:
645
+
646
+ ```yaml
647
+ tools:
648
+ canvas-importer:
649
+ type: slack_agents.tools.canvas_importer
650
+ bot_token: "{SLACK_BOT_TOKEN}"
651
+ allowed_functions: [".*"]
652
+ ```
653
+
654
+ When a user attaches a canvas (mimetype `application/vnd.slack-docs`) to a message, the importer reads its markdown content via the Slack API and includes it in the conversation context. Authorization is enforced — the agent only reads canvases the requesting user can access.
615
655
 
616
- - **Free plans**: 1 canvas per channel/DM. `canvas_create` requires `channel_id`.
617
- - **Paid plans** (Pro, Business+, Enterprise Grid): Unlimited canvases. `channel_id` is optional.
656
+ ## Authorization model
657
+
658
+ All canvas operations enforce **user-level permissions**. The agent acts as a delegate for the requesting user — it will not access canvases the user can't access themselves.
659
+
660
+ Access is resolved from `files.info` metadata (no extra storage or scopes needed):
661
+
662
+ | Check | Source field |
663
+ |-------|-------------|
664
+ | Is user the creator? | `user` / `canvas_creator_id` |
665
+ | Per-user access | `dm_mpdm_users_with_file_access` |
666
+ | Workspace-wide access | `org_or_workspace_access` |
667
+
668
+ **Access levels** (higher includes lower): `owner` > `write` > `read`
669
+
670
+ **Required access per tool:**
671
+
672
+ | Tool | Required |
673
+ |------|----------|
674
+ | `canvas_create` | — (no existing canvas) |
675
+ | `canvas_get` | read |
676
+ | `canvas_update` | write |
677
+ | `canvas_delete` | owner |
678
+ | `canvas_access_get` | read |
679
+ | `canvas_access_add` | owner |
680
+ | `canvas_access_remove` | owner |
681
+
682
+ If the user lacks sufficient access, the tool returns an error message explaining what access level is needed.
618
683
 
619
684
  ## Canvas content format
620
685
 
@@ -635,25 +700,24 @@ Block Kit is **not** supported in canvases.
635
700
 
636
701
  | Tool | Description |
637
702
  |------|-------------|
638
- | `canvas_create` | Create a canvas with title + content. Optional `channel_id` to share it. |
703
+ | `canvas_create` | Create a standalone canvas with title + content. |
639
704
  | `canvas_get` | Get a canvas by ID. Returns title, full markdown content, and permalink. |
640
705
  | `canvas_update` | Update a canvas — replace content, rename title, or both. |
641
706
  | `canvas_delete` | Permanently delete a canvas. |
642
- | `canvas_list` | List canvases visible to the bot. Optional `channel_id` filter. |
643
707
  | `canvas_access_get` | Get sharing/access info for a canvas. |
644
- | `canvas_access_add` | Grant read/write/owner access to users or channels. |
645
- | `canvas_access_remove` | Remove access for users or channels. |
708
+ | `canvas_access_add` | Grant read/write/owner access to users. Optionally set `org_access` for workspace-wide access. |
709
+ | `canvas_access_remove` | Remove access for users. |
646
710
 
647
711
  ## Example usage
648
712
 
649
- **Create a canvas in a channel:**
650
- > "Create a canvas in #project-updates titled 'Q1 Roadmap' with our milestone list"
713
+ **Create a canvas:**
714
+ > "Create a canvas titled 'Q1 Roadmap' with our milestone list"
651
715
 
652
716
  **Read and update a canvas:**
653
717
  > "Get the canvas F12345 and update it with the latest status"
654
718
 
655
- **Share a canvas with another team:**
656
- > "Give the #design channel write access to canvas F12345"
719
+ **Share a canvas with specific users:**
720
+ > "Give users U123 and U456 write access to canvas F12345"
657
721
 
658
722
  ---
659
723
 
@@ -1101,6 +1165,9 @@ For production agents with company-specific prompts, tools, and configs, create
1101
1165
 
1102
1166
  ```bash
1103
1167
  mkdir my-agents && cd my-agents
1168
+ python3 -m venv .venv
1169
+ source .venv/bin/activate
1170
+ pip install python-slack-agents
1104
1171
  slack-agents init my-agents
1105
1172
  pip install -e .
1106
1173
  ```
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "python-slack-agents"
7
- version = "0.6.0"
7
+ version = "0.6.2"
8
8
  description = "A Python framework for deploying AI agents as Slack bots"
9
9
  authors = [{name = "Eric Pichon", email = "epichon@comparenetworks.com"}]
10
10
  readme = "README.md"
@@ -1,7 +1,7 @@
1
1
  """slack-agents: A Python framework for deploying AI agents as Slack bots."""
2
2
 
3
3
  from importlib.metadata import version
4
- from typing import TypedDict
4
+ from typing import NotRequired, TypedDict
5
5
 
6
6
  __version__ = version("python-slack-agents")
7
7
 
@@ -23,3 +23,4 @@ class InputFile(TypedDict):
23
23
  file_bytes: bytes
24
24
  mimetype: str
25
25
  filename: str
26
+ file_id: NotRequired[str]