OnyxMunk commited on
Commit
dbd76ba
·
1 Parent(s): 6c4f822

feat: Update to Web-First CLI, Python 3.11, and optimize Dockerfile for HF Spaces

Browse files
.gitignore CHANGED
@@ -137,5 +137,4 @@ venv.bak/
137
  .dmypy.json
138
  dmypy.json
139
 
140
- # Generated agents
141
- generated_agents/
 
137
  .dmypy.json
138
  dmypy.json
139
 
140
+
 
Dockerfile CHANGED
@@ -7,8 +7,8 @@ COPY frontend/ ./
7
  RUN npm run build
8
 
9
  # Stage 2: Base Python image with git (for Hugging Face Spaces dev-mode compatibility)
10
- # Using python:3.10 (not slim) which includes git by default
11
- FROM python:3.10 as base
12
  # Ensure git, build tools, and utilities needed for HF Spaces dev-mode are available
13
  # wget and tar are needed for the injected vscode stage in dev-mode
14
  RUN apt-get update && apt-get install -y --no-install-recommends \
@@ -44,8 +44,6 @@ RUN pip install --no-cache-dir -r requirements.txt
44
  COPY llm_agent_builder/ ./llm_agent_builder/
45
  COPY server/ ./server/
46
  COPY main.py .
47
- # Create empty init for server if not exists (though we have it)
48
- # COPY server/__init__.py ./server/
49
 
50
  # Copy frontend build from stage 1
51
  COPY --from=frontend-build /app/frontend/dist ./frontend/dist
 
7
  RUN npm run build
8
 
9
  # Stage 2: Base Python image with git (for Hugging Face Spaces dev-mode compatibility)
10
+ # Using python:3.11 (not slim) which includes git by default
11
+ FROM python:3.11 as base
12
  # Ensure git, build tools, and utilities needed for HF Spaces dev-mode are available
13
  # wget and tar are needed for the injected vscode stage in dev-mode
14
  RUN apt-get update && apt-get install -y --no-install-recommends \
 
44
  COPY llm_agent_builder/ ./llm_agent_builder/
45
  COPY server/ ./server/
46
  COPY main.py .
 
 
47
 
48
  # Copy frontend build from stage 1
49
  COPY --from=frontend-build /app/frontend/dist ./frontend/dist
README.md CHANGED
@@ -74,16 +74,38 @@ LLM Agent Builder is a comprehensive Python application that enables developers
74
 
75
  ## 📖 Usage
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  ### Command Line Interface
78
 
 
 
79
  #### Generate an Agent
80
 
81
  **Interactive Mode:**
82
 
83
  ```bash
84
- llm-agent-builder generate
85
- # or simply
86
- llm-agent-builder
87
  ```
88
 
89
  **Command-Line Mode:**
 
74
 
75
  ## 📖 Usage
76
 
77
+ ### Web Interface (Default)
78
+
79
+ The easiest way to use LLM Agent Builder is via the web interface.
80
+
81
+ 1. **Launch the application:**
82
+
83
+ ```bash
84
+ python main.py
85
+ # or
86
+ llm-agent-builder
87
+ ```
88
+
89
+ 2. **Access the UI:**
90
+
91
+ Open your browser to `http://localhost:7860`.
92
+
93
+ The web interface allows you to:
94
+ - Generate agents using a simple form
95
+ - Preview and copy generated code
96
+ - Test agents directly in the browser
97
+ - Switch between dark and light themes
98
+
99
  ### Command Line Interface
100
 
101
+ You can still use the CLI for scripting or if you prefer the terminal.
102
+
103
  #### Generate an Agent
104
 
105
  **Interactive Mode:**
106
 
107
  ```bash
108
+ llm-agent-builder generate --interactive
 
 
109
  ```
110
 
111
  **Command-Line Mode:**
frontend/package-lock.json CHANGED
@@ -13,6 +13,7 @@
13
  },
