improve error handling

This commit is contained in:
Yazan Agha-Schrader 2023-11-28 09:43:01 +01:00
parent 57f8edd016
commit 5ac0f300a9
3 changed files with 169 additions and 61 deletions

View file

@ -32,11 +32,11 @@
const params = signal({ const params = signal({
n_predict: 358, n_predict: 358,
temperature: 0.7, temperature: 1.0, // adapt to optimized min-p requierements
repeat_last_n: 256, // 0 = disable penalty, -1 = context size repeat_last_n: 256, // 0 = disable penalty, -1 = context size
repeat_penalty: 1.18, // 1.0 = disabled repeat_penalty: 1.18, // 1.0 = disabled
top_k: 1, // <= 0 to use vocab size top_k: 0, // <= 0 to use vocab size
top_p: 0.5, // 1.0 = disabled top_p: 1.0, // 1.0 = disabled
min_p: 0.05, // 0 = disabled min_p: 0.05, // 0 = disabled
tfs_z: 1.0, // 1.0 = disabled tfs_z: 1.0, // 1.0 = disabled
typical_p: 1.0, // 1.0 = disabled typical_p: 1.0, // 1.0 = disabled
@ -658,12 +658,14 @@ async function updateSystemLanguage(event) {
</optgroup> </optgroup>
<optgroup label="More Prompt-Styles"> <optgroup label="More Prompt-Styles">
<option value="airoboros180">Airoboros L2</option> <option value="airoboros180">Airoboros L2</option>
<option value="bakllava">BakLLaVA-1</option>
<option value="codeCherryPop">Code Cherry Pop</option> <option value="codeCherryPop">Code Cherry Pop</option>
<option value="deepseekCoder">Deepseek Coder</option> <option value="deepseekCoder">Deepseek Coder</option>
<option value="dolphinMistral">Dolphin Mistral</option> <option value="dolphinMistral">Dolphin Mistral</option>
<option value="evolvedSeeker">evolvedSeeker 1.3B</option> <option value="evolvedSeeker">evolvedSeeker 1.3B</option>
<option value="goliath120b">Goliath 120B</option> <option value="goliath120b">Goliath 120B</option>
<option value="jordan">Jordan</option> <option value="jordan">Jordan</option>
<option value="llava">LLaVA</option>
<option value="leoHessianai">Leo Hessianai</option> <option value="leoHessianai">Leo Hessianai</option>
<option value="leoMistral">Leo Mistral</option> <option value="leoMistral">Leo Mistral</option>
<option value="marx">Marx</option> <option value="marx">Marx</option>
@ -773,21 +775,21 @@ async function updateSystemLanguage(event) {
<fieldset class="two"> <fieldset class="two">
${IntField({ label: "Prediction", max: 2048, min: -1, step: 16, name: "n_predict", value: params.value.n_predict, })} ${IntField({ label: "Prediction", max: 2048, min: -1, step: 16, name: "n_predict", value: params.value.n_predict, })}
${FloatField({ label: "Temperature", max: 1.5, min: 0.0, name: "temperature", step: 0.01, value: params.value.temperature })}
${IntField({ label: "Top-K", max: 100, min: -1, step: 1, name: "top_k", value: params.value.top_k })}
${FloatField({ label: "Repetition Penalty", max: 2.0, min: 0.0, name: "repeat_penalty", step: 0.01, value: params.value.repeat_penalty })}
${FloatField({ label: "Min-P sampling", max: 1.0, min: 0.0, name: "min_p", step: 0.01, value: params.value.min_p })} ${FloatField({ label: "Min-P sampling", max: 1.0, min: 0.0, name: "min_p", step: 0.01, value: params.value.min_p })}
${FloatField({ label: "Repetition Penalty", max: 2.0, min: 0.0, name: "repeat_penalty", step: 0.01, value: params.value.repeat_penalty })}
${FloatField({ label: "Temperature", max: 1.5, min: 0.0, name: "temperature", step: 0.01, value: params.value.temperature })}
</fieldset> </fieldset>
<details> <details>
<summary><span class="summary-title">Further Options</span></summary> <summary><span class="summary-title">Further Options</span></summary>
<fieldset class="two"> <fieldset class="two">
${FloatField({ label: "Top-P", max: 1.0, min: 0.0, name: "top_p", step: 0.01, value: params.value.top_p })} ${IntField({ label: "Top-K", max: 100, min: -1, step: 1, name: "top_k", value: params.value.top_k })}
${IntField({ label: "Penalize Last N", max: 2048, min: 0, step: 16, name: "repeat_last_n", value: params.value.repeat_last_n })} ${IntField({ label: "Penalize Last N", max: 2048, min: 0, step: 16, name: "repeat_last_n", value: params.value.repeat_last_n })}
${FloatField({ label: "TFS-Z", max: 1.0, min: 0.0, name: "tfs_z", step: 0.01, value: params.value.tfs_z })} ${FloatField({ label: "Top-P", max: 1.0, min: 0.0, name: "top_p", step: 0.01, value: params.value.top_p })}
${FloatField({ label: "Presence Penalty", max: 1.0, min: 0.0, name: "presence_penalty", step: 0.01, value: params.value.presence_penalty })} ${FloatField({ label: "Presence Penalty", max: 1.0, min: 0.0, name: "presence_penalty", step: 0.01, value: params.value.presence_penalty })}
${FloatField({ label: "Typical-P", max: 1.0, min: 0.0, name: "typical_p", step: 0.01, value: params.value.typical_p })} ${FloatField({ label: "TFS-Z", max: 1.0, min: 0.0, name: "tfs_z", step: 0.01, value: params.value.tfs_z })}
${FloatField({ label: "Frequency Penalty", max: 1.0, min: 0.0, name: "frequency_penalty", step: 0.01, value: params.value.frequency_penalty })} ${FloatField({ label: "Frequency Penalty", max: 1.0, min: 0.0, name: "frequency_penalty", step: 0.01, value: params.value.frequency_penalty })}
${FloatField({ label: "Typical-P", max: 1.0, min: 0.0, name: "typical_p", step: 0.01, value: params.value.typical_p })}
</fieldset> </fieldset>
<hr style="height: 1px; background-color: #ececf1; border: none;" /> <hr style="height: 1px; background-color: #ececf1; border: none;" />

View file

@ -12,6 +12,12 @@ export const promptFormats = {
char: "Response", char: "Response",
user: "Instruction" user: "Instruction"
}, },
"bakllava": {
template: "{{history}}{{char}}:",
historyTemplate: "{{name}}: {{message}}\n",
char: "ASSISTANT",
user: "USER"
},
"chatml": { "chatml": {
template: "<|im_start|>system\n{{prompt}}<|im_end|>\n{{history}}\n<|im_start|>{{char}}", template: "<|im_start|>system\n{{prompt}}<|im_end|>\n{{history}}\n<|im_start|>{{char}}",
historyTemplate: "<|im_start|>{{user}}\n{{message}}<|im_end|>", historyTemplate: "<|im_start|>{{user}}\n{{message}}<|im_end|>",
@ -54,6 +60,18 @@ export const promptFormats = {
char: "ASSISTANT", char: "ASSISTANT",
user: "USER" user: "USER"
}, },
"llama2": {
template: "<s>[INST] <<SYS>>\n{{prompt}}\n<</SYS>>\n\n{{history}} [/INST] {{char}} </s><s>[INST] ",
historyTemplate: "{{name}}: {{message}} [/INST]",
char: "llama",
user: "user"
},
"llava": {
template: "{{history}}{{char}}:",
historyTemplate: "{{name}}: {{message}}\n",
char: "ASSISTANT",
user: "USER"
},
"leoHessianai": { "leoHessianai": {
template: "<|im_start|>system\n{{prompt}}<|im_end|>\n{{history}}\n<|im_start|>{{char}}", template: "<|im_start|>system\n{{prompt}}<|im_end|>\n{{history}}\n<|im_start|>{{char}}",
historyTemplate: "<|im_start|>{{user}}\n{{message}}<|im_end|>", historyTemplate: "<|im_start|>{{user}}\n{{message}}<|im_end|>",
@ -66,12 +84,6 @@ export const promptFormats = {
char: "ASSISTANT", char: "ASSISTANT",
user: "USER" user: "USER"
}, },
"llama2": {
template: "<s>[INST] <<SYS>>\n{{prompt}}\n<</SYS>>\n\n{{history}} [/INST] {{char}} </s><s>[INST] ",
historyTemplate: "{{name}}: {{message}} [/INST]",
char: "llama",
user: "user"
},
"marx": { "marx": {
template: "{{history}}\n{{char}}:", template: "{{history}}\n{{char}}:",
historyTemplate: "{{name}}: {{message}}", historyTemplate: "{{name}}: {{message}}",

View file

@ -1,5 +1,13 @@
#!/bin/bash #!/bin/bash
# Determine the size of the terminal window
TERMINAL_HEIGHT=$(tput lines)
TERMINAL_WIDTH=$(tput cols)
# Calculate a size for the dialog box as a percentage of the terminal to make sure it fits
DIALOG_HEIGHT=$((TERMINAL_HEIGHT * 5 / 8)) # approx. golden ratio
DIALOG_WIDTH=$((TERMINAL_WIDTH * 5 / 8)) # approx. golden ratio
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
# Set default values # Set default values
@ -71,7 +79,7 @@ fi
model_selection_warning() { model_selection_warning() {
dialog --title "Hinweis" --msgbox "\n\n\nPlease note: To navigate to a folder, please press the space bar twice. To return to a higher-level folder, press the Backspace key.\n\n\nAlternatively, you can also enter the desired path manually in the lower address field. \n\n\nOnly confirm your selection with the Enter key once you have selected the file or the desired folder to be searched." 23 65 dialog --title "Hinweis" --msgbox "\n\n\nPlease note!\n\nTo navigate to a folder, please press the space bar twice. To return to a higher-level folder, press the Backspace key.\n\n\nAlternatively, you can also enter the desired path manually in the lower path field. \n\n\nOnly confirm your selection with the Enter key once you have selected the file or the desired folder to be searched recursively." $DIALOG_HEIGHT $DIALOG_WIDTH
} }
@ -85,7 +93,7 @@ model_selection() {
model_path=$(dialog --backtitle "Model Selection" \ model_path=$(dialog --backtitle "Model Selection" \
--title "Select Model File or Folder" \ --title "Select Model File or Folder" \
--fselect "$INITIAL_DIR" 23 65 \ --fselect "$INITIAL_DIR" $DIALOG_HEIGHT $DIALOG_WIDTH \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
@ -98,12 +106,19 @@ model_selection() {
# If a folder has been selected, search for *.gguf files # If a folder has been selected, search for *.gguf files
if [ -d "$model_path" ]; then if [ -d "$model_path" ]; then
model_files=($(find "$model_path" -name "*.gguf" 2>/dev/null)) model_files=($(find "$model_path" -name "*.gguf" 2>/dev/null))
# Check whether files have been found
if [ ${#model_files[@]} -eq 0 ]; then
dialog --backtitle "Model Selection" \
--title "No Models Found" \
--msgbox "\n\n\nNo model files (*.gguf) were found in the selected directory." $DIALOG_HEIGHT $DIALOG_WIDTH
return
fi
elif [ -f "$model_path" ]; then elif [ -f "$model_path" ]; then
model_files=("$model_path") model_files=("$model_path")
else else
dialog --backtitle "Model Selection" \ dialog --backtitle "Model Selection" \
--title "Invalid Selection" \ --title "Invalid Selection" \
--msgbox "The selected path is not valid." 23 65 --msgbox "\n\n\nThe selected path is not valid." $DIALOG_HEIGHT $DIALOG_WIDTH
return return
fi fi
@ -111,7 +126,7 @@ model_selection() {
exec 3>&1 exec 3>&1
model_choice=$(dialog --backtitle "Model Selection" \ model_choice=$(dialog --backtitle "Model Selection" \
--title "Select a Model File" \ --title "Select a Model File" \
--menu "Choose one of the found models:" 23 65 4 \ --menu "Choose one of the found models:" $DIALOG_HEIGHT $DIALOG_WIDTH \
$(for i in "${!model_files[@]}"; do echo "$((i+1))" "$(basename "${model_files[$i]}")"; done) \ $(for i in "${!model_files[@]}"; do echo "$((i+1))" "$(basename "${model_files[$i]}")"; done) \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
@ -135,7 +150,7 @@ multimodal_model_selection() {
mmproj_path=$(dialog --backtitle "Multimodal Model Selection" \ mmproj_path=$(dialog --backtitle "Multimodal Model Selection" \
--title "Select Multimodal Model File or Folder" \ --title "Select Multimodal Model File or Folder" \
--fselect "$INITIAL_DIR" 23 65 \ --fselect "$INITIAL_DIR" $DIALOG_HEIGHT $DIALOG_WIDTH \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
@ -148,12 +163,19 @@ multimodal_model_selection() {
# If a folder has been selected, search for *.bin files # If a folder has been selected, search for *.bin files
if [ -d "$mmproj_path" ]; then if [ -d "$mmproj_path" ]; then
multi_modal_files=($(find "$mmproj_path" -name "*.bin" 2>/dev/null)) multi_modal_files=($(find "$mmproj_path" -name "*.bin" 2>/dev/null))
# Check whether files have been found
if [ ${#multi_modal_files[@]} -eq 0 ]; then
dialog --backtitle "Multimodal Model Selection" \
--title "No Multimodal Models Found" \
--msgbox "\n\n\nNo multimodal model files (*.bin) were found in the selected directory." $DIALOG_HEIGHT $DIALOG_WIDTH
return
fi
elif [ -f "$mmproj_path" ]; then elif [ -f "$mmproj_path" ]; then
multi_modal_files=("$mmproj_path") multi_modal_files=("$mmproj_path")
else else
dialog --backtitle "Multimodal Model" \ dialog --backtitle "Multimodal Model Selection" \
--title "Invalid Selection" \ --title "Invalid Selection" \
--msgbox "The selected path is not valid." 7 50 --msgbox "\n\n\nThe selected path is not valid." $DIALOG_HEIGHT $DIALOG_WIDTH
return return
fi fi
@ -161,7 +183,7 @@ multimodal_model_selection() {
exec 3>&1 exec 3>&1
multi_modal_choice=$(dialog --backtitle "Multimodal Model" \ multi_modal_choice=$(dialog --backtitle "Multimodal Model" \
--title "Select a Model File" \ --title "Select a Model File" \
--menu "Choose one of the found models:" 23 65 4 \ --menu "Choose one of the found models:" $DIALOG_HEIGHT $DIALOG_WIDTH 8 \
$(for i in "${!multi_modal_files[@]}"; do echo "$((i+1))" "$(basename "${multi_modal_files[$i]}")"; done) \ $(for i in "${!multi_modal_files[@]}"; do echo "$((i+1))" "$(basename "${multi_modal_files[$i]}")"; done) \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
@ -184,7 +206,7 @@ options() {
form_values=$(dialog --backtitle "Options Configuration" \ form_values=$(dialog --backtitle "Options Configuration" \
--title "Set Options" \ --title "Set Options" \
--form "Enter the values for the following options:" \ --form "Enter the values for the following options:" \
23 65 0 \ $DIALOG_HEIGHT $DIALOG_WIDTH 0 \
"Number of Threads (-t):" 1 1 "$threads" 1 25 25 5 \ "Number of Threads (-t):" 1 1 "$threads" 1 25 25 5 \
"Context Size (-c):" 2 1 "$ctx_size" 2 25 25 5 \ "Context Size (-c):" 2 1 "$ctx_size" 2 25 25 5 \
"Batch Size (-b):" 3 1 "$batch_size" 3 25 25 5 \ "Batch Size (-b):" 3 1 "$batch_size" 3 25 25 5 \
@ -214,7 +236,7 @@ further_options() {
exec 3>&1 exec 3>&1
choices=$(dialog --backtitle "Further Options" \ choices=$(dialog --backtitle "Further Options" \
--title "Boolean Options" \ --title "Boolean Options" \
--checklist "Select options:" 23 65 3 \ --checklist "Select options:" $DIALOG_HEIGHT $DIALOG_WIDTH 3 \
"1" "Continuous Batching (-cb)" $cb_value \ "1" "Continuous Batching (-cb)" $cb_value \
"2" "Memory Lock (--mlock)" $mlock_value \ "2" "Memory Lock (--mlock)" $mlock_value \
"3" "No Memory Map (--no-mmap)" $no_mmap_value \ "3" "No Memory Map (--no-mmap)" $no_mmap_value \
@ -248,10 +270,10 @@ advanced_options() {
advanced_values=$(dialog --backtitle "Advanced Options" \ advanced_values=$(dialog --backtitle "Advanced Options" \
--title "Advanced Server Configuration" \ --title "Advanced Server Configuration" \
--form "Enter the advanced configuration options:" \ --form "Enter the advanced configuration options:" \
23 65 0 \ $DIALOG_HEIGHT $DIALOG_WIDTH 0 \
"Host IP:" 1 1 "$host" 1 15 15 0 \ "Host IP:" 1 1 "$host" 1 25 15 0 \
"Port:" 2 1 "$port" 2 15 5 0 \ "Port:" 2 1 "$port" 2 25 5 0 \
"Additional Options:" 3 1 "$advanced_options" 3 15 30 0 \ "Additional Options:" 3 1 "$advanced_options" 3 25 30 0 \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
@ -272,7 +294,7 @@ save_config() {
exec 3>&1 exec 3>&1
config_file=$(dialog --backtitle "Save Configuration" \ config_file=$(dialog --backtitle "Save Configuration" \
--title "Save Configuration File" \ --title "Save Configuration File" \
--fselect "$SCRIPT_DIR/" 23 65 \ --fselect "$SCRIPT_DIR/" $DIALOG_HEIGHT $DIALOG_WIDTH \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
@ -282,10 +304,13 @@ save_config() {
return return
fi fi
absolute_model_path=$(get_absolute_path "$model_path")
absolute_mmproj_path=$(get_absolute_path "$mmproj_path")
# Saving the configuration to the file with absolute paths using custom function # Saving the configuration to the file with absolute paths using custom function
cat > "$config_file" << EOF cat > "$config_file" << EOF
model_path=$(get_absolute_path "$model_path") model_path=$absolute_model_path
mmproj_path=$(get_absolute_path "$mmproj_path") mmproj_path=$absolute_mmproj_path
threads=$threads threads=$threads
ctx_size=$ctx_size ctx_size=$ctx_size
batch_size=$batch_size batch_size=$batch_size
@ -300,7 +325,7 @@ EOF
dialog --backtitle "Save Configuration" \ dialog --backtitle "Save Configuration" \
--title "Configuration Saved" \ --title "Configuration Saved" \
--msgbox "Configuration has been saved to $config_file" 7 50 --msgbox "\n\n\nYour configuration has been saved to\n\n$config_file" $DIALOG_HEIGHT $DIALOG_WIDTH
} }
@ -310,7 +335,7 @@ load_config() {
exec 3>&1 exec 3>&1
config_file=$(dialog --backtitle "Load Configuration" \ config_file=$(dialog --backtitle "Load Configuration" \
--title "Load Configuration File" \ --title "Load Configuration File" \
--fselect "$SCRIPT_DIR/" 23 65 \ --fselect "$SCRIPT_DIR/" $DIALOG_HEIGHT $DIALOG_WIDTH \
2>&1 1>&3) 2>&1 1>&3)
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
@ -324,23 +349,73 @@ load_config() {
if [ ! -f "$config_file" ]; then if [ ! -f "$config_file" ]; then
dialog --backtitle "Load Configuration" \ dialog --backtitle "Load Configuration" \
--title "File Not Found" \ --title "File Not Found" \
--msgbox "The file $config_file was not found." 7 50 --msgbox "\n\n\nThe file $config_file was not found." $DIALOG_HEIGHT $DIALOG_WIDTH
return return
fi fi
# Load configuration from the file # Load configuration from the file
source "$config_file" source "$config_file"
# Convert model paths to absolute paths
model_path=$(get_absolute_path "$model_path")
mmproj_path=$(get_absolute_path "$mmproj_path")
dialog --backtitle "Load Configuration" \ dialog --backtitle "Load Configuration" \
--title "Configuration Loaded" \ --title "Configuration Loaded" \
--msgbox "Configuration has been loaded from $config_file" 7 50 --msgbox "\n\n\nConfiguration has been loaded successfully from\n\n$config_file" $DIALOG_HEIGHT $DIALOG_WIDTH
}
# Checking the existence of the server executable
check_server_executable() {
local server_executable="$SCRIPT_DIR/../server"
local makefile_path="$SCRIPT_DIR/../Makefile"
local cmake_lists_path="$SCRIPT_DIR/../CMakeLists.txt"
if [ ! -f "$server_executable" ]; then
# Server executable does not exist, check Makefile and CMakeLists.txt
if [ -f "$makefile_path" ] && [ -f "$cmake_lists_path" ]; then
# Offer the user to build the server now
exec 3>&1
response=$(dialog --title "Server Executable Missing" \
--yesno "\n\n\nThe server executable does not exist. Would you like to run 'make' to build it? Note: This will build a basic server without GPU acceleration. Please read the documentation if you need more options and run the build process manually." $DIALOG_HEIGHT $DIALOG_WIDTH \
2>&1 1>&3)
exit_status=$?
exec 3>&-
if [ $exit_status = 0 ]; then
# User has agreed, run 'make'
(cd "$SCRIPT_DIR/.." && make)
# Check if 'make' was successful
if [ ! -f "$server_executable" ]; then
dialog --title "Build Failed" --msgbox "\n\n\nThe server could not be built. Please check the build process manually." $DIALOG_HEIGHT $DIALOG_WIDTH
exit 1
fi
else
# User has rejected or pressed ESC
dialog --title "Build Canceled" --msgbox "\n\n\nServer build was canceled. Cannot start the server without the executable." $DIALOG_HEIGHT $DIALOG_WIDTH
exit 1
fi
else
# Makefile and CMakeLists.txt do not exist
dialog --title "Critical Error" --msgbox "\n\n\nMakefile and CMakeLists.txt are missing. This script may not be in the correct directory. Please make sure this script is in its correct directory." $DIALOG_HEIGHT $DIALOG_WIDTH
exit 1
fi
fi
} }
confirm_and_start_server() { confirm_and_start_server() {
# Check whether model_path refers to a valid .gguf file
if [[ ! "$model_path" =~ \.gguf$ ]] || [ ! -f "$model_path" ]; then
dialog --title "Invalid Model File" --msgbox "\n\n\nThe selected model file ($model_path) is not valid or does not end with .gguf or a model file was not selected yet.\n\n\nPlease select a valid .gguf model file." $DIALOG_HEIGHT $DIALOG_WIDTH
return 1
fi
# Show the compiled command in a dialog box # Show the compiled command in a dialog box
dialog --title "Server Start Confirmation" --yesno "The server will be started with the following command:\n\n$cmd\n\nDo not forget to close the server with Ctrl+C as soon as you are finished.\n\nWould you like to continue?" 23 65 dialog --title "Server Start Confirmation" --yesno "\n\n\nThe server will be started with the following command:\n\n$cmd\n\nDo not forget to close the server with Ctrl+C as soon as you are finished.\n\nWould you like to continue?" $DIALOG_HEIGHT $DIALOG_WIDTH
# Check exit status of dialog # Check exit status of dialog
response=$? response=$?
@ -377,6 +452,21 @@ start_server() {
# Function to confirm exit
confirm_exit() {
exec 3>&1
selection=$(dialog \
--backtitle "Confirm Exit" \
--title "Are you sure?" \
--yesno "Are you sure you want to exit?" 7 60 \
2>&1 1>&3)
exit_status=$?
exec 3>&-
return $exit_status
}
# Function to show the main menu # Function to show the main menu
show_main_menu() { show_main_menu() {
while true; do while true; do
@ -386,7 +476,7 @@ show_main_menu() {
--title "Main Menu" \ --title "Main Menu" \
--clear \ --clear \
--cancel-label "Exit" \ --cancel-label "Exit" \
--menu "Welcome to llama.cpp Dialog" 23 65 6 \ --menu "Welcome to llama.cpp Dialog" $DIALOG_HEIGHT $DIALOG_WIDTH 8 \
"1" "Model Selection" \ "1" "Model Selection" \
"2" "Multimodal Model Selection" \ "2" "Multimodal Model Selection" \
"3" "Options" \ "3" "Options" \
@ -399,11 +489,14 @@ show_main_menu() {
exit_status=$? exit_status=$?
exec 3>&- exec 3>&-
# Check whether user has selected 'Exit' # Check whether user has unintentionally selected 'Exit'
if [ $exit_status = 1 ]; then if [ $exit_status = 1 ]; then
confirm_exit
if [ $? = 0 ]; then
clear clear
exit exit
fi fi
else
# Call up the corresponding function based on the selection # Call up the corresponding function based on the selection
case $selection in case $selection in
@ -417,6 +510,7 @@ show_main_menu() {
8) start_server ;; 8) start_server ;;
*) clear ;; *) clear ;;
esac esac
fi
done done
} }