params.use_jinja = true;
}
+ params.use_color = tty_can_use_colors();
+
// load dynamic backends
ggml_backend_load_all();
}
).set_examples({LLAMA_EXAMPLE_MAIN}));
add_opt(common_arg(
- {"-co", "--color"},
- string_format("colorise output to distinguish prompt and user input from generations (default: %s)", params.use_color ? "true" : "false"),
- [](common_params & params) {
- params.use_color = true;
+ {"-co", "--color"}, "[on|off|auto]",
+ "Colorize output to distinguish prompt and user input from generations ('on', 'off', or 'auto', default: 'auto')\n"
+ "'auto' enables colors when output is to a terminal",
+ [](common_params & params, const std::string & value) {
+ if (is_truthy(value)) {
+ params.use_color = true;
+ } else if (is_falsey(value)) {
+ params.use_color = false;
+ } else if (is_autoy(value)) {
+ params.use_color = tty_can_use_colors();
+ } else {
+ throw std::invalid_argument(
+ string_format("error: unknown value for --color: '%s'\n", value.c_str()));
+ }
}
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
add_opt(common_arg(
params.flash_attn_type = LLAMA_FLASH_ATTN_TYPE_AUTO;
} else {
throw std::runtime_error(
- string_format("error: unkown value for --flash-attn: '%s'\n", value.c_str()));
+ string_format("error: unknown value for --flash-attn: '%s'\n", value.c_str()));
}
}).set_env("LLAMA_ARG_FLASH_ATTN"));
add_opt(common_arg(
common_log_set_colors(common_log_main(), LOG_COLORS_AUTO);
} else {
throw std::invalid_argument(
- string_format("error: unkown value for --log-colors: '%s'\n", value.c_str()));
+ string_format("error: unknown value for --log-colors: '%s'\n", value.c_str()));
}
}
).set_env("LLAMA_LOG_COLORS"));
return files;
}
+//
+// TTY utils
+//
+
+bool tty_can_use_colors() {
+ // Check NO_COLOR environment variable (https://no-color.org/)
+ if (const char * no_color = std::getenv("NO_COLOR")) {
+ if (no_color[0] != '\0') {
+ return false;
+ }
+ }
+
+ // Check TERM environment variable
+ if (const char * term = std::getenv("TERM")) {
+ if (std::strcmp(term, "dumb") == 0) {
+ return false;
+ }
+ }
+
+ // Check if stdout and stderr are connected to a terminal
+ // We check both because log messages can go to either
+ bool stdout_is_tty = isatty(fileno(stdout));
+ bool stderr_is_tty = isatty(fileno(stderr));
+
+ return stdout_is_tty || stderr_is_tty;
+}
//
// Model utils
};
std::vector<common_file_info> fs_list(const std::string & path, bool include_directories);
+//
+// TTY utils
+//
+
+// Auto-detect if colors can be enabled based on terminal and environment
+bool tty_can_use_colors();
+
//
// Model utils
//
+#include "common.h"
#include "log.h"
#include <chrono>
common_log_verbosity_thold = verbosity;
}
-// Auto-detect if colors should be enabled based on terminal and environment
-static bool common_log_should_use_colors_auto() {
- // Check NO_COLOR environment variable (https://no-color.org/)
- if (const char * no_color = std::getenv("NO_COLOR")) {
- if (no_color[0] != '\0') {
- return false;
- }
- }
-
- // Check TERM environment variable
- if (const char * term = std::getenv("TERM")) {
- if (std::strcmp(term, "dumb") == 0) {
- return false;
- }
- }
-
- // Check if stdout and stderr are connected to a terminal
- // We check both because log messages can go to either
- bool stdout_is_tty = isatty(fileno(stdout));
- bool stderr_is_tty = isatty(fileno(stderr));
-
- return stdout_is_tty || stderr_is_tty;
-}
-
static int64_t t_us() {
return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
static std::once_flag init_flag;
std::call_once(init_flag, [&]() {
// Set default to auto-detect colors
- log.set_colors(common_log_should_use_colors_auto());
+ log.set_colors(tty_can_use_colors());
});
return &log;
void common_log_set_colors(struct common_log * log, log_colors colors) {
if (colors == LOG_COLORS_AUTO) {
- log->set_colors(common_log_should_use_colors_auto());
+ log->set_colors(tty_can_use_colors());
return;
}