14
  "devDependencies": {
15
  "@eslint/js": "^9.39.1",
 
16
  "@types/react": "^19.2.5",
17
  "@types/react-dom": "^19.2.3",
18
  "@vitejs/plugin-react": "^5.1.1",
@@ -26,6 +27,19 @@
26
  "vite": "^7.2.4"
27
  }
28
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  "node_modules/@babel/code-frame": {
30
  "version": "7.27.1",
31
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -1324,6 +1338,277 @@
1324
  "win32"
1325
  ]
1326
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1327
  "node_modules/@types/babel__core": {
1328
  "version": "7.20.5",
1329
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
@@ -1716,6 +2001,16 @@
1716
  "dev": true,
1717
  "license": "MIT"
1718
  },
 
 
 
 
 
 
 
 
 
 
1719
  "node_modules/electron-to-chromium": {
1720
  "version": "1.5.262",
1721
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz",
@@ -1723,6 +2018,20 @@
1723
  "dev": true,
1724
  "license": "ISC"
1725
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1726
  "node_modules/esbuild": {
1727
  "version": "0.25.12",
1728
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
@@ -2127,6 +2436,13 @@
2127
  "url": "https://github.com/sponsors/sindresorhus"
2128
  }
2129
  },
 
 
 
 
 
 
 
2130
  "node_modules/has-flag": {
2131
  "version": "4.0.0",
2132
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2221,6 +2537,16 @@
2221
  "dev": true,
2222
  "license": "ISC"
2223
  },
 
 
 
 
 
 
 
 
 
 
2224
  "node_modules/js-tokens": {
2225
  "version": "4.0.0",
2226
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -2312,6 +2638,267 @@
2312
  "node": ">= 0.8.0"
2313
  }
2314
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2315
  "node_modules/locate-path": {
2316
  "version": "6.0.0",
2317
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -2345,6 +2932,16 @@
2345
  "yallist": "^3.0.2"
2346
  }
2347
  },
 
 
 
 
 
 
 
 
 
 
2348
  "node_modules/minimatch": {
2349
  "version": "3.1.2",
2350
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -2732,6 +3329,20 @@
2732
  "dev": true,
2733
  "license": "MIT"
2734
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2735
  "node_modules/tinyglobby": {
2736
  "version": "0.2.15",
2737
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
 
13
  },
14
  "devDependencies": {
15
  "@eslint/js": "^9.39.1",
16
+ "@tailwindcss/postcss": "^4.0.0",
17
  "@types/react": "^19.2.5",
18
  "@types/react-dom": "^19.2.3",
19
  "@vitejs/plugin-react": "^5.1.1",
 
27
  "vite": "^7.2.4"
28
  }
29
  },
30
+ "node_modules/@alloc/quick-lru": {
31
+ "version": "5.2.0",
32
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
33
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
34
+ "dev": true,
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=10"
38
+ },
39
+ "funding": {
40
+ "url": "https://github.com/sponsors/sindresorhus"
41
+ }
42
+ },
43
  "node_modules/@babel/code-frame": {
44
  "version": "7.27.1",
45
  "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
 
1338
  "win32"
1339
  ]
1340
  },
