Brunobkr/llama.cpp_AlgMor24_github
ΩFFFΣLLIa • llama.cpp • AlgMor24 ██████╗ ███████╗███████╗███████╗██╗ ██╗ ██╗ █████╗ ██╔═══██╗██╔════╝██╔════╝██╔════╝██║ ██║ ██║██╔══██╗ ██║ ██║█████╗ █████╗ █████╗ ██║ ██║ ██║███████║ ██║ ██║██╔══╝ ██╔══╝ ██╔══╝ ██║ ██║ ██║██╔══██║ ╚██████╔╝██║ ██║ ███████╗███████╗███████╗██║██║ ██║ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚═╝╚═╝ ╚═╝ High-Performance LLM / VLM Inference & Autonomous Agentic Ecosystem… See the full description on the dataset page: https://huggingface.co/datasets/Brunobkr/llama.cpp_AlgMor24_github.
03.1k
1# Provision UI assets and generate ui.cpp/ui.h.2#3# Asset provisioning priority:4# 1. Pre-built assets in SRC_DIST_DIR (manually built by user)5# 2. If BUILD_UI=ON: npm build6# 3. If above did not produce assets and HF_ENABLED=ON: HF Bucket download7# of dist.tar.gz (verified against dist.tar.gz.sha256)8 9cmake_minimum_required(VERSION 3.18)10 11set(UI_SOURCE_DIR "" CACHE STRING "UI source directory (to run npm build)")12set(UI_BINARY_DIR "" CACHE STRING "UI binary directory (to store generated files)")13set(LLAMA_SOURCE_DIR "" CACHE STRING "Project source root (to resolve version from git)")14set(HF_BUCKET "" CACHE STRING "Hugging Face bucket name")15set(HF_VERSION "" CACHE STRING "Version to download (empty = resolve from git)")16set(HF_ENABLED "" CACHE STRING "Whether to allow HF Bucket download (ON/OFF)")17set(BUILD_UI "" CACHE STRING "Build UI via npm (ON/OFF)")18set(LLAMA_UI_EMBED "" CACHE STRING "Path to llama-ui-embed helper")19set(LLAMA_UI_GZIP "" CACHE STRING "Apply gzip compress to assets to save bandwidth")20 21set(DIST_DIR "${UI_BINARY_DIR}/dist")22set(SRC_DIST_DIR "${UI_SOURCE_DIR}/dist")23set(WORK_DIR "${UI_BINARY_DIR}/ui-src")24set(STAMP_FILE "${UI_BINARY_DIR}/.ui-stamp")25set(UI_CPP "${UI_BINARY_DIR}/ui.cpp")26set(UI_H "${UI_BINARY_DIR}/ui.h")27 28function(npm_build_should_skip out_var)29 set(${out_var} FALSE PARENT_SCOPE)30 31 if(NOT EXISTS "${DIST_DIR}/index.html")32 return()33 endif()34 35 if(EXISTS "${STAMP_FILE}")36 return()37 endif()38 39 if(NOT EXISTS "${UI_SOURCE_DIR}/sources.cmake")40 return()41 endif()42 include("${UI_SOURCE_DIR}/sources.cmake")43 44 set(globs "")45 foreach(g ${UI_SOURCE_GLOBS})46 list(APPEND globs "${UI_SOURCE_DIR}/${g}")47 endforeach()48 file(GLOB_RECURSE sources ${globs})49 foreach(f ${UI_SOURCE_FILES})50 list(APPEND sources "${UI_SOURCE_DIR}/${f}")51 endforeach()52 53 file(TIMESTAMP "${DIST_DIR}/index.html" out_ts)54 55 foreach(s ${sources})56 if(NOT EXISTS "${s}")57 continue()58 endif()59 file(TIMESTAMP "${s}" s_ts)60 if(s_ts STRGREATER out_ts)61 return()62 endif()63 endforeach()64 65 set(${out_var} TRUE PARENT_SCOPE)66endfunction()67 68function(stage_sources)69 if(EXISTS "${WORK_DIR}")70 file(GLOB staged RELATIVE "${WORK_DIR}" "${WORK_DIR}/*")71 list(REMOVE_ITEM staged "node_modules")72 foreach(entry ${staged})73 file(REMOVE_RECURSE "${WORK_DIR}/${entry}")74 endforeach()75 endif()76 77 file(COPY "${UI_SOURCE_DIR}/"78 DESTINATION "${WORK_DIR}"79 NO_SOURCE_PERMISSIONS80 PATTERN "node_modules" EXCLUDE81 )82endfunction()83 84function(npm_build out_var)85 set(${out_var} FALSE PARENT_SCOPE)86 87 if(NOT EXISTS "${UI_SOURCE_DIR}/package.json")88 message(STATUS "UI: ${UI_SOURCE_DIR}/package.json not found, skipping npm")89 return()90 endif()91 92 npm_build_should_skip(skip)93 if(skip)94 message(STATUS "UI: npm output up-to-date, skipping build")95 set(${out_var} TRUE PARENT_SCOPE)96 return()97 endif()98 99 if(CMAKE_HOST_WIN32)100 find_program(NPM_EXECUTABLE NAMES npm.cmd npm.bat npm)101 else()102 find_program(NPM_EXECUTABLE npm)103 endif()104 if(NOT NPM_EXECUTABLE)105 message(STATUS "UI: npm not found, skipping npm build")106 return()107 endif()108 109 stage_sources()110 111 # npm writes node_modules/.package-lock.json on every successful install,112 # so a package-lock.json newer than this marker means node_modules is stale113 set(NPM_MARKER "${WORK_DIR}/node_modules/.package-lock.json")114 set(need_install FALSE)115 if(NOT EXISTS "${NPM_MARKER}")116 set(need_install TRUE)117 else()118 file(TIMESTAMP "${WORK_DIR}/package-lock.json" lock_ts)119 file(TIMESTAMP "${NPM_MARKER}" marker_ts)120 if(lock_ts STRGREATER marker_ts)121 set(need_install TRUE)122 endif()123 endif()124 125 if(need_install)126 message(STATUS "UI: running npm ci")127 execute_process(128 COMMAND ${NPM_EXECUTABLE} ci129 WORKING_DIRECTORY "${WORK_DIR}"130 RESULT_VARIABLE rc131 ERROR_VARIABLE err132 )133 if(NOT rc EQUAL 0)134 message(STATUS "UI: npm ci failed (${rc})")135 message(STATUS " stderr: ${err}")136 return()137 endif()138 endif()139 140 file(MAKE_DIRECTORY "${DIST_DIR}")141 142 message(STATUS "UI: running npm run build, output -> ${DIST_DIR}")143 execute_process(144 COMMAND ${CMAKE_COMMAND} -E env "LLAMA_UI_OUT_DIR=${DIST_DIR}" "LLAMA_UI_VERSION=${HF_VERSION}" "LLAMA_BUILD_NUMBER=${LLAMA_BUILD_NUMBER}"145 ${NPM_EXECUTABLE} run build146 WORKING_DIRECTORY "${WORK_DIR}"147 RESULT_VARIABLE rc148 ERROR_VARIABLE err149 )150 if(NOT rc EQUAL 0)151 message(STATUS "UI: npm run build failed (${rc})")152 message(STATUS " stderr: ${err}")153 return()154 endif()155 156 if(NOT EXISTS "${DIST_DIR}/index.html")157 message(STATUS "UI: npm build finished but assets missing in ${DIST_DIR}")158 return()159 endif()160 161 message(STATUS "UI: npm build succeeded")162 file(REMOVE "${STAMP_FILE}")163 set(${out_var} TRUE PARENT_SCOPE)164endfunction()165 166function(resolve_version out_var)167 if(NOT "${HF_VERSION}" STREQUAL "")168 set(${out_var} "${HF_VERSION}" PARENT_SCOPE)169 return()170 endif()171 172 if(EXISTS "${LLAMA_SOURCE_DIR}/cmake/build-info.cmake")173 include("${LLAMA_SOURCE_DIR}/cmake/build-info.cmake")174 if(NOT "${BUILD_NUMBER}" STREQUAL "" AND NOT BUILD_NUMBER EQUAL 0)175 set(${out_var} "b${BUILD_NUMBER}" PARENT_SCOPE)176 return()177 endif()178 endif()179 180 set(${out_var} "" PARENT_SCOPE)181endfunction()182 183function(hf_download version out_var out_resolved)184 set(${out_var} FALSE PARENT_SCOPE)185 set(${out_resolved} "" PARENT_SCOPE)186 187 set(archive "${UI_BINARY_DIR}/dist.tar.gz")188 189 # Use HF_TOKEN to benefit from higher rate limits190 set(auth_headers "")191 if(DEFINED ENV{HF_TOKEN} AND NOT "$ENV{HF_TOKEN}" STREQUAL "")192 list(APPEND auth_headers "HTTPHEADER" "Authorization: Bearer $ENV{HF_TOKEN}")193 endif()194 195 set(candidates "")196 if(NOT "${version}" STREQUAL "")197 list(APPEND candidates "${version}")198 endif()199 list(APPEND candidates "latest")200 201 foreach(resolved ${candidates})202 set(base "https://huggingface.co/buckets/${HF_BUCKET}/resolve/${resolved}")203 204 message(STATUS "UI: downloading from ${resolved}: ${base}/dist.tar.gz")205 206 file(DOWNLOAD "${base}/dist.tar.gz?download=true" "${archive}"207 STATUS status TIMEOUT 300 ${auth_headers}208 )209 list(GET status 0 rc)210 if(NOT rc EQUAL 0)211 list(GET status 1 errmsg)212 message(STATUS "UI: download dist.tar.gz from ${resolved} failed: ${errmsg}")213 continue()214 endif()215 216 file(DOWNLOAD "${base}/dist.tar.gz.sha256?download=true" "${archive}.sha256"217 STATUS status TIMEOUT 30 ${auth_headers}218 )219 list(GET status 0 rc)220 if(NOT rc EQUAL 0)221 list(GET status 1 errmsg)222 message(STATUS "UI: download dist.tar.gz.sha256 from ${resolved} failed: ${errmsg}")223 continue()224 endif()225 226 # Validate sha256 checkums227 file(READ "${archive}.sha256" expected)228 string(REGEX MATCH "^[0-9a-fA-F]+" expected "${expected}")229 string(TOLOWER "${expected}" expected)230 file(SHA256 "${archive}" actual)231 if("${expected}" STREQUAL "" OR NOT "${actual}" STREQUAL "${expected}")232 message(STATUS "UI: checksum mismatch for dist.tar.gz from ${resolved}")233 continue()234 endif()235 236 # Clear DIST_DIR to remove stale files first237 file(REMOVE_RECURSE "${DIST_DIR}")238 239 file(ARCHIVE_EXTRACT INPUT "${archive}" DESTINATION "${DIST_DIR}")240 241 if(NOT EXISTS "${DIST_DIR}/index.html")242 message(STATUS "UI: archive from ${resolved} is missing required assets")243 continue()244 endif()245 246 message(STATUS "UI: archive verified and extracted")247 set(${out_var} TRUE PARENT_SCOPE)248 set(${out_resolved} "${resolved}" PARENT_SCOPE)249 return()250 endforeach()251endfunction()252 253function(emit_files dist_dir)254 # If gzip is requested, compress every asset into a parallel _gzip/ tree255 # the structure stays the same; for ex: /abc/def --> /_gzip/abc/def256 # embed.cpp will check for _gzip and will pick it up257 if(LLAMA_UI_GZIP AND EXISTS "${dist_dir}/index.html")258 find_program(GZIP_EXECUTABLE gzip)259 if(NOT GZIP_EXECUTABLE)260 message(WARNING "UI: LLAMA_UI_GZIP requested but gzip not found, embedding uncompressed")261 else()262 set(gzip_dir "${dist_dir}/_gzip")263 file(REMOVE_RECURSE "${gzip_dir}")264 file(GLOB_RECURSE all_files RELATIVE "${dist_dir}" "${dist_dir}/*")265 foreach(f ${all_files})266 get_filename_component(dst_dir "${gzip_dir}/${f}" DIRECTORY)267 file(MAKE_DIRECTORY "${dst_dir}")268 execute_process(269 COMMAND "${GZIP_EXECUTABLE}" -c "${dist_dir}/${f}"270 OUTPUT_FILE "${gzip_dir}/${f}"271 RESULT_VARIABLE gz_rc272 )273 if(NOT gz_rc EQUAL 0)274 message(FATAL_ERROR "UI: gzip failed for ${f}")275 endif()276 endforeach()277 message(STATUS "UI: gzip compression applied (${gzip_dir})")278 endif()279 endif()280 281 set(args "${UI_CPP}" "${UI_H}")282 if(EXISTS "${dist_dir}/index.html")283 list(APPEND args "${dist_dir}")284 endif()285 286 execute_process(287 COMMAND "${LLAMA_UI_EMBED}" ${args}288 RESULT_VARIABLE rc289 )290 if(NOT rc EQUAL 0)291 message(FATAL_ERROR "UI: llama-ui-embed failed (${rc})")292 endif()293endfunction()294 295# ---------------------------------------------------------------------------296# 1. Priority 1: pre-built assets supplied in tools/ui/dist297# ---------------------------------------------------------------------------298if(EXISTS "${SRC_DIST_DIR}/index.html")299 message(STATUS "UI: using pre-built assets from ${SRC_DIST_DIR}")300 emit_files("${SRC_DIST_DIR}")301 return()302endif()303 304# ---------------------------------------------------------------------------305# 2. Priority 2: npm build (if BUILD_UI=ON)306# ---------------------------------------------------------------------------307set(provisioned FALSE)308 309if(BUILD_UI)310 # Resolve version from git build-info if not explicitly set311 resolve_version(HF_VERSION)312 npm_build(NPM_OK)313 if(NPM_OK)314 set(provisioned TRUE)315 endif()316endif()317 318# ---------------------------------------------------------------------------319# 3. Priority 3: HF Bucket download (if npm did not produce assets and HF_ENABLED=ON)320# ---------------------------------------------------------------------------321if(NOT provisioned AND HF_ENABLED)322 resolve_version(VERSION)323 324 set(stamp_ok FALSE)325 if(EXISTS "${STAMP_FILE}" AND NOT "${VERSION}" STREQUAL "")326 file(READ "${STAMP_FILE}" stamped)327 string(STRIP "${stamped}" stamped)328 if("${stamped}" STREQUAL "${VERSION}")329 set(stamp_ok TRUE)330 endif()331 endif()332 333 set(have_assets FALSE)334 if(EXISTS "${DIST_DIR}/index.html")335 set(have_assets TRUE)336 endif()337 if(stamp_ok AND have_assets)338 message(STATUS "UI: HF stamp '${stamped}' matches version, skipping HF fetch")339 set(provisioned TRUE)340 else()341 hf_download("${VERSION}" HF_OK HF_RESOLVED)342 if(HF_OK)343 file(WRITE "${STAMP_FILE}" "${HF_RESOLVED}")344 message(STATUS "UI: HF download succeeded, stamp updated (${HF_RESOLVED})")345 set(provisioned TRUE)346 else()347 message(STATUS "UI: HF download failed")348 endif()349 endif()350endif()351 352# ---------------------------------------------------------------------------353# 4. Fallback: warn about stale or missing assets, then emit whatever we have354# ---------------------------------------------------------------------------355if(NOT provisioned)356 if(EXISTS "${DIST_DIR}/index.html")357 message(WARNING "UI: provisioning failed; embedding stale assets from ${DIST_DIR}")358 else()359 message(WARNING "UI: no assets available - building without an embedded UI. "360 "In a disconnected environment, download the pre-built UI "361 "from a llama.cpp release at "362 "https://github.com/ggml-org/llama.cpp/releases and "363 "extract to tools/ui/dist.")364 endif()365endif()366 367emit_files("${DIST_DIR}")368 