Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-tui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ jobs:
AGENTSWARM_PRODUCT_MDNS_DOMAIN: openswarm.local
AGENTSWARM_PRODUCT_STARTER_REPO: VRSEN/OpenSwarm
AGENTSWARM_PRODUCT_STARTER_FOLDER: openswarm
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py,agency.py
AGENTSWARM_PRODUCT_SKIP_POST_AUTH_MODEL_SELECTION: "true"
AGENTSWARM_PRODUCT_TUI_LOGO_LEFT: '[" "," ██████╗ ██████╗ ███████╗███╗ ██╗","██╔═══██╗██╔══██╗██╔════╝████╗ ██║","██║ ██║██████╔╝█████╗ ██╔██╗ ██║","██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║","╚██████╔╝██║ ███████╗██║ ╚████║"," ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝"]'
AGENTSWARM_PRODUCT_TUI_LOGO_RIGHT: '["","███████╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗","██╔════╝██║ ██║██╔══██╗██╔══██╗████╗ ████║","███████╗██║ █╗ ██║███████║██████╔╝██╔████╔██║","╚════██║██║███╗██║██╔══██║██╔══██╗██║╚██╔╝██║","███████║╚███╔███╔╝██║ ██║██║ ██║██║ ╚═╝ ██║","╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝"]'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/live-run-mode-smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ jobs:
AGENTSWARM_PRODUCT_MDNS_DOMAIN: openswarm.local
AGENTSWARM_PRODUCT_STARTER_REPO: VRSEN/OpenSwarm
AGENTSWARM_PRODUCT_STARTER_FOLDER: openswarm
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py,agency.py
AGENTSWARM_PRODUCT_SKIP_POST_AUTH_MODEL_SELECTION: "true"
AGENTSWARM_PRODUCT_TUI_LOGO_LEFT: '[" "," ██████╗ ██████╗ ███████╗███╗ ██╗","██╔═══██╗██╔══██╗██╔════╝████╗ ██║","██║ ██║██████╔╝█████╗ ██╔██╗ ██║","██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║","╚██████╔╝██║ ███████╗██║ ╚████║"," ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝"]'
AGENTSWARM_PRODUCT_TUI_LOGO_RIGHT: '["","███████╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗","██╔════╝██║ ██║██╔══██╗██╔══██╗████╗ ████║","███████╗██║ █╗ ██║███████║██████╔╝██╔████╔██║","╚════██║██║███╗██║██╔══██║██╔══██╗██║╚██╔╝██║","███████║╚███╔███╔╝██║ ██║██║ ██║██║ ╚═╝ ██║","╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝"]'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-mac.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
AGENTSWARM_PRODUCT_MDNS_DOMAIN: openswarm.local
AGENTSWARM_PRODUCT_STARTER_REPO: VRSEN/OpenSwarm
AGENTSWARM_PRODUCT_STARTER_FOLDER: openswarm
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py
AGENTSWARM_PRODUCT_ENTRY_FILES: swarm.py,agency.py
AGENTSWARM_PRODUCT_TUI_LOGO_LEFT: '[" "," ██████╗ ██████╗ ███████╗███╗ ██╗","██╔═══██╗██╔══██╗██╔════╝████╗ ██║","██║ ██║██████╔╝█████╗ ██╔██╗ ██║","██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║","╚██████╔╝██║ ███████╗██║ ╚████║"," ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝"]'
AGENTSWARM_PRODUCT_TUI_LOGO_RIGHT: '["","███████╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗","██╔════╝██║ ██║██╔══██╗██╔══██╗████╗ ████║","███████╗██║ █╗ ██║███████║██████╔╝██╔████╔██║","╚════██║██║███╗██║██╔══██║██╔══██╗██║╚██╔╝██║","███████║╚███╔███╔╝██║ ██║██║ ██║██║ ╚═╝ ██║","╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝"]'
AGENTSWARM_PRODUCT_WORDMARK_LINES: '[""," ██████╗ ██████╗ ███████╗███╗ ██╗ ███████╗██╗ ██╗ █████╗ ██████╗ ███╗ ███╗","██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ██╔════╝██║ ██║██╔══██╗██╔══██╗████╗ ████║","██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ███████╗██║ █╗ ██║███████║██████╔╝██╔████╔██║","██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ╚════██║██║███╗██║██╔══██╗██╔══██╗██║╚██╔╝██║","╚██████╔╝██║ ███████╗██║ ╚████║ ███████║╚███╔███╔╝██║ ██║██║ ██║██║ ╚═╝ ██║"," ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝"]'
Expand Down
2 changes: 1 addition & 1 deletion bin/openswarm
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const downstreamEnv = {
AGENTSWARM_PRODUCT_MDNS_DOMAIN: 'openswarm.local',
AGENTSWARM_PRODUCT_STARTER_REPO: 'VRSEN/OpenSwarm',
AGENTSWARM_PRODUCT_STARTER_FOLDER: 'openswarm',
AGENTSWARM_PRODUCT_ENTRY_FILES: 'swarm.py',
AGENTSWARM_PRODUCT_ENTRY_FILES: 'swarm.py,agency.py',
AGENTSWARM_PRODUCT_SKIP_POST_AUTH_MODEL_SELECTION: 'true',
AGENTSWARM_PRODUCT_TUI_LOGO_LEFT: JSON.stringify(productTuiLogoLeft),
AGENTSWARM_PRODUCT_TUI_LOGO_RIGHT: JSON.stringify(productTuiLogoRight),
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ dependencies = [
openswarm = "run_utils:main"

[tool.setuptools]
py-modules = ["agency", "swarm", "helpers", "config", "onboard", "server", "run_utils"]
py-modules = ["swarm", "helpers", "config", "onboard", "server", "run_utils"]

[tool.setuptools.packages.find]
where = ["."]
Expand Down
6 changes: 4 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
agency-swarm[fastapi,jupyter,litellm]>=1.9.7
agency-swarm[fastapi,jupyter,litellm]>=1.9.8
questionary>=2.0.0
python-dotenv
rich
fastapi
uvicorn
composio==0.8.0
Expand Down Expand Up @@ -28,6 +30,7 @@ nbformat>=5.0.0

# Image processing (for load_images tool)
pillow>=9.0.0
opencv-python-headless

# PowerPoint processing (for slides_agent)
python-pptx>=1.0.0
Expand All @@ -43,7 +46,6 @@ cairosvg
weasyprint
html2text
google-genai
opencv-python-headless
moviepy<2
fal-client
httpx
Expand Down
1 change: 1 addition & 0 deletions run_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def _load_openswarm_dotenv(*, override: bool = False) -> bool:

def _configure_product_env() -> None:
os.environ.setdefault("AGENTSWARM_PRODUCT_SKIP_POST_AUTH_MODEL_SELECTION", "true")
os.environ.setdefault("AGENTSWARM_PRODUCT_ENTRY_FILES", "swarm.py,agency.py")
os.environ.setdefault("AGENTSWARM_PRODUCT_TUI_LOGO_LEFT", _PRODUCT_TUI_LOGO_LEFT)
os.environ.setdefault("AGENTSWARM_PRODUCT_TUI_LOGO_RIGHT", _PRODUCT_TUI_LOGO_RIGHT)
os.environ.setdefault("AGENTSWARM_PRODUCT_WORDMARK_LINES", _PRODUCT_WORDMARK_LINES)
Expand Down
32 changes: 30 additions & 2 deletions scripts/smoke-bootstrap-onboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io
import json
import os
import runpy
import sys
import tempfile
import types
Expand Down Expand Up @@ -48,9 +49,7 @@ def smoke_swarm_import_skips_bootstrap() -> None:
replacements = {
"run_utils": module(
"run_utils",
_bootstrap=lambda: order.append("bootstrap"),
_openswarm_state_root=lambda: ROOT,
_preload_agentswarm_bin=lambda: order.append("preload"),
),
"dotenv": module("dotenv", load_dotenv=lambda *args, **kwargs: order.append("dotenv")),
"agents": module(
Expand Down Expand Up @@ -97,6 +96,27 @@ def smoke_swarm_import_skips_bootstrap() -> None:
raise RuntimeError(f"swarm.py did not configure runtime during import: {order}")


def smoke_swarm_script_delegates_to_run_utils_main() -> None:
calls: list[str] = []
replacements = {
"run_utils": module(
"run_utils",
_openswarm_state_root=lambda: ROOT,
main=lambda: calls.append("main"),
),
}
old_path = list(sys.path)
try:
with swapped_modules(replacements):
sys.path.insert(0, str(ROOT))
runpy.run_path(str(ROOT / "swarm.py"), run_name="__main__")
finally:
sys.path[:] = old_path

if calls != ["main"]:
raise RuntimeError(f"python swarm.py did not delegate to run_utils.main: {calls}")


def smoke_onboard_env_writes() -> None:
sys.path.insert(0, str(ROOT))
try:
Expand Down Expand Up @@ -167,6 +187,7 @@ def smoke_product_state_root_env() -> None:
encoding="utf-8",
)
old_state = os.environ.pop("AGENTSWARM_PRODUCT_STATE_ROOT", None)
old_entry = os.environ.pop("AGENTSWARM_PRODUCT_ENTRY_FILES", None)
old_bin = os.environ.pop("AGENTSWARM_BIN", None)
old_key = os.environ.pop("OPENAI_API_KEY", None)
old_cwd = Path.cwd()
Expand All @@ -187,6 +208,8 @@ def smoke_product_state_root_env() -> None:

if os.environ.get("AGENTSWARM_PRODUCT_STATE_ROOT") != str(root):
raise RuntimeError("OpenSwarm did not configure AGENTSWARM_PRODUCT_STATE_ROOT from OPENSWARM_STATE_ROOT")
if os.environ.get("AGENTSWARM_PRODUCT_ENTRY_FILES") != "swarm.py,agency.py":
raise RuntimeError("OpenSwarm Python path did not configure the expected product entry files")
if os.environ.get("OPENAI_API_KEY") != "state-openai":
raise RuntimeError("OpenSwarm did not load dotenv values from the fixed state root before caller cwd")
if os.environ.get("AGENTSWARM_BIN") != "/explicit/bin":
Expand Down Expand Up @@ -219,6 +242,10 @@ def smoke_product_state_root_env() -> None:
os.environ.pop("AGENTSWARM_PRODUCT_STATE_ROOT", None)
else:
os.environ["AGENTSWARM_PRODUCT_STATE_ROOT"] = old_state
if old_entry is None:
os.environ.pop("AGENTSWARM_PRODUCT_ENTRY_FILES", None)
else:
os.environ["AGENTSWARM_PRODUCT_ENTRY_FILES"] = old_entry
if old_bin is None:
os.environ.pop("AGENTSWARM_BIN", None)
else:
Expand Down Expand Up @@ -395,6 +422,7 @@ def which(name: str) -> str | None:

def main() -> int:
smoke_swarm_import_skips_bootstrap()
smoke_swarm_script_delegates_to_run_utils_main()
smoke_onboard_env_writes()
smoke_product_state_root_env()
smoke_bootstrap_node_setup_installs_slides_dependencies()
Expand Down
5 changes: 5 additions & 0 deletions scripts/smoke-openswarm-launcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,10 @@ function assertProductAddons(api) {
])
}

function assertProductEntryFiles(api) {
assert.equal(api.downstreamEnv.AGENTSWARM_PRODUCT_ENTRY_FILES, 'swarm.py,agency.py')
}

function assertStateRoot() {
const linux = load({
platform: 'linux',
Expand Down Expand Up @@ -178,6 +182,7 @@ async function main() {
assert.equal(musl.api.shouldUseDependencyBinary(), true)
assert.equal(await musl.api.ensureCustomBinary(), null)
assert.deepEqual(musl.requests, [])
assertProductEntryFiles(musl.api)
assertProductAddons(musl.api)
assertStateRoot()

Expand Down
20 changes: 4 additions & 16 deletions scripts/smoke-run-mode.py
Original file line number Diff line number Diff line change
Expand Up @@ -494,22 +494,10 @@ def main() -> int:
package_dir = root / "node_modules" / "@vrsen" / "openswarm"
if openswarm_tui_binary:
install_openswarm_tui_binary(package_dir, openswarm_tui_binary)
generic_dir = root / "my-agency"
generic_dir.mkdir()
(generic_dir / "agency.py").write_text(
"\n".join(
[
"from agency_swarm import Agency",
"",
"def create_agency(load_threads_callback=None):",
" return Agency(name='Generic Agency')",
"",
]
),
encoding="utf-8",
)
create_local_openswarm_project(package_dir, generic_dir)
plain = run_tui_smoke(launcher, package_dir, generic_dir, root, env, args.check, args.prompt, args.expect, args.timeout)
workspace = root / "workspace"
workspace.mkdir()
create_local_openswarm_project(package_dir, workspace)
plain = run_tui_smoke(launcher, package_dir, workspace, root, env, args.check, args.prompt, args.expect, args.timeout)
if "Agency Swarm Default" not in plain:
raise RuntimeError("Smoke response was seen, but Agency Swarm Run mode was not detected")
if args.check in {"agents", "all"}:
Expand Down
19 changes: 5 additions & 14 deletions swarm.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import os

from run_utils import _bootstrap, _openswarm_state_root, _preload_agentswarm_bin
from run_utils import _openswarm_state_root

_RUNTIME_CONFIGURED = False

Expand Down Expand Up @@ -35,13 +35,6 @@ def _configure_runtime() -> None:
_RUNTIME_CONFIGURED = True


if __name__ == "__main__":
_preload_agentswarm_bin()
_bootstrap()

_configure_runtime()


def create_agency(load_threads_callback=None):
_configure_runtime()

Expand Down Expand Up @@ -101,10 +94,8 @@ def create_agency(load_threads_callback=None):
return agency


def _main() -> None:
agency = create_agency()
agency.tui(show_reasoning=True, reload=False)


if __name__ == "__main__":
_main()
from run_utils import main as _run_main
_run_main()
else:
_configure_runtime()
Loading