1341
+ "node_modules/@tailwindcss/node": {
1342
+ "version": "4.1.17",
1343
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz",
1344
+ "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==",
1345
+ "dev": true,
1346
+ "license": "MIT",
1347
+ "dependencies": {
1348
+ "@jridgewell/remapping": "^2.3.4",
1349
+ "enhanced-resolve": "^5.18.3",
1350
+ "jiti": "^2.6.1",
1351
+ "lightningcss": "1.30.2",
1352
+ "magic-string": "^0.30.21",
1353
+ "source-map-js": "^1.2.1",
1354
+ "tailwindcss": "4.1.17"
1355
+ }
1356
+ },
1357
+ "node_modules/@tailwindcss/oxide": {
1358
+ "version": "4.1.17",
1359
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz",
1360
+ "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==",
1361
+ "dev": true,
1362
+ "license": "MIT",
1363
+ "engines": {
1364
+ "node": ">= 10"
1365
+ },
1366
+ "optionalDependencies": {
1367
+ "@tailwindcss/oxide-android-arm64": "4.1.17",
1368
+ "@tailwindcss/oxide-darwin-arm64": "4.1.17",
1369
+ "@tailwindcss/oxide-darwin-x64": "4.1.17",
1370
+ "@tailwindcss/oxide-freebsd-x64": "4.1.17",
1371
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17",
1372
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17",
1373
+ "@tailwindcss/oxide-linux-arm64-musl": "4.1.17",
1374
+ "@tailwindcss/oxide-linux-x64-gnu": "4.1.17",
1375
+ "@tailwindcss/oxide-linux-x64-musl": "4.1.17",
1376
+ "@tailwindcss/oxide-wasm32-wasi": "4.1.17",
1377
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17",
1378
+ "@tailwindcss/oxide-win32-x64-msvc": "4.1.17"
1379
+ }
1380
+ },
1381
+ "node_modules/@tailwindcss/oxide-android-arm64": {
1382
+ "version": "4.1.17",
1383
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz",
1384
+ "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==",
1385
+ "cpu": [
1386
+ "arm64"
1387
+ ],
1388
+ "dev": true,
1389
+ "license": "MIT",
1390
+ "optional": true,
1391
+ "os": [
1392
+ "android"
1393
+ ],
1394
+ "engines": {
1395
+ "node": ">= 10"
1396
+ }
1397
+ },
1398
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
1399
+ "version": "4.1.17",
1400
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz",
1401
+ "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==",
1402
+ "cpu": [
1403
+ "arm64"
1404
+ ],
1405
+ "dev": true,
1406
+ "license": "MIT",
1407
+ "optional": true,
1408
+ "os": [
1409
+ "darwin"
1410
+ ],
1411
+ "engines": {
1412
+ "node": ">= 10"
1413
+ }
1414
+ },
1415
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
1416
+ "version": "4.1.17",
1417
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz",
1418
+ "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==",
1419
+ "cpu": [
1420
+ "x64"
1421
+ ],
1422
+ "dev": true,
1423
+ "license": "MIT",
1424
+ "optional": true,
1425
+ "os": [
1426
+ "darwin"
1427
+ ],
1428
+ "engines": {
1429
+ "node": ">= 10"
1430
+ }
1431
+ },
1432
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
1433
+ "version": "4.1.17",
1434
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz",
1435
+ "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==",
1436
+ "cpu": [
1437
+ "x64"
1438
+ ],
1439
+ "dev": true,
1440
+ "license": "MIT",
1441
+ "optional": true,
1442
+ "os": [
1443
+ "freebsd"
1444
+ ],
1445
+ "engines": {
1446
+ "node": ">= 10"
1447
+ }
1448
+ },
1449
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
1450
+ "version": "4.1.17",
1451
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz",
1452
+ "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==",
1453
+ "cpu": [
1454
+ "arm"
1455
+ ],
1456
+ "dev": true,
1457
+ "license": "MIT",
1458
+ "optional": true,
1459
+ "os": [
1460
+ "linux"
1461
+ ],
1462
+ "engines": {
1463
+ "node": ">= 10"
1464
+ }
1465
+ },
1466
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
1467
+ "version": "4.1.17",
1468
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz",
1469
+ "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==",
1470
+ "cpu": [
1471
+ "arm64"
1472
+ ],
1473
+ "dev": true,
1474
+ "license": "MIT",
1475
+ "optional": true,
1476
+ "os": [
1477
+ "linux"
1478
+ ],
1479
+ "engines": {
1480
+ "node": ">= 10"
1481
+ }
1482
+ },
1483
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
1484
+ "version": "4.1.17",
1485
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz",
1486
+ "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==",
1487
+ "cpu": [
1488
+ "arm64"
1489
+ ],
1490
+ "dev": true,
1491
+ "license": "MIT",
1492
+ "optional": true,
1493
+ "os": [
1494
+ "linux"
1495
+ ],
1496
+ "engines": {
1497
+ "node": ">= 10"
1498
+ }
1499
+ },
1500
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
1501
+ "version": "4.1.17",
1502
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz",
1503
+ "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==",
1504
+ "cpu": [
1505
+ "x64"
1506
+ ],
1507
+ "dev": true,
1508
+ "license": "MIT",
1509
+ "optional": true,
1510
+ "os": [
1511
+ "linux"
1512
+ ],
1513
+ "engines": {
1514
+ "node": ">= 10"
1515
+ }
1516
+ },
1517
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
1518
+ "version": "4.1.17",
1519
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz",
1520
+ "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==",
1521
+ "cpu": [
1522
+ "x64"
1523
+ ],
1524
+ "dev": true,
1525
+ "license": "MIT",
1526
+ "optional": true,
1527
+ "os": [
1528
+ "linux"
1529
+ ],
1530
+ "engines": {
1531
+ "node": ">= 10"
1532
+ }
1533
+ },
1534
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
1535
+ "version": "4.1.17",
1536
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz",
1537
+ "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==",
1538
+ "bundleDependencies": [
1539
+ "@napi-rs/wasm-runtime",
1540
+ "@emnapi/core",
1541
+ "@emnapi/runtime",
1542
+ "@tybys/wasm-util",
1543
+ "@emnapi/wasi-threads",
1544
+ "tslib"
1545
+ ],
1546
+ "cpu": [
1547
+ "wasm32"
1548
+ ],
1549
+ "dev": true,
1550
+ "license": "MIT",
1551
+ "optional": true,
1552
+ "dependencies": {
1553
+ "@emnapi/core": "^1.6.0",
1554
+ "@emnapi/runtime": "^1.6.0",
1555
+ "@emnapi/wasi-threads": "^1.1.0",
1556
+ "@napi-rs/wasm-runtime": "^1.0.7",
1557
+ "@tybys/wasm-util": "^0.10.1",
1558
+ "tslib": "^2.4.0"
1559
+ },
1560
+ "engines": {
1561
+ "node": ">=14.0.0"
1562
+ }
1563
+ },
1564
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
1565
+ "version": "4.1.17",
1566
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz",
1567
+ "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==",
1568
+ "cpu": [
1569
+ "arm64"
1570
+ ],
1571
+ "dev": true,
1572
+ "license": "MIT",
1573
+ "optional": true,
1574
+ "os": [
1575
+ "win32"
1576
+ ],
1577
+ "engines": {
1578
+ "node": ">= 10"
1579
+ }
1580
+ },
1581
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
1582
+ "version": "4.1.17",
1583
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz",
1584
+ "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==",
1585
+ "cpu": [
1586
+ "x64"
1587
+ ],
1588
+ "dev": true,
1589
+ "license": "MIT",
1590
+ "optional": true,
1591
+ "os": [
1592
+ "win32"
1593
+ ],
1594
+ "engines": {
1595
+ "node": ">= 10"
1596
+ }
1597
+ },
1598
+ "node_modules/@tailwindcss/postcss": {
1599
+ "version": "4.1.17",
1600
+ "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz",
1601
+ "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==",
1602
+ "dev": true,
1603
+ "license": "MIT",
1604
+ "dependencies": {
1605
+ "@alloc/quick-lru": "^5.2.0",
1606
+ "@tailwindcss/node": "4.1.17",
1607
+ "@tailwindcss/oxide": "4.1.17",
1608
+ "postcss": "^8.4.41",
1609
+ "tailwindcss": "4.1.17"
1610
+ }
1611
+ },
1612
  "node_modules/@types/babel__core": {
1613
  "version": "7.20.5",
1614
  "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
 
2001
  "dev": true,
2002
  "license": "MIT"
2003
  },
