open-swarm 0.1.1745019858__tar.gz → 0.1.1745020084__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/PKG-INFO +1 -1
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/pyproject.toml +1 -1
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/chatbot/blueprint_chatbot.py +41 -38
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/digitalbutlers/blueprint_digitalbutlers.py +24 -101
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/divine_code/blueprint_divine_code.py +4 -38
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/blueprint_family_ties.py +9 -33
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/omniplex/blueprint_omniplex.py +20 -20
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/rue_code/blueprint_rue_code.py +0 -14
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/suggestion/blueprint_suggestion.py +24 -91
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/cli_handler.py +1 -2
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_chatbot.py +13 -16
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/.gitignore +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/LICENSE +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/README.md +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/agent/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/apps.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/auth.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/README.md +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/blueprint_audit_status.json +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/chatbot/templates/chatbot/chatbot.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/codey/CODEY.md +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/codey/README.md +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/codey/blueprint_codey.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/codey/instructions.md +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/divine_code/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/divine_code/apps.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/django_chat/apps.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/django_chat/blueprint_django_chat.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/django_chat/templates/django_chat/django_chat_webpage.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/django_chat/urls.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/django_chat/views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/echocraft/blueprint_echocraft.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/apps.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/models.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/serializers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/settings.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/urls.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/family_ties/views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/flock/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/geese/blueprint_geese.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/mcp_demo/blueprint_mcp_demo.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/messenger/templates/messenger/messenger.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/mission_improbable/blueprint_mission_improbable.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/monkai_magic/blueprint_monkai_magic.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/nebula_shellz/blueprint_nebula_shellz.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/rue_code/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/unapologetic_press/blueprint_unapologetic_press.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/whiskeytango_foxtrot/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/whiskeytango_foxtrot/apps.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/blueprints/whiskeytango_foxtrot/blueprint_whiskeytango_foxtrot.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/consumers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/agent_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/blueprint_base.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/blueprint_discovery.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/blueprint_runner.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/blueprint_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/blueprint_ux.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/build_launchers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/build_swarm_wrapper.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/commands/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/commands/blueprint_management.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/interactive_shell.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/main.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/utils/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/cli/utils/discover_commands.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/common_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/config_loader.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/config_manager.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/output_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/server_config.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/session_logger.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/setup_wizard.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/slash_commands.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/spinner.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/swarm_api.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/swarm_cli.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/swarm_wrapper.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/utils/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/core/utils/logger.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/django_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/interactive_mode.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/modes/rest_mode.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/blueprint/runnable_blueprint.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/blueprint_runner.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/cli_args.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/blueprint_management.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/config_management.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/edit_config.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/list_blueprints.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/validate_env.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/commands/validate_envvars.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/interactive_shell.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/main.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/selection.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/utils/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/utils/discover_commands.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/utils/env_setup.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/utils/prompt_user.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/cli/utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/config/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/config/config_loader.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/launchers/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/launchers/swarm_api.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/extensions/launchers/swarm_cli.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/management/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/management/commands/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/management/commands/runserver.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/messages.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/middleware.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/migrations/0010_initial_chat_models.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/migrations/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/models.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/permissions.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/repl/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/repl/repl.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/serializers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/settings.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/fonts/fontawesome-webfont.ttf +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/fonts/fontawesome-webfont.woff +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/fonts/fontawesome-webfont.woff2 +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/markedjs/marked.min.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/adjustments-horizontal.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/alert-triangle.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/archive.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/artboard.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/automatic-gearbox.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/box-multiple.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/carambola.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/copy.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/download.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/edit.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/filled/carambola.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/filled/paint.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/headset.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/layout-sidebar-left-collapse.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/layout-sidebar-left-expand.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/layout-sidebar-right-collapse.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/layout-sidebar-right-expand.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/message-chatbot.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/message-star.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/message-x.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/message.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/paperclip.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/playlist-add.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/robot.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/search.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/settings.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/thumb-down.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/contrib/tabler-icons/thumb-up.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/css/dropdown.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/htmx/htmx.min.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/js/dropdown.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/base.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/chat-history.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/chat.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/chatbot.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/chatgpt.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/colors/corporate.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/colors/pastel.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/colors/tropical.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/general.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/layout.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/layouts/messenger-layout.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/layouts/minimalist-layout.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/layouts/mobile-layout.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/messages.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/messenger.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/settings.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/simple.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/slack.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/style.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/theme.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/css/toast.css +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/auth.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/blueprint.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/blueprintUtils.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/chatLogic.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/debug.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/events.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/main.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/messages.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/messengerLogic.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/apiService.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/blueprintManager.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/chatHistory.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/debugLogger.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/eventHandlers.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/messageProcessor.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/state.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/userInteractions.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/modules/validation.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/rendering.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/settings.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/sidebar.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/simpleLogic.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/slackLogic.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/splash.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/theme.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/toast.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/ui.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/js/validation.js +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/animated_spinner.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/arrow_down.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/arrow_left.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/arrow_right.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/arrow_up.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/attach.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/avatar.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/canvas.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/chat_history.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/close.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/copy.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/dark_mode.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/edit.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/layout.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/logo.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/logout.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/mobile.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/new_chat.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/not_visible.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/plus.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/run_code.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/save.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/search.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/settings.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/speaker.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/stop.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/thumbs_down.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/thumbs_up.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/toggle_off.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/toggle_on.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/trash.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/undo.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/visible.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/static/rest_mode/svg/voice.svg +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/account/login.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/account/signup.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/base.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/chat.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/index.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/chat_sidebar.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/header.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/main_chat_pane.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/settings_dialog.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/splash_screen.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/components/top_bar.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/message_ui.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/rest_mode/slackbot.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/simple_blueprint_page.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/websocket_partials/final_system_message.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/websocket_partials/system_message.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/templates/websocket_partials/user_message.html +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/tool_executor.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/urls.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/util.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/color_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/context_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/general_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/log_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/logger.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/logger_setup.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/message_sequence.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/message_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/utils/redact.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/api_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/chat_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/core_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/message_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/model_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/views/web_views.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/src/swarm/wsgi.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/__init__.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/api/conftest.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/api/test_chat_completions_auth_async.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/api/test_chat_completions_failing_async.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/api/test_chat_completions_validation_async.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_codey.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_codey_approval_mode.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_codey_github.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_digitalbutlers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_dilbot_universe.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_divine_code.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_echocraft.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_family_ties.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_gaggle.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_geese.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_gotchaman.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_mcp_demo.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_mission_improbable.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_monkai_magic.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_nebula_shellz.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_omniplex.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_suggestion.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_unapologetic_press.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/blueprints/test_whiskeytangofoxtrot.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/cli/test_cli_config.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/cli/test_launchers.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/cli/test_list_blueprints.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/conftest.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/extensions/launchers/test_swarm_api_launcher.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/integration/test_cli_commands.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/swarm_config.json +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_chucks_angels.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_digitalbutlers.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_dilbot_universe.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_divine_code.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_django_chat.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_echocraft.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_family_ties.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_flock.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_gaggle.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_gotchaman.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_monkai-magic.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_nebula_shellz.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_omniplex.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_rue-code.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_suggestion.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_unapologetic_press.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_university.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/system/test_whiskeytango_foxtrot.sh +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_blueprint_loading.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_cli_mode_selection.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_core_filter_duplicate_system_messages.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_core_filter_messages.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_core_truncate_message_history.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_core_update_null_content.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_dummy.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/test_truncate_message_history.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/unit/blueprints/rue_code/test_rue_code_tools.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/unit/test_blueprint_base_config.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/unit/test_output_utils.py +0 -0
- {open_swarm-0.1.1745019858 → open_swarm-0.1.1745020084}/tests/unit/test_slash_commands.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: open-swarm
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.1745020084
|
4
4
|
Summary: Open Swarm: Orchestrating AI Agent Swarms with Django
|
5
5
|
Project-URL: Homepage, https://github.com/yourusername/open-swarm
|
6
6
|
Project-URL: Documentation, https://github.com/yourusername/open-swarm/blob/main/README.md
|
@@ -19,6 +19,12 @@ if not os.environ.get("SWARM_DEBUG"):
|
|
19
19
|
else:
|
20
20
|
logging.basicConfig(level=logging.DEBUG)
|
21
21
|
|
22
|
+
# Set logging to WARNING by default unless SWARM_DEBUG=1
|
23
|
+
if not os.environ.get("SWARM_DEBUG"):
|
24
|
+
logging.basicConfig(level=logging.WARNING)
|
25
|
+
else:
|
26
|
+
logging.basicConfig(level=logging.DEBUG)
|
27
|
+
|
22
28
|
# Ensure src is in path for BlueprintBase import
|
23
29
|
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
24
30
|
src_path = os.path.join(project_root, 'src')
|
@@ -180,50 +186,47 @@ You are a helpful and friendly chatbot. Respond directly to the user's input in
|
|
180
186
|
logger.debug("Chatbot agent created.")
|
181
187
|
return chatbot_agent
|
182
188
|
|
183
|
-
def render_prompt(self, template_name: str, context: dict) -> str:
|
184
|
-
return f"User request: {context.get('user_request', '')}\nHistory: {context.get('history', '')}\nAvailable tools: {', '.join(context.get('available_tools', []))}"
|
185
|
-
|
186
189
|
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
187
190
|
"""Main execution entry point for the Chatbot blueprint."""
|
188
191
|
logger.info("ChatbotBlueprint run method called.")
|
189
|
-
|
190
|
-
|
191
|
-
yield
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
]
|
206
|
-
}
|
207
|
-
return
|
192
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
193
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
194
|
+
yield chunk
|
195
|
+
logger.info("ChatbotBlueprint run method finished.")
|
196
|
+
|
197
|
+
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
198
|
+
mcp_servers = kwargs.get("mcp_servers", [])
|
199
|
+
agent = self.create_starting_agent(mcp_servers=mcp_servers)
|
200
|
+
from agents import Runner
|
201
|
+
import os
|
202
|
+
model_name = os.getenv("LITELLM_MODEL") or os.getenv("DEFAULT_LLM") or "gpt-3.5-turbo"
|
203
|
+
try:
|
204
|
+
result = await Runner.run(agent, instruction)
|
205
|
+
yield {"messages": [{"role": "assistant", "content": getattr(result, 'final_output', str(result))}]}
|
206
|
+
except Exception as e:
|
207
|
+
logger.error(f"Error during non-interactive run: {e}", exc_info=True)
|
208
|
+
yield {"messages": [{"role": "assistant", "content": f"An error occurred: {e}"}]}
|
208
209
|
|
209
210
|
# Standard Python entry point
|
210
211
|
if __name__ == "__main__":
|
212
|
+
import sys
|
211
213
|
import asyncio
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
if instruction:
|
221
|
-
blueprint = ChatbotBlueprint(blueprint_id="chatbot")
|
222
|
-
async def runner():
|
223
|
-
async for chunk in blueprint._run_non_interactive(instruction):
|
224
|
-
msg = chunk["messages"][0]["content"]
|
225
|
-
if not msg.startswith("An error occurred:"):
|
226
|
-
print(msg)
|
227
|
-
asyncio.run(runner())
|
214
|
+
# --- AUTO-PYTHONPATH PATCH FOR AGENTS ---
|
215
|
+
import os
|
216
|
+
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))
|
217
|
+
src_path = os.path.join(project_root, 'src')
|
218
|
+
if src_path not in sys.path:
|
219
|
+
sys.path.insert(0, src_path)
|
220
|
+
if '--instruction' in sys.argv:
|
221
|
+
instruction = sys.argv[sys.argv.index('--instruction') + 1]
|
228
222
|
else:
|
229
223
|
print("Interactive mode not supported in this script.")
|
224
|
+
sys.exit(1)
|
225
|
+
|
226
|
+
blueprint = ChatbotBlueprint(blueprint_id="chatbot")
|
227
|
+
async def runner():
|
228
|
+
async for chunk in blueprint._run_non_interactive(instruction):
|
229
|
+
msg = chunk["messages"][0]["content"]
|
230
|
+
if not msg.startswith("An error occurred:"):
|
231
|
+
print(msg)
|
232
|
+
asyncio.run(runner())
|
@@ -123,16 +123,8 @@ SPINNER_STATES = ['Generating.', 'Generating..', 'Generating...', 'Running...']
|
|
123
123
|
|
124
124
|
# --- Define the Blueprint ---
|
125
125
|
class DigitalButlersBlueprint(BlueprintBase):
|
126
|
-
def __init__(self,
|
127
|
-
super().__init__(
|
128
|
-
class DummyLLM:
|
129
|
-
def chat_completion_stream(self, messages, **_):
|
130
|
-
class DummyStream:
|
131
|
-
def __aiter__(self): return self
|
132
|
-
async def __anext__(self):
|
133
|
-
raise StopAsyncIteration
|
134
|
-
return DummyStream()
|
135
|
-
self.llm = DummyLLM()
|
126
|
+
def __init__(self, blueprint_id: str, config_path: Optional[Path] = None, **kwargs):
|
127
|
+
super().__init__(blueprint_id, config_path=config_path, **kwargs)
|
136
128
|
|
137
129
|
"""Blueprint for private web search and home automation using a team of digital butlers."""
|
138
130
|
metadata: ClassVar[Dict[str, Any]] = {
|
@@ -258,97 +250,28 @@ class DigitalButlersBlueprint(BlueprintBase):
|
|
258
250
|
logger.debug("Digital Butlers team created: Jeeves (Coordinator), Mycroft (Search), Gutenberg (Home).")
|
259
251
|
return jeeves_agent # Jeeves is the entry point
|
260
252
|
|
261
|
-
def
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
return
|
284
|
-
|
285
|
-
async def run(self, messages):
|
286
|
-
last_result = None
|
287
|
-
async for result in self._original_run(messages):
|
288
|
-
last_result = result
|
289
|
-
yield result
|
290
|
-
if last_result is not None:
|
291
|
-
await self.reflect_and_learn(messages, last_result)
|
292
|
-
|
293
|
-
async def reflect_and_learn(self, messages, result):
|
294
|
-
log = {
|
295
|
-
'task': messages,
|
296
|
-
'result': result,
|
297
|
-
'reflection': 'Success' if self.success_criteria(result) else 'Needs improvement',
|
298
|
-
'alternatives': self.consider_alternatives(messages, result),
|
299
|
-
'swarm_lessons': self.query_swarm_knowledge(messages)
|
300
|
-
}
|
301
|
-
self.write_to_swarm_log(log)
|
302
|
-
|
303
|
-
def success_criteria(self, result):
|
304
|
-
if not result or (isinstance(result, dict) and 'error' in result):
|
305
|
-
return False
|
306
|
-
if isinstance(result, list) and result and 'error' in result[0].get('messages', [{}])[0].get('content', '').lower():
|
307
|
-
return False
|
308
|
-
return True
|
309
|
-
|
310
|
-
def consider_alternatives(self, messages, result):
|
311
|
-
alternatives = []
|
312
|
-
if not self.success_criteria(result):
|
313
|
-
alternatives.append('Delegate to a different butler.')
|
314
|
-
alternatives.append('Try a simpler or more robust plan.')
|
315
|
-
else:
|
316
|
-
alternatives.append('Parallelize tasks for efficiency.')
|
317
|
-
return alternatives
|
318
|
-
|
319
|
-
def query_swarm_knowledge(self, messages):
|
320
|
-
import json, os
|
321
|
-
path = os.path.join(os.path.dirname(__file__), '../../../swarm_knowledge.json')
|
322
|
-
if not os.path.exists(path):
|
323
|
-
return []
|
324
|
-
with open(path, 'r') as f:
|
325
|
-
knowledge = json.load(f)
|
326
|
-
task_str = json.dumps(messages)
|
327
|
-
return [entry for entry in knowledge if entry.get('task_str') == task_str]
|
328
|
-
|
329
|
-
def write_to_swarm_log(self, log):
|
330
|
-
import json, os, time
|
331
|
-
from filelock import FileLock, Timeout
|
332
|
-
path = os.path.join(os.path.dirname(__file__), '../../../swarm_log.json')
|
333
|
-
lock_path = path + '.lock'
|
334
|
-
log['task_str'] = json.dumps(log['task'])
|
335
|
-
for attempt in range(10):
|
336
|
-
try:
|
337
|
-
with FileLock(lock_path, timeout=5):
|
338
|
-
if os.path.exists(path):
|
339
|
-
with open(path, 'r') as f:
|
340
|
-
try:
|
341
|
-
logs = json.load(f)
|
342
|
-
except json.JSONDecodeError:
|
343
|
-
logs = []
|
344
|
-
else:
|
345
|
-
logs = []
|
346
|
-
logs.append(log)
|
347
|
-
with open(path, 'w') as f:
|
348
|
-
json.dump(logs, f, indent=2)
|
349
|
-
break
|
350
|
-
except Timeout:
|
351
|
-
time.sleep(0.2 * (attempt + 1))
|
253
|
+
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
254
|
+
"""Main execution entry point for the DigitalButlers blueprint."""
|
255
|
+
logger.info("DigitalButlersBlueprint run method called.")
|
256
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
257
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
258
|
+
yield chunk
|
259
|
+
logger.info("DigitalButlersBlueprint run method finished.")
|
260
|
+
|
261
|
+
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
262
|
+
logger.info(f"Running DigitalButlers non-interactively with instruction: '{instruction[:100]}...'")
|
263
|
+
mcp_servers = kwargs.get("mcp_servers", [])
|
264
|
+
agent = self.create_starting_agent(mcp_servers=mcp_servers)
|
265
|
+
# Use Runner.run as a classmethod for portability
|
266
|
+
from agents import Runner
|
267
|
+
import os
|
268
|
+
model_name = os.getenv("LITELLM_MODEL") or os.getenv("DEFAULT_LLM") or "gpt-3.5-turbo"
|
269
|
+
try:
|
270
|
+
for chunk in Runner.run(agent, instruction):
|
271
|
+
yield chunk
|
272
|
+
except Exception as e:
|
273
|
+
logger.error(f"Error during non-interactive run: {e}", exc_info=True)
|
274
|
+
yield {"messages": [{"role": "assistant", "content": f"An error occurred: {e}"}]}
|
352
275
|
|
353
276
|
# Standard Python entry point
|
354
277
|
if __name__ == "__main__":
|
@@ -164,14 +164,6 @@ execute_shell_command_tool = PatchedFunctionTool(execute_shell_command, 'execute
|
|
164
164
|
class DivineOpsBlueprint(BlueprintBase):
|
165
165
|
def __init__(self, blueprint_id: str, config_path: Optional[Path] = None, **kwargs):
|
166
166
|
super().__init__(blueprint_id, config_path=config_path, **kwargs)
|
167
|
-
class DummyLLM:
|
168
|
-
def chat_completion_stream(self, messages, **_):
|
169
|
-
class DummyStream:
|
170
|
-
def __aiter__(self): return self
|
171
|
-
async def __anext__(self):
|
172
|
-
raise StopAsyncIteration
|
173
|
-
return DummyStream()
|
174
|
-
self.llm = DummyLLM()
|
175
167
|
# Use serious style for DivineOps
|
176
168
|
self.ux = BlueprintUX(style="serious")
|
177
169
|
|
@@ -289,39 +281,13 @@ class DivineOpsBlueprint(BlueprintBase):
|
|
289
281
|
logger.debug("Divine Ops Team (Zeus & Pantheon) created successfully. Zeus is starting agent.")
|
290
282
|
return zeus_agent
|
291
283
|
|
292
|
-
def render_prompt(self, template_name: str, context: dict) -> str:
|
293
|
-
return f"User request: {context.get('user_request', '')}\nHistory: {context.get('history', '')}\nAvailable tools: {', '.join(context.get('available_tools', []))}"
|
294
|
-
|
295
284
|
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
296
285
|
"""Main execution entry point for the DivineOps blueprint."""
|
297
286
|
logger.info("DivineOpsBlueprint run method called.")
|
298
|
-
|
299
|
-
|
300
|
-
yield
|
301
|
-
|
302
|
-
prompt_context = {
|
303
|
-
"user_request": last_user_message,
|
304
|
-
"history": messages[:-1],
|
305
|
-
"available_tools": ["divine_code"]
|
306
|
-
}
|
307
|
-
rendered_prompt = self.render_prompt("divine_code_prompt.j2", prompt_context)
|
308
|
-
import asyncio
|
309
|
-
for i in range(4):
|
310
|
-
yield {"messages": [{"role": "assistant", "content": self.ux.box("DivineOps", self.ux.spinner(i), summary="Preparing to process", params=prompt_context["user_request"])}]}
|
311
|
-
await asyncio.sleep(0.2)
|
312
|
-
yield {"messages": [{"role": "assistant", "content": self.ux.box("DivineOps", self.ux.spinner(0, taking_long=True), summary="Still working", params=prompt_context["user_request"])}]}
|
313
|
-
# Simulate code vs semantic search distinction
|
314
|
-
code_results = ["def divine(): ...", "def ops(): ..."]
|
315
|
-
semantic_results = ["This function orchestrates SDLC.", "This function demonstrates self-healing."]
|
316
|
-
yield {"messages": [{"role": "assistant", "content": self.ux.box(
|
317
|
-
"DivineOps Results",
|
318
|
-
self.ux.code_vs_semantic("code", code_results) + "\n" + self.ux.code_vs_semantic("semantic", semantic_results),
|
319
|
-
summary=self.ux.summary("Analyzed codebase", 4, prompt_context["user_request"]),
|
320
|
-
result_count=4,
|
321
|
-
params=prompt_context["user_request"]
|
322
|
-
)}]}
|
323
|
-
logger.info("DivineOpsBlueprint run finished.")
|
324
|
-
return
|
287
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
288
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
289
|
+
yield chunk
|
290
|
+
logger.info("DivineOpsBlueprint run method finished.")
|
325
291
|
|
326
292
|
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
327
293
|
logger.info(f"Running DivineOps non-interactively with instruction: '{instruction[:100]}...'")
|
@@ -55,16 +55,8 @@ brian_instructions = (
|
|
55
55
|
|
56
56
|
# --- Define the Blueprint ---
|
57
57
|
class FamilyTiesBlueprint(BlueprintBase):
|
58
|
-
def __init__(self,
|
59
|
-
super().__init__(
|
60
|
-
class DummyLLM:
|
61
|
-
def chat_completion_stream(self, messages, **_):
|
62
|
-
class DummyStream:
|
63
|
-
def __aiter__(self): return self
|
64
|
-
async def __anext__(self):
|
65
|
-
raise StopAsyncIteration
|
66
|
-
return DummyStream()
|
67
|
-
self.llm = DummyLLM()
|
58
|
+
def __init__(self, blueprint_id: str, config_path: Optional[Path] = None, **kwargs):
|
59
|
+
super().__init__(blueprint_id, config_path=config_path, **kwargs)
|
68
60
|
|
69
61
|
"""Manages WordPress content with a Peter/Brian agent team using the `server-wp-mcp` server."""
|
70
62
|
metadata: ClassVar[Dict[str, Any]] = {
|
@@ -161,29 +153,13 @@ class FamilyTiesBlueprint(BlueprintBase):
|
|
161
153
|
logger.debug("Agents created: PeterGrifton (Coordinator), BrianGrifton (WordPress Manager).")
|
162
154
|
return peter_agent # Peter is the entry point
|
163
155
|
|
164
|
-
def
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
return
|
172
|
-
prompt_context = {
|
173
|
-
"user_request": last_user_message,
|
174
|
-
"history": messages[:-1],
|
175
|
-
"available_tools": ["family_ties"]
|
176
|
-
}
|
177
|
-
rendered_prompt = self.render_prompt("family_ties_prompt.j2", prompt_context)
|
178
|
-
yield {
|
179
|
-
"messages": [
|
180
|
-
{
|
181
|
-
"role": "assistant",
|
182
|
-
"content": f"[FamilyTies LLM] Would respond to: {rendered_prompt}"
|
183
|
-
}
|
184
|
-
]
|
185
|
-
}
|
186
|
-
return
|
156
|
+
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
157
|
+
"""Main execution entry point for the FamilyTies blueprint."""
|
158
|
+
logger.info("FamilyTiesBlueprint run method called.")
|
159
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
160
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
161
|
+
yield chunk
|
162
|
+
logger.info("FamilyTiesBlueprint run method finished.")
|
187
163
|
|
188
164
|
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
189
165
|
logger.info(f"Running FamilyTies non-interactively with instruction: '{instruction[:100]}...'")
|
@@ -231,26 +231,26 @@ class OmniplexBlueprint(BlueprintBase):
|
|
231
231
|
logger.info(f"Omniplex Coordinator created with tools for: {[t.name for t in team_tools]}")
|
232
232
|
return coordinator_agent
|
233
233
|
|
234
|
-
async def run(self, messages:
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
}
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
234
|
+
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
235
|
+
"""Main execution entry point for the Omniplex blueprint."""
|
236
|
+
logger.info("OmniplexBlueprint run method called.")
|
237
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
238
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
239
|
+
yield chunk
|
240
|
+
logger.info("OmniplexBlueprint run method finished.")
|
241
|
+
|
242
|
+
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
243
|
+
logger.info(f"Running OmniplexBlueprint non-interactively with instruction: '{instruction[:100]}...'")
|
244
|
+
mcp_servers = kwargs.get("mcp_servers", [])
|
245
|
+
agent = self.create_starting_agent(mcp_servers=mcp_servers)
|
246
|
+
from agents import Runner
|
247
|
+
model_name = os.getenv("LITELLM_MODEL") or os.getenv("DEFAULT_LLM") or "gpt-3.5-turbo"
|
248
|
+
try:
|
249
|
+
for chunk in Runner.run(agent, instruction):
|
250
|
+
yield chunk
|
251
|
+
except Exception as e:
|
252
|
+
logger.error(f"Error during non-interactive run: {e}", exc_info=True)
|
253
|
+
yield {"messages": [{"role": "assistant", "content": f"An error occurred: {e}"}]}
|
254
254
|
|
255
255
|
# Standard Python entry point
|
256
256
|
if __name__ == "__main__":
|
@@ -265,20 +265,6 @@ class RueCodeBlueprint(BlueprintBase):
|
|
265
265
|
params=prompt_context["user_request"]
|
266
266
|
)}]}
|
267
267
|
logger.info("RueCodeBlueprint run finished.")
|
268
|
-
return
|
269
|
-
|
270
|
-
def create_starting_agent(self, mcp_servers):
|
271
|
-
read_file_tool = PatchedFunctionTool(read_file_fileops, 'read_file')
|
272
|
-
write_file_tool = PatchedFunctionTool(write_file_fileops, 'write_file')
|
273
|
-
list_files_tool = PatchedFunctionTool(list_files_fileops, 'list_files')
|
274
|
-
execute_shell_command_tool = PatchedFunctionTool(execute_shell_command_fileops, 'execute_shell_command')
|
275
|
-
rue_agent = self.make_agent(
|
276
|
-
name="RueCodeAgent",
|
277
|
-
instructions="You are RueCodeAgent. You can use fileops tools (read_file, write_file, list_files, execute_shell_command) for any file or shell tasks.",
|
278
|
-
tools=[read_file_tool, write_file_tool, list_files_tool, execute_shell_command_tool],
|
279
|
-
mcp_servers=mcp_servers
|
280
|
-
)
|
281
|
-
return rue_agent
|
282
268
|
|
283
269
|
if __name__ == "__main__":
|
284
270
|
import asyncio
|
@@ -138,8 +138,11 @@ class SuggestionBlueprint(BlueprintBase):
|
|
138
138
|
model_name = profile_data.get("model")
|
139
139
|
if not model_name: raise ValueError(f"Missing 'model' in profile '{profile_name}'.")
|
140
140
|
if provider != "openai": raise ValueError(f"Unsupported provider: {provider}")
|
141
|
+
# Remove redundant client instantiation; rely on framework-level default client
|
142
|
+
# All blueprints now use the default client set at framework init
|
141
143
|
logger.debug(f"Instantiating OpenAIChatCompletionsModel(model='{model_name}') for '{profile_name}'.")
|
142
144
|
try:
|
145
|
+
# Ensure the model selected supports structured output (most recent OpenAI do)
|
143
146
|
model_instance = OpenAIChatCompletionsModel(model=model_name)
|
144
147
|
self._model_instance_cache[profile_name] = model_instance
|
145
148
|
return model_instance
|
@@ -168,97 +171,27 @@ class SuggestionBlueprint(BlueprintBase):
|
|
168
171
|
logger.debug("SuggestionAgent created with output_type enforcement.")
|
169
172
|
return suggestion_agent
|
170
173
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
]
|
192
|
-
}
|
193
|
-
return
|
194
|
-
|
195
|
-
async def run(self, messages):
|
196
|
-
last_result = None
|
197
|
-
async for result in self._original_run(messages):
|
198
|
-
last_result = result
|
199
|
-
yield result
|
200
|
-
if last_result is not None:
|
201
|
-
await self.reflect_and_learn(messages, last_result)
|
202
|
-
|
203
|
-
async def reflect_and_learn(self, messages, result):
|
204
|
-
log = {
|
205
|
-
'task': messages,
|
206
|
-
'result': result,
|
207
|
-
'reflection': 'Success' if self.success_criteria(result) else 'Needs improvement',
|
208
|
-
'alternatives': self.consider_alternatives(messages, result),
|
209
|
-
'swarm_lessons': self.query_swarm_knowledge(messages)
|
210
|
-
}
|
211
|
-
self.write_to_swarm_log(log)
|
212
|
-
|
213
|
-
def success_criteria(self, result):
|
214
|
-
if not result or (isinstance(result, dict) and 'error' in result):
|
215
|
-
return False
|
216
|
-
if isinstance(result, list) and result and 'error' in result[0].get('messages', [{}])[0].get('content', '').lower():
|
217
|
-
return False
|
218
|
-
return True
|
219
|
-
|
220
|
-
def consider_alternatives(self, messages, result):
|
221
|
-
alternatives = []
|
222
|
-
if not self.success_criteria(result):
|
223
|
-
alternatives.append('Try a different suggestion agent.')
|
224
|
-
alternatives.append('Fallback to a simpler suggestion.')
|
225
|
-
else:
|
226
|
-
alternatives.append('Expand suggestions with more context.')
|
227
|
-
return alternatives
|
228
|
-
|
229
|
-
def query_swarm_knowledge(self, messages):
|
230
|
-
import json, os
|
231
|
-
path = os.path.join(os.path.dirname(__file__), '../../../swarm_knowledge.json')
|
232
|
-
if not os.path.exists(path):
|
233
|
-
return []
|
234
|
-
with open(path, 'r') as f:
|
235
|
-
knowledge = json.load(f)
|
236
|
-
task_str = json.dumps(messages)
|
237
|
-
return [entry for entry in knowledge if entry.get('task_str') == task_str]
|
238
|
-
|
239
|
-
def write_to_swarm_log(self, log):
|
240
|
-
import json, os, time
|
241
|
-
from filelock import FileLock, Timeout
|
242
|
-
path = os.path.join(os.path.dirname(__file__), '../../../swarm_log.json')
|
243
|
-
lock_path = path + '.lock'
|
244
|
-
log['task_str'] = json.dumps(log['task'])
|
245
|
-
for attempt in range(10):
|
246
|
-
try:
|
247
|
-
with FileLock(lock_path, timeout=5):
|
248
|
-
if os.path.exists(path):
|
249
|
-
with open(path, 'r') as f:
|
250
|
-
try:
|
251
|
-
logs = json.load(f)
|
252
|
-
except json.JSONDecodeError:
|
253
|
-
logs = []
|
254
|
-
else:
|
255
|
-
logs = []
|
256
|
-
logs.append(log)
|
257
|
-
with open(path, 'w') as f:
|
258
|
-
json.dump(logs, f, indent=2)
|
259
|
-
break
|
260
|
-
except Timeout:
|
261
|
-
time.sleep(0.2 * (attempt + 1))
|
174
|
+
async def run(self, messages: List[Dict[str, Any]], **kwargs) -> Any:
|
175
|
+
"""Main execution entry point for the Suggestion blueprint."""
|
176
|
+
logger.info("SuggestionBlueprint run method called.")
|
177
|
+
instruction = messages[-1].get("content", "") if messages else ""
|
178
|
+
async for chunk in self._run_non_interactive(instruction, **kwargs):
|
179
|
+
yield chunk
|
180
|
+
logger.info("SuggestionBlueprint run method finished.")
|
181
|
+
|
182
|
+
async def _run_non_interactive(self, instruction: str, **kwargs) -> Any:
|
183
|
+
logger.info(f"Running SuggestionBlueprint non-interactively with instruction: '{instruction[:100]}...'")
|
184
|
+
mcp_servers = kwargs.get("mcp_servers", [])
|
185
|
+
agent = self.create_starting_agent(mcp_servers=mcp_servers)
|
186
|
+
from agents import Runner
|
187
|
+
import os
|
188
|
+
model_name = os.getenv("LITELLM_MODEL") or os.getenv("DEFAULT_LLM") or "gpt-3.5-turbo"
|
189
|
+
try:
|
190
|
+
for chunk in Runner.run(agent, instruction):
|
191
|
+
yield chunk
|
192
|
+
except Exception as e:
|
193
|
+
logger.error(f"Error during non-interactive run: {e}", exc_info=True)
|
194
|
+
yield {"messages": [{"role": "assistant", "content": f"An error occurred: {e}"}]}
|
262
195
|
|
263
196
|
if __name__ == "__main__":
|
264
197
|
import asyncio
|
@@ -24,7 +24,7 @@ logger = logging.getLogger("swarm.cli")
|
|
24
24
|
project_root = Path(__file__).parent.parent.parent.parent # /home/chatgpt/open-swarm
|
25
25
|
dotenv_path = project_root / ".env"
|
26
26
|
load_dotenv(dotenv_path=dotenv_path, override=True)
|
27
|
-
print("[DEBUG] LITELLM_API_KEY:", os.environ.get("LITELLM_API_KEY"))
|
27
|
+
# print("[DEBUG] LITELLM_API_KEY:", os.environ.get("LITELLM_API_KEY"))
|
28
28
|
# print(f"[DEBUG] Loaded .env from: {dotenv_path}")
|
29
29
|
# print(f"[DEBUG] LITELLM_MODEL={os.environ.get('LITELLM_MODEL')}")
|
30
30
|
# print(f"[DEBUG] LITELLM_BASE_URL={os.environ.get('LITELLM_BASE_URL')}")
|
@@ -73,7 +73,6 @@ async def _run_blueprint_async_with_shutdown(blueprint: 'BlueprintBase', instruc
|
|
73
73
|
sys.exit(1)
|
74
74
|
|
75
75
|
|
76
|
-
|
77
76
|
def run_blueprint_cli(
|
78
77
|
blueprint_cls: Type['BlueprintBase'],
|
79
78
|
swarm_version: str,
|
@@ -54,22 +54,17 @@ def chatbot_blueprint_instance():
|
|
54
54
|
|
55
55
|
import traceback
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
@pytest.mark.asyncio
|
69
|
-
async def test_chatbot_cli_execution():
|
70
|
-
blueprint = ChatbotBlueprint(blueprint_id="chatbot")
|
71
|
-
# Simulate CLI execution (mock if needed)
|
72
|
-
assert True
|
57
|
+
def test_chatbot_agent_creation(chatbot_blueprint_instance):
|
58
|
+
"""Test that the ChatbotBlueprint creates a valid agent instance."""
|
59
|
+
try:
|
60
|
+
blueprint = chatbot_blueprint_instance
|
61
|
+
agent = blueprint.create_starting_agent(mcp_servers=[])
|
62
|
+
assert agent is not None
|
63
|
+
assert hasattr(agent, "run")
|
64
|
+
except Exception as e:
|
65
|
+
# print("[DEBUG][test_chatbot_agent_creation] Exception:", e)
|
66
|
+
traceback.print_exc()
|
67
|
+
raise
|
73
68
|
|
74
69
|
@pytest.mark.asyncio
|
75
70
|
async def test_chatbot_run_conversation(chatbot_blueprint_instance):
|
@@ -89,3 +84,5 @@ async def test_chatbot_run_conversation(chatbot_blueprint_instance):
|
|
89
84
|
# Assert
|
90
85
|
mock_runner_run.assert_called_once()
|
91
86
|
# Need to capture stdout/stderr or check console output mock
|
87
|
+
|
88
|
+
# Keep the main branch's logic for chatbot blueprint tests. Integrate any unique improvements from the feature branch only if they do not conflict with stability or test coverage.
|
File without changes
|