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.
- open_swarm-0.1.1743362777.dist-info/METADATA +217 -0
- open_swarm-0.1.1743362777.dist-info/RECORD +260 -0
- {open_swarm-0.1.1743070217.dist-info → open_swarm-0.1.1743362777.dist-info}/WHEEL +1 -2
- open_swarm-0.1.1743362777.dist-info/entry_points.txt +2 -0
- swarm/__init__.py +0 -2
- swarm/auth.py +53 -49
- swarm/blueprints/README.md +67 -0
- swarm/blueprints/burnt_noodles/blueprint_burnt_noodles.py +412 -0
- swarm/blueprints/chatbot/blueprint_chatbot.py +98 -0
- swarm/blueprints/chatbot/templates/chatbot/chatbot.html +33 -0
- swarm/blueprints/digitalbutlers/blueprint_digitalbutlers.py +183 -0
- swarm/blueprints/dilbot_universe/blueprint_dilbot_universe.py +285 -0
- swarm/blueprints/divine_code/__init__.py +0 -0
- swarm/blueprints/divine_code/apps.py +11 -0
- swarm/blueprints/divine_code/blueprint_divine_code.py +219 -0
- swarm/blueprints/django_chat/apps.py +6 -0
- swarm/blueprints/django_chat/blueprint_django_chat.py +84 -0
- swarm/blueprints/django_chat/templates/django_chat/django_chat_webpage.html +37 -0
- swarm/blueprints/django_chat/urls.py +8 -0
- swarm/blueprints/django_chat/views.py +32 -0
- swarm/blueprints/echocraft/blueprint_echocraft.py +44 -0
- swarm/blueprints/family_ties/apps.py +11 -0
- swarm/blueprints/family_ties/blueprint_family_ties.py +152 -0
- swarm/blueprints/family_ties/models.py +19 -0
- swarm/blueprints/family_ties/serializers.py +7 -0
- swarm/blueprints/family_ties/settings.py +16 -0
- swarm/blueprints/family_ties/urls.py +10 -0
- swarm/blueprints/family_ties/views.py +26 -0
- swarm/blueprints/flock/__init__.py +0 -0
- swarm/blueprints/gaggle/blueprint_gaggle.py +184 -0
- swarm/blueprints/gotchaman/blueprint_gotchaman.py +232 -0
- swarm/blueprints/mcp_demo/blueprint_mcp_demo.py +133 -0
- swarm/blueprints/messenger/templates/messenger/messenger.html +46 -0
- swarm/blueprints/mission_improbable/blueprint_mission_improbable.py +234 -0
- swarm/blueprints/monkai_magic/blueprint_monkai_magic.py +248 -0
- swarm/blueprints/nebula_shellz/blueprint_nebula_shellz.py +156 -0
- swarm/blueprints/omniplex/blueprint_omniplex.py +221 -0
- swarm/blueprints/rue_code/__init__.py +0 -0
- swarm/blueprints/rue_code/blueprint_rue_code.py +291 -0
- swarm/blueprints/suggestion/blueprint_suggestion.py +110 -0
- swarm/blueprints/unapologetic_press/blueprint_unapologetic_press.py +298 -0
- swarm/blueprints/whiskeytango_foxtrot/__init__.py +0 -0
- swarm/blueprints/whiskeytango_foxtrot/apps.py +11 -0
- swarm/blueprints/whiskeytango_foxtrot/blueprint_whiskeytango_foxtrot.py +256 -0
- swarm/extensions/blueprint/__init__.py +30 -15
- swarm/extensions/blueprint/agent_utils.py +16 -40
- swarm/extensions/blueprint/blueprint_base.py +141 -543
- swarm/extensions/blueprint/blueprint_discovery.py +112 -98
- swarm/extensions/blueprint/cli_handler.py +185 -0
- swarm/extensions/blueprint/config_loader.py +122 -0
- swarm/extensions/blueprint/django_utils.py +181 -79
- swarm/extensions/blueprint/interactive_mode.py +1 -1
- swarm/extensions/config/config_loader.py +83 -200
- swarm/extensions/launchers/build_swarm_wrapper.py +0 -0
- swarm/extensions/launchers/swarm_cli.py +199 -287
- swarm/llm/chat_completion.py +26 -55
- swarm/management/__init__.py +0 -0
- swarm/management/commands/__init__.py +0 -0
- swarm/management/commands/runserver.py +58 -0
- swarm/permissions.py +38 -0
- swarm/serializers.py +96 -5
- swarm/settings.py +95 -110
- swarm/static/contrib/fonts/fontawesome-webfont.ttf +7 -0
- swarm/static/contrib/fonts/fontawesome-webfont.woff +7 -0
- swarm/static/contrib/fonts/fontawesome-webfont.woff2 +7 -0
- swarm/static/contrib/markedjs/marked.min.js +6 -0
- swarm/static/contrib/tabler-icons/adjustments-horizontal.svg +27 -0
- swarm/static/contrib/tabler-icons/alert-triangle.svg +21 -0
- swarm/static/contrib/tabler-icons/archive.svg +21 -0
- swarm/static/contrib/tabler-icons/artboard.svg +27 -0
- swarm/static/contrib/tabler-icons/automatic-gearbox.svg +23 -0
- swarm/static/contrib/tabler-icons/box-multiple.svg +19 -0
- swarm/static/contrib/tabler-icons/carambola.svg +19 -0
- swarm/static/contrib/tabler-icons/copy.svg +20 -0
- swarm/static/contrib/tabler-icons/download.svg +21 -0
- swarm/static/contrib/tabler-icons/edit.svg +21 -0
- swarm/static/contrib/tabler-icons/filled/carambola.svg +13 -0
- swarm/static/contrib/tabler-icons/filled/paint.svg +13 -0
- swarm/static/contrib/tabler-icons/headset.svg +22 -0
- swarm/static/contrib/tabler-icons/layout-sidebar-left-collapse.svg +21 -0
- swarm/static/contrib/tabler-icons/layout-sidebar-left-expand.svg +21 -0
- swarm/static/contrib/tabler-icons/layout-sidebar-right-collapse.svg +21 -0
- swarm/static/contrib/tabler-icons/layout-sidebar-right-expand.svg +21 -0
- swarm/static/contrib/tabler-icons/message-chatbot.svg +22 -0
- swarm/static/contrib/tabler-icons/message-star.svg +22 -0
- swarm/static/contrib/tabler-icons/message-x.svg +23 -0
- swarm/static/contrib/tabler-icons/message.svg +21 -0
- swarm/static/contrib/tabler-icons/paperclip.svg +18 -0
- swarm/static/contrib/tabler-icons/playlist-add.svg +22 -0
- swarm/static/contrib/tabler-icons/robot.svg +26 -0
- swarm/static/contrib/tabler-icons/search.svg +19 -0
- swarm/static/contrib/tabler-icons/settings.svg +20 -0
- swarm/static/contrib/tabler-icons/thumb-down.svg +19 -0
- swarm/static/contrib/tabler-icons/thumb-up.svg +19 -0
- swarm/static/css/dropdown.css +22 -0
- swarm/static/htmx/htmx.min.js +0 -0
- swarm/static/js/dropdown.js +23 -0
- swarm/static/rest_mode/css/base.css +470 -0
- swarm/static/rest_mode/css/chat-history.css +286 -0
- swarm/static/rest_mode/css/chat.css +251 -0
- swarm/static/rest_mode/css/chatbot.css +74 -0
- swarm/static/rest_mode/css/chatgpt.css +62 -0
- swarm/static/rest_mode/css/colors/corporate.css +74 -0
- swarm/static/rest_mode/css/colors/pastel.css +81 -0
- swarm/static/rest_mode/css/colors/tropical.css +82 -0
- swarm/static/rest_mode/css/general.css +142 -0
- swarm/static/rest_mode/css/layout.css +167 -0
- swarm/static/rest_mode/css/layouts/messenger-layout.css +17 -0
- swarm/static/rest_mode/css/layouts/minimalist-layout.css +57 -0
- swarm/static/rest_mode/css/layouts/mobile-layout.css +8 -0
- swarm/static/rest_mode/css/messages.css +84 -0
- swarm/static/rest_mode/css/messenger.css +135 -0
- swarm/static/rest_mode/css/settings.css +91 -0
- swarm/static/rest_mode/css/simple.css +44 -0
- swarm/static/rest_mode/css/slack.css +58 -0
- swarm/static/rest_mode/css/style.css +156 -0
- swarm/static/rest_mode/css/theme.css +30 -0
- swarm/static/rest_mode/css/toast.css +40 -0
- swarm/static/rest_mode/js/auth.js +9 -0
- swarm/static/rest_mode/js/blueprint.js +41 -0
- swarm/static/rest_mode/js/blueprintUtils.js +12 -0
- swarm/static/rest_mode/js/chatLogic.js +79 -0
- swarm/static/rest_mode/js/debug.js +63 -0
- swarm/static/rest_mode/js/events.js +98 -0
- swarm/static/rest_mode/js/main.js +19 -0
- swarm/static/rest_mode/js/messages.js +264 -0
- swarm/static/rest_mode/js/messengerLogic.js +355 -0
- swarm/static/rest_mode/js/modules/apiService.js +84 -0
- swarm/static/rest_mode/js/modules/blueprintManager.js +162 -0
- swarm/static/rest_mode/js/modules/chatHistory.js +110 -0
- swarm/static/rest_mode/js/modules/debugLogger.js +14 -0
- swarm/static/rest_mode/js/modules/eventHandlers.js +107 -0
- swarm/static/rest_mode/js/modules/messageProcessor.js +120 -0
- swarm/static/rest_mode/js/modules/state.js +7 -0
- swarm/static/rest_mode/js/modules/userInteractions.js +29 -0
- swarm/static/rest_mode/js/modules/validation.js +23 -0
- swarm/static/rest_mode/js/rendering.js +119 -0
- swarm/static/rest_mode/js/settings.js +130 -0
- swarm/static/rest_mode/js/sidebar.js +94 -0
- swarm/static/rest_mode/js/simpleLogic.js +37 -0
- swarm/static/rest_mode/js/slackLogic.js +66 -0
- swarm/static/rest_mode/js/splash.js +76 -0
- swarm/static/rest_mode/js/theme.js +111 -0
- swarm/static/rest_mode/js/toast.js +36 -0
- swarm/static/rest_mode/js/ui.js +265 -0
- swarm/static/rest_mode/js/validation.js +57 -0
- swarm/static/rest_mode/svg/animated_spinner.svg +12 -0
- swarm/static/rest_mode/svg/arrow_down.svg +5 -0
- swarm/static/rest_mode/svg/arrow_left.svg +5 -0
- swarm/static/rest_mode/svg/arrow_right.svg +5 -0
- swarm/static/rest_mode/svg/arrow_up.svg +5 -0
- swarm/static/rest_mode/svg/attach.svg +8 -0
- swarm/static/rest_mode/svg/avatar.svg +7 -0
- swarm/static/rest_mode/svg/canvas.svg +6 -0
- swarm/static/rest_mode/svg/chat_history.svg +4 -0
- swarm/static/rest_mode/svg/close.svg +5 -0
- swarm/static/rest_mode/svg/copy.svg +4 -0
- swarm/static/rest_mode/svg/dark_mode.svg +3 -0
- swarm/static/rest_mode/svg/edit.svg +5 -0
- swarm/static/rest_mode/svg/layout.svg +9 -0
- swarm/static/rest_mode/svg/logo.svg +29 -0
- swarm/static/rest_mode/svg/logout.svg +5 -0
- swarm/static/rest_mode/svg/mobile.svg +5 -0
- swarm/static/rest_mode/svg/new_chat.svg +4 -0
- swarm/static/rest_mode/svg/not_visible.svg +5 -0
- swarm/static/rest_mode/svg/plus.svg +7 -0
- swarm/static/rest_mode/svg/run_code.svg +6 -0
- swarm/static/rest_mode/svg/save.svg +4 -0
- swarm/static/rest_mode/svg/search.svg +6 -0
- swarm/static/rest_mode/svg/settings.svg +4 -0
- swarm/static/rest_mode/svg/speaker.svg +5 -0
- swarm/static/rest_mode/svg/stop.svg +6 -0
- swarm/static/rest_mode/svg/thumbs_down.svg +3 -0
- swarm/static/rest_mode/svg/thumbs_up.svg +3 -0
- swarm/static/rest_mode/svg/toggle_off.svg +6 -0
- swarm/static/rest_mode/svg/toggle_on.svg +6 -0
- swarm/static/rest_mode/svg/trash.svg +10 -0
- swarm/static/rest_mode/svg/undo.svg +3 -0
- swarm/static/rest_mode/svg/visible.svg +8 -0
- swarm/static/rest_mode/svg/voice.svg +10 -0
- swarm/templates/account/login.html +22 -0
- swarm/templates/account/signup.html +32 -0
- swarm/templates/base.html +30 -0
- swarm/templates/chat.html +43 -0
- swarm/templates/index.html +35 -0
- swarm/templates/rest_mode/components/chat_sidebar.html +55 -0
- swarm/templates/rest_mode/components/header.html +45 -0
- swarm/templates/rest_mode/components/main_chat_pane.html +41 -0
- swarm/templates/rest_mode/components/settings_dialog.html +97 -0
- swarm/templates/rest_mode/components/splash_screen.html +7 -0
- swarm/templates/rest_mode/components/top_bar.html +28 -0
- swarm/templates/rest_mode/message_ui.html +50 -0
- swarm/templates/rest_mode/slackbot.html +30 -0
- swarm/templates/simple_blueprint_page.html +24 -0
- swarm/templates/websocket_partials/final_system_message.html +3 -0
- swarm/templates/websocket_partials/system_message.html +4 -0
- swarm/templates/websocket_partials/user_message.html +5 -0
- swarm/urls.py +57 -74
- swarm/utils/log_utils.py +63 -0
- swarm/views/api_views.py +48 -39
- swarm/views/chat_views.py +156 -70
- swarm/views/core_views.py +85 -90
- swarm/views/model_views.py +64 -121
- swarm/views/utils.py +65 -441
- open_swarm-0.1.1743070217.dist-info/METADATA +0 -258
- open_swarm-0.1.1743070217.dist-info/RECORD +0 -89
- open_swarm-0.1.1743070217.dist-info/entry_points.txt +0 -3
- open_swarm-0.1.1743070217.dist-info/top_level.txt +0 -1
- swarm/agent/agent.py +0 -49
- swarm/core.py +0 -326
- swarm/extensions/mcp/__init__.py +0 -1
- swarm/extensions/mcp/cache_utils.py +0 -36
- swarm/extensions/mcp/mcp_client.py +0 -341
- swarm/extensions/mcp/mcp_constants.py +0 -7
- swarm/extensions/mcp/mcp_tool_provider.py +0 -110
- swarm/types.py +0 -126
- {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,,
|
swarm/__init__.py
CHANGED
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
|
-
|
5
|
-
from
|
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
|
-
|
10
|
-
|
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
|
-
|
15
|
+
# --- Static Token Authentication ---
|
16
|
+
class StaticTokenAuthentication(BaseAuthentication):
|
16
17
|
"""
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
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
|
+
|