2004
+ "node_modules/detect-libc": {
2005
+ "version": "2.1.2",
2006
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
2007
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
2008
+ "dev": true,
2009
+ "license": "Apache-2.0",
2010
+ "engines": {
2011
+ "node": ">=8"
2012
+ }
2013
+ },
2014
  "node_modules/electron-to-chromium": {
2015
  "version": "1.5.262",
2016
  "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.262.tgz",
 
2018
  "dev": true,
2019
  "license": "ISC"
2020
  },
2021
+ "node_modules/enhanced-resolve": {
2022
+ "version": "5.18.3",
2023
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
2024
+ "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
2025
+ "dev": true,
2026
+ "license": "MIT",
2027
+ "dependencies": {
2028
+ "graceful-fs": "^4.2.4",
2029
+ "tapable": "^2.2.0"
2030
+ },
2031
+ "engines": {
2032
+ "node": ">=10.13.0"
2033
+ }
2034
+ },
2035
  "node_modules/esbuild": {
2036
  "version": "0.25.12",
2037
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
 
2436
  "url": "https://github.com/sponsors/sindresorhus"
2437
  }
2438
  },
2439
+ "node_modules/graceful-fs": {
2440
+ "version": "4.2.11",
2441
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
2442
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
2443
+ "dev": true,
2444
+ "license": "ISC"
2445
+ },
2446
  "node_modules/has-flag": {
2447
  "version": "4.0.0",
2448
  "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
 
2537
  "dev": true,
2538
  "license": "ISC"
2539
  },
