diff --git a/gpt4all-backend/llmodel.cpp b/gpt4all-backend/llmodel.cpp index c60a4d3b..0835f42f 100644 --- a/gpt4all-backend/llmodel.cpp +++ b/gpt4all-backend/llmodel.cpp @@ -8,6 +8,7 @@ #include #include #include +#include std::string LLModel::m_implementations_search_path = "."; @@ -75,26 +76,30 @@ const std::vector &LLModel::implementationList() { static auto* libs = new std::vector([] () { std::vector fres; - auto search_in_directory = [&](const std::filesystem::path& path) { - // Iterate over all libraries - for (const auto& f : std::filesystem::directory_iterator(path)) { - const std::filesystem::path& p = f.path(); - if (p.extension() != LIB_FILE_EXT) continue; - // Add to list if model implementation - try { - Dlhandle dl(p.string()); - if (!Implementation::isImplementation(dl)) { - continue; - } - fres.emplace_back(Implementation(std::move(dl))); - } catch (...) {} + auto search_in_directory = [&](const std::string& paths) { + std::stringstream ss(paths); + std::string path; + // Split the paths string by the delimiter and process each path. + while (std::getline(ss, path, ';')) { + std::filesystem::path fs_path(path); + // Iterate over all libraries + for (const auto& f : std::filesystem::directory_iterator(fs_path)) { + const std::filesystem::path& p = f.path(); + if (p.extension() != LIB_FILE_EXT) continue; + // Add to list if model implementation + try { + Dlhandle dl(p.string()); + if (!Implementation::isImplementation(dl)) { + continue; + } + fres.emplace_back(Implementation(std::move(dl))); + } catch (...) {} + } } }; search_in_directory(m_implementations_search_path); -#if defined(__APPLE__) - search_in_directory("../../../"); -#endif + return fres; }()); // Return static result diff --git a/gpt4all-backend/llmodel_c.h b/gpt4all-backend/llmodel_c.h index dab51b72..c0d9249c 100644 --- a/gpt4all-backend/llmodel_c.h +++ b/gpt4all-backend/llmodel_c.h @@ -180,7 +180,8 @@ int32_t llmodel_threadCount(llmodel_model model); /** * Set llmodel implementation search path. * Default is "." - * @param path The path to the llmodel implementation shared objects. + * @param path The path to the llmodel implementation shared objects. This can be a single path or + * a list of paths separated by ';' delimiter. */ void llmodel_set_implementation_search_path(const char *path); diff --git a/gpt4all-chat/cmake/deploy-qt-mac.cmake.in b/gpt4all-chat/cmake/deploy-qt-mac.cmake.in index e3ded8e5..7db3468b 100644 --- a/gpt4all-chat/cmake/deploy-qt-mac.cmake.in +++ b/gpt4all-chat/cmake/deploy-qt-mac.cmake.in @@ -2,9 +2,15 @@ set(MACDEPLOYQT "@MACDEPLOYQT@") set(COMPONENT_NAME_MAIN "@COMPONENT_NAME_MAIN@") set(CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") execute_process(COMMAND ${MACDEPLOYQT} ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app -qmldir=${CMAKE_CURRENT_SOURCE_DIR} -verbose=2) -file(GLOB MYLAMALIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/libllama.*) +file(GLOB MYGPTJLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/libgptj*) +file(GLOB MYMPTLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/libmpt*) +file(GLOB MYLLAMALIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/libllama*) file(GLOB MYLLMODELLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/libllmodel.*) -file(COPY ${MYLAMALIBS} +file(COPY ${MYGPTJLIBS} + DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app/Contents/Frameworks) +file(COPY ${MYMPTLIBS} + DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app/Contents/Frameworks) +file(COPY ${MYLLAMALIBS} DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app/Contents/Frameworks) file(COPY ${MYLLMODELLIBS} DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin/gpt4all.app/Contents/Frameworks) diff --git a/gpt4all-chat/cmake/deploy-qt-windows.cmake.in b/gpt4all-chat/cmake/deploy-qt-windows.cmake.in index 68380aa1..0c432e4e 100644 --- a/gpt4all-chat/cmake/deploy-qt-windows.cmake.in +++ b/gpt4all-chat/cmake/deploy-qt-windows.cmake.in @@ -2,9 +2,15 @@ set(WINDEPLOYQT "@WINDEPLOYQT@") set(COMPONENT_NAME_MAIN "@COMPONENT_NAME_MAIN@") set(CMAKE_CURRENT_SOURCE_DIR "@CMAKE_CURRENT_SOURCE_DIR@") execute_process(COMMAND ${WINDEPLOYQT} --qmldir ${CMAKE_CURRENT_SOURCE_DIR} ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin) -file(GLOB MYLAMALIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/*llama.*) +file(GLOB MYGPTJLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/*gptj.*) +file(GLOB MYMPTLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/*mpt.*) +file(GLOB MYLLAMALIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/*llama.*) file(GLOB MYLLMODELLIBS ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/lib/*llmodel.*) -file(COPY ${MYLAMALIBS} +file(COPY ${MYGPTJLIBS} + DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin) +file(COPY ${MYMPTLIBS} + DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin) +file(COPY ${MYLLAMALIBS} DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin) file(COPY ${MYLLMODELLIBS} DESTINATION ${CPACK_TEMPORARY_INSTALL_DIRECTORY}/packages/${COMPONENT_NAME_MAIN}/data/bin) diff --git a/gpt4all-chat/llm.cpp b/gpt4all-chat/llm.cpp index 075eecf9..388bdccf 100644 --- a/gpt4all-chat/llm.cpp +++ b/gpt4all-chat/llm.cpp @@ -25,6 +25,13 @@ LLM::LLM() , m_serverEnabled(false) , m_compatHardware(true) { + QString llmodelSearchPaths = QCoreApplication::applicationDirPath(); +#if defined(Q_OS_MAC) + llmodelSearchPaths += ";" + QCoreApplication::applicationDirPath() + "../../../"; + llmodelSearchPaths += ";" + QCoreApplication::applicationDirPath() + "../Frameworks/"; +#endif + LLModel::setImplementationsSearchPath(llmodelSearchPaths.toStdString()); + connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &LLM::aboutToQuit); connect(this, &LLM::serverEnabledChanged,