open-swarm 0.1.1743070217__py3-none-any.whl → 0.1.1743362777__py3-none-any.whl

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 (217) hide show
  1. open_swarm-0.1.1743362777.dist-info/METADATA +217 -0
  2. open_swarm-0.1.1743362777.dist-info/RECORD +260 -0
  3. {open_swarm-0.1.1743070217.dist-info → open_swarm-0.1.1743362777.dist-info}/WHEEL +1 -2
  4. open_swarm-0.1.1743362777.dist-info/entry_points.txt +2 -0
  5. swarm/__init__.py +0 -2
  6. swarm/auth.py +53 -49
  7. swarm/blueprints/README.md +67 -0
  8. swarm/blueprints/burnt_noodles/blueprint_burnt_noodles.py +412 -0
  9. swarm/blueprints/chatbot/blueprint_chatbot.py +98 -0
  10. swarm/blueprints/chatbot/templates/chatbot/chatbot.html +33 -0
  11. swarm/blueprints/digitalbutlers/blueprint_digitalbutlers.py +183 -0
  12. swarm/blueprints/dilbot_universe/blueprint_dilbot_universe.py +285 -0
  13. swarm/blueprints/divine_code/__init__.py +0 -0
  14. swarm/blueprints/divine_code/apps.py +11 -0
  15. swarm/blueprints/divine_code/blueprint_divine_code.py +219 -0
  16. swarm/blueprints/django_chat/apps.py +6 -0
  17. swarm/blueprints/django_chat/blueprint_django_chat.py +84 -0
  18. swarm/blueprints/django_chat/templates/django_chat/django_chat_webpage.html +37 -0
  19. swarm/blueprints/django_chat/urls.py +8 -0
  20. swarm/blueprints/django_chat/views.py +32 -0
  21. swarm/blueprints/echocraft/blueprint_echocraft.py +44 -0
  22. swarm/blueprints/family_ties/apps.py +11 -0
  23. swarm/blueprints/family_ties/blueprint_family_ties.py +152 -0
  24. swarm/blueprints/family_ties/models.py +19 -0
  25. swarm/blueprints/family_ties/serializers.py +7 -0
  26. swarm/blueprints/family_ties/settings.py +16 -0
  27. swarm/blueprints/family_ties/urls.py +10 -0
  28. swarm/blueprints/family_ties/views.py +26 -0
  29. swarm/blueprints/flock/__init__.py +0 -0
  30. swarm/blueprints/gaggle/blueprint_gaggle.py +184 -0
  31. swarm/blueprints/gotchaman/blueprint_gotchaman.py +232 -0
  32. swarm/blueprints/mcp_demo/blueprint_mcp_demo.py +133 -0
  33. swarm/blueprints/messenger/templates/messenger/messenger.html +46 -0
  34. swarm/blueprints/mission_improbable/blueprint_mission_improbable.py +234 -0
  35. swarm/blueprints/monkai_magic/blueprint_monkai_magic.py +248 -0
  36. swarm/blueprints/nebula_shellz/blueprint_nebula_shellz.py +156 -0
  37. swarm/blueprints/omniplex/blueprint_omniplex.py +221 -0
  38. swarm/blueprints/rue_code/__init__.py +0 -0
  39. swarm/blueprints/rue_code/blueprint_rue_code.py +291 -0
  40. swarm/blueprints/suggestion/blueprint_suggestion.py +110 -0
  41. swarm/blueprints/unapologetic_press/blueprint_unapologetic_press.py +298 -0
  42. swarm/blueprints/whiskeytango_foxtrot/__init__.py +0 -0
  43. swarm/blueprints/whiskeytango_foxtrot/apps.py +11 -0
  44. swarm/blueprints/whiskeytango_foxtrot/blueprint_whiskeytango_foxtrot.py +256 -0
  45. swarm/extensions/blueprint/__init__.py +30 -15
  46. swarm/extensions/blueprint/agent_utils.py +16 -40
  47. swarm/extensions/blueprint/blueprint_base.py +141 -543
  48. swarm/extensions/blueprint/blueprint_discovery.py +112 -98
  49. swarm/extensions/blueprint/cli_handler.py +185 -0
  50. swarm/extensions/blueprint/config_loader.py +122 -0
  51. swarm/extensions/blueprint/django_utils.py +181 -79
  52. swarm/extensions/blueprint/interactive_mode.py +1 -1
  53. swarm/extensions/config/config_loader.py +83 -200
  54. swarm/extensions/launchers/build_swarm_wrapper.py +0 -0
  55. swarm/extensions/launchers/swarm_cli.py +199 -287
  56. swarm/llm/chat_completion.py +26 -55
  57. swarm/management/__init__.py +0 -0
  58. swarm/management/commands/__init__.py +0 -0
  59. swarm/management/commands/runserver.py +58 -0
  60. swarm/permissions.py +38 -0
  61. swarm/serializers.py +96 -5
  62. swarm/settings.py +95 -110
  63. swarm/static/contrib/fonts/fontawesome-webfont.ttf +7 -0
  64. swarm/static/contrib/fonts/fontawesome-webfont.woff +7 -0
  65. swarm/static/contrib/fonts/fontawesome-webfont.woff2 +7 -0
  66. swarm/static/contrib/markedjs/marked.min.js +6 -0
  67. swarm/static/contrib/tabler-icons/adjustments-horizontal.svg +27 -0
  68. swarm/static/contrib/tabler-icons/alert-triangle.svg +21 -0
  69. swarm/static/contrib/tabler-icons/archive.svg +21 -0
  70. swarm/static/contrib/tabler-icons/artboard.svg +27 -0
  71. swarm/static/contrib/tabler-icons/automatic-gearbox.svg +23 -0
  72. swarm/static/contrib/tabler-icons/box-multiple.svg +19 -0
  73. swarm/static/contrib/tabler-icons/carambola.svg +19 -0
  74. swarm/static/contrib/tabler-icons/copy.svg +20 -0
  75. swarm/static/contrib/tabler-icons/download.svg +21 -0
  76. swarm/static/contrib/tabler-icons/edit.svg +21 -0
  77. swarm/static/contrib/tabler-icons/filled/carambola.svg +13 -0
  78. swarm/static/contrib/tabler-icons/filled/paint.svg +13 -0
  79. swarm/static/contrib/tabler-icons/headset.svg +22 -0
  80. swarm/static/contrib/tabler-icons/layout-sidebar-left-collapse.svg +21 -0
  81. swarm/static/contrib/tabler-icons/layout-sidebar-left-expand.svg +21 -0
  82. swarm/static/contrib/tabler-icons/layout-sidebar-right-collapse.svg +21 -0
  83. swarm/static/contrib/tabler-icons/layout-sidebar-right-expand.svg +21 -0
  84. swarm/static/contrib/tabler-icons/message-chatbot.svg +22 -0
  85. swarm/static/contrib/tabler-icons/message-star.svg +22 -0
  86. swarm/static/contrib/tabler-icons/message-x.svg +23 -0
  87. swarm/static/contrib/tabler-icons/message.svg +21 -0
  88. swarm/static/contrib/tabler-icons/paperclip.svg +18 -0
  89. swarm/static/contrib/tabler-icons/playlist-add.svg +22 -0
  90. swarm/static/contrib/tabler-icons/robot.svg +26 -0
  91. swarm/static/contrib/tabler-icons/search.svg +19 -0
  92. swarm/static/contrib/tabler-icons/settings.svg +20 -0
  93. swarm/static/contrib/tabler-icons/thumb-down.svg +19 -0
  94. swarm/static/contrib/tabler-icons/thumb-up.svg +19 -0
  95. swarm/static/css/dropdown.css +22 -0
  96. swarm/static/htmx/htmx.min.js +0 -0
  97. swarm/static/js/dropdown.js +23 -0
  98. swarm/static/rest_mode/css/base.css +470 -0
  99. swarm/static/rest_mode/css/chat-history.css +286 -0
  100. swarm/static/rest_mode/css/chat.css +251 -0
  101. swarm/static/rest_mode/css/chatbot.css +74 -0
  102. swarm/static/rest_mode/css/chatgpt.css +62 -0
  103. swarm/static/rest_mode/css/colors/corporate.css +74 -0
  104. swarm/static/rest_mode/css/colors/pastel.css +81 -0
  105. swarm/static/rest_mode/css/colors/tropical.css +82 -0
  106. swarm/static/rest_mode/css/general.css +142 -0
  107. swarm/static/rest_mode/css/layout.css +167 -0
  108. swarm/static/rest_mode/css/layouts/messenger-layout.css +17 -0
  109. swarm/static/rest_mode/css/layouts/minimalist-layout.css +57 -0
  110. swarm/static/rest_mode/css/layouts/mobile-layout.css +8 -0
  111. swarm/static/rest_mode/css/messages.css +84 -0
  112. swarm/static/rest_mode/css/messenger.css +135 -0
  113. swarm/static/rest_mode/css/settings.css +91 -0
  114. swarm/static/rest_mode/css/simple.css +44 -0
  115. swarm/static/rest_mode/css/slack.css +58 -0
  116. swarm/static/rest_mode/css/style.css +156 -0
  117. swarm/static/rest_mode/css/theme.css +30 -0
  118. swarm/static/rest_mode/css/toast.css +40 -0
  119. swarm/static/rest_mode/js/auth.js +9 -0
  120. swarm/static/rest_mode/js/blueprint.js +41 -0
  121. swarm/static/rest_mode/js/blueprintUtils.js +12 -0
  122. swarm/static/rest_mode/js/chatLogic.js +79 -0
  123. swarm/static/rest_mode/js/debug.js +63 -0
  124. swarm/static/rest_mode/js/events.js +98 -0
  125. swarm/static/rest_mode/js/main.js +19 -0
  126. swarm/static/rest_mode/js/messages.js +264 -0
  127. swarm/static/rest_mode/js/messengerLogic.js +355 -0
  128. swarm/static/rest_mode/js/modules/apiService.js +84 -0
  129. swarm/static/rest_mode/js/modules/blueprintManager.js +162 -0
  130. swarm/static/rest_mode/js/modules/chatHistory.js +110 -0
  131. swarm/static/rest_mode/js/modules/debugLogger.js +14 -0
  132. swarm/static/rest_mode/js/modules/eventHandlers.js +107 -0
  133. swarm/static/rest_mode/js/modules/messageProcessor.js +120 -0
  134. swarm/static/rest_mode/js/modules/state.js +7 -0
  135. swarm/static/rest_mode/js/modules/userInteractions.js +29 -0
  136. swarm/static/rest_mode/js/modules/validation.js +23 -0
  137. swarm/static/rest_mode/js/rendering.js +119 -0
  138. swarm/static/rest_mode/js/settings.js +130 -0
  139. swarm/static/rest_mode/js/sidebar.js +94 -0
  140. swarm/static/rest_mode/js/simpleLogic.js +37 -0
  141. swarm/static/rest_mode/js/slackLogic.js +66 -0
  142. swarm/static/rest_mode/js/splash.js +76 -0
  143. swarm/static/rest_mode/js/theme.js +111 -0
  144. swarm/static/rest_mode/js/toast.js +36 -0
  145. swarm/static/rest_mode/js/ui.js +265 -0
  146. swarm/static/rest_mode/js/validation.js +57 -0
  147. swarm/static/rest_mode/svg/animated_spinner.svg +12 -0
  148. swarm/static/rest_mode/svg/arrow_down.svg +5 -0
  149. swarm/static/rest_mode/svg/arrow_left.svg +5 -0
  150. swarm/static/rest_mode/svg/arrow_right.svg +5 -0
  151. swarm/static/rest_mode/svg/arrow_up.svg +5 -0
  152. swarm/static/rest_mode/svg/attach.svg +8 -0
  153. swarm/static/rest_mode/svg/avatar.svg +7 -0
  154. swarm/static/rest_mode/svg/canvas.svg +6 -0
  155. swarm/static/rest_mode/svg/chat_history.svg +4 -0
  156. swarm/static/rest_mode/svg/close.svg +5 -0
  157. swarm/static/rest_mode/svg/copy.svg +4 -0
  158. swarm/static/rest_mode/svg/dark_mode.svg +3 -0
  159. swarm/static/rest_mode/svg/edit.svg +5 -0
  160. swarm/static/rest_mode/svg/layout.svg +9 -0
  161. swarm/static/rest_mode/svg/logo.svg +29 -0
  162. swarm/static/rest_mode/svg/logout.svg +5 -0
  163. swarm/static/rest_mode/svg/mobile.svg +5 -0
  164. swarm/static/rest_mode/svg/new_chat.svg +4 -0
  165. swarm/static/rest_mode/svg/not_visible.svg +5 -0
  166. swarm/static/rest_mode/svg/plus.svg +7 -0
  167. swarm/static/rest_mode/svg/run_code.svg +6 -0
  168. swarm/static/rest_mode/svg/save.svg +4 -0
  169. swarm/static/rest_mode/svg/search.svg +6 -0
  170. swarm/static/rest_mode/svg/settings.svg +4 -0
  171. swarm/static/rest_mode/svg/speaker.svg +5 -0
  172. swarm/static/rest_mode/svg/stop.svg +6 -0
  173. swarm/static/rest_mode/svg/thumbs_down.svg +3 -0
  174. swarm/static/rest_mode/svg/thumbs_up.svg +3 -0
  175. swarm/static/rest_mode/svg/toggle_off.svg +6 -0
  176. swarm/static/rest_mode/svg/toggle_on.svg +6 -0
  177. swarm/static/rest_mode/svg/trash.svg +10 -0
  178. swarm/static/rest_mode/svg/undo.svg +3 -0
  179. swarm/static/rest_mode/svg/visible.svg +8 -0
  180. swarm/static/rest_mode/svg/voice.svg +10 -0
  181. swarm/templates/account/login.html +22 -0
  182. swarm/templates/account/signup.html +32 -0
  183. swarm/templates/base.html +30 -0
  184. swarm/templates/chat.html +43 -0
  185. swarm/templates/index.html +35 -0
  186. swarm/templates/rest_mode/components/chat_sidebar.html +55 -0
  187. swarm/templates/rest_mode/components/header.html +45 -0
  188. swarm/templates/rest_mode/components/main_chat_pane.html +41 -0
  189. swarm/templates/rest_mode/components/settings_dialog.html +97 -0
  190. swarm/templates/rest_mode/components/splash_screen.html +7 -0
  191. swarm/templates/rest_mode/components/top_bar.html +28 -0
  192. swarm/templates/rest_mode/message_ui.html +50 -0
  193. swarm/templates/rest_mode/slackbot.html +30 -0
  194. swarm/templates/simple_blueprint_page.html +24 -0
  195. swarm/templates/websocket_partials/final_system_message.html +3 -0
  196. swarm/templates/websocket_partials/system_message.html +4 -0
  197. swarm/templates/websocket_partials/user_message.html +5 -0
  198. swarm/urls.py +57 -74
  199. swarm/utils/log_utils.py +63 -0
  200. swarm/views/api_views.py +48 -39
  201. swarm/views/chat_views.py +156 -70
  202. swarm/views/core_views.py +85 -90
  203. swarm/views/model_views.py +64 -121
  204. swarm/views/utils.py +65 -441
  205. open_swarm-0.1.1743070217.dist-info/METADATA +0 -258
  206. open_swarm-0.1.1743070217.dist-info/RECORD +0 -89
  207. open_swarm-0.1.1743070217.dist-info/entry_points.txt +0 -3
  208. open_swarm-0.1.1743070217.dist-info/top_level.txt +0 -1
  209. swarm/agent/agent.py +0 -49
  210. swarm/core.py +0 -326
  211. swarm/extensions/mcp/__init__.py +0 -1
  212. swarm/extensions/mcp/cache_utils.py +0 -36
  213. swarm/extensions/mcp/mcp_client.py +0 -341
  214. swarm/extensions/mcp/mcp_constants.py +0 -7
  215. swarm/extensions/mcp/mcp_tool_provider.py +0 -110
  216. swarm/types.py +0 -126
  217. {open_swarm-0.1.1743070217.dist-info → open_swarm-0.1.1743362777.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,217 @@
1
+ Metadata-Version: 2.4
2
+ Name: open-swarm
3
+ Version: 0.1.1743362777
4
+ Summary: Open Swarm: Orchestrating AI Agent Swarms with Django
5
+ Project-URL: Homepage, https://github.com/yourusername/open-swarm
6
+ Project-URL: Documentation, https://github.com/yourusername/open-swarm/blob/main/README.md
7
+ Project-URL: Repository, https://github.com/yourusername/open-swarm.git
8
+ Project-URL: Changelog, https://github.com/yourusername/open-swarm/blob/main/CHANGELOG.md
9
+ Author-email: Matthew Hand <matthewhandau@gmail.com>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Framework :: Django :: 4.2
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Natural Language :: English
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.10
19
+ Classifier: Programming Language :: Python :: 3.11
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
22
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: beautifulsoup4>=4.12.0
25
+ Requires-Dist: celery>=5.3.0
26
+ Requires-Dist: channels-redis>=4.0
27
+ Requires-Dist: channels>=4.0
28
+ Requires-Dist: django-cors-headers>=4.0.0
29
+ Requires-Dist: django-environ>=0.11.0
30
+ Requires-Dist: django-extensions>=3.2.0
31
+ Requires-Dist: django-filter>=23.0
32
+ Requires-Dist: django-model-utils>=4.3.0
33
+ Requires-Dist: django<5.0,>=4.2
34
+ Requires-Dist: djangorestframework<4.0,>=3.14
35
+ Requires-Dist: drf-spectacular>=0.28.0
36
+ Requires-Dist: drf-yasg>=1.21.0
37
+ Requires-Dist: google-api-python-client>=2.100.0
38
+ Requires-Dist: google-auth-httplib2>=0.1.0
39
+ Requires-Dist: google-auth-oauthlib>=1.2.1
40
+ Requires-Dist: gunicorn>=21.0.0
41
+ Requires-Dist: httpx<0.26.0,>=0.25.2
42
+ Requires-Dist: jinja2>=3.1.6
43
+ Requires-Dist: openai-agents>=0.0.1
44
+ Requires-Dist: openai<2.0.0,>=1.3.0
45
+ Requires-Dist: platformdirs>=4.0.0
46
+ Requires-Dist: psycopg2-binary>=2.9.0
47
+ Requires-Dist: pyinstaller>=5.13.0
48
+ Requires-Dist: python-dotenv>=1.0.0
49
+ Requires-Dist: pyyaml>=6.0
50
+ Requires-Dist: qdrant-client>=1.6.0
51
+ Requires-Dist: redis>=5.0.0
52
+ Requires-Dist: requests>=2.31.0
53
+ Requires-Dist: tiktoken>=0.5.0
54
+ Requires-Dist: typer>=0.9.0
55
+ Requires-Dist: uvicorn>=0.23.0
56
+ Provides-Extra: dev
57
+ Requires-Dist: factory-boy>=3.3.0; extra == 'dev'
58
+ Requires-Dist: ipdb; extra == 'dev'
59
+ Requires-Dist: ipython; extra == 'dev'
60
+ Requires-Dist: mypy>=1.5.0; extra == 'dev'
61
+ Requires-Dist: pre-commit>=3.5.0; extra == 'dev'
62
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
63
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
64
+ Requires-Dist: pytest-django>=4.7.0; extra == 'dev'
65
+ Requires-Dist: pytest-mock>=3.11.0; extra == 'dev'
66
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
67
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
68
+ Requires-Dist: uv>=0.1.11; extra == 'dev'
69
+ Provides-Extra: docs
70
+ Requires-Dist: myst-parser>=2.0.0; extra == 'docs'
71
+ Requires-Dist: sphinx-rtd-theme>=1.3.0; extra == 'docs'
72
+ Requires-Dist: sphinx>=7.0.0; extra == 'docs'
73
+ Provides-Extra: test
74
+ Requires-Dist: anyio>=4.0.0; extra == 'test'
75
+ Requires-Dist: factory-boy>=3.3.0; extra == 'test'
76
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
77
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'test'
78
+ Requires-Dist: pytest-django>=4.7.0; extra == 'test'
79
+ Requires-Dist: pytest-env>=1.0.0; extra == 'test'
80
+ Requires-Dist: pytest-mock>=3.11.0; extra == 'test'
81
+ Requires-Dist: pytest-xdist; extra == 'test'
82
+ Requires-Dist: pytest>=8.0.0; extra == 'test'
83
+ Requires-Dist: respx>=0.20.0; extra == 'test'
84
+ Requires-Dist: sseclient-py>=1.7.2; extra == 'test'
85
+ Description-Content-Type: text/markdown
86
+
87
+ # Open Swarm
88
+
89
+ <div align="center">
90
+ <img src="assets/images/openswarm-project-image.jpg" alt="Project Logo" width="70%"/>
91
+ </div>
92
+
93
+ **Open Swarm** is a Python framework for creating, managing, and deploying autonomous agent swarms. It leverages the `openai-agents` library for core agent functionality and provides a structured way to build complex, multi-agent workflows using **Blueprints**.
94
+
95
+ ---
96
+
97
+ ## Core Concepts
98
+
99
+ * **Agents:** Individual AI units performing specific tasks, powered by LLMs (like GPT-4, Claude, etc.). Built using the `openai-agents` SDK.
100
+ * **Blueprints:** Python classes (`BlueprintBase` subclasses) defining a swarm's structure, agents, coordination logic, and external dependencies (like required environment variables or MCP servers). They act as reusable templates for specific tasks (e.g., code generation, research, data analysis).
101
+ * **MCP (Mission Control Platform) Servers:** Optional external processes providing specialized capabilities (tools) to agents, such as filesystem access, web browsing, database interaction, or interacting with specific APIs (Slack, Monday.com, etc.). Agents interact with MCP servers via a standardized communication protocol.
102
+ * **Configuration (`swarm_config.json`):** A central JSON file defining available LLM profiles (API keys, models) and configurations for MCP servers. Typically managed via `swarm-cli` in `~/.config/swarm/`.
103
+ * **`swarm-cli`:** A command-line tool for managing blueprints (adding, listing, running, installing) and the `swarm_config.json` file. Uses XDG directories for storing blueprints (`~/.local/share/swarm/blueprints/`) and configuration (`~/.config/swarm/`).
104
+ * **`swarm-api`:** A launcher for the Django/DRF backend that exposes installed blueprints via an OpenAI-compatible REST API (`/v1/models`, `/v1/chat/completions`).
105
+
106
+ ---
107
+
108
+ ## Quickstart (Docker - Recommended)
109
+
110
+ This is the easiest and recommended way to get started, especially for deploying the API service.
111
+
112
+ **Prerequisites:**
113
+ * Docker ([Install Docker](https://docs.docker.com/engine/install/))
114
+ * Docker Compose ([Install Docker Compose](https://docs.docker.com/compose/install/))
115
+
116
+ **Steps:**
117
+
118
+ 1. **Clone the Repository:**
119
+ ```bash
120
+ git clone https://github.com/matthewhand/open-swarm.git
121
+ cd open-swarm
122
+ ```
123
+
124
+ 2. **Configure Environment:**
125
+ * Copy the example environment file:
126
+ ```bash
127
+ cp .env.example .env
128
+ ```
129
+ * Edit `.env` and add your necessary API keys (e.g., `OPENAI_API_KEY`).
130
+
131
+ 3. **Configure Docker Compose Overrides (Optional but Recommended):**
132
+ * Copy the override example:
133
+ ```bash
134
+ cp docker-compose.override.yaml.example docker-compose.override.yaml
135
+ ```
136
+ * Edit `docker-compose.override.yaml` to:
137
+ * Mount any local directories containing custom blueprints you want the API server to access (e.g., uncomment and adjust the `./my_custom_blueprints:/app/custom_blueprints:ro` line).
138
+ * Make any other necessary adjustments (ports, environment variables, etc.).
139
+
140
+ 4. **Start the Service:**
141
+ ```bash
142
+ docker compose up -d
143
+ ```
144
+ This will build the image (if not already pulled/built) and start the `open-swarm` service, exposing the API on port 8000 (or the port specified in your `.env`/override).
145
+
146
+ 5. **Verify API:**
147
+ * Check the available models (blueprints):
148
+ ```bash
149
+ curl http://localhost:8000/v1/models
150
+ ```
151
+ * Send a chat completion request:
152
+ ```bash
153
+ curl http://localhost:8000/v1/chat/completions \
154
+ -H "Content-Type: application/json" \
155
+ -d '{
156
+ "model": "echocraft",
157
+ "messages": [{"role": "user", "content": "Hello Docker!"}]
158
+ }'
159
+ ```
160
+ *(Replace `echocraft` with a blueprint name available in your mounted volumes or the base image).*
161
+
162
+ ---
163
+
164
+ ## Usage Modes
165
+
166
+ Open Swarm offers several ways to interact with your blueprints:
167
+
168
+ 1. **Run via `swarm-api` (OpenAI-Compatible REST API):**
169
+ * **How:** Start the Django server (`uv run python manage.py runserver` or via Docker as shown above).
170
+ * **What:** Exposes blueprints listed in `settings.BLUEPRINT_DIRECTORY` (within the Docker container, this typically includes `/app/blueprints` and any volumes mounted in the override file) via `/v1/models` and `/v1/chat/completions`.
171
+ * **Auth:** If `SWARM_API_KEY` is set in `.env`, requests require an `Authorization: Bearer <your_key>` header. Otherwise, access is anonymous.
172
+ * **Security:** **Warning:** Running with anonymous access, especially when bound to `0.0.0.0`, can be insecure if blueprints have access to sensitive operations (filesystem, shell commands). **Setting `SWARM_API_KEY` is highly recommended for non-local deployments.**
173
+ * **(TODO) Web UI:** A future mode will integrate a simple web chat interface with the API server.
174
+
175
+ 2. **Run via `swarm-cli run`:**
176
+ * **How:** `swarm-cli run <blueprint_name> --instruction "Your single instruction"`
177
+ * **What:** Executes a blueprint managed by `swarm-cli` (located in `~/.local/share/swarm/blueprints/`) directly in the terminal. Uses configuration from `~/.config/swarm/swarm_config.json`.
178
+ * **Interactive Mode:** If you omit the `--instruction` argument (`swarm-cli run <blueprint_name>`), it will enter an interactive chat mode in the terminal.
179
+ * **Use Case:** Good for testing, debugging, interactive sessions, or running specific tasks locally without the API overhead.
180
+
181
+ 3. **Run via `swarm-cli install`:**
182
+ * **How:** `swarm-cli install <blueprint_name>`, then run `<blueprint_name> --instruction "..."`
183
+ * **What:** Creates a standalone executable for a managed blueprint using PyInstaller and places it in the user's binary directory (e.g., `~/.local/bin/` or similar, ensure it's in your `PATH`).
184
+ * **Use Case:** Convenient for frequently used blueprints that act like regular command-line tools.
185
+
186
+ 4. **Direct Python Execution:**
187
+ * **How:** `uv run python /path/to/your/blueprint_file.py --instruction "..."`
188
+ * **What:** Runs a specific blueprint Python file directly. Requires manual handling of configuration loading and dependencies.
189
+ * **Use Case:** Primarily for development and testing of a single blueprint file outside the managed environment.
190
+
191
+ ---
192
+
193
+ ## Further Documentation
194
+
195
+ This README provides a high-level overview and quickstart. For more detailed information, please refer to:
196
+
197
+ * **User Guide (`USERGUIDE.md`):** Detailed instructions on using `swarm-cli` commands for managing blueprints and configuration.
198
+ * **Development Guide (`DEVELOPMENT.md`):** Information for contributors and developers, including architecture details, testing strategies, project layout, and advanced topics like XDG paths and blueprint creation.
199
+ * **Example Blueprints (`src/swarm/blueprints/README.md`):** A list and description of the example blueprints included with the framework, showcasing various features and integration patterns.
200
+
201
+ ---
202
+
203
+ ## Contributing
204
+
205
+ Contributions are welcome! Please refer to the `CONTRIBUTING.md` file (if available) or open an issue/pull request on the repository.
206
+
207
+ ---
208
+
209
+ ## License
210
+
211
+ Open Swarm is provided under the MIT License. Refer to the [LICENSE](LICENSE) file for full details.
212
+
213
+ ---
214
+
215
+ ## Acknowledgements
216
+
217
+ This project builds upon concepts and code from the `openai-agents` library and potentially other open-source projects. Specific acknowledgements can be found in `DEVELOPMENT.md` or individual source files.
@@ -0,0 +1,260 @@
1
+ swarm/__init__.py,sha256=aT-yyX84tiZhihp0RAXYTADCo9dhOnmolQVfn4_NQa8,46
2
+ swarm/apps.py,sha256=up4C3m2JeyXeUcH-wYeReCuiOBVJ6404w9OfaRChLwM,2568
3
+ swarm/auth.py,sha256=M_29ksMrTgs5u-iyFTkIqZNOpRoYzkcm3drIokQYS9A,2654
4
+ swarm/consumers.py,sha256=wESLamkhbi4SEZt9k3yx6eU9ufOIZMCAL-OAXjJBGXE,5056
5
+ swarm/messages.py,sha256=CwADrjlj-uVmm-so1xIZvN1UkEWdzSn_hu7slfhuS8w,6549
6
+ swarm/models.py,sha256=Ix0WEYYqza2lbOEBNesikRCs3XGUPWmqQyMWzZYUaxM,1494
7
+ swarm/permissions.py,sha256=iM86fSL1TtgqJzgDkS3Dl82X6Xk7VDHWwdBDfs5RKWc,1671
8
+ swarm/serializers.py,sha256=4g3G2FdWpSIuLLC_SBKoNITw1b0G83Bxo7YHc-kjsro,4550
9
+ swarm/settings.py,sha256=rGPcnLSf6WetpeovBb6AhDzWi2GwaFbsQ8UZjRVTMtI,6334
10
+ swarm/tool_executor.py,sha256=KHM2mTGgbbTgWNN3fbV5c4MDY238OTLwaaqtkczFHFQ,12385
11
+ swarm/urls.py,sha256=9eRQWsB-Vs3Nmes4mtlZtk_Rvuixf4Y9uwrX9dVQ9Is,3292
12
+ swarm/util.py,sha256=G4x2hXopHhB7IdGCkUXGoykYWyiICnjxg7wcr-WqL8I,4644
13
+ swarm/wsgi.py,sha256=REM_u4HpMCkO0ddrOUXgtY-ITL-VTbRB1-WHvFJAtAU,408
14
+ swarm/agent/__init__.py,sha256=YESGu_UXEBxrlQwghodUMN0vmXZDwWMU7DclCUvoklA,104
15
+ swarm/blueprints/README.md,sha256=tsngbSB9N0tILcz_m1OGAjyKZQYlGTN-i5e5asq1GbE,8478
16
+ swarm/blueprints/burnt_noodles/blueprint_burnt_noodles.py,sha256=LwKVYTRRg6ceNpvbuzM-bl7NukBGNu3bOU9Q3h6WjOU,22834
17
+ swarm/blueprints/chatbot/blueprint_chatbot.py,sha256=D31OgSoxllhzn8f7cdVYflqzadN2SZ61rabPuK6EqQ8,4728
18
+ swarm/blueprints/chatbot/templates/chatbot/chatbot.html,sha256=REFnqNg0EHsXxAUfaCJe1YgOKiV_umBXuC6y8veF5CU,1568
19
+ swarm/blueprints/digitalbutlers/blueprint_digitalbutlers.py,sha256=JK_rmZgPMw4PdQFrMverrwgcjH0NRkuqkchYOJwXYuM,9809
20
+ swarm/blueprints/dilbot_universe/blueprint_dilbot_universe.py,sha256=w7i96KkRNmBOV2Kz9SJqQCirsRPEgENR-79iLOzpKaQ,16770
21
+ swarm/blueprints/divine_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ swarm/blueprints/divine_code/apps.py,sha256=k615JHdfOuo_GwfVbC7ah8X9OblkAL2XWm9aLBjmMyY,306
23
+ swarm/blueprints/divine_code/blueprint_divine_code.py,sha256=YO-YE5ORvx4R_1VD2i60cPc21ZX6c8sXwOGTqmDk2Xw,13516
24
+ swarm/blueprints/django_chat/apps.py,sha256=rn1Eu11c4zZ6DYZeFb6AkCDMoM_dcQTzeNwW-IxXpCI,200
25
+ swarm/blueprints/django_chat/blueprint_django_chat.py,sha256=jROcPgqNJZv2E2efCoGzouXHnHZP1JJundj0R3VTNbM,3376
26
+ swarm/blueprints/django_chat/urls.py,sha256=TTTF3pgymvCYbuxpwi4WRBPv8ftQNH4pEoURT8sEVAg,147
27
+ swarm/blueprints/django_chat/views.py,sha256=MUKjXXjXsq8jMZtAb4RR9g2mEYrwFemN6Bqxpeyi7p4,1299
28
+ swarm/blueprints/django_chat/templates/django_chat/django_chat_webpage.html,sha256=wAEOI4Wg0JJ8drXaOcr2Pel6lW3JSHmyIpbocLS5tI8,1649
29
+ swarm/blueprints/echocraft/blueprint_echocraft.py,sha256=kd5EFDhveaF2oaaYXhycakA9TYyH7KuXluyb99V4Puo,1589
30
+ swarm/blueprints/family_ties/apps.py,sha256=EjV7AxDNsLM4gsLr_qMEiLAVbERuo1ZsdU9vPtOEYAY,287
31
+ swarm/blueprints/family_ties/blueprint_family_ties.py,sha256=XVcSZNHmqQNqyjDZM36wtUh2V2Qx2_lComjD7E7er1A,7986
32
+ swarm/blueprints/family_ties/models.py,sha256=C3_okdVVYuu9xOpoKRsaLoGrM2775cS_cU4UKYAkJ9s,903
33
+ swarm/blueprints/family_ties/serializers.py,sha256=kH3T6OgXjF534bO3gfAUr6GpXZ5Jx0BQkK58nvuEcqA,325
34
+ swarm/blueprints/family_ties/settings.py,sha256=5zcVsq7ny3GLWcJnOplZW4fMFNtyC3ba0ZOESRD2gh4,425
35
+ swarm/blueprints/family_ties/urls.py,sha256=awRZHb1gb1p3I6YZzfKMGSydd6kYPTLgax2jZ1ocS4U,294
36
+ swarm/blueprints/family_ties/views.py,sha256=FbPkDNlFEixtRFbSpkr51IyJ28FRkXa1W5xyO_KeXH0,1081
37
+ swarm/blueprints/flock/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ swarm/blueprints/gaggle/blueprint_gaggle.py,sha256=27KqO5M3x6vBQWN3AOWK6VJjuypygk05B1QeFWwZVEQ,10161
39
+ swarm/blueprints/gotchaman/blueprint_gotchaman.py,sha256=bElwOpesPINuLJB_H8-1UoYiPvhnF_lFFjxUFHz0T5M,12326
40
+ swarm/blueprints/mcp_demo/blueprint_mcp_demo.py,sha256=eUu5_BvLwVSdWiEonXWKuN7YgKsqz04JB_KbMPowryc,6599
41
+ swarm/blueprints/messenger/templates/messenger/messenger.html,sha256=izuFtFn40Gm7M4gSUAUT5CIezjBjmNv2w4_fwSlv7VA,2323
42
+ swarm/blueprints/mission_improbable/blueprint_mission_improbable.py,sha256=N4Tw0laErP4eCJM103XOaVrqbFNKZRUG1Bpze8g79MI,12753
43
+ swarm/blueprints/monkai_magic/blueprint_monkai_magic.py,sha256=r0q6fV6QNsF28UHwO5RtZTwofke2YfHrlRAZtGgT9Yo,13315
44
+ swarm/blueprints/nebula_shellz/blueprint_nebula_shellz.py,sha256=VjUjlDiEVkMhooRtItiU-0YzwksO6yyk2Sf1mVCKTSc,9750
45
+ swarm/blueprints/omniplex/blueprint_omniplex.py,sha256=GuoxSbI05NzlDgtnUcHnqZhsxJ62FN2Y7SO2pbPhY_M,11486
46
+ swarm/blueprints/rue_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ swarm/blueprints/rue_code/blueprint_rue_code.py,sha256=Eh1MWT4m0_62WEVtgcijzTe_5kUUAUIvV7dB9BSqULo,14647
48
+ swarm/blueprints/suggestion/blueprint_suggestion.py,sha256=nN9PqQJyDIa4lVHQluEviKZthsoKU4hejDUV4ed6KiA,5682
49
+ swarm/blueprints/unapologetic_press/blueprint_unapologetic_press.py,sha256=e1-HpSHNp1PJAcb3-6sI1kE7KeJRQ2lGTUJPXYjvaY4,17648
50
+ swarm/blueprints/whiskeytango_foxtrot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ swarm/blueprints/whiskeytango_foxtrot/apps.py,sha256=V1QKvyb2Vz-EtDNhhNe4tw2W9LYhNDuiaIq_fAU4ilw,334
52
+ swarm/blueprints/whiskeytango_foxtrot/blueprint_whiskeytango_foxtrot.py,sha256=ithMeMjU6bMeX1AeaSBX22yRmu9yizfafGD4sjykoeo,14301
53
+ swarm/extensions/__init__.py,sha256=SadbzfxckByaaqzuKPfXMvqmj45-dcMlavlfQYhGnzE,56
54
+ swarm/extensions/blueprint/__init__.py,sha256=VHSlq8q3AeclMsp63f8RXc3vhcZyzHH0uEaYV6AW-ZI,1841
55
+ swarm/extensions/blueprint/agent_utils.py,sha256=YWpANYTaFKAK4inWSirRlvzbHwQAH1wNkgW0esHKIeg,542
56
+ swarm/extensions/blueprint/blueprint_base.py,sha256=vebDxZnQiaz2lhivPYElhZM886BwigJc6EG_zEEG09U,7513
57
+ swarm/extensions/blueprint/blueprint_discovery.py,sha256=oU7q1JeVMP5k52hfTGObDy1Jn2v5lJRufz9BNvP3W58,5531
58
+ swarm/extensions/blueprint/blueprint_utils.py,sha256=Ef_pu-RYomqzFjMg6LOSPSdbYFCbYXjEoSvK1OT49Eo,702
59
+ swarm/extensions/blueprint/cli_handler.py,sha256=ri812w0w2JzXtLSmwfSbpJCCveokgABnTfZEv4Iup2Y,9250
60
+ swarm/extensions/blueprint/common_utils.py,sha256=jeKcN3lMdrpOYWIpErH3L5am13jHjaImpVvk2b0mps4,462
61
+ swarm/extensions/blueprint/config_loader.py,sha256=ldQGtv4tXeDJzL2GCylDxykZxYBo4ALFY2kS0jZ79Eo,5652
62
+ swarm/extensions/blueprint/django_utils.py,sha256=ObtkmF1JW4H2OEYa7vC6ussUsMBtDsZTTVeHGHI-GOQ,17457
63
+ swarm/extensions/blueprint/interactive_mode.py,sha256=vGmMuAgC93TLjMi2RkXQ2FkWfIUblyOTFGHmVdGKLSQ,4572
64
+ swarm/extensions/blueprint/output_utils.py,sha256=8OtVE3gEvPeeTu4Juo6Ad6omSlMqSuAtckXXx7P1CyQ,4022
65
+ swarm/extensions/blueprint/spinner.py,sha256=3J0ZrNzoI5O5qR7hnCeRM3dZx2fLb_H3zkoj_AYt5LQ,3394
66
+ swarm/extensions/blueprint/modes/rest_mode.py,sha256=KZuB_j2NfomER7CmlsLBqRipU3DymKY-9RpoGilMH0I,1357
67
+ swarm/extensions/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ swarm/extensions/cli/blueprint_runner.py,sha256=CG6XfOiDWuc84I_qefBpkwxEs7JcIbvNJqce9jBYUxo,9158
69
+ swarm/extensions/cli/cli_args.py,sha256=Lws6Q3I-DNpzq9qSRN8ylUXg-lWly1SuqDSQF9n50bw,2980
70
+ swarm/extensions/cli/interactive_shell.py,sha256=ocHBP975uqJU5LQyM2IiMVW5lQ387lgYHe3sme9ucX4,1322
71
+ swarm/extensions/cli/main.py,sha256=NnmovA7h1Rj1eDQVYe9AN6-eraIbIclHesNVmQPjdk4,1002
72
+ swarm/extensions/cli/selection.py,sha256=etdG6hJFgnLuvD_sVJvXg8qFcgjzCjyL-vYyxWcU0TI,2002
73
+ swarm/extensions/cli/utils.py,sha256=amDW-jbiM12N-t72j2S0cHP3Mxgoo3nrcwq6CwN9HFY,3290
74
+ swarm/extensions/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
+ swarm/extensions/cli/commands/blueprint_management.py,sha256=dLNLLoTjInXQ1m9zRyNxu8NacDgwqYY50GvnhSiMQ_I,1116
76
+ swarm/extensions/cli/commands/config_management.py,sha256=RFu9AP437aqUnyy8RDoyoZgW0WfT7h88_CQJaUnCR9E,480
77
+ swarm/extensions/cli/commands/edit_config.py,sha256=O2Y-BKOSx7shSc-kspyseEQvtIeyQBUCD7Aj3r9dirw,2325
78
+ swarm/extensions/cli/commands/list_blueprints.py,sha256=TyZv_dqM_UTK84-s-Dp7UWUcvWHXsNuxnCRNNNymWio,768
79
+ swarm/extensions/cli/commands/validate_env.py,sha256=VXBjx9etvj4Re8qLwIPoHr4g5VwbwBCBdsr8gGLLYHI,1958
80
+ swarm/extensions/cli/commands/validate_envvars.py,sha256=7-BDPYzV7wsga7kOggHNuCscI-7z-oPjMEBhq-ndDXA,1588
81
+ swarm/extensions/cli/utils/discover_commands.py,sha256=aJdU3kSmLlpBxzGdfOA88AaCwpknHSD2cE0piCHZRUY,1053
82
+ swarm/extensions/cli/utils/env_setup.py,sha256=k7QxRjzIGx5HC6RVZP9QSaaXEKMkcKCewD66u0e7qfE,496
83
+ swarm/extensions/config/__init__.py,sha256=WjmGxMU5k3S40TNQxTfByYcT2YAchq_5gzXFWDLrLzU,141
84
+ swarm/extensions/config/config_loader.py,sha256=CCT6U-iduNcB7hoeyPRonZR9veFzqoBGvEP2pweci2Y,4813
85
+ swarm/extensions/config/config_manager.py,sha256=bBT-NGbRdsXoJ-lxZM5kjAf5FvVVGRVdbbCQJiCX1_0,9951
86
+ swarm/extensions/config/server_config.py,sha256=iBlQOaFQmkEPNLmVpAQvXlSWhTsu-YMIjEf-H-7QfUU,1882
87
+ swarm/extensions/config/setup_wizard.py,sha256=yAZ7MOgc8ZGti2kjZ72G6QLFBI0lbhXAa7Wi7SeXDYo,4567
88
+ swarm/extensions/config/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ swarm/extensions/config/utils/logger.py,sha256=sUkKdZsjRiCGGCEPfZ4YqeZDbiaUeGFOa3mdbVOTmvU,1242
90
+ swarm/extensions/launchers/__init__.py,sha256=RR4up00HKqXOOToxb63mKZ2o9fq-o75bUw7dZuxkAVk,56
91
+ swarm/extensions/launchers/build_launchers.py,sha256=Eh3ODR9L4KinG1GDK4-lF3NE0EZ-ArCrP3fxtGYhXgs,433
92
+ swarm/extensions/launchers/build_swarm_wrapper.py,sha256=c_9oR3To4M2cZyc1uYSiysHLhUGX5FkCAQk9AG7Va2Q,231
93
+ swarm/extensions/launchers/swarm_api.py,sha256=f8olTI5JVdayp923etVQWsP8WRquPG5Mw3Q40ItN6kY,2877
94
+ swarm/extensions/launchers/swarm_cli.py,sha256=dlvMq2HvUI2XlADuTzM8kpeedPkqzKB6k0oy7z2V_p0,9747
95
+ swarm/extensions/launchers/swarm_wrapper.py,sha256=3K58yqPN4Ct0c7zfSDKRIGdL1Q7WOBXmAVHXT-aaPj4,1004
96
+ swarm/llm/chat_completion.py,sha256=HnuuBtTooODJwU8egi3JSngmgo8076CBxF_0XqxDM2M,7634
97
+ swarm/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
+ swarm/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
+ swarm/management/commands/runserver.py,sha256=MQJxuV_4le4u_4RJu25OyiDgcEOyIB9StQ2U8xrkTOA,2621
100
+ swarm/migrations/0010_initial_chat_models.py,sha256=qJbvLReRBEOE08FkxjOWMcwu7Ny4epNI_eG1PF8wcWM,1900
101
+ swarm/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
+ swarm/repl/__init__.py,sha256=hNU3HxjJJi6w5xgx34n3253QJPspFltrK7AM0G_1TlE,32
103
+ swarm/repl/repl.py,sha256=sfVdSiDrStpZyxZehPn0nAxqaja2eySL9v9CfWhZEVc,2609
104
+ swarm/static/contrib/fonts/fontawesome-webfont.ttf,sha256=VffZ6ZuOLU4OGTsvAnVQHm2cHr0pytvqag2kioWH4-A,146
105
+ swarm/static/contrib/fonts/fontawesome-webfont.woff,sha256=VffZ6ZuOLU4OGTsvAnVQHm2cHr0pytvqag2kioWH4-A,146
106
+ swarm/static/contrib/fonts/fontawesome-webfont.woff2,sha256=VffZ6ZuOLU4OGTsvAnVQHm2cHr0pytvqag2kioWH4-A,146
107
+ swarm/static/contrib/markedjs/marked.min.js,sha256=ixCmFz1ST8bJe8lYm6g4PgIS1cDWF-FRnl9OagyfIk8,39249
108
+ swarm/static/contrib/tabler-icons/adjustments-horizontal.svg,sha256=vxgHX9-4TmrGFv5RLhP3quTD9LWh5SNAimbI627gx5o,640
109
+ swarm/static/contrib/tabler-icons/alert-triangle.svg,sha256=gxyaxDShS46IVXdYEM2XHP8EVzMAEKTDyB90Iz2-5f8,506
110
+ swarm/static/contrib/tabler-icons/archive.svg,sha256=CYCi5N6si5jV8i_q6wHCT1hatnkpBOH5QQ40F5gQ2gw,488
111
+ swarm/static/contrib/tabler-icons/artboard.svg,sha256=jPoQ3vfdeVoSoGJxUOg6VLCiPp-BP3oU_X6-3B5r9B4,604
112
+ swarm/static/contrib/tabler-icons/automatic-gearbox.svg,sha256=D7bNI-yKcn5sf2nufvMlV6FvmhTfaqack5QsZE4NzLo,594
113
+ swarm/static/contrib/tabler-icons/box-multiple.svg,sha256=ranHl2fyhPSasYvTWlwHh7ZOEo2cFiKBuiv18QIhEa4,498
114
+ swarm/static/contrib/tabler-icons/carambola.svg,sha256=rHpYxin07lR34uMzP1v1hU9cH5wZz8Dcluwol4GM5a8,611
115
+ swarm/static/contrib/tabler-icons/copy.svg,sha256=EyzzGI9ve5xPRMT8-TfAJt1-6hnLjkZwwSWGO5BOwp0,580
116
+ swarm/static/contrib/tabler-icons/download.svg,sha256=NJNt8BlcJhCyRorNPnjUvjhEPnwHa_tRMYJ9OtKCeiE,399
117
+ swarm/static/contrib/tabler-icons/edit.svg,sha256=R2_4UhC0AiAp8-g-uhbEsow2JIY07Uq7lxsum7RTrvg,481
118
+ swarm/static/contrib/tabler-icons/headset.svg,sha256=iqPoDoxHGSfpEQDW-o4yWNmcOSdH4C7GZdTAUzZgPbE,584
119
+ swarm/static/contrib/tabler-icons/layout-sidebar-left-collapse.svg,sha256=gGCwuGCGj4sQCx5N_ehAStbS3rx5XUBMEz0gHn-Ivxk,470
120
+ swarm/static/contrib/tabler-icons/layout-sidebar-left-expand.svg,sha256=qrQGKaVjBPXLhCN6AUvqo1d4LSH7-Wu8oMQZrDiJai8,470
121
+ swarm/static/contrib/tabler-icons/layout-sidebar-right-collapse.svg,sha256=hhRc_GF2iD2msRKn0QIlHeYcfpccqP3mpw-iebqpCZI,470
122
+ swarm/static/contrib/tabler-icons/layout-sidebar-right-expand.svg,sha256=A4vOygRo_-AvlSAL2pZojEy9TlgHnMjqx40ybA13ouU,471
123
+ swarm/static/contrib/tabler-icons/message-chatbot.svg,sha256=3kzJqimURtFYouNSU5xWN4AqzUk92oAvNf1GnNT90x8,516
124
+ swarm/static/contrib/tabler-icons/message-star.svg,sha256=EyJPjs5MGxIJ_uBFYEaMxBMVxeqbf7vNgi70ytj1muA,806
125
+ swarm/static/contrib/tabler-icons/message-x.svg,sha256=O42m_yEBWrkg0X_DVNQd7-2KZNvAzu-EUD-lyLTYmJQ,542
126
+ swarm/static/contrib/tabler-icons/message.svg,sha256=IpzYNETPNs0TBX5Hnka_HtfsC8LE-K6lqKY_DJGvLGs,484
127
+ swarm/static/contrib/tabler-icons/paperclip.svg,sha256=uGqKL5F5BllN3yD0xFCqu7njyYU-DFxccgAsTE8Z2TI,389
128
+ swarm/static/contrib/tabler-icons/playlist-add.svg,sha256=IZ3YfhAK8PAGq49TavITQ_L7NcZP65HsQAXlUmEPwtI,422
129
+ swarm/static/contrib/tabler-icons/robot.svg,sha256=clX91lxB8bXOcUZJ9Rfs42XVQzkNZRWzEbDUioV0Wwg,582
130
+ swarm/static/contrib/tabler-icons/search.svg,sha256=OD-rI7w852D0e-E6BV8oJWpoRp-0z52Moz_LCbzVP1E,376
131
+ swarm/static/contrib/tabler-icons/settings.svg,sha256=mPEM7wVxqbuvlUyKXTaBB8JHIV-taLxiprLH38DilkI,898
132
+ swarm/static/contrib/tabler-icons/thumb-down.svg,sha256=295gU94RFvRqDj57pcn5q1tJ5XgZ9mishMsdsoGNs4g,461
133
+ swarm/static/contrib/tabler-icons/thumb-up.svg,sha256=VErjBaOuYIWf0A-Q5wiv27wSADqfyczpSBW7637dCKc,465
134
+ swarm/static/contrib/tabler-icons/filled/carambola.svg,sha256=AJDlJ7UMFzo1DCLP5S9HTAMvtMNyWIm7UBDdYwWVdH4,625
135
+ swarm/static/contrib/tabler-icons/filled/paint.svg,sha256=ExnUx5q2P5L9gqAUIo7Yi3eSpFf70w0aDlrMcXNakGE,625
136
+ swarm/static/css/dropdown.css,sha256=cUzKXj4rFoXzTddU8LNj2gXz4bA_j7KdnD6Jnzc4A24,363
137
+ swarm/static/htmx/htmx.min.js,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
+ swarm/static/js/dropdown.js,sha256=Vy3FGUQz_DnstV_CgSuZQghpoAfxqVupEsW8aahZauk,1110
139
+ swarm/static/rest_mode/css/base.css,sha256=RrauHcOBb2UsFVK5Px0RA9LFW4etIpACfH54fskGGTQ,10190
140
+ swarm/static/rest_mode/css/chat-history.css,sha256=2dwpl6tp-dwY28ypHJyRr3tIo4ynmd7QwCqMaq_Yq0Q,5963
141
+ swarm/static/rest_mode/css/chat.css,sha256=TaW9m3i0tOaCHdLj_XnE0Bxgnf4YMBouC_CAuPC8vpg,6721
142
+ swarm/static/rest_mode/css/chatbot.css,sha256=amLMNJep-mReOl9fi7cooQLcTMy0wwav9EBziGLKepo,1475
143
+ swarm/static/rest_mode/css/chatgpt.css,sha256=_IWj_Pbh_FoHqCn4pLJFf_2KJkGVIhx3PFDPulTQTxQ,1126
144
+ swarm/static/rest_mode/css/general.css,sha256=onEYMsQ1ufBoQ4B9oz3y4qKL2J3Vm0QtV7IjmseOLhI,2035
145
+ swarm/static/rest_mode/css/layout.css,sha256=AFgJ_V6p51RYDveN8UBL8QLXrdjAmf66EnKCgzgbpyM,3254
146
+ swarm/static/rest_mode/css/messages.css,sha256=YHL5wNbP387gIEUI2rrc-D9YrD9N6kg1_ZO8D_Qup8Y,1566
147
+ swarm/static/rest_mode/css/messenger.css,sha256=PUPwjFq0ZmVy1QYWFlDwG7V6fhG1_AL4ltYrnoVylyg,2805
148
+ swarm/static/rest_mode/css/settings.css,sha256=h-CCaKo47W2UOUS9cmufg_CKXPEOnIsJcklXqs5vUJ0,2432
149
+ swarm/static/rest_mode/css/simple.css,sha256=yZWS1WtKbEoou3xhfBKVn6Pb06CA_CHn-BI3fO0mfmE,830
150
+ swarm/static/rest_mode/css/slack.css,sha256=gPCI-ff_zGcZ1U6r7SxjnxpZ20K_PP8oumcuPr5Qnuw,1022
151
+ swarm/static/rest_mode/css/style.css,sha256=5HUYyrf_OazZorAJ59U_I1YwQ3uWRHsRhAaQrDT7NPQ,3216
152
+ swarm/static/rest_mode/css/theme.css,sha256=NVEtV_UhcDXlA_gCFzCxKFcXe9P_CYeKyzf7mAMzFyI,903
153
+ swarm/static/rest_mode/css/toast.css,sha256=oxcrp7A3vWY4QBLeHTdaA0rft7x-iwvr2NvcDWepeXo,706
154
+ swarm/static/rest_mode/css/colors/corporate.css,sha256=1083vv4inVV35XrmqRZu5gqRsAhnflqxOoleqdJSzRE,2027
155
+ swarm/static/rest_mode/css/colors/pastel.css,sha256=9F70z98HRBu3hZLNlSepfZ24zAiyOslyqbfvaNn9wTE,2456
156
+ swarm/static/rest_mode/css/colors/tropical.css,sha256=oadHNGghCYkd2jNToTabckh7yrR5toQhddSQk0Txq9c,2528
157
+ swarm/static/rest_mode/css/layouts/messenger-layout.css,sha256=XuAx8LRjdaTGo1Adya-Ren8GiZeAe4UcWA8yXGO-LeU,321
158
+ swarm/static/rest_mode/css/layouts/minimalist-layout.css,sha256=4l06WNTuasTzaWuyUz_FHF7-knmxCzZrU10_QBaUs0U,1257
159
+ swarm/static/rest_mode/css/layouts/mobile-layout.css,sha256=-9ePbwt47wZ1qH_fF8wDSmN8q_bNk0no3LG6Roo5OxA,129
160
+ swarm/static/rest_mode/js/auth.js,sha256=6nw1ILMd5QEjR-k5DyKYSBeNTMUrg-sfUiC-G8kCV_w,202
161
+ swarm/static/rest_mode/js/blueprint.js,sha256=slQzz6jB_uP-zzWykmqQtDQc3yv28mUk-DZipKQjBlQ,1239
162
+ swarm/static/rest_mode/js/blueprintUtils.js,sha256=-0LkrPsBSZ8D8o7QmT2g7Rm_aQ4YTQ6fgbOMYE96UAc,461
163
+ swarm/static/rest_mode/js/chatLogic.js,sha256=XScNtw0qpPkhLwhk8cWctHBArv0MJbm5JExdWCBufKU,3053
164
+ swarm/static/rest_mode/js/debug.js,sha256=wQvouiFyxT62dL_sQ8VkdU7re99JxJ5zLckU6PvLHUk,2125
165
+ swarm/static/rest_mode/js/events.js,sha256=8UFyAmAHu4-HK4Bfckytatd4GBrAQwgfjY3xs5ZQRgM,3703
166
+ swarm/static/rest_mode/js/main.js,sha256=QhcVh7UocC4USpcdpsema8PHwy8K7ylGWPmT6pUtjjQ,580
167
+ swarm/static/rest_mode/js/messages.js,sha256=offtFtDA9joqMZejTUU7BbEeU0M2QpWtbtM4WGiuPfo,8301
168
+ swarm/static/rest_mode/js/messengerLogic.js,sha256=bWuFpsUyQsEDPePQZnGp9Zmc3Ikmu7vq-ZisFWr80sQ,14917
169
+ swarm/static/rest_mode/js/rendering.js,sha256=4pY0oGrgyqv2DmGBoYZ4bakzfYCgkGirW1jRRgBevOA,4517
170
+ swarm/static/rest_mode/js/settings.js,sha256=flinYM3_aAzLOPMJEiUp1CQAx8Mm-cq77kSTeSnqkTU,4383
171
+ swarm/static/rest_mode/js/sidebar.js,sha256=xYsShufjz8ve3Fsot9LlRI31Dj6jxpPzuq3py6VJAcg,3133
172
+ swarm/static/rest_mode/js/simpleLogic.js,sha256=9F85JmT5eJXVhKpv6wgsRtSSqtfWpD0jVvQnOcFDNHg,1464
173
+ swarm/static/rest_mode/js/slackLogic.js,sha256=S0ByXaXOj08EjruulNOgrXcqGE-8zZULRayJI76AUAw,2445
174
+ swarm/static/rest_mode/js/splash.js,sha256=B1p9BR2UsfjwNPqeVTDkzT_VQK0lZuOPwB1PWbOfnYI,2839
175
+ swarm/static/rest_mode/js/theme.js,sha256=X8YjouxHXGIVcY9FHVUDiJJpFABAxB7Orair_t1osjE,4233
176
+ swarm/static/rest_mode/js/toast.js,sha256=UKKaDoMeLudvS_Yp7FWQoXvcYn6eFC-MwGvG8aYRstI,1153
177
+ swarm/static/rest_mode/js/ui.js,sha256=In8MeGywkET2S_pKRFzZNE_VZo4QEaMQEJAwmF8fUPQ,8248
178
+ swarm/static/rest_mode/js/validation.js,sha256=yZLTu-YnYDDjP-kpss8NlCdjQt5TqiEBjneF6BpigYo,1593
179
+ swarm/static/rest_mode/js/modules/apiService.js,sha256=Mt5_5rwKjlTc36WLzE5b1hrYJEfj8i-kfMfIzt33V-Y,2924
180
+ swarm/static/rest_mode/js/modules/blueprintManager.js,sha256=xVImTb6PMCqShymeJ7FEeYgNeSkPKElzga1L2DaS4MQ,6112
181
+ swarm/static/rest_mode/js/modules/chatHistory.js,sha256=ALLjZvLHX8y43kbrM3StbQe3M8W-3rO3W1wakJLCjxw,4478
182
+ swarm/static/rest_mode/js/modules/debugLogger.js,sha256=aC66sQlqkSMLKlDSKOgfCM-IVz-H2DhECmZimmyZPwA,379
183
+ swarm/static/rest_mode/js/modules/eventHandlers.js,sha256=qxbGAQqXuMSP60r8DwZafQodCcp3EgKwG8gXxD1bpjQ,3910
184
+ swarm/static/rest_mode/js/modules/messageProcessor.js,sha256=5keCMqK_DrfI6X0hSV3QEbb4l-p5WPdf6dtzfAWI9CM,4450
185
+ swarm/static/rest_mode/js/modules/state.js,sha256=G-3XURThklkPfTkeK4fOw1tFLeyuXaHLxnKoCuV28dw,174
186
+ swarm/static/rest_mode/js/modules/userInteractions.js,sha256=3Z35T-LUulQr-ZSzR2hHFdL5ORrKcvL3Yx_ao_PG9IM,730
187
+ swarm/static/rest_mode/js/modules/validation.js,sha256=0cO0vRdTPeJGXUYpgfP4VPJPAzYvMq7r_WH2XvhaCJ4,849
188
+ swarm/static/rest_mode/svg/animated_spinner.svg,sha256=uX5a2UAU5Xm7zVw884hpuvnGO9qPYI6UBoA8whEd6Z8,416
189
+ swarm/static/rest_mode/svg/arrow_down.svg,sha256=1TULkQfk2sjYFikPS1ECfQM_vw7VCWYQmzfa59RKBqU,387
190
+ swarm/static/rest_mode/svg/arrow_left.svg,sha256=tEG2xRp3KVhRWCbnAEm4IDvDhBqOFTbCxk-znLhSOzg,389
191
+ swarm/static/rest_mode/svg/arrow_right.svg,sha256=nXbDN01H1ThNEIx1wyor4ClLX6h_H3zRtCWQWT1I0E0,387
192
+ swarm/static/rest_mode/svg/arrow_up.svg,sha256=yy0unxFyYaZI40JpMHA6NWSZmouyI7QToeHgSioh7Vg,388
193
+ swarm/static/rest_mode/svg/attach.svg,sha256=C71rmaz2O7TAeK9Occ2Zl0Zs9ZJn1VPqcFMnN6ieFVk,372
194
+ swarm/static/rest_mode/svg/avatar.svg,sha256=yk7nzKyV9_YfFr0b2Qf_wysYsdJd-qD1JJhPYBht2oY,389
195
+ swarm/static/rest_mode/svg/canvas.svg,sha256=3KKsRbWNMogd69XF3dAC60A9Srr2bb-lqx4zhBjdKtc,393
196
+ swarm/static/rest_mode/svg/chat_history.svg,sha256=QIJYGZB8pAoXLOCh_1gOeUazPEXpkiAS721tjlrDwCs,311
197
+ swarm/static/rest_mode/svg/close.svg,sha256=jvag87WkCHeSeta8xgHY9pS4o41Mi1-HNnECO3Jl8ME,380
198
+ swarm/static/rest_mode/svg/copy.svg,sha256=fy7rzebt6LFJCQZUx5NnQQzYbiAcc0ZUwv06uPH_GRE,267
199
+ swarm/static/rest_mode/svg/dark_mode.svg,sha256=03G2vhVx7VfsbwwqrWDklUhDoQ3McB06yNGQIa6z5HQ,200
200
+ swarm/static/rest_mode/svg/edit.svg,sha256=LagsxrwH462uLbnXSsO3DxrvE_2D8AfE3dTRuhcJPI8,370
201
+ swarm/static/rest_mode/svg/layout.svg,sha256=f2FCXQZ3bVHa1KGyjxjSGAsl5sUgNiFVfbzsFYR7jZE,653
202
+ swarm/static/rest_mode/svg/logo.svg,sha256=nKAKoOQa5BWwWIULebnx_i8n4AurFnDnw_7JNWWmvRk,597
203
+ swarm/static/rest_mode/svg/logout.svg,sha256=KwsIpmgRJUwJNQBOppGRw5WeklDNQSg1qAXgNDTDT4s,420
204
+ swarm/static/rest_mode/svg/mobile.svg,sha256=TPI_UDCHXWKFP6TMdzSIa4uCsvLdRqii89x7RSoNXho,263
205
+ swarm/static/rest_mode/svg/new_chat.svg,sha256=Al_Y_wJvoYJHPNDWSnk0pybUwAsYJa3a7uWQhf_7IKM,314
206
+ swarm/static/rest_mode/svg/not_visible.svg,sha256=3MAibmZQIYjOA8nliGMTDIu8YpNJdUsI8tO0qgrxPJE,774
207
+ swarm/static/rest_mode/svg/plus.svg,sha256=2dWAZGiSwNE8UdRnMSsREV3k7NxN11NILmt2VRnoGe8,428
208
+ swarm/static/rest_mode/svg/run_code.svg,sha256=bmxf2fHqjg4pZ5Sn6VG7cpiggwqIqTVpKI2GjOwekNI,302
209
+ swarm/static/rest_mode/svg/save.svg,sha256=5TudtKjW08KYLfMCiEcJuPcC9_OHzrAm57lM16q85aQ,242
210
+ swarm/static/rest_mode/svg/search.svg,sha256=lgQAvrGw9IJiIvYv0WgRg2kxKd63ZcVoTilHXfmp3_0,340
211
+ swarm/static/rest_mode/svg/settings.svg,sha256=WEtagh8nt7NnG6D8ebr46rugo_tnSsR-nVf1wO-WExQ,742
212
+ swarm/static/rest_mode/svg/speaker.svg,sha256=kQGhqH6Y5u9adwgUzEu_BFwhRQ3EE4I09PCYDIWBNkU,398
213
+ swarm/static/rest_mode/svg/stop.svg,sha256=b3JSTUS4stS5O2oYBN055pr6VqD9W0ihSMeLlNXiU_8,346
214
+ swarm/static/rest_mode/svg/thumbs_down.svg,sha256=msS4t_j_XkkKeusZvbvzWENjoRhhZuAzzBQq2_xzFcs,1574
215
+ swarm/static/rest_mode/svg/thumbs_up.svg,sha256=nybp8imzOK2mfQ6PqZP0X08UNbqO1_5JQf8sO61axnU,805
216
+ swarm/static/rest_mode/svg/toggle_off.svg,sha256=sKCoCQA-nijibG-JCh1yl5g0jM1PVy0XmS7flsLwOMk,345
217
+ swarm/static/rest_mode/svg/toggle_on.svg,sha256=ckSCIuW8I1aOhAitOxs_dr7uVXO3EFilWyBX7WaOOxc,372
218
+ swarm/static/rest_mode/svg/trash.svg,sha256=ynSZX5Xc0DlJeNNGUzC4n5IA4m_1xn105wxKF0zcsGg,576
219
+ swarm/static/rest_mode/svg/undo.svg,sha256=0pIAAA6nFlrrm5fxHT3LR5yeBoQYzsGDDf81ZsPdTHc,336
220
+ swarm/static/rest_mode/svg/visible.svg,sha256=dPKYA4sdjEyoqX6DG-gMuNc1_vsy3rQwRx28MLMtvn0,425
221
+ swarm/static/rest_mode/svg/voice.svg,sha256=rtTTy23nh9t_B2sqCMbvR1jetS-Lgdhr7CKJYBdRYUo,738
222
+ swarm/templates/base.html,sha256=yHhl6KDE6nwGKvijkS6QMueeIrK4Ql3CI2luZkIcNzM,1086
223
+ swarm/templates/chat.html,sha256=1OPRn3Q4bdg4dlX0w6a4ZZMMZdNyLrmsvYyuSRLxRSk,1657
224
+ swarm/templates/index.html,sha256=FbUCxo9rBOULi2f8RuAfTzeKFSUOIi0PawNvEHT1fIU,1368
225
+ swarm/templates/simple_blueprint_page.html,sha256=uHTqfDqQ2B5a4YV_nDEELM9T29aA-Vuf7h_ELZFCyas,1053
226
+ swarm/templates/account/login.html,sha256=PIOIg9ztWybty55v8lDX1cmwtHwPPjj2aWpv1f2wyOQ,705
227
+ swarm/templates/account/signup.html,sha256=HQMdaXKm2Ama-Jt3lbeU7EHYSGwzf8Kc5nJpoZb8ogg,1106
228
+ swarm/templates/rest_mode/message_ui.html,sha256=6niayyHGIs2DI3b-IPQ56RB11VmkByDSI6cGgacBLdE,2716
229
+ swarm/templates/rest_mode/slackbot.html,sha256=7-SiEt0ieTPiSGKBk7Epo8hgb7sU-Hy0RoJVn7Sl99U,1246
230
+ swarm/templates/rest_mode/components/chat_sidebar.html,sha256=cFm0lK09jRuQncS8HswpdlEOM2EXHkCkD68LGeYLFYE,2828
231
+ swarm/templates/rest_mode/components/header.html,sha256=Mg0cwV7tHEx1dcBmaYWDtfymQ0HDcTYUEhPBCOJv3qI,2078
232
+ swarm/templates/rest_mode/components/main_chat_pane.html,sha256=CnyYMGn46r4fJfuX4uqUrNabyVNPh6oJWG47WlkFc6U,2513
233
+ swarm/templates/rest_mode/components/settings_dialog.html,sha256=cH1pMCnigZWgTBp-Z5X_Bgm7rsZM_3oM7d_20DkM30U,5472
234
+ swarm/templates/rest_mode/components/splash_screen.html,sha256=ddtlCNtYER7bbFwpOlu_blKpPn9l60kmwMPvSxkKaeM,326
235
+ swarm/templates/rest_mode/components/top_bar.html,sha256=I-J0Bmmcr0c6_KXEEmM6mwTBVjIoTi8vth0fTObHSI8,836
236
+ swarm/templates/websocket_partials/final_system_message.html,sha256=hZeOez70ZvYsDrmq965kFzV6wh5dBkKkP2FTiXS0FWo,128
237
+ swarm/templates/websocket_partials/system_message.html,sha256=0eBzz9dJBmnwDwnh-X_7wDefSatbS1LepaLhXxN-qI4,171
238
+ swarm/templates/websocket_partials/user_message.html,sha256=-TjdT4-FKFVXeYsPglG3VayDYg1A2beE5gV6AQWu-00,149
239
+ swarm/utils/color_utils.py,sha256=utIfZ6ptGEdpHxIZiZ4gtfo5lLqZKQL5g0F8mEwMhTo,1184
240
+ swarm/utils/context_utils.py,sha256=2Eu372CsuDTt6ikZ0w3OkLrFp4t9hKdgU5Kkc8faDDM,19315
241
+ swarm/utils/general_utils.py,sha256=K3_Uy-189XSpLOxKGxl14fa2n7B0ZH28HgysL6vWG-M,7919
242
+ swarm/utils/log_utils.py,sha256=-qrTMYqxJKHLAgC_r-VeuwQHDUQv3zseVbks-9JQmCE,2523
243
+ swarm/utils/logger.py,sha256=g-ynqO3jqKx2rT2keiECsZ13aywFPsFlJAvo-SOeGlw,1679
244
+ swarm/utils/logger_setup.py,sha256=2A9bXicV03yAPpgMFJGQt5ePB1tLwdkk7sCo-0OiglU,714
245
+ swarm/utils/message_sequence.py,sha256=7Xa7YwGPgojfkrGcl-SbeR_BWwzXGDYNqAxq8F6XhDc,8616
246
+ swarm/utils/message_utils.py,sha256=oNTD7pfmnnu_Br24pR2VEX9afIZwFLwg2HJBLXs1blY,4074
247
+ swarm/utils/redact.py,sha256=L2lo927S575Ay7Jz6pUlK47Sxxzpd9IMybnDm6-WlC8,2955
248
+ swarm/views/__init__.py,sha256=AcLk0R7Y69FhIVgJK2hZs8M_gCR-h_5iqUywz89yuHM,1223
249
+ swarm/views/api_views.py,sha256=BbDEgI6Ftg-c-mMkE9DvRGZHIZ-WAZSfwqAB7j98WxM,1937
250
+ swarm/views/chat_views.py,sha256=ajTVOyQpMMjr3yK7m8chX8SszsHz83uB12mt3eJo3DU,11777
251
+ swarm/views/core_views.py,sha256=iGbits6HqVXE13vEkqvOBQHGS7LZb6Gg9Hcs6KjZmmk,5255
252
+ swarm/views/message_views.py,sha256=sDUnXyqKXC8WwIIMAlWf00s2_a2T9c75Na5FvYMJwBM,1596
253
+ swarm/views/model_views.py,sha256=aAbU4AZmrOTaPeKMWtoKK7FPYHdaN3Zbx55JfKzYTRY,2937
254
+ swarm/views/utils.py,sha256=geX3Z5ZDKFYyXYBMilc-4qgOSjhujK3AfRtvbXgFpXk,3643
255
+ swarm/views/web_views.py,sha256=ExQQeJpZ8CkLZQC_pXKOOmdnEy2qR3wEBP4LLp27DPU,7404
256
+ open_swarm-0.1.1743362777.dist-info/METADATA,sha256=q3l34AHcBOzw_80TKYl3NG_RgoJMOOiwwxJ8pEN1PH8,11145
257
+ open_swarm-0.1.1743362777.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
258
+ open_swarm-0.1.1743362777.dist-info/entry_points.txt,sha256=LudR3dBqGnglrE1n2zAeWo38Ck0m57sKPW36KfK-pzo,71
259
+ open_swarm-0.1.1743362777.dist-info/licenses/LICENSE,sha256=BU9bwRlnOt_JDIb6OT55Q4leLZx9RArDLTFnlDIrBEI,1062
260
+ open_swarm-0.1.1743362777.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: hatchling 1.27.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ swarm-cli = swarm.extensions.launchers.swarm_cli:app
swarm/__init__.py CHANGED
@@ -1,3 +1 @@
1
1
  default_app_config = 'swarm.apps.SwarmConfig'
2
-
3
- from .core import Swarm
swarm/auth.py CHANGED
@@ -1,56 +1,60 @@
1
- import os
2
1
  import logging
2
+ import os
3
+ from rest_framework.authentication import BaseAuthentication, SessionAuthentication
4
+ from rest_framework import exceptions
5
+ from django.conf import settings
6
+ from django.utils.translation import gettext_lazy as _
7
+ # Import AnonymousUser
3
8
  from django.contrib.auth.models import AnonymousUser
4
- from rest_framework.authentication import TokenAuthentication # type: ignore
5
- from rest_framework.exceptions import AuthenticationFailed # type: ignore
6
-
7
- logger = logging.getLogger(__name__)
9
+ # Keep get_user_model if CustomSessionAuthentication needs it or for future user mapping
10
+ from django.contrib.auth import get_user_model
8
11
 
9
- class EnvAuthenticatedUser(AnonymousUser):
10
- """ Custom user class that is always authenticated. """
11
- @property
12
- def is_authenticated(self) -> bool: # type: ignore[override]
13
- return True # Ensure Django recognizes this user as authenticated
12
+ logger = logging.getLogger('swarm.auth')
13
+ User = get_user_model()
14
14
 
15
- class EnvOrTokenAuthentication(TokenAuthentication):
15
+ # --- Static Token Authentication ---
16
+ class StaticTokenAuthentication(BaseAuthentication):
16
17
  """
17
- Custom authentication that allows:
18
- 1. If API_AUTH_TOKEN is set, it enforces token authentication.
19
- 2. Else if ENABLE_API_AUTH is False/Unset, authentication is bypassed.
20
- 3. Otherwise, falls back to Django's TokenAuthentication.
18
+ Authenticates requests based on a static API token passed in a header.
19
+ Returns (AnonymousUser, token) on success to satisfy DRF's expectations
20
+ while signaling that a specific user isn't associated.
21
21
  """
22
+ keyword = 'Bearer'
23
+
22
24
  def authenticate(self, request):
23
- auth_header = request.headers.get("Authorization", "")
24
- env_token = os.getenv("API_AUTH_TOKEN", None)
25
- enable_auth = os.getenv("ENABLE_API_AUTH", "false").lower() in ("true", "1", "t")
26
-
27
- # If API authentication is disabled, allow unrestricted access
28
- if not enable_auth:
29
- logger.info("Authentication is disabled (ENABLE_API_AUTH not set or False). Allowing all users.")
30
- return (EnvAuthenticatedUser(), None)
31
-
32
- # If API_AUTH_TOKEN is set, enforce token validation
33
- if env_token:
34
- if not auth_header:
35
- raise AuthenticationFailed("Authentication credentials were not provided.")
36
- if not auth_header.startswith("Bearer "):
37
- raise AuthenticationFailed("Invalid token format.")
38
-
39
- token = auth_header.split("Bearer ")[-1].strip()
40
-
41
- if token == env_token:
42
- logger.info("Authenticated using API_AUTH_TOKEN.")
43
- return (EnvAuthenticatedUser(), None) # Allow access
44
- else:
45
- raise AuthenticationFailed("Invalid token.")
46
-
47
- # If API authentication is disabled, allow unrestricted access
48
- if not enable_auth:
49
- logger.info("Authentication is disabled (ENABLE_API_AUTH not set or False). Allowing all users.")
50
- return (EnvAuthenticatedUser(), None)
51
-
52
- # Fallback to Django's TokenAuthentication
53
- return super().authenticate(request)
54
-
55
- def authenticate_header(self, request):
56
- return "Bearer"
25
+ logger.debug("[Auth][StaticToken] StaticTokenAuthentication.authenticate called.")
26
+ expected_token = getattr(settings, 'SWARM_API_KEY', None)
27
+
28
+ if not expected_token:
29
+ logger.error("[Auth][StaticToken] SWARM_API_KEY is not set in Django settings. Cannot authenticate.")
30
+ return None
31
+
32
+ provided_token = None
33
+ auth_header = request.META.get('HTTP_AUTHORIZATION', '').split()
34
+ if len(auth_header) == 2 and auth_header[0].lower() == self.keyword.lower():
35
+ provided_token = auth_header[1]
36
+ logger.debug(f"[Auth][StaticToken] Found token in Authorization header: {provided_token[:6]}...")
37
+ else:
38
+ provided_token = request.META.get('HTTP_X_API_KEY')
39
+ if provided_token:
40
+ logger.debug(f"[Auth][StaticToken] Found token in X-API-Key header: {provided_token[:6]}...")
41
+
42
+ if not provided_token:
43
+ logger.debug("[Auth][StaticToken] No token found in headers.")
44
+ return None
45
+
46
+ # Use constant time comparison if possible in future?
47
+ if provided_token == expected_token:
48
+ logger.info("[Auth][StaticToken] Static token authentication successful.")
49
+ # *** Return AnonymousUser and the token ***
50
+ # This sets request.user to AnonymousUser and request.auth to the token.
51
+ return (AnonymousUser(), provided_token)
52
+ else:
53
+ logger.warning(f"[Auth][StaticToken] Invalid token provided: {provided_token[:6]}...")
54
+ raise exceptions.AuthenticationFailed(_("Invalid API Key."))
55
+
56
+ # --- Custom *Synchronous* Session Authentication ---
57
+ class CustomSessionAuthentication(SessionAuthentication):
58
+ """ Standard SessionAuthentication """
59
+ pass
60
+