2540
+ "node_modules/jiti": {
2541
+ "version": "2.6.1",
2542
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
2543
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
2544
+ "dev": true,
2545
+ "license": "MIT",
2546
+ "bin": {
2547
+ "jiti": "lib/jiti-cli.mjs"
2548
+ }
2549
+ },
2550
  "node_modules/js-tokens": {
2551
  "version": "4.0.0",
2552
  "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
 
2638
  "node": ">= 0.8.0"
2639
  }
2640
  },
2641
+ "node_modules/lightningcss": {
2642
+ "version": "1.30.2",
2643
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
2644
+ "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
2645
+ "dev": true,
2646
+ "license": "MPL-2.0",
2647
+ "dependencies": {
2648
+ "detect-libc": "^2.0.3"
2649
+ },
2650
+ "engines": {
2651
+ "node": ">= 12.0.0"
2652
+ },
2653
+ "funding": {
2654
+ "type": "opencollective",
2655
+ "url": "https://opencollective.com/parcel"
2656
+ },
2657
+ "optionalDependencies": {
2658
+ "lightningcss-android-arm64": "1.30.2",
2659
+ "lightningcss-darwin-arm64": "1.30.2",
2660
+ "lightningcss-darwin-x64": "1.30.2",
2661
+ "lightningcss-freebsd-x64": "1.30.2",
2662
+ "lightningcss-linux-arm-gnueabihf": "1.30.2",
2663
+ "lightningcss-linux-arm64-gnu": "1.30.2",
2664
+ "lightningcss-linux-arm64-musl": "1.30.2",
2665
+ "lightningcss-linux-x64-gnu": "1.30.2",
2666
+ "lightningcss-linux-x64-musl": "1.30.2",
2667
+ "lightningcss-win32-arm64-msvc": "1.30.2",
2668
+ "lightningcss-win32-x64-msvc": "1.30.2"
2669
+ }
2670
+ },
2671
+ "node_modules/lightningcss-android-arm64": {
2672
+ "version": "1.30.2",
2673
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
2674
+ "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
2675
+ "cpu": [
2676
+ "arm64"
2677
+ ],
2678
+ "dev": true,
2679
+ "license": "MPL-2.0",
2680
+ "optional": true,
2681
+ "os": [
2682
+ "android"
2683
+ ],
2684
+ "engines": {
2685
+ "node": ">= 12.0.0"
2686
+ },
2687
+ "funding": {
2688
+ "type": "opencollective",
2689
+ "url": "https://opencollective.com/parcel"
2690
+ }
2691
+ },
2692
+ "node_modules/lightningcss-darwin-arm64": {
2693
+ "version": "1.30.2",
2694
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
2695
+ "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
2696
+ "cpu": [
2697
+ "arm64"
2698
+ ],
2699
+ "dev": true,
2700
+ "license": "MPL-2.0",
2701
+ "optional": true,
2702
+ "os": [
2703
+ "darwin"
2704
+ ],
2705
+ "engines": {
2706
+ "node": ">= 12.0.0"
2707
+ },
2708
+ "funding": {
2709
+ "type": "opencollective",
2710
+ "url": "https://opencollective.com/parcel"
2711
+ }
2712
+ },
2713
+ "node_modules/lightningcss-darwin-x64": {
2714
+ "version": "1.30.2",
2715
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
2716
+ "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
2717
+ "cpu": [
2718
+ "x64"
2719
+ ],
2720
+ "dev": true,
2721
+ "license": "MPL-2.0",
2722
+ "optional": true,
2723
+ "os": [
2724
+ "darwin"
2725
+ ],
2726
+ "engines": {
2727
+ "node": ">= 12.0.0"
2728
+ },
2729
+ "funding": {
2730
+ "type": "opencollective",
2731
+ "url": "https://opencollective.com/parcel"
2732
+ }
2733
+ },
2734
+ "node_modules/lightningcss-freebsd-x64": {
2735
+ "version": "1.30.2",
2736
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
2737
+ "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
2738
+ "cpu": [
2739
+ "x64"
2740
+ ],
2741
+ "dev": true,
2742
+ "license": "MPL-2.0",
2743
+ "optional": true,
2744
+ "os": [
2745
+ "freebsd"
2746
+ ],
2747
+ "engines": {
2748
+ "node": ">= 12.0.0"
2749
+ },
2750
+ "funding": {
2751
+ "type": "opencollective",
2752
+ "url": "https://opencollective.com/parcel"
2753
+ }
2754
+ },
2755
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
2756
+ "version": "1.30.2",
2757
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
2758
+ "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
2759
+ "cpu": [
2760
+ "arm"
2761
+ ],
2762
+ "dev": true,
2763
+ "license": "MPL-2.0",
2764
+ "optional": true,
2765
+ "os": [
2766
+ "linux"
2767
+ ],
2768
+ "engines": {
2769
+ "node": ">= 12.0.0"
2770
+ },
2771
+ "funding": {
2772
+ "type": "opencollective",
2773
+ "url": "https://opencollective.com/parcel"
2774
+ }
2775
+ },
2776
+ "node_modules/lightningcss-linux-arm64-gnu": {
2777
+ "version": "1.30.2",
2778
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
2779
+ "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
2780
+ "cpu": [
2781
+ "arm64"
2782
+ ],
2783
+ "dev": true,
2784
+ "license": "MPL-2.0",
2785
+ "optional": true,
2786
+ "os": [
2787
+ "linux"
2788
+ ],
2789
+ "engines": {
2790
+ "node": ">= 12.0.0"
2791
+ },
2792
+ "funding": {
2793
+ "type": "opencollective",
2794
+ "url": "https://opencollective.com/parcel"
2795
+ }
2796
+ },
2797
+ "node_modules/lightningcss-linux-arm64-musl": {
2798
+ "version": "1.30.2",
2799
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
2800
+ "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
2801
+ "cpu": [
2802
+ "arm64"
2803
+ ],
2804
+ "dev": true,
2805
+ "license": "MPL-2.0",
2806
+ "optional": true,
2807
+ "os": [
2808
+ "linux"
2809
+ ],
2810
+ "engines": {
2811
+ "node": ">= 12.0.0"
2812
+ },
2813
+ "funding": {
2814
+ "type": "opencollective",
2815
+ "url": "https://opencollective.com/parcel"
2816
+ }
2817
+ },
2818
+ "node_modules/lightningcss-linux-x64-gnu": {
2819
+ "version": "1.30.2",
2820
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
2821
+ "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
2822
+ "cpu": [
2823
+ "x64"
2824
+ ],
2825
+ "dev": true,
2826
+ "license": "MPL-2.0",
2827
+ "optional": true,
2828
+ "os": [
2829
+ "linux"
2830
+ ],
2831
+ "engines": {
2832
+ "node": ">= 12.0.0"
2833
+ },
2834
+ "funding": {
2835
+ "type": "opencollective",
2836
+ "url": "https://opencollective.com/parcel"
2837
+ }
2838
+ },
2839
+ "node_modules/lightningcss-linux-x64-musl": {
2840
+ "version": "1.30.2",
2841
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
2842
+ "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
2843
+ "cpu": [
2844
+ "x64"
2845
+ ],
2846
+ "dev": true,
2847
+ "license": "MPL-2.0",
2848
+ "optional": true,
2849
+ "os": [
2850
+ "linux"
2851
+ ],
2852
+ "engines": {
2853
+ "node": ">= 12.0.0"
2854
+ },
2855
+ "funding": {
2856
+ "type": "opencollective",
2857
+ "url": "https://opencollective.com/parcel"
2858
+ }
2859
+ },
2860
+ "node_modules/lightningcss-win32-arm64-msvc": {
2861
+ "version": "1.30.2",
2862
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
2863
+ "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
2864
+ "cpu": [
2865
+ "arm64"
2866
+ ],
2867
+ "dev": true,
2868
+ "license": "MPL-2.0",
2869
+ "optional": true,
2870
+ "os": [
2871
+ "win32"
2872
+ ],
2873
+ "engines": {
2874
+ "node": ">= 12.0.0"
2875
+ },
2876
+ "funding": {
2877
+ "type": "opencollective",
2878
+ "url": "https://opencollective.com/parcel"
2879
+ }
2880
+ },
2881
+ "node_modules/lightningcss-win32-x64-msvc": {
2882
+ "version": "1.30.2",
2883
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
2884
+ "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
2885
+ "cpu": [
2886
+ "x64"
2887
+ ],
2888
+ "dev": true,
2889
+ "license": "MPL-2.0",
2890
+ "optional": true,
2891
+ "os": [
2892
+ "win32"
2893
+ ],
2894
+ "engines": {
2895
+ "node": ">= 12.0.0"
2896
+ },
2897
+ "funding": {
2898
+ "type": "opencollective",
2899
+ "url": "https://opencollective.com/parcel"
2900
+ }
2901
+ },
2902
  "node_modules/locate-path": {
2903
  "version": "6.0.0",
2904
  "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
 
2932
  "yallist": "^3.0.2"
2933
  }
