Spaces:
Sleeping
Sleeping
Redeploy with build fixes and framework integrity
Browse files- helpers/settings.py +0 -69
- {api → patches/api}/api_docs.py +0 -0
- {helpers → patches/helpers}/api.py +1 -0
- {helpers → patches/helpers}/runtime.py +5 -0
- {helpers → patches/helpers}/ui_server.py +1 -0
- run_ui.py +0 -85
- start_hf.sh +0 -6
helpers/settings.py
DELETED
|
@@ -1,69 +0,0 @@
|
|
| 1 |
-
import json
|
| 2 |
-
import os
|
| 3 |
-
import secrets
|
| 4 |
-
from python.helpers import files
|
| 5 |
-
from python.helpers.print_style import PrintStyle
|
| 6 |
-
|
| 7 |
-
def get_settings() -> dict:
|
| 8 |
-
try:
|
| 9 |
-
path = files.get_abs_path("settings.json")
|
| 10 |
-
if os.path.exists(path):
|
| 11 |
-
with open(path, "r") as f:
|
| 12 |
-
return json.load(f)
|
| 13 |
-
except Exception as e:
|
| 14 |
-
PrintStyle.error(f"Error loading settings: {e}")
|
| 15 |
-
# Return defaults
|
| 16 |
-
return {
|
| 17 |
-
"chat_model_provider": "openai",
|
| 18 |
-
"chat_model_name": "gpt-4",
|
| 19 |
-
"chat_model_api_base": "",
|
| 20 |
-
"chat_model_ctx_length": 128000,
|
| 21 |
-
"chat_model_vision": True,
|
| 22 |
-
"chat_model_rl_requests": 0,
|
| 23 |
-
"chat_model_rl_input": 0,
|
| 24 |
-
"chat_model_rl_output": 0,
|
| 25 |
-
"chat_model_kwargs": {},
|
| 26 |
-
"util_model_provider": "openai",
|
| 27 |
-
"util_model_name": "gpt-4o-mini",
|
| 28 |
-
"util_model_api_base": "",
|
| 29 |
-
"util_model_ctx_length": 128000,
|
| 30 |
-
"util_model_rl_requests": 0,
|
| 31 |
-
"util_model_rl_input": 0,
|
| 32 |
-
"util_model_rl_output": 0,
|
| 33 |
-
"util_model_kwargs": {},
|
| 34 |
-
"embed_model_provider": "openai",
|
| 35 |
-
"embed_model_name": "text-embedding-3-small",
|
| 36 |
-
"embed_model_api_base": "",
|
| 37 |
-
"embed_model_rl_requests": 0,
|
| 38 |
-
"embed_model_kwargs": {},
|
| 39 |
-
"browser_model_provider": "openai",
|
| 40 |
-
"browser_model_name": "gpt-4o-mini",
|
| 41 |
-
"browser_model_api_base": "",
|
| 42 |
-
"browser_model_vision": True,
|
| 43 |
-
"browser_model_kwargs": {},
|
| 44 |
-
"agent_profile": "default",
|
| 45 |
-
"agent_memory_subdir": "default",
|
| 46 |
-
"agent_knowledge_subdir": "custom",
|
| 47 |
-
"mcp_servers": "",
|
| 48 |
-
"rfc_url": "localhost",
|
| 49 |
-
"rfc_port_http": 55521
|
| 50 |
-
}
|
| 51 |
-
|
| 52 |
-
def save_settings(settings: dict) -> bool:
|
| 53 |
-
try:
|
| 54 |
-
path = files.get_abs_path("settings.json")
|
| 55 |
-
with open(path, "w") as f:
|
| 56 |
-
json.dump(settings, f, indent=4)
|
| 57 |
-
return True
|
| 58 |
-
except Exception as e:
|
| 59 |
-
PrintStyle.error(f"Error saving settings: {e}")
|
| 60 |
-
return False
|
| 61 |
-
|
| 62 |
-
def get_runtime_config(set):
|
| 63 |
-
return {
|
| 64 |
-
"code_exec_docker_enabled": False,
|
| 65 |
-
"code_exec_ssh_enabled": False
|
| 66 |
-
}
|
| 67 |
-
|
| 68 |
-
def create_auth_token():
|
| 69 |
-
return secrets.token_hex(16)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{api → patches/api}/api_docs.py
RENAMED
|
File without changes
|
{helpers → patches/helpers}/api.py
RENAMED
|
@@ -61,6 +61,7 @@ class ApiHandler:
|
|
| 61 |
|
| 62 |
async def handle_request(self, request: Request) -> Response:
|
| 63 |
try:
|
|
|
|
| 64 |
input_data: Input = {}
|
| 65 |
if request.is_json:
|
| 66 |
try:
|
|
|
|
| 61 |
|
| 62 |
async def handle_request(self, request: Request) -> Response:
|
| 63 |
try:
|
| 64 |
+
# input data from request based on type
|
| 65 |
input_data: Input = {}
|
| 66 |
if request.is_json:
|
| 67 |
try:
|
{helpers → patches/helpers}/runtime.py
RENAMED
|
@@ -17,10 +17,15 @@ def initialize():
|
|
| 17 |
|
| 18 |
def get_arg(name: str): return args.get(name, None)
|
| 19 |
def is_dockerized() -> bool: return bool(get_arg("dockerized")) or os.getenv("HF_SPACE") == "true"
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
def get_runtime_id() -> str:
|
| 21 |
global runtime_id
|
| 22 |
if not runtime_id: runtime_id = secrets.token_hex(8)
|
| 23 |
return runtime_id
|
|
|
|
| 24 |
def get_web_ui_port():
|
| 25 |
if os.getenv("HF_SPACE") == "true": return 7860
|
| 26 |
return get_arg("port") or 5000
|
|
|
|
| 17 |
|
| 18 |
def get_arg(name: str): return args.get(name, None)
|
| 19 |
def is_dockerized() -> bool: return bool(get_arg("dockerized")) or os.getenv("HF_SPACE") == "true"
|
| 20 |
+
def is_development() -> bool:
|
| 21 |
+
if os.getenv("HF_SPACE") == "true": return False
|
| 22 |
+
return not is_dockerized()
|
| 23 |
+
|
| 24 |
def get_runtime_id() -> str:
|
| 25 |
global runtime_id
|
| 26 |
if not runtime_id: runtime_id = secrets.token_hex(8)
|
| 27 |
return runtime_id
|
| 28 |
+
|
| 29 |
def get_web_ui_port():
|
| 30 |
if os.getenv("HF_SPACE") == "true": return 7860
|
| 31 |
return get_arg("port") or 5000
|
{helpers → patches/helpers}/ui_server.py
RENAMED
|
@@ -85,6 +85,7 @@ class UiServerRuntime:
|
|
| 85 |
|
| 86 |
lock = threading.RLock()
|
| 87 |
|
|
|
|
| 88 |
cors_allowed = "*" if os.getenv("HF_SPACE") == "true" else (lambda _origin, environ: validate_ws_origin(environ)[0])
|
| 89 |
|
| 90 |
socketio_server = socketio.AsyncServer(
|
|
|
|
| 85 |
|
| 86 |
lock = threading.RLock()
|
| 87 |
|
| 88 |
+
# Use a lambda to avoid issues if validate_ws_origin is called during initialization
|
| 89 |
cors_allowed = "*" if os.getenv("HF_SPACE") == "true" else (lambda _origin, environ: validate_ws_origin(environ)[0])
|
| 90 |
|
| 91 |
socketio_server = socketio.AsyncServer(
|
run_ui.py
DELETED
|
@@ -1,85 +0,0 @@
|
|
| 1 |
-
from datetime import timedelta
|
| 2 |
-
import os
|
| 3 |
-
import secrets
|
| 4 |
-
import threading
|
| 5 |
-
from flask import Flask, request, Response, session
|
| 6 |
-
from werkzeug.middleware.proxy_fix import ProxyFix
|
| 7 |
-
import initialize
|
| 8 |
-
from python.helpers import files, git, mcp_server, fasta2a_server
|
| 9 |
-
from python.helpers.files import get_abs_path
|
| 10 |
-
from python.helpers import runtime, dotenv, process
|
| 11 |
-
from python.helpers.extract_tools import load_classes_from_folder
|
| 12 |
-
from python.helpers.api import ApiHandler
|
| 13 |
-
from python.helpers.print_style import PrintStyle
|
| 14 |
-
|
| 15 |
-
# initialize the internal Flask server
|
| 16 |
-
webapp = Flask("app", static_folder=get_abs_path("./webui"), static_url_path="/")
|
| 17 |
-
webapp.secret_key = os.getenv("FLASK_SECRET_KEY") or secrets.token_hex(32)
|
| 18 |
-
|
| 19 |
-
# HF Space reverse proxy support
|
| 20 |
-
if os.getenv("HF_SPACE") == "true":
|
| 21 |
-
webapp.wsgi_app = ProxyFix(webapp.wsgi_app, x_for=1, x_proto=1, x_host=1)
|
| 22 |
-
|
| 23 |
-
webapp.config.update(
|
| 24 |
-
JSON_SORT_KEYS=False,
|
| 25 |
-
SESSION_COOKIE_NAME="session_" + runtime.get_runtime_id(),
|
| 26 |
-
SESSION_COOKIE_SAMESITE="Lax",
|
| 27 |
-
SESSION_PERMANENT=True,
|
| 28 |
-
PERMANENT_SESSION_LIFETIME=timedelta(days=1)
|
| 29 |
-
)
|
| 30 |
-
|
| 31 |
-
lock = threading.Lock()
|
| 32 |
-
|
| 33 |
-
@webapp.route("/", methods=["GET"])
|
| 34 |
-
async def serve_index():
|
| 35 |
-
index = files.read_file("webui/index.html")
|
| 36 |
-
return index
|
| 37 |
-
|
| 38 |
-
@webapp.route("/health", methods=["GET"])
|
| 39 |
-
async def health():
|
| 40 |
-
return {"status": "ok", "service": "agent-zero"}
|
| 41 |
-
|
| 42 |
-
@webapp.route("/api-docs", methods=["GET"])
|
| 43 |
-
async def api_docs():
|
| 44 |
-
from python.api.api_docs import ApiDocs
|
| 45 |
-
handler = ApiDocs(webapp, lock)
|
| 46 |
-
result = await handler.process({}, request)
|
| 47 |
-
return result
|
| 48 |
-
|
| 49 |
-
def run():
|
| 50 |
-
from werkzeug.serving import make_server
|
| 51 |
-
from werkzeug.middleware.dispatcher import DispatcherMiddleware
|
| 52 |
-
from a2wsgi import ASGIMiddleware
|
| 53 |
-
|
| 54 |
-
port = runtime.get_web_ui_port()
|
| 55 |
-
host = "0.0.0.0"
|
| 56 |
-
|
| 57 |
-
# register API handlers
|
| 58 |
-
handlers = load_classes_from_folder("python/api", "*.py", ApiHandler)
|
| 59 |
-
for handler in handlers:
|
| 60 |
-
name = handler.__module__.split(".")[-1]
|
| 61 |
-
instance = handler(webapp, lock)
|
| 62 |
-
async def handler_wrap(h=instance): return await h.handle_request(request=request)
|
| 63 |
-
webapp.add_url_rule(f"/api/{name}", f"/{name}", handler_wrap, methods=handler.get_methods())
|
| 64 |
-
|
| 65 |
-
middleware_routes = {
|
| 66 |
-
"/mcp": ASGIMiddleware(app=mcp_server.DynamicMcpProxy.get_instance()),
|
| 67 |
-
"/a2a": ASGIMiddleware(app=fasta2a_server.DynamicA2AProxy.get_instance()),
|
| 68 |
-
}
|
| 69 |
-
|
| 70 |
-
app = DispatcherMiddleware(webapp, middleware_routes)
|
| 71 |
-
server = make_server(host=host, port=port, app=app, threaded=True)
|
| 72 |
-
process.set_server(server)
|
| 73 |
-
|
| 74 |
-
# Init tasks
|
| 75 |
-
initialize.initialize_chats().result_sync()
|
| 76 |
-
initialize.initialize_mcp()
|
| 77 |
-
initialize.initialize_job_loop()
|
| 78 |
-
|
| 79 |
-
PrintStyle().debug(f"Starting server at http://{host}:{port} ...")
|
| 80 |
-
server.serve_forever()
|
| 81 |
-
|
| 82 |
-
if __name__ == "__main__":
|
| 83 |
-
runtime.initialize()
|
| 84 |
-
dotenv.load_dotenv()
|
| 85 |
-
run()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
start_hf.sh
CHANGED
|
@@ -14,17 +14,12 @@ fi
|
|
| 14 |
git clone "$REPO_URL" "$CLONE_DIR"
|
| 15 |
|
| 16 |
echo "Applying Agent-Zero codebase to app directory..."
|
| 17 |
-
# Copy everything from the clone into the current directory, but don't overwrite local patches
|
| 18 |
cp -rn "$CLONE_DIR"/* "$APP_DIR/" 2>/dev/null || true
|
| 19 |
|
| 20 |
echo "Applying patches from $PATCHES_DIR..."
|
| 21 |
-
# Forcefully apply our adaptations over the cloned files
|
| 22 |
if [ -d "$PATCHES_DIR/helpers" ]; then
|
| 23 |
cp -f "$PATCHES_DIR/helpers/"*.py "$APP_DIR/helpers/"
|
| 24 |
fi
|
| 25 |
-
if [ -f "$PATCHES_DIR/run_ui.py" ]; then
|
| 26 |
-
cp -f "$PATCHES_DIR/run_ui.py" "$APP_DIR/run_ui.py"
|
| 27 |
-
fi
|
| 28 |
if [ -d "$PATCHES_DIR/api" ]; then
|
| 29 |
mkdir -p "$APP_DIR/api"
|
| 30 |
cp -f "$PATCHES_DIR/api/"*.py "$APP_DIR/api/"
|
|
@@ -42,5 +37,4 @@ export PORT=7860
|
|
| 42 |
export HOST=0.0.0.0
|
| 43 |
|
| 44 |
echo "Starting Agent-Zero..."
|
| 45 |
-
# The run_ui.py in the root has been patched with HF adaptations
|
| 46 |
python run_ui.py
|
|
|
|
| 14 |
git clone "$REPO_URL" "$CLONE_DIR"
|
| 15 |
|
| 16 |
echo "Applying Agent-Zero codebase to app directory..."
|
|
|
|
| 17 |
cp -rn "$CLONE_DIR"/* "$APP_DIR/" 2>/dev/null || true
|
| 18 |
|
| 19 |
echo "Applying patches from $PATCHES_DIR..."
|
|
|
|
| 20 |
if [ -d "$PATCHES_DIR/helpers" ]; then
|
| 21 |
cp -f "$PATCHES_DIR/helpers/"*.py "$APP_DIR/helpers/"
|
| 22 |
fi
|
|
|
|
|
|
|
|
|
|
| 23 |
if [ -d "$PATCHES_DIR/api" ]; then
|
| 24 |
mkdir -p "$APP_DIR/api"
|
| 25 |
cp -f "$PATCHES_DIR/api/"*.py "$APP_DIR/api/"
|
|
|
|
| 37 |
export HOST=0.0.0.0
|
| 38 |
|
| 39 |
echo "Starting Agent-Zero..."
|
|
|
|
| 40 |
python run_ui.py
|