diff --git a/tooling/pipeline/includes/data_model/models.h b/tooling/pipeline/includes/data_model/models.h index 05d4bc45..2666c3c1 100644 --- a/tooling/pipeline/includes/data_model/models.h +++ b/tooling/pipeline/includes/data_model/models.h @@ -191,9 +191,9 @@ struct SamplingOptions { * @brief Selects which DataGenerator backend the pipeline uses. */ enum class GeneratorMode { - Mock, - Llama, - OpenAI, + kMock, + kLlama, + kOpenAI, }; /** @@ -202,25 +202,25 @@ enum class GeneratorMode { struct GeneratorOptions { /** * @brief Path to the LLM model file (gguf format). Only meaningful for - * GeneratorMode::Llama. + * GeneratorMode::kLlama. */ std::filesystem::path model_path; /** * @brief Which generator backend to use. */ - GeneratorMode mode = GeneratorMode::Mock; + GeneratorMode mode = GeneratorMode::kMock; /** * @brief Specific sampling parameters for this generator. Only - * meaningful for GeneratorMode::Llama; if nullopt, LlamaGenerator uses + * meaningful for GeneratorMode::kLlama; if nullopt, LlamaGenerator uses * its own defaults. */ std::optional sampling; /** * @brief OpenAI API key, read from the OPENAI_API_KEY environment - * variable. Only populated for GeneratorMode::OpenAI. + * variable. Only populated for GeneratorMode::kOpenAI. */ std::string openai_api_key; diff --git a/tooling/pipeline/src/application_options/parse_arguments.cc b/tooling/pipeline/src/application_options/parse_arguments.cc index b1fe5c2a..1822584b 100644 --- a/tooling/pipeline/src/application_options/parse_arguments.cc +++ b/tooling/pipeline/src/application_options/parse_arguments.cc @@ -182,16 +182,16 @@ std::optional ParseArguments( .phase = PipelinePhase::Startup, .message = msg}); } else { - std::cerr << msg << std::endl; + std::cerr << msg << '\n'; } return std::nullopt; } options.generator.openai_api_key = api_key_env; } - options.generator.mode = use_mocked ? GeneratorMode::Mock - : use_openai ? GeneratorMode::OpenAI - : GeneratorMode::Llama; + options.generator.mode = use_mocked ? GeneratorMode::kMock + : use_openai ? GeneratorMode::kOpenAI + : GeneratorMode::kLlama; options.generator.model_path = model_path; options.generator.openai_model = var_map["openai-model"].as(); @@ -208,7 +208,7 @@ std::optional ParseArguments( if (user_provided_sampling) { // Warn but do not fail — the run is still valid, the flags are just // silently irrelevant when no local model is loaded. - if (options.generator.mode != GeneratorMode::Llama) { + if (options.generator.mode != GeneratorMode::kLlama) { const std::string msg = "Sampling parameters are ignored unless using --model " "(Llama)"; diff --git a/tooling/pipeline/src/biergarten_pipeline_orchestrator/generate_breweries.cc b/tooling/pipeline/src/biergarten_pipeline_orchestrator/generate_breweries.cc index 3a5d24a1..2fa65463 100644 --- a/tooling/pipeline/src/biergarten_pipeline_orchestrator/generate_breweries.cc +++ b/tooling/pipeline/src/biergarten_pipeline_orchestrator/generate_breweries.cc @@ -31,8 +31,8 @@ double RadiansToDegrees(double radians) { } } // namespace -static Coords GetRandomCoordsWithinRange(Coords const& centre, - int const distance_km, +static Coords GetRandomCoordsWithinRange(const Coords& centre, + const int distance_km, std::mt19937& rng) { std::uniform_real_distribution angle_dist(0.0, 2.0 * std::numbers::pi); diff --git a/tooling/pipeline/src/data_generation/generation_json_validation.cc b/tooling/pipeline/src/data_generation/generation_json_validation.cc index 0fbb3929..42344f16 100644 --- a/tooling/pipeline/src/data_generation/generation_json_validation.cc +++ b/tooling/pipeline/src/data_generation/generation_json_validation.cc @@ -8,12 +8,14 @@ #include #include -#include #include +#include #include #include #include +#include + namespace { /** * String trimming: removes leading and trailing whitespace @@ -66,11 +68,18 @@ bool ReadRequiredTrimmedStringField(const boost::json::object& obj, std::string* error_out) { const boost::json::value* field = obj.if_contains(key); if (field == nullptr || !field->is_string()) { + if (error_out != nullptr) { + *error_out = + std::format("Missing or invalid string field: {}", key); + } return false; } const auto& string_value = field->as_string(); out = Trim(std::string_view(string_value.data(), string_value.size())); + if (out.empty() && error_out != nullptr) { + *error_out = std::format("Field must not be empty: {}", key); + } return !out.empty(); } diff --git a/tooling/pipeline/src/data_generation/openai/call_chat_completions_api.cc b/tooling/pipeline/src/data_generation/openai/call_chat_completions_api.cc index 05ce3aaf..f878616f 100644 --- a/tooling/pipeline/src/data_generation/openai/call_chat_completions_api.cc +++ b/tooling/pipeline/src/data_generation/openai/call_chat_completions_api.cc @@ -9,7 +9,6 @@ * Structured Outputs: https://platform.openai.com/docs/guides/structured-outputs */ -#include #include #include #include @@ -17,6 +16,8 @@ #include #include +#include + #include "data_generation/openai_generator.h" namespace { diff --git a/tooling/pipeline/src/main.cc b/tooling/pipeline/src/main.cc index 7a02d08f..32b01709 100644 --- a/tooling/pipeline/src/main.cc +++ b/tooling/pipeline/src/main.cc @@ -67,7 +67,7 @@ int main(const int argc, char** argv) { std::unique_ptr prompt_directory; - if (options.generator.mode != GeneratorMode::Mock) { + if (options.generator.mode != GeneratorMode::kMock) { try { prompt_directory = std::make_unique( options.pipeline.prompt_dir, log_producer); @@ -90,7 +90,7 @@ int main(const int argc, char** argv) { di::bind().to( [options, &log_producer]() -> std::unique_ptr { - if (options.generator.mode == GeneratorMode::Mock) { + if (options.generator.mode == GeneratorMode::kMock) { log_producer->Log( {.level = LogLevel::Info, .phase = PipelinePhase::Startup, @@ -110,7 +110,7 @@ int main(const int argc, char** argv) { di::bind().to( [options, &log_producer]() -> std::unique_ptr { - // if (options.generator.mode == GeneratorMode::Mock) { + // if (options.generator.mode == GeneratorMode::kMock) { // log_producer->Log({.level = LogLevel::Info, // .phase = PipelinePhase::Startup, // .message = "Curated data: mock"}); @@ -131,7 +131,7 @@ int main(const int argc, char** argv) { }); }), di::bind().to([options, log_producer] { - if (options.generator.mode != GeneratorMode::Llama) { + if (options.generator.mode != GeneratorMode::kLlama) { log_producer->Log( {.level = LogLevel::Info, .phase = PipelinePhase::Startup, @@ -150,7 +150,7 @@ int main(const int argc, char** argv) { std::make_unique()); }), di::bind().to([options, log_producer] { - if (options.generator.mode == GeneratorMode::Mock) { + if (options.generator.mode == GeneratorMode::kMock) { { log_producer->Log( {.level = LogLevel::Info, @@ -170,7 +170,7 @@ int main(const int argc, char** argv) { di::bind().to( [options, &log_producer]( const auto& inj) -> std::unique_ptr { - if (options.generator.mode == GeneratorMode::Mock) { + if (options.generator.mode == GeneratorMode::kMock) { log_producer->Log({.level = LogLevel::Info, .phase = PipelinePhase::Startup, .message = "Enrichment: mock"}); @@ -190,7 +190,7 @@ int main(const int argc, char** argv) { [&options, &model_path, &sampling, &prompt_directory, &log_producer]( const auto& inj) -> std::unique_ptr { - if (options.generator.mode == GeneratorMode::Mock) { + if (options.generator.mode == GeneratorMode::kMock) { log_producer->Log({.level = LogLevel::Info, .phase = PipelinePhase::Startup, .message = "Generator: mock"}); @@ -198,7 +198,7 @@ int main(const int argc, char** argv) { return std::make_unique(); } - if (options.generator.mode == GeneratorMode::OpenAI) { + if (options.generator.mode == GeneratorMode::kOpenAI) { log_producer->Log( {.level = LogLevel::Info, .phase = PipelinePhase::Startup,