2934
  },
2935
+ "node_modules/magic-string": {
2936
+ "version": "0.30.21",
2937
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
2938
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
2939
+ "dev": true,
2940
+ "license": "MIT",
2941
+ "dependencies": {
2942
+ "@jridgewell/sourcemap-codec": "^1.5.5"
2943
+ }
2944
+ },
2945
  "node_modules/minimatch": {
2946
  "version": "3.1.2",
2947
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
 
3329
  "dev": true,
3330
  "license": "MIT"
3331
  },
3332
+ "node_modules/tapable": {
3333
+ "version": "2.3.0",
3334
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
3335
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
3336
+ "dev": true,
3337
+ "license": "MIT",
3338
+ "engines": {
3339
+ "node": ">=6"
3340
+ },
3341
+ "funding": {
3342
+ "type": "opencollective",
3343
+ "url": "https://opencollective.com/webpack"
3344
+ }
3345
+ },
3346
  "node_modules/tinyglobby": {
3347
  "version": "0.2.15",
3348
  "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
llm_agent_builder/cli.py CHANGED
@@ -198,12 +198,21 @@ Examples:
198
  batch_parser.add_argument("config_file", help="Path to JSON configuration file")
199
  batch_parser.add_argument("--output", default="generated_agents", help="Output directory for generated agents")
200
 
 
 
 
 
 
201
  args = parser.parse_args()
202
 
203
  # Handle no command (default to generate in interactive mode)
 
204
  if not args.command:
205
- args.command = "generate"
206
- args.interactive = True
 
 
 
207
 
208
  try:
209
  if args.command == "generate":
@@ -281,6 +290,9 @@ Examples:
281
  elif args.command == "batch":
282
  batch_generate(args.config_file, args.output)
283
 
 
 
 
284
  except KeyboardInterrupt:
285
  print("\n\nOperation cancelled by user.")
286
  sys.exit(1)
@@ -288,5 +300,18 @@ Examples:
288
  print(f"Error: {e}", file=sys.stderr)
289
  sys.exit(1)
290
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
  if __name__ == "__main__":
292
  main()
 
198
  batch_parser.add_argument("config_file", help="Path to JSON configuration file")
199
  batch_parser.add_argument("--output", default="generated_agents", help="Output directory for generated agents")
200
 
201
+ # Web subcommand
202
+ web_parser = subparsers.add_parser("web", help="Launch the web interface")
203
+ web_parser.add_argument("--host", default="0.0.0.0", help="Host to bind to")
204
+ web_parser.add_argument("--port", type=int, default=7860, help="Port to bind to")
205
+
206
  args = parser.parse_args()
207
 
208
  # Handle no command (default to generate in interactive mode)
209
+ # Handle no command (default to web interface)
210
  if not args.command:
211
+ print("No command provided. Launching web interface...")
212
+ args.command = "web"
213
+ # Set default values for web command since they weren't parsed
214
+ args.host = "0.0.0.0"
215
+ args.port = 7860
216
 
217
  try:
218
  if args.command == "generate":
 
290
  elif args.command == "batch":
291
  batch_generate(args.config_file, args.output)
292
 
293
+ elif args.command == "web":
294
+ run_web_server(args.host, args.port)
295
+
296
  except KeyboardInterrupt:
297
  print("\n\nOperation cancelled by user.")
298
  sys.exit(1)
 
300
  print(f"Error: {e}", file=sys.stderr)
301
  sys.exit(1)
302
 
303
+ def run_web_server(host: str, port: int) -> None:
304
+ """Run the web interface server."""
305
+ try:
306
+ import uvicorn
307
+ print(f"Starting web interface at http://{host}:{port}")
308
+ uvicorn.run("server.main:app", host=host, port=port, reload=False)
309
+ except ImportError:
310
+ print("Error: uvicorn is not installed. Please install it with 'pip install uvicorn'.")
311
+ sys.exit(1)
312
+ except Exception as e:
313
+ print(f"Error starting web server: {e}")
314
+ sys.exit(1)
315
+
316
  if __name__ == "__main__":
317
  main()
pre-commit-check.sh CHANGED
File without changes
server/main.py CHANGED
@@ -77,6 +77,8 @@ async def execute_agent(request: Request, execute_request: ExecuteRequest):
77
  raise HTTPException(status_code=400, detail=str(e))
78
  except subprocess.TimeoutExpired:
79
  raise HTTPException(status_code=408, detail="Execution timed out")
 
 
80
  except Exception as e:
81
  raise HTTPException(status_code=500, detail=f"Execution error: {str(e)}")
82
 
@@ -102,6 +104,8 @@ async def generate_agent(request: Request, generate_request: GenerateRequest):
102
  }
103
  except ValueError as e:
104
  raise HTTPException(status_code=400, detail=str(e))
 
 
105
  except Exception as e:
106
  raise HTTPException(status_code=500, detail=f"Generation error: {str(e)}")
107
 
 
77
  raise HTTPException(status_code=400, detail=str(e))
78
  except subprocess.TimeoutExpired:
79
  raise HTTPException(status_code=408, detail="Execution timed out")
80
+ except HTTPException: # Re-raise HTTPException directly
81
+ raise
82
  except Exception as e:
83
  raise HTTPException(status_code=500, detail=f"Execution error: {str(e)}")
84
 
 
104
  }
105
  except ValueError as e:
106
  raise HTTPException(status_code=400, detail=str(e))
107
+ except HTTPException: # Re-raise HTTPException directly
108
+ raise
109
  except Exception as e:
110
  raise HTTPException(status_code=500, detail=f"Generation error: {str(e)}")
111