feat: add llm command for managing sillytavern and koboldcpp
Signed-off-by: Menno van Leeuwen <menno@vleeuwen.me>
This commit is contained in:
298
config/ansible/tasks/global/utils/llm
Executable file
298
config/ansible/tasks/global/utils/llm
Executable file
@@ -0,0 +1,298 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
CYAN='\033[0;36m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
KOBOLD_PATH="/mnt/data/ai/llm/koboldcpp-linux-x64"
|
||||||
|
KOBOLD_MODEL="/mnt/data/ai/llm/Mistral-Small-24B-Instruct-2501-Q4_K_M.gguf" # Default model
|
||||||
|
SILLYTAVERN_SCREEN="sillytavern"
|
||||||
|
KOBOLD_SCREEN="koboldcpp"
|
||||||
|
|
||||||
|
# Function to check if a screen session exists
|
||||||
|
check_screen() {
|
||||||
|
screen -ls | grep -q "\.${1}\s"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to list available models
|
||||||
|
list_models() {
|
||||||
|
echo -e "${BLUE}Available models:${NC}"
|
||||||
|
ls -1 /mnt/data/ai/llm/*.gguf | nl -w2 -s'. '
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to select a model
|
||||||
|
select_model() {
|
||||||
|
list_models
|
||||||
|
echo
|
||||||
|
read -p "Select model number (or press Enter for default): " model_num
|
||||||
|
|
||||||
|
if [[ -z "$model_num" ]]; then
|
||||||
|
echo -e "${YELLOW}Using default model: $(basename "$KOBOLD_MODEL")${NC}"
|
||||||
|
else
|
||||||
|
selected_model=$(ls -1 /mnt/data/ai/llm/*.gguf | sed -n "${model_num}p")
|
||||||
|
if [[ -n "$selected_model" ]]; then
|
||||||
|
KOBOLD_MODEL="$selected_model"
|
||||||
|
echo -e "${GREEN}Selected model: $(basename "$KOBOLD_MODEL")${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}Invalid selection. Using default model.${NC}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to start SillyTavern
|
||||||
|
start_sillytavern() {
|
||||||
|
echo -e "${YELLOW}Starting SillyTavern in screen session '${SILLYTAVERN_SCREEN}'...${NC}"
|
||||||
|
screen -dmS "$SILLYTAVERN_SCREEN" bash -c "cd ~/SillyTavern && npm start -- --listen 0.0.0.0"
|
||||||
|
sleep 2
|
||||||
|
if check_screen "$SILLYTAVERN_SCREEN"; then
|
||||||
|
echo -e "${GREEN}✓ SillyTavern started successfully!${NC}"
|
||||||
|
echo -e "${BLUE} Access at: http://0.0.0.0:8000${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Failed to start SillyTavern${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to start KoboldCPP
|
||||||
|
start_koboldcpp() {
|
||||||
|
select_model
|
||||||
|
echo -e "${YELLOW}Starting KoboldCPP in screen session '${KOBOLD_SCREEN}'...${NC}"
|
||||||
|
screen -dmS "$KOBOLD_SCREEN" bash -c "cd /mnt/data/ai/llm && ./koboldcpp-linux-x64 --model '$KOBOLD_MODEL' --host 0.0.0.0 --port 5001 --contextsize 8192 --gpulayers 999"
|
||||||
|
sleep 2
|
||||||
|
if check_screen "$KOBOLD_SCREEN"; then
|
||||||
|
echo -e "${GREEN}✓ KoboldCPP started successfully!${NC}"
|
||||||
|
echo -e "${BLUE} Model: $(basename "$KOBOLD_MODEL")${NC}"
|
||||||
|
echo -e "${BLUE} Access at: http://0.0.0.0:5001${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Failed to start KoboldCPP${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to stop a service
|
||||||
|
stop_service() {
|
||||||
|
local service=$1
|
||||||
|
local screen_name=$2
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Stopping ${service}...${NC}"
|
||||||
|
screen -S "$screen_name" -X quit
|
||||||
|
sleep 1
|
||||||
|
if ! check_screen "$screen_name"; then
|
||||||
|
echo -e "${GREEN}✓ ${service} stopped successfully${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Failed to stop ${service}${NC}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to show service status
|
||||||
|
show_status() {
|
||||||
|
echo -e "${CYAN}╔═══════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}║ Service Status Overview ║${NC}"
|
||||||
|
echo -e "${CYAN}╚═══════════════════════════════════════╝${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
local st_running=false
|
||||||
|
local kc_running=false
|
||||||
|
|
||||||
|
# Check SillyTavern
|
||||||
|
if check_screen "$SILLYTAVERN_SCREEN"; then
|
||||||
|
st_running=true
|
||||||
|
echo -e " ${GREEN}●${NC} SillyTavern: ${GREEN}Running${NC} (screen: ${SILLYTAVERN_SCREEN})"
|
||||||
|
echo -e " ${BLUE}→ http://0.0.0.0:8000${NC}"
|
||||||
|
else
|
||||||
|
echo -e " ${RED}●${NC} SillyTavern: ${RED}Not running${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Check KoboldCPP
|
||||||
|
if check_screen "$KOBOLD_SCREEN"; then
|
||||||
|
kc_running=true
|
||||||
|
echo -e " ${GREEN}●${NC} KoboldCPP: ${GREEN}Running${NC} (screen: ${KOBOLD_SCREEN})"
|
||||||
|
echo -e " ${BLUE}→ http://0.0.0.0:5001${NC}"
|
||||||
|
else
|
||||||
|
echo -e " ${RED}●${NC} KoboldCPP: ${RED}Not running${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to handle service management
|
||||||
|
manage_services() {
|
||||||
|
local st_running=$(check_screen "$SILLYTAVERN_SCREEN" && echo "true" || echo "false")
|
||||||
|
local kc_running=$(check_screen "$KOBOLD_SCREEN" && echo "true" || echo "false")
|
||||||
|
|
||||||
|
# If both services are running
|
||||||
|
if [[ "$st_running" == "true" ]] && [[ "$kc_running" == "true" ]]; then
|
||||||
|
echo -e "${GREEN}Both services are running.${NC}"
|
||||||
|
echo
|
||||||
|
echo "1) Attach to SillyTavern"
|
||||||
|
echo "2) Attach to KoboldCPP"
|
||||||
|
echo "3) Restart SillyTavern"
|
||||||
|
echo "4) Restart KoboldCPP"
|
||||||
|
echo "5) Stop all services"
|
||||||
|
echo "6) Exit"
|
||||||
|
|
||||||
|
read -p "Your choice (1-6): " choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
echo -e "${BLUE}Attaching to SillyTavern... (Use Ctrl+A then D to detach)${NC}"
|
||||||
|
sleep 1
|
||||||
|
screen -r "$SILLYTAVERN_SCREEN"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo -e "${BLUE}Attaching to KoboldCPP... (Use Ctrl+A then D to detach)${NC}"
|
||||||
|
sleep 1
|
||||||
|
screen -r "$KOBOLD_SCREEN"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
stop_service "SillyTavern" "$SILLYTAVERN_SCREEN"
|
||||||
|
echo
|
||||||
|
start_sillytavern
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
stop_service "KoboldCPP" "$KOBOLD_SCREEN"
|
||||||
|
echo
|
||||||
|
start_koboldcpp
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
stop_service "SillyTavern" "$SILLYTAVERN_SCREEN"
|
||||||
|
stop_service "KoboldCPP" "$KOBOLD_SCREEN"
|
||||||
|
;;
|
||||||
|
6)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Invalid choice${NC}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If only SillyTavern is running
|
||||||
|
elif [[ "$st_running" == "true" ]]; then
|
||||||
|
echo -e "${YELLOW}Only SillyTavern is running.${NC}"
|
||||||
|
echo
|
||||||
|
echo "1) Attach to SillyTavern"
|
||||||
|
echo "2) Start KoboldCPP"
|
||||||
|
echo "3) Restart SillyTavern"
|
||||||
|
echo "4) Stop SillyTavern"
|
||||||
|
echo "5) Exit"
|
||||||
|
|
||||||
|
read -p "Your choice (1-5): " choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
echo -e "${BLUE}Attaching to SillyTavern... (Use Ctrl+A then D to detach)${NC}"
|
||||||
|
sleep 1
|
||||||
|
screen -r "$SILLYTAVERN_SCREEN"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
start_koboldcpp
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
stop_service "SillyTavern" "$SILLYTAVERN_SCREEN"
|
||||||
|
echo
|
||||||
|
start_sillytavern
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
stop_service "SillyTavern" "$SILLYTAVERN_SCREEN"
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Invalid choice${NC}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If only KoboldCPP is running
|
||||||
|
elif [[ "$kc_running" == "true" ]]; then
|
||||||
|
echo -e "${YELLOW}Only KoboldCPP is running.${NC}"
|
||||||
|
echo
|
||||||
|
echo "1) Attach to KoboldCPP"
|
||||||
|
echo "2) Start SillyTavern"
|
||||||
|
echo "3) Restart KoboldCPP"
|
||||||
|
echo "4) Stop KoboldCPP"
|
||||||
|
echo "5) Exit"
|
||||||
|
|
||||||
|
read -p "Your choice (1-5): " choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
echo -e "${BLUE}Attaching to KoboldCPP... (Use Ctrl+A then D to detach)${NC}"
|
||||||
|
sleep 1
|
||||||
|
screen -r "$KOBOLD_SCREEN"
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
start_sillytavern
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
stop_service "KoboldCPP" "$KOBOLD_SCREEN"
|
||||||
|
echo
|
||||||
|
start_koboldcpp
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
stop_service "KoboldCPP" "$KOBOLD_SCREEN"
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Invalid choice${NC}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If no services are running
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}No services are running.${NC}"
|
||||||
|
echo
|
||||||
|
echo "1) Start both services"
|
||||||
|
echo "2) Start SillyTavern only"
|
||||||
|
echo "3) Start KoboldCPP only"
|
||||||
|
echo "4) Exit"
|
||||||
|
|
||||||
|
read -p "Your choice (1-4): " choice
|
||||||
|
|
||||||
|
case $choice in
|
||||||
|
1)
|
||||||
|
start_sillytavern
|
||||||
|
echo
|
||||||
|
start_koboldcpp
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
start_sillytavern
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
start_koboldcpp
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Invalid choice${NC}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main script
|
||||||
|
echo -e "${BLUE}╔═══════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║ LLM Services Manager ║${NC}"
|
||||||
|
echo -e "${BLUE}╚═══════════════════════════════════════╝${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Show status
|
||||||
|
show_status
|
||||||
|
|
||||||
|
# Show separator and manage services
|
||||||
|
echo -e "${CYAN}═══════════════════════════════════════${NC}"
|
||||||
|
manage_services
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo -e "${BLUE}Quick reference:${NC}"
|
||||||
|
echo "• List sessions: screen -ls"
|
||||||
|
echo "• Attach: screen -r <name>"
|
||||||
|
echo "• Detach: Ctrl+A then D"
|
Reference in New Issue
Block a user