Files
smarteragents/start.sh
2026-05-26 00:31:45 -07:00

131 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail
# --- Color Definitions ---
CYAN='\033[96m'
GREEN='\033[92m'
YELLOW='\033[93m'
RED='\033[91m'
RESET='\033[0m'
BOLD='\033[1m'
# --- Paths & Dependencies ---
MODEL_DIR="./models"
AGENT_DIR="./agents"
LLAMA_SERVER="./core/llama.cpp/build/bin/llama-server"
PYTHON_SCRIPT="./core/smarterframework.py"
echo -e "${CYAN}${BOLD}=== SmarterAgents Core Launch System ===${RESET}"
# Ensure local dev and log folders exist in workspace
mkdir -p dev
mkdir -p core/logs
# Verify core compilation target exists
if [ ! -f "$LLAMA_SERVER" ]; then
echo -e "${RED}[ERR] compiled 'llama-server' binary missing at '$LLAMA_SERVER'.${RESET}"
echo -e "Please run cmake build inside core/llama.cpp as detailed in the README."
exit 1
fi
# 1. Model Selection
mapfile -t MODELS < <(find "$MODEL_DIR" -name "*.gguf" 2>/dev/null)
if [ ${#MODELS[@]} -eq 0 ]; then
echo -e "${RED}[ERR] No GGUF models discovered in '$MODEL_DIR'. Please copy a model there first.${RESET}"
exit 1
fi
echo -e "\n${YELLOW}Discovered Models:${RESET}"
for i in "${!MODELS[@]}"; do
echo -e " [$i] $(basename "${MODELS[$i]}")"
done
read -rp "Select Model Index [0-$((${#MODELS[@]} - 1))]: " MODEL_IDX
SELECTED_MODEL="${MODELS[$MODEL_IDX]}"
# 2. Agent Selection
mapfile -t AGENTS < <(find "$AGENT_DIR" -name "*.md" 2>/dev/null)
if [ ${#AGENTS[@]} -eq 0 ]; then
echo -e "${RED}[ERR] No Markdown agents discovered in '$AGENT_DIR'.${RESET}"
exit 1
fi
echo -e "\n${YELLOW}Discovered Agent Personas:${RESET}"
for i in "${!AGENTS[@]}"; do
echo -e " [$i] $(basename "${AGENTS[$i]}")"
done
read -rp "Select Agent Index [0-$((${#AGENTS[@]} - 1))]: " AGENT_IDX
SELECTED_AGENT="${AGENTS[$AGENT_IDX]}"
# 3. Environment Variable Export for Python Orchestrator
GRAMMAR_FILE=""
for path in "tools/tool_rules.gbnf" "tools/tool_rules.gnbf" "agents/tools/tool_rules.gbnf" "agents/tools/tool_rules.gnbf"; do
if [ -f "$path" ]; then
GRAMMAR_FILE="$path"
break
fi
done
if [ -n "$GRAMMAR_FILE" ]; then
export AMDA_GRAMMAR_FILE="$GRAMMAR_FILE"
else
export AMDA_GRAMMAR_FILE="tools/tool_rules.gbnf"
fi
export AMDA_BACKEND_URL="http://127.0.0.1:8080"
export AMDA_SYSTEM_PROMPT="$SELECTED_AGENT"
# 4. Vulkan Background Server Initialization
PHYS_CORES=8
echo -e "\n${CYAN}[Init] Booting Vulkan llama-server daemon...${RESET}"
echo -e "${DIM}Assigning 100% compute threads to $PHYS_CORES physical cores.${RESET}"
# Start llama-server and capture process PID
"$LLAMA_SERVER" \
--model "$SELECTED_MODEL" \
--host "127.0.0.1" \
--port "8080" \
--ctx-size 16384 \
--parallel 1 \
--threads "$PHYS_CORES" \
--batch-size 128 \
--ubatch-size 64 \
--no-mmap \
-ngl 999 \
-fa on \
-ctk q8_0 \
-ctv q8_0 \
--jinja > core/logs/llama-server.log 2>&1 & # <-- Added --jinja here
SERVER_PID=$!
# Safe Target-Specific cleanup (Only kill the llama-server child process)
cleanup() {
echo -e "\n${YELLOW}[Exit] Shutting down llama-server daemon... (PID: $SERVER_PID)${RESET}"
kill -9 "$SERVER_PID" 2>/dev/null || true
wait "$SERVER_PID" 2>/dev/null || true
}
trap cleanup EXIT INT TERM HUP
# 5. Health Check Diagnostics
echo -e "${CYAN}[Health] Polling background loop for local endpoint availability...${RESET}"
RETRIES=15
CONNECTED=false
for ((i=1; i<=RETRIES; i++)); do
if curl -s -o /dev/null -w "%{http_code}" "$AMDA_BACKEND_URL/health" | grep -q "200"; then
echo -e "${GREEN}[Ready] Local Vulkan compute engine activated successfully.${RESET}"
CONNECTED=true
break
fi
sleep 1
done
if [ "$CONNECTED" = false ]; then
echo -e "${RED}[ERR] llama-server failed to activate within timeout period.${RESET}"
echo -e "Diagnostics: Last 15 lines of core/logs/llama-server.log:"
tail -n 15 core/logs/llama-server.log
exit 1
fi
# 6. Transfer Execution to Python TUI Engine
echo -e "${CYAN}[Exec] Handoff control to asynchronous user interface...${RESET}\n"
python3 "$PYTHON_SCRIPT"