90 if (
argc > 1 && (std::string(
argv[1]) ==
"-h" || std::string(
argv[1]) ==
"--help")) {
96 std::cerr <<
"ERROR: Missing required arguments." << std::endl;
110 }
catch (
const std::exception&
e) {
111 Logger::warning(
"Could not parse num_threads from argv[3]: '" + (
argc > 3 ? std::string(
argv[3]) :
"<not provided>") +
"'. Using default: " + std::to_string(
num_threads));
115 std::cerr <<
"ERROR: Missing mode argument (prompt|chat|batch) after num_threads." << std::endl;
123 int max_tokens = 256;
131 int max_batch_size = 8;
134 float temperature = 0.1f;
143 if (
arg ==
"--system-prompt" ||
arg ==
"-sp") {
148 std::cerr <<
"ERROR: --system-prompt requires a value." << std::endl;
152 }
else if (
arg ==
"--max-tokens" ||
arg ==
"-mt") {
157 }
else { std::cerr <<
"ERROR: --max-tokens requires a value." << std::endl;
return 1;}
158 }
else if (
arg ==
"--n-gpu-layers" ||
arg ==
"-ngl") {
163 }
else { std::cerr <<
"ERROR: --n-gpu-layers requires a value." << std::endl;
return 1;}
164 }
else if (
arg ==
"--use-mmap") {
170 else { std::cerr <<
"ERROR: Invalid use_mmap value." << std::endl;
return 1; }
172 }
else { std::cerr <<
"ERROR: --use-mmap requires a value." << std::endl;
return 1;}
173 }
else if (
arg ==
"--temperature" ||
arg ==
"-t") {
178 }
else { std::cerr <<
"ERROR: --temperature requires a value." << std::endl;
return 1;}
179 }
else if (
arg ==
"--top-k" ||
arg ==
"-k") {
184 }
else { std::cerr <<
"ERROR: --top-k requires a value." << std::endl;
return 1;}
185 }
else if (
arg ==
"--top-p" ||
arg ==
"-p") {
190 }
else { std::cerr <<
"ERROR: --top-p requires a value." << std::endl;
return 1;}
191 }
else if (
arg ==
"--raw-prompt") {
194 }
else if (
arg ==
"--rep-penalty" ||
arg ==
"-rp") {
199 }
else { std::cerr <<
"ERROR: --rep-penalty requires a value." << std::endl;
return 1;}
200 }
else if (
arg ==
"--use-kv-quant" ||
arg ==
"-kvq") {
206 else { std::cerr <<
"ERROR: Invalid use_kv_quant value: " <<
argv[
current_arg_idx+1] << std::endl;
return 1; }
208 }
else { std::cerr <<
"ERROR: --use-kv-quant requires a value." << std::endl;
return 1;}
209 }
else if (
arg ==
"--use-batch-generation" ||
arg ==
"-ubg") {
215 else { std::cerr <<
"ERROR: Invalid use_batch_generation value: " <<
argv[
current_arg_idx+1] << std::endl;
return 1; }
217 }
else { std::cerr <<
"ERROR: --use-batch-generation requires a value." << std::endl;
return 1;}
218 }
else if (
arg ==
"--batch-prompts" ||
arg ==
"-bp") {
225 std::cerr <<
"ERROR: --batch-prompts requires at least one prompt." << std::endl;
228 }
else if (
arg ==
"--max-batch-size" ||
arg ==
"-mbs") {
233 }
else { std::cerr <<
"ERROR: --max-batch-size requires a value." << std::endl;
return 1;}
238 std::cerr <<
"ERROR: Unexpected positional argument: " <<
argv[
current_arg_idx] << std::endl;
256 Logger::info(
"Max tokens: " + std::to_string(max_tokens));
259 Logger::info(
"Temperature: " + std::to_string(temperature));
271 Logger::info(
"TinyLlamaSession initialized successfully.");
281 (
session.get_tokenizer() && !
session.get_tokenizer()->get_gguf_chat_template().empty())) {
283 Logger::info(
"[Main.cpp] Llama 3 model or GGUF chat template detected. Internal Q&A prompt formatting will be DISABLED.");
286 Logger::info(
"[Main.cpp] Non-Llama 3 model and no GGUF chat template. Internal Q&A prompt formatting will be ENABLED.");
294 Logger::info(
"[Main.cpp] --raw-prompt: internal Q&A formatting DISABLED.");
300 std::string generated_text =
302 std::cout << generated_text << std::endl;
304 std::cout <<
"Entering chat mode. System Prompt: \"" <<
system_prompt_str <<
"\". Type 'exit', 'quit' to end." << std::endl;
315 std::cout <<
"You: ";
329 std::cerr <<
"ERROR: Batch mode requires prompts. Use --batch-prompts \"prompt1\" \"prompt2\" ..." << std::endl;
334 if (
batch_prompts.size() >
static_cast<size_t>(max_batch_size)) {
335 std::cerr <<
"ERROR: Number of prompts (" <<
batch_prompts.size()
336 <<
") exceeds max batch size (" << max_batch_size <<
")" << std::endl;
348 std::cout <<
"\n" << std::string(80,
'=') << std::endl;
349 std::cout <<
"BATCH PROCESSING RESULTS" << std::endl;
350 std::cout << std::string(80,
'=') << std::endl;
353 std::cout <<
"\n--- Prompt " << (
i + 1) <<
" ---" << std::endl;
355 std::cout <<
"Output: " <<
results[
i] << std::endl;
358 }
catch (
const std::exception&
e) {
359 Logger::error(
"[Batch Mode] Error during batch processing: " + std::string(
e.what()));
363 std::cerr <<
"ERROR: Invalid mode '" <<
mode_str <<
"'. Expected 'prompt', 'chat', or 'batch'." << std::endl;
368 }
catch (
const std::exception&
e) {
std::string trim_whitespace(const std::string &s)
int main(int argc, char **argv)
void print_usage(const char *program_name)