From 5c0d55aa625fd4be4be62b20a97eac8b23973354 Mon Sep 17 00:00:00 2001 From: IIIIIllllIIIIIlllll <2432896620@qq.com> Date: Sun, 23 Aug 2026 22:18:59 +0800 Subject: [PATCH 1/2] feat(server): support --list-devices --- CMakeLists.txt | 14 ++++++++++++++ app/cli/args.cpp | 14 ++++++++++++++ app/cli/args.h | 2 ++ app/cli/main.cpp | 11 +---------- app/server/main.cpp | 10 +++++++++- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2ebd829a..17870058 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1848,6 +1848,20 @@ endif() if (ENGINE_BUILD_TESTS) enable_testing() + add_test( + NAME audiocpp_cli_list_devices + COMMAND audiocpp_cli --list-devices + ) + add_test( + NAME audiocpp_server_list_devices + COMMAND audiocpp_server --list-devices + ) + set_tests_properties( + audiocpp_cli_list_devices + audiocpp_server_list_devices + PROPERTIES PASS_REGULAR_EXPRESSION "available_devices=[0-9]+" + ) + set(ENGINE_UNITTEST_ASSET_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/tests/unittests/assets") function(add_engine_unittest target source) diff --git a/app/cli/args.cpp b/app/cli/args.cpp index dbd4c01d..14d00c84 100644 --- a/app/cli/args.cpp +++ b/app/cli/args.cpp @@ -1,5 +1,6 @@ #include "args.h" +#include #include namespace minitts::cli { @@ -111,4 +112,17 @@ engine::core::BackendType parse_backend(const std::string & value) { throw std::runtime_error("unsupported backend: " + value); } +void print_backend_devices(std::ostream & out) { + const auto devices = engine::core::list_backend_devices(); + out << "available_devices=" << devices.size() << "\n"; + for (const auto & device : devices) { + out << device.backend << ":" << device.index; + if (!device.name.empty()) { + out << " \"" << device.name << "\""; + } + out << " [" << device.type << "]\n"; + } + out << "select with: --backend --device \n"; +} + } // namespace minitts::cli diff --git a/app/cli/args.h b/app/cli/args.h index d11aa1be..6e951006 100644 --- a/app/cli/args.h +++ b/app/cli/args.h @@ -3,6 +3,7 @@ #include "engine/framework/core/backend.h" #include +#include #include #include #include @@ -31,5 +32,6 @@ int parse_int_arg(int argc, char ** argv, const std::string & name, int fallback std::optional parse_optional_float_arg(int argc, char ** argv, const std::string & name); std::optional optional_path_arg(int argc, char ** argv, const std::string & name); engine::core::BackendType parse_backend(const std::string & value); +void print_backend_devices(std::ostream & out); } // namespace minitts::cli diff --git a/app/cli/main.cpp b/app/cli/main.cpp index 37b2a3e5..dcbe09cf 100644 --- a/app/cli/main.cpp +++ b/app/cli/main.cpp @@ -648,16 +648,7 @@ int audiocpp_cli_main(int argc, char ** argv) { return 0; } if (has_arg(argc, argv, "--list-devices")) { - const auto devices = engine::core::list_backend_devices(); - std::cout << "available_devices=" << devices.size() << "\n"; - for (const auto & device : devices) { - std::cout << device.backend << ":" << device.index; - if (!device.name.empty()) { - std::cout << " \"" << device.name << "\""; - } - std::cout << " [" << device.type << "]\n"; - } - std::cout << "select with: --backend --device \n"; + print_backend_devices(std::cout); return 0; } if (has_arg(argc, argv, "--list-loaders")) { diff --git a/app/server/main.cpp b/app/server/main.cpp index 348988d6..85dcd7dd 100644 --- a/app/server/main.cpp +++ b/app/server/main.cpp @@ -2,6 +2,8 @@ #include "http.h" #include "runtime.h" +#include "../cli/args.h" + #include "engine/framework/debug/trace.h" #include @@ -60,7 +62,8 @@ std::filesystem::path executable_directory(const char * argv0) { void print_help() { std::cout << "audiocpp_server [--config ] [--ui] [--host ] [--port ] [--backend ]\n" - << " [--device ] [--threads ] [--busy-timeout-ms ] [--max-loaded-models ]\n" + << " [--device ] [--list-devices] [--threads ] [--busy-timeout-ms ]\n" + << " [--max-loaded-models ]\n" << " [--model-spec-override ] [--voice-dir ]\n" << " [--log] [--log-file ]\n" << " [--cors-origins ]\n" @@ -69,6 +72,7 @@ void print_help() { << " --ui-management allow WebUI model management and downloads; requires\n" << " AUDIOCPP_BUILD_NATIVE_MODEL_MANAGER=ON at build time\n" << " --backend cpu|cuda|hip|rocm|vulkan|metal default cuda (rocm is an alias for hip)\n" + << " --list-devices list available backend devices and exit\n" << " --busy-timeout-ms fail a request with 503 when the model has been\n" << " busy this long; default 300000, 0 disables\n" << " --max-loaded-models keep at most n models resident in memory, unloading\n" @@ -110,6 +114,10 @@ void print_help() { int main(int argc, char ** argv) { try { + if (has_arg(argc, argv, "--list-devices")) { + minitts::cli::print_backend_devices(std::cout); + return 0; + } if (has_arg(argc, argv, "--help") || has_arg(argc, argv, "-h")) { print_help(); return 0; From 614ad602bba57a4625c1e646eb83f4d481d2006f Mon Sep 17 00:00:00 2001 From: IIIIIllllIIIIIlllll <2432896620@qq.com> Date: Sun, 23 Aug 2026 23:50:02 +0800 Subject: [PATCH 2/2] refactor(core): own backend device printing --- app/cli/args.cpp | 14 -------------- app/cli/args.h | 2 -- app/cli/main.cpp | 2 +- app/server/main.cpp | 5 ++--- include/engine/framework/core/backend.h | 2 ++ src/framework/core/backend.cpp | 14 ++++++++++++++ 6 files changed, 19 insertions(+), 20 deletions(-) diff --git a/app/cli/args.cpp b/app/cli/args.cpp index 14d00c84..dbd4c01d 100644 --- a/app/cli/args.cpp +++ b/app/cli/args.cpp @@ -1,6 +1,5 @@ #include "args.h" -#include #include namespace minitts::cli { @@ -112,17 +111,4 @@ engine::core::BackendType parse_backend(const std::string & value) { throw std::runtime_error("unsupported backend: " + value); } -void print_backend_devices(std::ostream & out) { - const auto devices = engine::core::list_backend_devices(); - out << "available_devices=" << devices.size() << "\n"; - for (const auto & device : devices) { - out << device.backend << ":" << device.index; - if (!device.name.empty()) { - out << " \"" << device.name << "\""; - } - out << " [" << device.type << "]\n"; - } - out << "select with: --backend --device \n"; -} - } // namespace minitts::cli diff --git a/app/cli/args.h b/app/cli/args.h index 6e951006..d11aa1be 100644 --- a/app/cli/args.h +++ b/app/cli/args.h @@ -3,7 +3,6 @@ #include "engine/framework/core/backend.h" #include -#include #include #include #include @@ -32,6 +31,5 @@ int parse_int_arg(int argc, char ** argv, const std::string & name, int fallback std::optional parse_optional_float_arg(int argc, char ** argv, const std::string & name); std::optional optional_path_arg(int argc, char ** argv, const std::string & name); engine::core::BackendType parse_backend(const std::string & value); -void print_backend_devices(std::ostream & out); } // namespace minitts::cli diff --git a/app/cli/main.cpp b/app/cli/main.cpp index dcbe09cf..affe12bd 100644 --- a/app/cli/main.cpp +++ b/app/cli/main.cpp @@ -648,7 +648,7 @@ int audiocpp_cli_main(int argc, char ** argv) { return 0; } if (has_arg(argc, argv, "--list-devices")) { - print_backend_devices(std::cout); + engine::core::print_backend_devices(std::cout); return 0; } if (has_arg(argc, argv, "--list-loaders")) { diff --git a/app/server/main.cpp b/app/server/main.cpp index 85dcd7dd..d3e6fdd9 100644 --- a/app/server/main.cpp +++ b/app/server/main.cpp @@ -2,8 +2,7 @@ #include "http.h" #include "runtime.h" -#include "../cli/args.h" - +#include "engine/framework/core/backend.h" #include "engine/framework/debug/trace.h" #include @@ -115,7 +114,7 @@ void print_help() { int main(int argc, char ** argv) { try { if (has_arg(argc, argv, "--list-devices")) { - minitts::cli::print_backend_devices(std::cout); + engine::core::print_backend_devices(std::cout); return 0; } if (has_arg(argc, argv, "--help") || has_arg(argc, argv, "-h")) { diff --git a/include/engine/framework/core/backend.h b/include/engine/framework/core/backend.h index 782667e8..d56637e8 100644 --- a/include/engine/framework/core/backend.h +++ b/include/engine/framework/core/backend.h @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -29,6 +30,7 @@ struct BackendDeviceInfo { // Enumerates every device of every loaded ggml backend registry, in registry order. std::vector list_backend_devices(); +void print_backend_devices(std::ostream & out); struct BackendMemorySnapshot { bool available = false; diff --git a/src/framework/core/backend.cpp b/src/framework/core/backend.cpp index 0297b51c..afb5489e 100644 --- a/src/framework/core/backend.cpp +++ b/src/framework/core/backend.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -209,6 +210,19 @@ std::vector list_backend_devices() { return devices; } +void print_backend_devices(std::ostream & out) { + const auto devices = list_backend_devices(); + out << "available_devices=" << devices.size() << "\n"; + for (const auto & device : devices) { + out << device.backend << ":" << device.index; + if (!device.name.empty()) { + out << " \"" << device.name << "\""; + } + out << " [" << device.type << "]\n"; + } + out << "select with: --backend --device \n"; +} + ggml_backend_t init_backend(const BackendConfig & config) { ensure_backends_loaded(); switch (config.type) {