aboutsummaryrefslogtreecommitdiff
path: root/examples/main
diff options
context:
space:
mode:
authorDannyDaemonic <DannyDaemonic@gmail.com>2023-05-08 19:45:48 -0700
committerGitHub <noreply@github.com>2023-05-08 19:45:48 -0700
commit41654efea879bbdf4fd794e13335929d4cf0eb90 (patch)
tree9807bdab964759e8d1bae87930a482194f60216f /examples/main
parent56551bc11f46b2716fdf61bb48ac28414889dc0a (diff)
Interface improvements and `--multiline-input` (previously `--author-mode`) (#1040)
* Interface improvements * Multiline input * Track character width * Works with all characters and control codes + Windows console fixes
Diffstat (limited to 'examples/main')
-rw-r--r--examples/main/main.cpp60
1 files changed, 21 insertions, 39 deletions
diff --git a/examples/main/main.cpp b/examples/main/main.cpp
index 045093c..6e1172a 100644
--- a/examples/main/main.cpp
+++ b/examples/main/main.cpp
@@ -35,12 +35,12 @@ static bool is_interacting = false;
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) || defined (_WIN32)
void sigint_handler(int signo) {
- set_console_color(con_st, CONSOLE_COLOR_DEFAULT);
- printf("\n"); // this also force flush stdout.
if (signo == SIGINT) {
if (!is_interacting) {
is_interacting=true;
} else {
+ console_cleanup(con_st);
+ printf("\n");
llama_print_timings(*g_ctx);
_exit(130);
}
@@ -59,10 +59,9 @@ int main(int argc, char ** argv) {
// save choice to use color for later
// (note for later: this is a slightly awkward choice)
con_st.use_color = params.use_color;
-
-#if defined (_WIN32)
- win32_console_init(params.use_color);
-#endif
+ con_st.multiline_input = params.multiline_input;
+ console_init(con_st);
+ atexit([]() { console_cleanup(con_st); });
if (params.perplexity) {
printf("\n************\n");
@@ -275,12 +274,21 @@ int main(int argc, char ** argv) {
std::fill(last_n_tokens.begin(), last_n_tokens.end(), 0);
if (params.interactive) {
+ const char *control_message;
+ if (con_st.multiline_input) {
+ control_message = " - To return control to LLaMa, end your input with '\\'.\n"
+ " - To return control without starting a new line, end your input with '/'.\n";
+ } else {
+ control_message = " - Press Return to return control to LLaMa.\n"
+ " - To return control without starting a new line, end your input with '/'.\n"
+ " - If you want to submit another line, end your input with '\\'.\n";
+ }
fprintf(stderr, "== Running in interactive mode. ==\n"
#if defined (__unix__) || (defined (__APPLE__) && defined (__MACH__)) || defined (_WIN32)
" - Press Ctrl+C to interject at any time.\n"
#endif
- " - Press Return to return control to LLaMa.\n"
- " - If you want to submit another line, end your input in '\\'.\n\n");
+ "%s\n", control_message);
+
is_interacting = params.interactive_first;
}
@@ -299,7 +307,7 @@ int main(int argc, char ** argv) {
int n_session_consumed = 0;
// the first thing we will do is to output the prompt, so set color accordingly
- set_console_color(con_st, CONSOLE_COLOR_PROMPT);
+ console_set_color(con_st, CONSOLE_COLOR_PROMPT);
std::vector<llama_token> embd;
@@ -498,7 +506,7 @@ int main(int argc, char ** argv) {
}
// reset color to default if we there is no pending user input
if (input_echo && (int)embd_inp.size() == n_consumed) {
- set_console_color(con_st, CONSOLE_COLOR_DEFAULT);
+ console_set_color(con_st, CONSOLE_COLOR_DEFAULT);
}
// in interactive mode, and not currently processing queued inputs;
@@ -518,17 +526,12 @@ int main(int argc, char ** argv) {
if (last_output.find(antiprompt.c_str(), last_output.length() - antiprompt.length(), antiprompt.length()) != std::string::npos) {
is_interacting = true;
is_antiprompt = true;
- set_console_color(con_st, CONSOLE_COLOR_USER_INPUT);
- fflush(stdout);
break;
}
}
}
if (n_past > 0 && is_interacting) {
- // potentially set color to indicate we are taking user input
- set_console_color(con_st, CONSOLE_COLOR_USER_INPUT);
-
if (params.instruct) {
printf("\n> ");
}
@@ -542,31 +545,12 @@ int main(int argc, char ** argv) {
std::string line;
bool another_line = true;
do {
-#if defined(_WIN32)
- std::wstring wline;
- if (!std::getline(std::wcin, wline)) {
- // input stream is bad or EOF received
- return 0;
- }
- win32_utf8_encode(wline, line);
-#else
- if (!std::getline(std::cin, line)) {
- // input stream is bad or EOF received
- return 0;
- }
-#endif
- if (!line.empty()) {
- if (line.back() == '\\') {
- line.pop_back(); // Remove the continue character
- } else {
- another_line = false;
- }
- buffer += line + '\n'; // Append the line to the result
- }
+ another_line = console_readline(con_st, line);
+ buffer += line;
} while (another_line);
// done taking input, reset color
- set_console_color(con_st, CONSOLE_COLOR_DEFAULT);
+ console_set_color(con_st, CONSOLE_COLOR_DEFAULT);
// Add tokens to embd only if the input buffer is non-empty
// Entering a empty line lets the user pass control back
@@ -622,7 +606,5 @@ int main(int argc, char ** argv) {
llama_print_timings(ctx);
llama_free(ctx);
- set_console_color(con_st, CONSOLE_COLOR_DEFAULT);
-
return 0;
}