diff --git a/gpt4all-backend-test/CMakeLists.txt b/gpt4all-backend-test/CMakeLists.txt index fb3151ed..62f3fc00 100644 --- a/gpt4all-backend-test/CMakeLists.txt +++ b/gpt4all-backend-test/CMakeLists.txt @@ -4,5 +4,5 @@ project(gpt4all-backend-test VERSION 0.1 LANGUAGES CXX) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") include(../common/common.cmake) -add_subdirectory(../gpt4all-backend "${CMAKE_CURRENT_BINARY_DIR}/gpt4all-backend") +add_subdirectory(../gpt4all-backend gpt4all-backend) add_subdirectory(src) diff --git a/gpt4all-backend-test/src/main.cpp b/gpt4all-backend-test/src/main.cpp index 641e47b7..66bdbf4a 100644 --- a/gpt4all-backend-test/src/main.cpp +++ b/gpt4all-backend-test/src/main.cpp @@ -1,3 +1,4 @@ +#include #include import fmt; @@ -10,5 +11,10 @@ using gpt4all::backend::LLMProvider; int main() { LLMProvider provider(OLLAMA_URL); - fmt::print("Server version: {}", provider.getVersion()); + auto version = QCoro::waitFor(provider.getVersion()); + if (version) { + fmt::print("Server version: {}", *version); + } else { + fmt::print("Network error: {}", version.unexpected().errorString); + } } diff --git a/gpt4all-backend/CMakeLists.txt b/gpt4all-backend/CMakeLists.txt index 1a1c4a94..46c2398b 100644 --- a/gpt4all-backend/CMakeLists.txt +++ b/gpt4all-backend/CMakeLists.txt @@ -7,5 +7,5 @@ include(../common/common.cmake) find_package(Qt6 6.8 COMPONENTS Concurrent Core Network REQUIRED) set(FMT_MODULE ON) -add_subdirectory(../deps "${CMAKE_CURRENT_BINARY_DIR}/common_deps") +add_subdirectory(../deps common_deps) add_subdirectory(src) diff --git a/gpt4all-backend/src/CMakeLists.txt b/gpt4all-backend/src/CMakeLists.txt index 6cb36e3b..dcbbb829 100644 --- a/gpt4all-backend/src/CMakeLists.txt +++ b/gpt4all-backend/src/CMakeLists.txt @@ -9,6 +9,7 @@ if (CMAKE_COMPILER_IS_GNUCXX) endif() target_sources(${TARGET} PUBLIC FILE_SET gpt4all_backend TYPE CXX_MODULES FILES + formatters.cppm main.cppm ) gpt4all_add_warning_options(${TARGET}) diff --git a/gpt4all-backend/src/formatters.cppm b/gpt4all-backend/src/formatters.cppm new file mode 100644 index 00000000..3887c2ae --- /dev/null +++ b/gpt4all-backend/src/formatters.cppm @@ -0,0 +1,32 @@ +module; + +#include +#include +#include +#include +#include + +#include + +export module gpt4all.backend.formatters; +import fmt; + + +// fmtlib formatters for QString and QVariant + +#define MAKE_FORMATTER(type, conversion) \ + export template <> \ + struct fmt::formatter : fmt::formatter { \ + template \ + FmtContext::iterator format(const type &value, FmtContext &ctx) const \ + { \ + auto valueUtf8 = (conversion); \ + std::string_view view(valueUtf8.cbegin(), valueUtf8.cend()); \ + return formatter::format(view, ctx); \ + } \ + } + +MAKE_FORMATTER(QUtf8StringView, value ); +MAKE_FORMATTER(QStringView, value.toUtf8() ); +MAKE_FORMATTER(QString, value.toUtf8() ); +MAKE_FORMATTER(QVariant, value.toString().toUtf8()); diff --git a/gpt4all-backend/src/main.cpp b/gpt4all-backend/src/main.cpp index 280b37df..d6505b94 100644 --- a/gpt4all-backend/src/main.cpp +++ b/gpt4all-backend/src/main.cpp @@ -24,7 +24,7 @@ auto LLMProvider::getVersion() const -> QCoro::Task> QNetworkAccessManager nam; std::unique_ptr reply(co_await nam.get(QNetworkRequest(m_baseUrl.resolved(u"/api/version"_s)))); if (auto err = reply->error()) - co_return std::unexpected(err); + co_return std::unexpected(NetErr{ err, reply->errorString() }); // TODO(jared): parse JSON here instead of just returning the data co_return QString::fromUtf8(reply->readAll()); diff --git a/gpt4all-backend/src/main.cppm b/gpt4all-backend/src/main.cppm index 0af9b04c..a12882a8 100644 --- a/gpt4all-backend/src/main.cppm +++ b/gpt4all-backend/src/main.cppm @@ -15,8 +15,13 @@ export module gpt4all.backend.main; export namespace gpt4all::backend { +struct NetErr { + QNetworkReply::NetworkError error; + QString errorString; +}; + template -using DataOrNetErr = std::expected; +using DataOrNetErr = std::expected; class LLMProvider { diff --git a/gpt4all-chat/CMakeLists.txt b/gpt4all-chat/CMakeLists.txt index 9e203743..c29a3a97 100644 --- a/gpt4all-chat/CMakeLists.txt +++ b/gpt4all-chat/CMakeLists.txt @@ -144,8 +144,8 @@ configure_file( "${CMAKE_CURRENT_BINARY_DIR}/config.h" ) -add_subdirectory(../deps "${CMAKE_CURRENT_BINARY_DIR}/common_deps") add_subdirectory(deps) +add_subdirectory(../gpt4all-backend gpt4all-backend) add_subdirectory(../gpt4all-backend-old llmodel) if (GPT4ALL_TEST) @@ -458,7 +458,7 @@ else() target_link_libraries(chat PRIVATE pdfium) endif() target_link_libraries(chat - PRIVATE llmodel nlohmann_json::nlohmann_json SingleApplication fmt::fmt duckx::duckx QXlsx) + PRIVATE gpt4all-backend llmodel nlohmann_json::nlohmann_json SingleApplication fmt::fmt duckx::duckx QXlsx) target_include_directories(chat PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/deps/minja/include) if (APPLE) diff --git a/gpt4all-chat/src/chatapi.cpp b/gpt4all-chat/src/chatapi.cpp index 363aa5a0..c793df1b 100644 --- a/gpt4all-chat/src/chatapi.cpp +++ b/gpt4all-chat/src/chatapi.cpp @@ -29,6 +29,7 @@ #include import fmt; +import gpt4all.backend.formatters; using namespace Qt::Literals::StringLiterals; diff --git a/gpt4all-chat/src/chatmodel.h b/gpt4all-chat/src/chatmodel.h index 4eed504b..de478a73 100644 --- a/gpt4all-chat/src/chatmodel.h +++ b/gpt4all-chat/src/chatmodel.h @@ -4,7 +4,6 @@ #include "database.h" #include "tool.h" #include "toolcallparser.h" -#include "utils.h" // IWYU pragma: keep #include "xlsxtomd.h" #include @@ -41,6 +40,7 @@ #include import fmt; +import gpt4all.backend.formatters; using namespace Qt::Literals::StringLiterals; namespace ranges = std::ranges; diff --git a/gpt4all-chat/src/database.cpp b/gpt4all-chat/src/database.cpp index 199753ff..da79360e 100644 --- a/gpt4all-chat/src/database.cpp +++ b/gpt4all-chat/src/database.cpp @@ -1,7 +1,6 @@ #include "database.h" #include "mysettings.h" -#include "utils.h" // IWYU pragma: keep #include #include @@ -42,6 +41,7 @@ #endif import fmt; +import gpt4all.backend.formatters; using namespace Qt::Literals::StringLiterals; namespace ranges = std::ranges; diff --git a/gpt4all-chat/src/jinja_helpers.cpp b/gpt4all-chat/src/jinja_helpers.cpp index 1a91014a..c3033d78 100644 --- a/gpt4all-chat/src/jinja_helpers.cpp +++ b/gpt4all-chat/src/jinja_helpers.cpp @@ -7,8 +7,6 @@ #include #include -import fmt; - namespace views = std::views; using json = nlohmann::ordered_json; diff --git a/gpt4all-chat/src/server.cpp b/gpt4all-chat/src/server.cpp index 74015e06..ae823c1b 100644 --- a/gpt4all-chat/src/server.cpp +++ b/gpt4all-chat/src/server.cpp @@ -4,7 +4,6 @@ #include "chatmodel.h" #include "modellist.h" #include "mysettings.h" -#include "utils.h" // IWYU pragma: keep #include @@ -49,6 +48,7 @@ #include import fmt; +import gpt4all.backend.formatters; using namespace std::string_literals; using namespace Qt::Literals::StringLiterals; diff --git a/gpt4all-chat/src/utils.h b/gpt4all-chat/src/utils.h index 72d1e253..5c21574f 100644 --- a/gpt4all-chat/src/utils.h +++ b/gpt4all-chat/src/utils.h @@ -1,42 +1,15 @@ #pragma once -#include #include #include // IWYU pragma: keep -#include -#include -#include -#include #include -#include #include // IWYU pragma: keep -import fmt; - // IWYU pragma: no_forward_declare QJsonValue class QJsonObject; -// fmtlib formatters for QString and QVariant - -#define MAKE_FORMATTER(type, conversion) \ - template <> \ - struct fmt::formatter: fmt::formatter { \ - template \ - FmtContext::iterator format(const type &value, FmtContext &ctx) const \ - { \ - auto valueUtf8 = (conversion); \ - std::string_view view(valueUtf8.cbegin(), valueUtf8.cend()); \ - return formatter::format(view, ctx); \ - } \ - } - -MAKE_FORMATTER(QUtf8StringView, value ); -MAKE_FORMATTER(QStringView, value.toUtf8() ); -MAKE_FORMATTER(QString, value.toUtf8() ); -MAKE_FORMATTER(QVariant, value.toString().toUtf8()); - // alternative to QJsonObject's initializer_list constructor that accepts Latin-1 strings QJsonObject makeJsonObject(std::initializer_list> args);