open-swarm 0.1.1743070217__py3-none-any.whl → 0.1.1743364176__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.1743364176.dist-info/METADATA +286 -0
  2. open_swarm-0.1.1743364176.dist-info/RECORD +260 -0
  3. {open_swarm-0.1.1743070217.dist-info → open_swarm-0.1.1743364176.dist-info}/WHEEL +1 -2
  4. open_swarm-0.1.1743364176.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.1743364176.dist-info}/licenses/LICENSE +0 -0
@@ -1,135 +1,78 @@
1
1
  """
2
- Model listing views for Open Swarm MCP Core.
3
- Dynamically discovers blueprints and lists them alongside configured LLMs.
2
+ Views related to listing and describing available models (Blueprints).
4
3
  """
5
- import os
6
- from django.http import JsonResponse
7
- from rest_framework.decorators import api_view, permission_classes, authentication_classes
8
- from rest_framework.permissions import AllowAny # Import AllowAny
9
- from drf_spectacular.utils import extend_schema
4
+ import logging
5
+ from django.conf import settings
6
+ from django.http import JsonResponse # Not used directly, Response is preferred
7
+ from django.utils.decorators import method_decorator
8
+ from django.views.decorators.csrf import csrf_exempt
10
9
 
11
- from swarm.utils.logger_setup import setup_logger
12
- # Import the function to discover blueprints, not the metadata variable
13
- from swarm.extensions.blueprint.blueprint_discovery import discover_blueprints
14
- # Import utility to filter blueprints if needed
15
- from swarm.extensions.blueprint.blueprint_utils import filter_blueprints
16
- # Import config loader or access config globally if set up
17
- # Using utils seems less direct, let's assume config needs loading or is globally available
18
- # from swarm.views.utils import config # This import might be problematic, load directly if needed
19
- from swarm.extensions.config.config_loader import load_server_config
20
- from swarm.settings import BLUEPRINTS_DIR # Import the directory setting
10
+ from rest_framework.views import APIView
11
+ from rest_framework.response import Response
12
+ from rest_framework.permissions import AllowAny, IsAuthenticated
13
+ from rest_framework import status
21
14
 
22
- logger = setup_logger(__name__)
15
+ from drf_spectacular.utils import extend_schema
23
16
 
24
- @extend_schema(
25
- responses={
26
- 200: {
27
- "type": "object",
28
- "properties": {
29
- "object": {"type": "string"},
30
- "data": {
31
- "type": "array",
32
- "items": {
33
- "type": "object",
34
- "properties": {
35
- "id": {"type": "string"},
36
- "object": {"type": "string"},
37
- "title": {"type": "string"},
38
- "description": {"type": "string"}
39
- }
40
- }
41
- }
42
- }
43
- }
44
- },
45
- summary="Lists LLMs, config-defined blueprints, and discovered blueprints as models."
46
- )
47
- @api_view(["GET"])
48
- @permission_classes([AllowAny]) # Use AllowAny directly
49
- @authentication_classes([]) # No authentication required for listing models
50
- def list_models(request):
51
- """List available LLMs, config-defined blueprints, and discovered blueprints."""
52
- if request.method != "GET":
53
- return JsonResponse({"error": "Method not allowed. Use GET."}, status=405)
17
+ # *** Import async_to_sync ***
18
+ from asgiref.sync import async_to_sync
54
19
 
55
- try:
56
- # Load configuration each time or ensure it's loaded globally/cached
57
- config = load_server_config() # Load config to get LLMs and config blueprints
20
+ # Import the utility function
21
+ from .utils import get_available_blueprints
22
+ from ..permissions import HasValidTokenOrSession
58
23
 
59
- # 1. LLMs from config (marked as passthrough)
60
- llm_config = config.get("llm", {})
61
- llm_data = [
62
- {
63
- "id": key,
64
- "object": "llm", # Mark as llm type
65
- "title": conf.get("model", key), # Use model name or key as title
66
- "description": f"Provider: {conf.get('provider', 'N/A')}, Model: {conf.get('model', 'N/A')}"
67
- }
68
- for key, conf in llm_config.items() if conf.get("passthrough")
69
- ]
24
+ logger = logging.getLogger(__name__)
70
25
 
71
- # 2. Blueprints defined directly in swarm_config.json
72
- config_blueprints = config.get("blueprints", {})
73
- config_bp_data = [
74
- {
75
- "id": key,
76
- "object": "blueprint", # Mark as blueprint type
77
- "title": bp.get("title", key),
78
- "description": bp.get("description", f"Blueprint '{key}' from configuration file.")
79
- }
80
- for key, bp in config_blueprints.items()
81
- ]
26
+ # ==============================================================================
27
+ # API Views (DRF based) for Models
28
+ # ==============================================================================
82
29
 
83
- # 3. Dynamically discovered blueprints from the blueprints directory
84
- # Ensure BLUEPRINTS_DIR is correctly pointing to your blueprints location relative to project root
85
- try:
86
- # Call discover_blueprints function to get the metadata dictionary
87
- discovered_blueprints_metadata = discover_blueprints(directories=[BLUEPRINTS_DIR])
88
- except FileNotFoundError:
89
- logger.warning(f"Blueprints directory '{BLUEPRINTS_DIR}' not found. No blueprints discovered dynamically.")
90
- discovered_blueprints_metadata = {}
91
- except Exception as discover_err:
92
- logger.error(f"Error discovering blueprints: {discover_err}", exc_info=True)
93
- discovered_blueprints_metadata = {}
30
+ class ListModelsView(APIView):
31
+ """
32
+ API view to list available models (Blueprints).
33
+ Compliant with OpenAI API's /v1/models endpoint structure.
34
+ """
35
+ permission_classes = [HasValidTokenOrSession]
94
36
 
37
+ @extend_schema(
38
+ responses={ # Simplified schema for brevity
39
+ 200: {"description": "A list of available models."}
40
+ }
41
+ )
42
+ # *** Make the handler synchronous ***
43
+ def get(self, request, *args, **kwargs):
44
+ """
45
+ Handles GET requests to list available models.
46
+ """
47
+ try:
48
+ # *** Call the async utility function using async_to_sync ***
49
+ # Ensure get_available_blueprints is awaitable (async def or wrapped)
50
+ available_blueprints_dict = async_to_sync(get_available_blueprints)()
95
51
 
96
- # Filter discovered blueprints based on environment variable if set
97
- allowed_blueprints_str = os.getenv("SWARM_BLUEPRINTS")
98
- if allowed_blueprints_str and allowed_blueprints_str.strip():
99
- # Use the imported filter_blueprints utility
100
- final_discovered_metadata = filter_blueprints(discovered_blueprints_metadata, allowed_blueprints_str)
101
- logger.info(f"Filtering discovered blueprints based on SWARM_BLUEPRINTS env var. Kept: {list(final_discovered_metadata.keys())}")
102
- else:
103
- final_discovered_metadata = discovered_blueprints_metadata # Use all discovered if no filter
52
+ models_data = [
53
+ {
54
+ "id": model_id,
55
+ "object": "model",
56
+ "created": 0, # Placeholder
57
+ "owned_by": "open-swarm",
58
+ # Access metadata safely
59
+ "profile_name": metadata.get('profile_name', 'unknown') if isinstance(metadata, dict) else 'unknown'
60
+ }
61
+ # Ensure iteration works correctly
62
+ for model_id, metadata in (available_blueprints_dict.items() if isinstance(available_blueprints_dict, dict) else [])
63
+ ]
104
64
 
105
- # Format discovered blueprint data
106
- discovered_bp_data = [
107
- {
108
- "id": key,
109
- "object": "blueprint", # Mark as blueprint type
110
- "title": meta.get("title", key),
111
- "description": meta.get("description", f"Discovered blueprint '{key}'.")
65
+ response_data = {
66
+ "object": "list",
67
+ "data": models_data,
112
68
  }
113
- for key, meta in final_discovered_metadata.items()
114
- ]
115
-
116
- # 4. Merge all data sources
117
- # Start with LLMs and config blueprints
118
- merged_data = llm_data + config_bp_data
119
- # Keep track of IDs already added
120
- seen_ids = {item["id"] for item in merged_data}
121
- # Add discovered blueprints only if their ID hasn't been used by config/LLMs
122
- for bp_item in discovered_bp_data:
123
- if bp_item["id"] not in seen_ids:
124
- merged_data.append(bp_item)
125
- seen_ids.add(bp_item["id"]) # Mark ID as seen
126
-
127
- logger.debug(f"Returning {len(merged_data)} models (LLMs + Blueprints).")
128
- # Return the merged list in the expected OpenAI-like format
129
- return JsonResponse({"object": "list", "data": merged_data}, status=200)
130
-
131
- except Exception as e:
132
- # Catch-all for unexpected errors during the process
133
- logger.error(f"Error listing models: {e}", exc_info=True)
134
- return JsonResponse({"error": "Internal Server Error while listing models."}, status=500)
69
+ # Return the standard sync Response
70
+ return Response(response_data, status=status.HTTP_200_OK)
135
71
 
72
+ except Exception as e:
73
+ logger.error(f"Error retrieving available blueprints: {e}", exc_info=True)
74
+ # Return the standard sync Response
75
+ return Response(
76
+ {"error": "Internal server error retrieving models."},
77
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
78
+ )