Merge branch 'upstream' into concedo_experimental

# Conflicts:
#	.github/workflows/docker.yml
#	Makefile
#	examples/CMakeLists.txt
#	ggml/CMakeLists.txt
#	ggml/src/CMakeLists.txt
#	ggml/src/ggml-sycl/common.hpp
#	ggml/src/ggml-sycl/convert.cpp
#	ggml/src/ggml-sycl/convert.hpp
#	ggml/src/ggml-sycl/ggml-sycl.cpp
#	scripts/sync-ggml.last
This commit is contained in:
Concedo 2025-05-08 23:07:33 +08:00
commit b6220669f4
14 changed files with 410 additions and 117 deletions

View file

@ -1284,7 +1284,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
[](common_params & params) {
params.use_color = true;
}
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_SPECULATIVE, LLAMA_EXAMPLE_LOOKUP}));
add_opt(common_arg(
{"-t", "--threads"}, "N",
string_format("number of threads to use during generation (default: %d)", params.cpuparams.n_threads),
@ -1417,7 +1417,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
add_opt(common_arg(
{"-n", "--predict", "--n-predict"}, "N",
string_format(
ex == LLAMA_EXAMPLE_MAIN || ex == LLAMA_EXAMPLE_INFILL
ex == LLAMA_EXAMPLE_MAIN
? "number of tokens to predict (default: %d, -1 = infinity, -2 = until context filled)"
: "number of tokens to predict (default: %d, -1 = infinity)",
params.n_predict),
@ -1656,7 +1656,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
params.input_prefix = value;
params.enable_chat_template = false;
}
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL}));
).set_examples({LLAMA_EXAMPLE_MAIN}));
add_opt(common_arg(
{"--in-suffix"}, "STRING",
"string to suffix after user inputs with (default: empty)",
@ -1664,7 +1664,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
params.input_suffix = value;
params.enable_chat_template = false;
}
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL}));
).set_examples({LLAMA_EXAMPLE_MAIN}));
add_opt(common_arg(
{"--no-warmup"},
"skip warming up the model with an empty run",
@ -1681,7 +1681,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
[](common_params & params) {
params.spm_infill = true;
}
).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_INFILL}));
).set_examples({LLAMA_EXAMPLE_SERVER}));
add_opt(common_arg(
{"--samplers"}, "SAMPLERS",
string_format("samplers that will be used for generation in the order, separated by \';\'\n(default: %s)", sampler_type_names.c_str()),
@ -2893,7 +2893,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
[](common_params & params) {
params.simple_io = true;
}
).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_INFILL}));
).set_examples({LLAMA_EXAMPLE_MAIN}));
add_opt(common_arg(
{"--positive-file"}, "FNAME",
string_format("positive prompts file, one prompt per line (default: '%s')", params.cvector_positive_file.c_str()),

View file

@ -62,7 +62,6 @@ enum llama_example {
LLAMA_EXAMPLE_COMMON,
LLAMA_EXAMPLE_SPECULATIVE,
LLAMA_EXAMPLE_MAIN,
LLAMA_EXAMPLE_INFILL,
LLAMA_EXAMPLE_EMBEDDING,
LLAMA_EXAMPLE_PERPLEXITY,
LLAMA_EXAMPLE_RETRIEVAL,

View file

@ -1,6 +1,7 @@
#include "sampling.h"
#include "common.h"
#include "log.h"
#include <cmath>
#include <unordered_map>
@ -534,14 +535,16 @@ std::vector<common_sampler_type> common_sampler_types_from_names(const std::vect
auto sampler = sampler_canonical_name_map.find(name);
if (sampler != sampler_canonical_name_map.end()) {
samplers.push_back(sampler->second);
} else {
continue;
}
if (allow_alt_names) {
sampler = sampler_alt_name_map.find(name);
if (sampler != sampler_alt_name_map.end()) {
samplers.push_back(sampler->second);
continue;
}
}
}
LOG_WRN("%s: unable to match sampler by name '%s'\n", __func__, name.c_str());
}
return samplers;
@ -568,6 +571,8 @@ std::vector<common_sampler_type> common_sampler_types_from_chars(const std::stri
const auto sampler = sampler_name_map.find(c);
if (sampler != sampler_name_map.end()) {
samplers.push_back(sampler->second);
} else {
LOG_WRN("%s: unable to match sampler by char '%c'\n", __func__, c);
}
}

View file

@ -87,8 +87,6 @@ static_assert(sizeof(block_iq4_nlx4) == 4 * sizeof(ggml_half) + QK4_NL * 2, "wro
#if defined(__GNUC__)
#pragma GCC diagnostic ignored "-Woverlength-strings"
#elif defined(_MSC_VER)
#pragma warning(disable: 4244 4267) // possible loss of data
#endif
#define UNUSED GGML_UNUSED

View file

@ -20,12 +20,6 @@
#define GROUP_MAX_EPS_IQ1_M 1e-7f
#define GROUP_MAX_EPS_IQ1_S 1e-12f
#if defined(_MSC_VER)
// disable "possible loss of data" to avoid warnings for hundreds of casts
// we should just be careful :)
#pragma warning(disable: 4244 4267)
#endif
#define UNUSED GGML_UNUSED
#ifndef MM256_SET_M128I

View file

@ -51,19 +51,6 @@
#include "llamafile/sgemm.h"
#endif
#if defined(_MSC_VER)
// disable "possible loss of data" to avoid hundreds of casts
// we should just be careful :)
#pragma warning(disable: 4244 4267)
// disable POSIX deprecation warnings
// these functions are never going away, anyway
#pragma warning(disable: 4996)
// unreachable code because of multiple instances of code after GGML_ABORT
#pragma warning(disable: 4702)
#endif
// Note: once we move threading into a separate C++ file
// will use std::hardware_destructive_interference_size instead of hardcoding it here
// and we'll use C++ attribute syntax.

View file

@ -8,19 +8,6 @@
#include <float.h>
#if defined(_MSC_VER)
// disable "possible loss of data" to avoid hundreds of casts
// we should just be careful :)
#pragma warning(disable: 4244 4267)
// disable POSIX deprecation warnings
// these functions are never going away, anyway
#pragma warning(disable: 4996)
// unreachable code because of multiple instances of code after GGML_ABORT
#pragma warning(disable: 4702)
#endif
// ggml_compute_forward_dup
static void ggml_compute_forward_dup_same_cont(

View file

@ -2,12 +2,6 @@
#include <cassert>
#if defined(_MSC_VER)
// disable "possible loss of data" to avoid hundreds of casts
// we should just be careful :)
#pragma warning(disable: 4244 4267)
#endif
// precomputed gelu table for f16 (128 KB)
ggml_fp16_t ggml_table_gelu_f16[1 << 16];

View file

@ -130,10 +130,6 @@ static int ggml_cuda_highest_compiled_arch(const int arch) {
#define MATRIX_ROW_PADDING 512 // last row of quant. matrices is a multiple of this to avoid out-of-bounds memory accesses
#if defined(_MSC_VER)
#pragma warning(disable: 4244 4267) // possible loss of data
#endif
#define GGML_CUDA_MAX_STREAMS 8
[[noreturn]]

View file

@ -2523,7 +2523,7 @@ template <ggml_type type, int mmq_x, int nwarps, bool need_check, bool fixup>
static __device__ __forceinline__ void mul_mat_q_process_tile(
const char * __restrict__ x, const int offset_x, const int * __restrict__ y,
const int * __restrict__ ids_dst, float * __restrict__ dst, float * __restrict__ tmp_fixup,
const int nrows_x, const int stride_row_x, const int ncols_y, const int stride_col_dst,
const int stride_row_x, const int ncols_y, const int stride_col_dst,
const int tile_x_max_i, const int tile_y_max_j, const int kb0_start, const int kb0_stop) {
constexpr int qk = ggml_cuda_type_traits<type>::qk;
@ -2690,7 +2690,7 @@ static __global__ void mul_mat_q(
constexpr bool fixup = false;
mul_mat_q_process_tile<type, mmq_x, nwarps, need_check, fixup>
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, nrows_x, stride_row_x, ncols_y, stride_col_dst,
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, stride_row_x, ncols_y, stride_col_dst,
tile_x_max_i, tile_y_max_j, 0, ncols_x/qk);
return;
}
@ -2768,7 +2768,7 @@ static __global__ void mul_mat_q(
constexpr bool fixup = false; // All but (potentially) the last iterations write their data to dst rather than the fixup buffer.
mul_mat_q_process_tile<type, mmq_x, nwarps, need_check, fixup>
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, nrows_x, stride_row_x, ncols_y, stride_col_dst,
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, stride_row_x, ncols_y, stride_col_dst,
tile_x_max_i, tile_y_max_j, kb0_start, kb0_stop);
kbc += blocks_per_ne00;
@ -2835,7 +2835,7 @@ static __global__ void mul_mat_q(
constexpr bool fixup = true; // Last index writes its data to fixup buffer to avoid data races with other blocks.
mul_mat_q_process_tile<type, mmq_x, nwarps, need_check, fixup>
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, nrows_x, stride_row_x, ncols_y, stride_col_dst,
(x, offset_x, y + offset_y, ids_dst_shared, dst + offset_dst, tmp_fixup, stride_row_x, ncols_y, stride_col_dst,
tile_x_max_i, tile_y_max_j, kb0_start, kb0_stop);
}

View file

@ -19,12 +19,6 @@
#define GROUP_MAX_EPS_IQ1_M 1e-7f
#define GROUP_MAX_EPS_IQ1_S 1e-12f
#if defined(_MSC_VER)
// disable "possible loss of data" to avoid warnings for hundreds of casts
// we should just be careful :)
#pragma warning(disable: 4244 4267)
#endif
#define UNUSED GGML_UNUSED
// reference implementation for deterministic creation of model files

View file

@ -12,7 +12,7 @@ Current version indicated by LITEVER below.
-->
<script>
const LITEVER = 238;
const LITEVER = 239;
const urlParams = new URLSearchParams(window.location.search);
var localflag = urlParams.get('local'); //this will be replaced automatically in embedded kcpp
const STORAGE_PREFIX = (localflag?"e_":"")+"kaihordewebui_";
@ -57,9 +57,11 @@ Current version indicated by LITEVER below.
--img_paper:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAAB5QTFRF+OmvAAAA89Ze14Rw2cCY1k8/8eGhmEQ/+uqj87Jse3RL9AAAAAp0Uk5T/wD49//9of8rH/vnQeUAAAEOSURBVHicXdG9asMwFAXggx1COmoJ8VgNptkKcmqyGaKSB0i127RkLiTgNV2CVxMo9G177rVSm2ow0se5Vz/Gbdub6YBz2//w0sV59s0wbs5X806X1j4JFN4Bx45La9eE7OM1PANIBHKCuW7CAYgkkIWgEaWeYN5DjHA0AthIZF8ILAgrpBJJ21N1hyGCXXvGA2EJibxJQaVwgUQKlNIkj5AePNKyrWAJtYS952dH6AlpJaQViW3AXc/shlnZFoRHAhd6hpkjrLGEl7lShFKuphXgA0B23WtF+UmwCjy1VijUw70H4iPeH0KaIMl/DKZjIf/lWo/QCJjVSAMYUoSvCH80gjHdEZibCQjJJuYXZ+xAP6Rjil4AAAAASUVORK5CYII=");
--img_dice:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAAGlQTFRF2gA3AAAArgAs9O7ptwAu2gI45Fp63y5a8+rm8t3czgA0xgAy3RtM7bG74Txk53qSsQAttQAurwAs8dLU6Yyf3tfT5WmFsAAs2gA3wqqrsBM6uhxD2gA32wA22gA30hdGsiRHt1Rq2gA3GZfQSAAAACN0Uk5T/wD//////////////////3QL3f////+22v///3AK+v///7M1XKlYAAABCElEQVR4nKWT63rCIAyG2xCggD1bD1On7v4vcgnForWVZ8++P22SF5JAyPKEsjy/nA/f2VwOALqmZeDy8xZlWSRk3xJwXowTQQA0BBzY2ujNa5gcPgsBnH/XF6aWMSxrU/Q7TkIA470QotAR0AU5+usEeFuoCCjhV+C0g2FHFYGKbcNVjEBW0xbb5xq2tEHNjQRAalU9xclRKU0OfABr+jsgVVkq+QFQ1I5RH4CS2yv/AyRTJIucKZ7kilzqqDFxWXacB7d63acRALsyMMMtAGgXR244fgUAwC0M7XC8wwh09MHrbOzt6cbr/dg3/APobIw6hCB+OO0+GPgQTPJPL2+bDhYVHm9Cv52hDBGSdP+eAAAAAElFTkSuQmCC");
--img_chat:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRFkcPmAAAAkcPmstXukL/ltNbueJGic4aTibLQkcPmvtzwpM7qmazZkcPm5vL5ps/ruNnw0uf1udD/////pH/0JgAAABR0Uk5T/wBl/xH0////Qrz8Bltj6diDAgFfSBG4AAAAzklEQVR4nL3TQQ6EIAwF0BYLSBFl9P53HUFhVKru5i/QpC+2CRWQOOpLIo9YAqQ9tJmqAJbqAFyBFuugK+hk0P0b9Mb05/MCjLUGwOZzexeBuQe9senjdmth2xbykEoFR89gJfQClHsD4eGyMlDAMmCkHYziPvixAhzjvlO+K9FxXShXAOKcB/VMJTPWegaYgP/gLwOVegVTqishO9i2+Bbw/h+Eth7g0LkOdog7AWoBnQDS5RvpuvGcZcjZ4JIWBuXkbvgAkMILWOdx6fEFbukIF0RE9j4AAAAASUVORK5CYII=");
--img_chat_mono:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRFu7u7AAAAu7u70NDQurq60dHRjY2Ng4ODu7u7rKys19fXxsbG7+/vubm5u7u709PTyMjI4+Pj3Nzc////jB2o5QAAABR0Uk5T/wBl/xH0//9C/7z8YwZb2OmDAgHH4NesAAAAzklEQVR4nL3Tyw6EIAwF0BbLw6Lg6P//6wgKo1J1N3eBJj2xTaiAxFFfEnnAEiDtoc1UBbBUB+AKtFgHXUEng+7foDemP58XYKw1ADaf27sIzD3ojU0ft1sL27aQh1QqOHoGK6EXoNwbCA+XlYEClgEj7WAQ98EPFeAQ953yXYmO60K5AhDnPKhnKpmx1jPABPwHfxmp1CuYUl0J2cG2xbeA9/8gtPUAh851sEPcCVAL6ASQLt9I143nLGPOBpe0MCgnd8MHgBRewDqPS48vawEIEy7Qd5cAAAAASUVORK5CYII=");
--img_compass:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRF/7VV/+J5AAAA8/P11Ob1l8jt/39K+chs/9tn/8Bd/+J48eTO/9x0/9Zv99ugiHp0/5MKWVFO/6k53KWUcJJTdwAAABR0Uk5T/v8A//////8Zydn/klf///v/bf9A3eYXAAABMUlEQVR4nG2T2RaDIAwFUwEBWdz+/18LuSypNS8enTGQQGgZ4VKMW4kYHb9fnnxaaOC4fUZsxbmoxHFRx5/f2BJRkY4Dgts+f2F9AU0Q3Aol9Qyd56DUvisVMlw6Dt5D5wVDKArzusdaBfaXlZqCUrlyiksRnORKt6dioRRCSND5CK1Z8Au5vn5Y1yy4zkhBaSRYS9yh85YiURwF3CtHbhwpPHGN/FuAsN7gOjwF1bhpAtYg7tnO5Wdww8Z+nn+CapyFswtiibJN5sbIJaQQGjdyk7PMWr8RRisziU7zj0OwaBRaPTkU0ep5WPo3+mGN437wedxIYS2+n7vkvl4YvnLl3Qb0Z1TICRZcWvg2Q8B1A8dkJXqNtHTh3cCE9tHzT+zB5/Am/4aFUAe4OT66+fULsfQP1birKzkAAAAASUVORK5CYII=");
--img_websearch:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAN1wAADdcBQiibeAAAAEtQTFRFAAAA////////////////////////////////////////////////////////////////////////////////////////////////g5kLBwAAABl0Uk5TAP8Ds+QtpRpgIn35Ud7vnMFxhNZFkswMPA2JIJgAAAFISURBVHicvZPbjsQgCIb5PdVT1dpW+/5PutTZncwp6V4NSasGBD4BoruI6E1LqRkfBb1LX2bcZV76i1r4dCoS1hW3nX/y0uW4aBbUiiWPg3xwMjU+Fxgy2DZedhS+0aa7Xp23MXeaQ+9BUV/5CKg/C7b2nKFxEwpRgZs4iPLs9aa3QKVtJA8Zo8TA2agCdgRIkIIyrJXhl7LYiExCIk30FdFakHbUtXO6k9MPO6H1gDxOdgvPiYoURMTu4alh0gN0wcKMLkNHVA0cFZuG6QxpB6eDqSXYdaYeyrIqL5MQao6p5R0Dc22lthx2jqZMlvwjfpZc9lbayHIPYdsTjjNaslx39hu53jYkPww2JE4siTPamVjgOveAYwL0MBAMeX4D+RftBq+/89D/KfdVw1y33HXTXrb99eB8Gr36OsBPw6vehnd4+Tj+P8K7EihG+ntRAAAAAElFTkSuQmCC');
--img_save:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRFQlFtSVp52uHyws7lztbmjpmuUdjlu8TZeIminqi9WvH/rrjNVMbYxuT0Xm2HAAAAR1h3RVVyR1ZyR1h2eZplWQAAABR0Uk5T////////////////////ANT0HUjqAr+PAAAAgUlEQVR4nI3Q2RaDIAxF0RuCDNUWKP//ryXFWkUczmP2ghVAjkTklOQAvLT28R1CgMwbQCoC6oBIH4ocAOIR4BYoZtZboOHbKHlaQw3rTsFNNVObFjCP2gzmGvhZ47k/qOUdW7An4IdfDbAt+dLYgJbkR+zdq/YnYn+rhBxT2kPKH1FvCKEBnt/sAAAAAElFTkSuQmCC");
--img_save_mono:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRFV1dXYWFh5eXl09PT2tram5ubnp6ejY2Nra2tysrKrKysvb29lpaWW1tbcnJy3d3dAAAAX19fXFxcXl5eL2vTkwAAABR0Uk5T//////////////////T//wDUHUizGkTXAAAAgUlEQVR4nI3QURKDIAxF0RcCAlUqlP3vtaRYq4jW+5kzMAHkRERWSRbAU2uXXjFGyLwBhCKgDoj0ocgJIJ0BboFiZr0HGj6NkqMt1LDtEuxUM7VpBfOoLWD+A881XvqBWt+xB38BbvjWAPuSK40NaEl+xN+96ngi9bcKyCmEI4T8BipnCJv9iKHqAAAAAElFTkSuQmCC");
--img_load:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRF8MQZKbmZ8p0fAAAA8bIc8MIa8MQZq7NIKrmY7cQa0sIs8d2BebRn87wcLL+aJrmZ//8AdbhpAP//c69phZ/jMwAAABR0Uk5T//3/AP+y8v6kbP///xcZUAGrAUn40tQBAAAAp0lEQVR4nHWSiw6DIAwAy1peojLd///rKm3ZZOOiCXLpBRIhB2CCf+JeXUr1RAECATGQ+WN3TFUBKsJmJu0ijOCZo5m7EJzVRrE2c3ZBhoiXCXoYsYm4qejbUSbWo94HXCfZALXF0kVWQVAKP6Xo/hK0RHZcmVnAa+lzketYESBb6dvwPmxDqdX49TiWlIw/JeG6+ViCVsJZCWclnJVwVkLwfwau/+INBncEwpxiohQAAAAASUVORK5CYII=");
--img_delete:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRF////AAAA////////////////////////////////////////////////////////////////////////npt1BAAAABR0Uk5T/wB3M/ryVkUE3GQ8bhvOlb+s6oPyVnGNAAAAt0lEQVR4nHWR2RaDIBBDGXZlVf//X8sMsQtt88BxuJpIUDTVrBLZhg1F0WutL/XUNUYfB/Dqh/Z/wA9AbLVIrIjMlySc6FyNHMC2gg2grqAC9BV0gIOHs4+z2y55B0DjvELJuUDFLYDzUsCfNAApKs/ustQFkFHP0C6PGkAmxz4j536HgdQYplWwUuEEAeF7xmkDgOGbSxyVo+EvEkCZzT0XZT7AmwpAXEEEWOutdANT7WvbVo6gB7iKBNvL+guBAAAAAElFTkSuQmCC");
--img_download:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADxQTFRFAAAA////////////+f783ffv/v//3ffv3ffv5Pnz8fz56vr16/r23ffv9v377/v4////3vfw5Pny3ffvbBfD6AAAABR0Uk5TAP+TRfsGWm8m6uDv0U/LfyiIepVDO0gQAAAAbElEQVR4nNWPuQ6AIBAFF+S+j///V0FjWJTEwsqpyEzxFoBXKGnQvwcuQw9B8kkLIRzrgbn2ROGQFwwFbYe3GgUfR4gejyRqzg1D0+2q2gszdb6ql9x2bH54AFW0Lmrxc1BSPvw2gQKZ+BQW7MaRAtfJQ2l0AAAAAElFTkSuQmCC");
@ -1874,6 +1876,27 @@ Current version indicated by LITEVER below.
flex-direction: column;
margin-top: 16px;
padding: 2px;
height: calc(100% - 20px);
}
.corpoleftpanelitemsinner
{
display: flex;
flex-direction: column;
padding: 2px;
overflow-y: auto;
overflow-x: hidden;
text-overflow: ellipsis;
display: inline-block;
margin: 2px;
margin-top: 4px;
margin-bottom: 4px;
}
.corpoleftpanelitemstopper
{
display: flex;
flex-direction: column;
padding: 2px;
display: inline-block;
}
.corpo_leftpanel_btn
{
@ -1889,9 +1912,9 @@ Current version indicated by LITEVER below.
background-size: 24px;
overflow: hidden;
text-overflow: ellipsis;
display: inline-block;
white-space: nowrap;
user-select: none;
width: 100%;
}
.corpo_leftpanel_btn:hover {
background: #9dcef5;
@ -1899,6 +1922,13 @@ Current version indicated by LITEVER below.
background-position: 8px;
background-size: 24px;
}
.corpo_leftpanel_btn.red:hover {
color: #000000;
background: #f5767f;
background-repeat: no-repeat;
background-position: 8px;
background-size: 24px;
}
.corpo_leftpanel_btn:active {
transform: translateY(1px);
}
@ -1910,6 +1940,14 @@ Current version indicated by LITEVER below.
background-position: 8px;
background-size: 24px;
}
body.darkmode .corpo_leftpanel_btn.red:hover
{
color: #000000;
background: #f5767f;
background-repeat: no-repeat;
background-position: 8px;
background-size: 24px;
}
.corporightpanel
{
width: 100%;
@ -3078,6 +3116,7 @@ Current version indicated by LITEVER below.
var temp_scenario = null;
var last_token_budget = ""; //to display token limits
var last_known_filename = "saved_story.json";
var last_used_saveslot = -1; //used for corpo mode quicksave
var backup_localmodeport = 5001; //sometimes we reattempt a different port, this stores a backup
var localmodeport = 5001;
var localmodehost = "localhost";
@ -4233,9 +4272,8 @@ Current version indicated by LITEVER below.
}
function replace_search_placeholders(text) {
// Remove any instruct tags as needed to ensure a more accurate search
function remove_all_instruct_tags(text)
{
text = replaceAll(text, get_instruct_starttag(false), "");
text = replaceAll(text, get_instruct_endtag(false), "");
text = replaceAll(text, get_instruct_systag(false), "");
@ -4245,6 +4283,12 @@ Current version indicated by LITEVER below.
text = text.replace(/\{\{\[INPUT\]\}\}/g, "").replace(/\{\{\[OUTPUT\]\}\}/g, "");
text = text.replace(/\{\{\[INPUT_END\]\}\}/g, "").replace(/\{\{\[OUTPUT_END\]\}\}/g, "");
text = text.replace(/\{\{\[SYSTEM\]\}\}/g, "").replace(/\{\{\[SYSTEM_END\]\}\}/g, "");
return text;
}
function replace_search_placeholders(text) {
// Remove any instruct tags as needed to ensure a more accurate search
text = remove_all_instruct_tags(text);
// Replace {{user}} and other placeholders
text = replace_placeholders(text);
@ -7363,7 +7407,10 @@ Current version indicated by LITEVER below.
if(usechatmode)
{
localsettings.opmode = 3;
if(localsettings.gui_type_chat!=3)
{
localsettings.gui_type_chat = 2;
}
gametext_arr.push("\n"+chatopponent+": "+greeting);
}
else
@ -7425,7 +7472,10 @@ Current version indicated by LITEVER below.
gametext_arr.push("\n"+chatopponent+": "+greeting);
current_memory = memory + scenario + examplemsg + "\n***";
localsettings.opmode = 3;
if(localsettings.gui_type_chat!=3)
{
localsettings.gui_type_chat = 2;
}
update_for_sidepanel();
render_gametext(true);
sync_multiplayer(true);
@ -7743,7 +7793,10 @@ Current version indicated by LITEVER below.
current_memory = combinedmem;
}
localsettings.opmode = 3;
if(localsettings.gui_type_chat!=3)
{
localsettings.gui_type_chat = 2;
}
localsettings.chatopponent = chatopponent;
update_for_sidepanel();
render_gametext();
@ -7839,9 +7892,12 @@ Current version indicated by LITEVER below.
}
}
if (temp_scenario.opmode == 3) {
if(localsettings.gui_type_chat!=3)
{
if (temp_scenario.gui_type===1) { localsettings.gui_type_chat = 1; }
else if(temp_scenario.gui_type===2) { localsettings.gui_type_chat = 2; }
else if(temp_scenario.gui_type===0) { localsettings.gui_type_chat = 0; }
}
if (temp_scenario.multiline_replies===true) { localsettings.multiline_replies = true; }
else if(temp_scenario.multiline_replies===false) { localsettings.multiline_replies = false; }
@ -10402,6 +10458,27 @@ Current version indicated by LITEVER below.
document.getElementById("saveslotselecteddropdown").innerHTML = choices;
}
}
function find_unused_saveslot(onDoneCallback)
{
let slotpromises = [];
for(let i=0;i<SAVE_SLOTS;++i)
{
slotpromises.push(indexeddb_load("slot_"+i+"_meta",""));
}
Promise.all(slotpromises).then(slotlabels=>
{
let esid = -1;
for(let i=0;i<slotlabels.length;++i)
{
if(slotlabels[i]=="")
{
esid = i;
break;
}
}
onDoneCallback(esid);
});
}
function display_saveloadcontainer()
{
mainmenu_untab(true);
@ -10442,7 +10519,43 @@ Current version indicated by LITEVER below.
});
}
}
function save_to_slot(slot,islocal)
function quicksave()
{
if(last_used_saveslot==-1)
{
if(!safe_to_overwrite())
{
find_unused_saveslot((slot)=>{
if(slot!=-1)
{
save_to_slot(slot,true,false);
}else
{
msgbox("Unable to Save - No Available New Slots.","Storage Slots Full");
}
});
}
else
{
msgbox("Nothing to save - Current session is empty.","Not Saved");
}
}
else
{
save_to_slot(last_used_saveslot,true,false);
}
}
function quickdelete()
{
if(last_used_saveslot!=-1)
{
delete_from_slot(last_used_saveslot,true,false);
}else
{
msgbox("Nothing to delete - Select a slot first.","No Action Taken");
}
}
function save_to_slot(slot,islocal,showcontainer)
{
let defaultsavename = (localsettings.opmode==1?"Untitled Story":(localsettings.opmode==2?"Untitled Adventure":(localsettings.opmode==3?"Untitled Chat":"Untitled Instruct")));
let savename = defaultsavename + " " + new Date().toLocaleString();
@ -10462,8 +10575,19 @@ Current version indicated by LITEVER below.
userinput = defaultsavename;
}
indexeddb_save("slot_" + slot + "_data", newcompressedstory)
indexeddb_save("slot_" + slot + "_meta", userinput).then(()=>{display_saveloadcontainer()});
indexeddb_save("slot_" + slot + "_meta", userinput).then(()=>{
if(showcontainer)
{
display_saveloadcontainer();
}
else
{
saveloadchangeslot(true);
populate_corpo_leftpanel();
}
});
});
last_used_saveslot = slot;
}
if (testslot) {
@ -10482,6 +10606,7 @@ Current version indicated by LITEVER below.
}
const slotwrite = function () {
warn_unsaved = false;
last_used_saveslot = -1;
inputBox("Enter a label for this Server Storage Slot data", "Enter a label", savename, defaultsavename, () => {
let userinput = getInputBoxValue();
if (userinput.trim() == "") {
@ -10529,7 +10654,7 @@ Current version indicated by LITEVER below.
}
}
}
function load_from_slot(slot,islocal)
function load_from_slot(slot,islocal,switch_to_corpo)
{
const proceed_load_from_slot = function() {
if(islocal)
@ -10539,11 +10664,21 @@ Current version indicated by LITEVER below.
{
hide_popups();
import_compressed_story(loadedstorycompressed,false);
last_used_saveslot = slot;
if(switch_to_corpo)
{
localsettings.gui_type_chat = 3;
localsettings.gui_type_story = 3;
localsettings.gui_type_adventure = 3;
localsettings.gui_type_instruct = 3;
render_gametext(false,false);
}
}else{
msgbox("Unable to load story from browser storage","Browser Storage Load Failed");
}
});
} else {
last_used_saveslot = -1;
fetch(custom_kobold_endpoint + koboldcpp_savedata_load_endpoint, {
method: 'POST', // or 'PUT'
headers: get_kobold_header(),
@ -10627,15 +10762,32 @@ Current version indicated by LITEVER below.
});
}
}
function delete_from_slot(slot,islocal)
function delete_from_slot(slot,islocal,showcontainer)
{
let slotnumshown = (parseInt(slot)+1);
if (islocal) {
let postdel = function(){
if(showcontainer)
{
display_saveloadcontainer();
}
else
{
saveloadchangeslot(true);
populate_corpo_leftpanel();
}
};
msgboxYesNo("Delete story in Browser Storage Slot " + slotnumshown + "?", "Delete Browser Storage Slot " + slotnumshown, () => {
indexeddb_save("slot_" + slot + "_data", "");
indexeddb_save("slot_" + slot + "_meta", "").then(() => { display_saveloadcontainer() });
indexeddb_save("slot_" + slot + "_meta", "").then(() => {
postdel();
if(slot==last_used_saveslot)
{
last_used_saveslot = -1;
}
});
}, () => {
display_saveloadcontainer();
postdel();
});
} else {
msgboxYesNo("Delete story in Server Storage Slot " + slotnumshown + "?", "Delete Server Storage Slot " + slotnumshown, () => {
@ -10679,14 +10831,14 @@ Current version indicated by LITEVER below.
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
let islocal = (selectedlocation=="1");
save_to_slot(selectedslot,islocal);
save_to_slot(selectedslot,islocal,true);
}
function load_from_curr_slot()
{
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
let islocal = (selectedlocation=="1");
load_from_slot(selectedslot,islocal);
load_from_slot(selectedslot,islocal,false);
}
function download_from_curr_slot()
{
@ -10700,7 +10852,7 @@ Current version indicated by LITEVER below.
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
let islocal = (selectedlocation=="1");
delete_from_slot(selectedslot,islocal);
delete_from_slot(selectedslot,islocal,true);
}
var cached_model_list = null;
@ -12203,6 +12355,12 @@ Current version indicated by LITEVER below.
if(selval=="0" || selval=="2" || selval=="3") //do not save any other value
{
localsettings.gui_type_instruct = selval;
if(selval=="3")
{
localsettings.gui_type_chat = selval;
localsettings.gui_type_story = selval;
localsettings.gui_type_adventure = selval;
}
render_gametext(true);
}
}
@ -12240,10 +12398,12 @@ Current version indicated by LITEVER below.
if (document.getElementById('opmode').value == 1) {
document.getElementById('gui_type').value = localsettings.gui_type_story;
document.getElementById('uipicker_aesthetic').classList.remove('hidden');
document.getElementById('uipicker_corpo').classList.remove('hidden');
}
if (document.getElementById('opmode').value == 2) {
document.getElementById('gui_type').value = localsettings.gui_type_adventure;
document.getElementById('uipicker_aesthetic').classList.remove('hidden');
document.getElementById('uipicker_corpo').classList.remove('hidden');
}
if (document.getElementById('opmode').value == 3) {
document.getElementById('gui_type').value = localsettings.gui_type_chat;
@ -12716,6 +12876,7 @@ Current version indicated by LITEVER below.
documentdb_data = "";
}
warn_unsaved = false;
last_used_saveslot = -1;
show_corpo_leftpanel(false);
update_toggle_lightmode(false); //load theme but dont save or toggle it
render_gametext(save); //necessary to trigger an autosave to wipe out current story in case they exit browser after newgame.
@ -17936,6 +18097,7 @@ Current version indicated by LITEVER below.
{
document.getElementById("inputrow").classList.remove("show_mode");
}
populate_corpo_leftpanel_topper();
if (gametext_arr.length == 0 && synchro_pending_stream=="" && pending_response_id=="") {
@ -18551,6 +18713,68 @@ Current version indicated by LITEVER below.
return turns;
}
function repack_adventure_history(input)
{
const regex = /\n\n> .+?\n/g;
const result = [];
let lastIndex = 0;
let match;
while ((match = regex.exec(input)) !== null) {
const start = match.index;
const end = regex.lastIndex;
if (start > lastIndex) {
// Opponent's turn (text before this match)
result.push({
msg: input.slice(lastIndex, start).trim(),
myturn: false
});
}
// My turn
let mymsg = match[0].trim();
if(mymsg.startsWith("> "))
{
mymsg = mymsg.substring(2);
}
result.push({
msg: mymsg,
myturn: true
});
lastIndex = end;
}
// Any remaining text after last match is opponent's turn
if (lastIndex < input.length) {
result.push({
msg: input.slice(lastIndex).trim(),
myturn: false
});
}
// Filter out empty messages
return result.filter(t => t.msg.length > 0);
}
function repack_story_history(input)
{
let arr = input.split("\n\n");
let result = [];
for(let i=0;i<arr.length;++i)
{
if(arr[i].trim()=="")
{
continue;
}
result.push({
msg: arr[i],
myturn: false
});
}
return result;
}
function corpo_chunk_prev()
{
let incomplete_resp = (synchro_pending_stream != "" || pending_response_id != "");
@ -18583,6 +18807,14 @@ Current version indicated by LITEVER below.
{
chatunits = repack_chat_history(currctx);
}
else if(localsettings.opmode==2)
{
chatunits = repack_adventure_history(currctx);
}
else if(localsettings.opmode==1)
{
chatunits = repack_story_history(currctx);
}
else
{
chatunits = repack_instruct_history(currctx);
@ -18601,6 +18833,31 @@ Current version indicated by LITEVER below.
gametext_arr.push(chunk);
}
}
else if(localsettings.opmode==2) //adventure mode
{
for(let i=0;i<=idx;++i)
{
let cont = chatunits[i].msg;
if(chatunits[i].myturn)
{
cont = `\n\n> ${cont}\n\n`;
}
gametext_arr.push(cont);
}
}
else if(localsettings.opmode==1) //story mode
{
for(let i=0;i<=idx;++i)
{
let cont = chatunits[i].msg;
if(i!=idx)
{
cont = `${cont}\n\n`;
}
gametext_arr.push(cont);
}
}
else
{
@ -18666,6 +18923,14 @@ Current version indicated by LITEVER below.
{
chatunits = repack_chat_history(currctx);
}
else if(localsettings.opmode==2)
{
chatunits = repack_adventure_history(currctx);
}
else if(localsettings.opmode==1)
{
chatunits = repack_story_history(currctx);
}
else
{
chatunits = repack_instruct_history(currctx);
@ -18700,6 +18965,37 @@ Current version indicated by LITEVER below.
}
}
}
else if(localsettings.opmode==2) //adventure mode
{
for(let i=0;i<chatunits.length;++i)
{
let cont = (i==idx?newtxt:chatunits[i].msg);
if(cont!="")
{
let chunk = cont;
if(chatunits[i].myturn)
{
chunk = `\n\n> ${chunk}\n\n`;
}
gametext_arr.push(chunk);
}
}
}
else if(localsettings.opmode==1) //story mode
{
for(let i=0;i<chatunits.length;++i)
{
let cont = (i==idx?newtxt:chatunits[i].msg);
if(cont!="")
{
if(i<chatunits.length-1)
{
cont = `${cont}\n\n`;
}
gametext_arr.push(cont);
}
}
}
else //instruct and the rest
{
let ste = "";
@ -18767,6 +19063,14 @@ Current version indicated by LITEVER below.
{
chatunits = repack_chat_history(input);
}
else if(localsettings.opmode==2)
{
chatunits = repack_adventure_history(input);
}
else if(localsettings.opmode==1)
{
chatunits = repack_story_history(input);
}
else
{
chatunits = repack_instruct_history(input);
@ -18815,7 +19119,7 @@ Current version indicated by LITEVER below.
{
namepart = curr.name;
}
else if(localsettings.inject_chatnames_instruct && localsettings.instruct_has_markdown)
else if(localsettings.opmode==4 && localsettings.inject_chatnames_instruct && localsettings.instruct_has_markdown)
{
let validprefixes = [];
if(curr.myturn)
@ -18886,13 +19190,19 @@ Current version indicated by LITEVER below.
(curr.myturn ? `` : `<button title="Retry Chunk" onclick="corpo_retry_chunk(${i})" class="corpo_hover_btn" type="button" style="background-image: var(--img_corpo_retry);"></button>`)
+ `</div>`);
newbodystr += `<div class="corpostyleitem">
<div><img ${(curr.myturn ? "" : `onclick="corpo_click_avatar()"`)} src="${(curr.myturn ? human_square : niko_square)}" class="corpoavatar"/></div>
newbodystr += `<div class="corpostyleitem">`;
if(localsettings.opmode==1)
{
newbodystr += `<div style="width:100%">`;
}
else {
newbodystr += `<div><img ${(curr.myturn ? "" : `onclick="corpo_click_avatar()"`)} src="${(curr.myturn ? human_square : niko_square)}" class="corpoavatar"/></div>
<div style="width:100%">
<div class="corpostyleitemheading">`+ namepart + `</div>
`+ bodypart + chunkbtns + `
</div>
</div>`;
<div class="corpostyleitemheading">`+ namepart + `</div>`;
}
newbodystr += bodypart + chunkbtns + `</div></div>`;
}
if(incomplete_resp)
{
@ -18902,14 +19212,23 @@ Current version indicated by LITEVER below.
{
namepart = "";
}
newbodystr += `<div class="corpostyleitem">
<div><img src="`+niko_square+`" class="corpoavatar"/></div>
newbodystr += `<div class="corpostyleitem">`;
if (localsettings.opmode == 1) {
newbodystr += `
<div>
<div class="corpostyleitemcontent"><p><span class="pending_text">`+ futuretext + `</span></p></div>
</div>`;
}
else {
newbodystr += `<div><img src="` + niko_square + `" class="corpoavatar"/></div>
<div>
<div class="corpostyleitemheading">`+ namepart +`</div>
<div class="corpostyleitemcontent"><p><span class="pending_text">`+ futuretext +`</span></p></div>
</div>
</div>`;
}
newbodystr += `</div>`;
}
return newbodystr;
}
@ -18932,6 +19251,24 @@ Current version indicated by LITEVER below.
}
}
function populate_corpo_leftpanel_topper()
{
let panel = document.getElementById('corpoleftpanelitemstopper');
let panelitems = `<div onclick="btn_memory()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_gear); padding-left: 44px;">Context</div>
<div onclick="btn_editmode()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_edit); padding-left: 44px;">Raw Editor</div>
<div onclick="update_toggle_lightmode(true)" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_theme); padding-left: 44px;">Light / Dark Theme</div>`;
if(localsettings.opmode==3||localsettings.opmode==4)
{
panelitems += `<div onclick="show_groupchat_select()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_chat_mono); padding-left: 44px;">Chat Select</div>`;
}
else if(localsettings.opmode==2)
{
let amode = (localsettings.adventure_switch_mode==0?"Story Mode":(localsettings.adventure_switch_mode==1?"Action Mode":"Dice Mode"))
panelitems += `<div onclick="btn_adventure_mode()" class="corpo_leftpanel_btn" type="button" >Adventure: ${amode}</div>`;
}
panel.innerHTML = panelitems;
}
function populate_corpo_leftpanel()
{
let slotpromises = [];
@ -18941,22 +19278,16 @@ Current version indicated by LITEVER below.
}
Promise.all(slotpromises).then(slotlabels=>
{
let panel = document.getElementById('corpoleftpanelitems');
let panelitems = `
<div onclick="btn_memory()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_gear); padding-left: 44px;">Context</div>
<div onclick="btn_editmode()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_edit); padding-left: 44px;">Raw Editor</div>
<div onclick="update_toggle_lightmode(true)" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_theme); padding-left: 44px;">Light / Dark Theme</div>
<div style="padding:2px;font-size:14px;margin-left:8px;font-weight:600;line-height:1.1;margin-top:22px">Quick Slot Load</div>
<hr style="margin-top:4px;margin-bottom:6px" />
`;
let panel = document.getElementById('corpoleftpanelitemsinner');
let panelitems = ``;
populate_corpo_leftpanel_topper();
for(let i=0;i<slotlabels.length;++i)
{
let testslot = slotlabels[i];
let entry = "";
if(testslot)
{
entry = `<div onclick="load_from_slot(`+i+`, true)" class="corpo_leftpanel_btn" type="button">`+testslot+`</div>`;
entry = `<div onclick="load_from_slot(`+i+`, true, true)" class="corpo_leftpanel_btn" type="button">`+testslot+`</div>`;
}
panelitems += entry;
}
@ -21128,9 +21459,13 @@ Current version indicated by LITEVER below.
<div class="corpostyle">
<div id="corpo_leftpannel" class="corpoleftpanel">
<button title="Hide Corpo Side Panel" class="corpo_leftpanel_close mainnav" onclick="show_corpo_leftpanel(false)">&times;</button>
<p id="corpoleftpanelitems" class="corpoleftpanelitems">
</p>
<div id="corpoleftpanelitems" class="corpoleftpanelitems">
<div class="corpoleftpanelitemstopper" id="corpoleftpanelitemstopper"></div>
<div style="padding:2px;font-size:14px;margin-left:8px;font-weight:600;line-height:1.1;margin-top:12px">Quick Slot Load</div>
<hr style="margin-top:4px;margin-bottom:6px" />
<div class="corpoleftpanelitemsinner" id="corpoleftpanelitemsinner"></div>
<div style="margin-top: auto; margin-bottom:2px; width: 230px;"><div onclick="quicksave()" class="corpo_leftpanel_btn" type="button" style="width:110px;padding-left: 44px;display:inline-block;background-image: var(--img_save_mono);">Save</div><div onclick="quickdelete()" class="corpo_leftpanel_btn red" type="button" style="width:110px;padding-left: 44px;display:inline-block;background-image: var(--img_delete);">Delete</div></div>
</div>
</div>
<button title="Show Corpo Side Panel" class="corpo_leftpanel_open mainnav" onclick="show_corpo_leftpanel(true)"><div class="corpo_arrow_right"></div></button>
<div class="corporightpanel">

View file

@ -3220,11 +3220,11 @@ Change Mode<br>
if not title or title=="":
title = "Untitled Save"
storybody = incoming_story.get('data', None) #should be a compressed string
if slotid >= 0 and slotid < net_save_slots: # we shall provide 4 network save slots
if slotid >= 0 and slotid < net_save_slots: # we shall provide some fixed network save slots
saveneeded = False
if storybody and storybody!="":
storybody = str(storybody)
if len(storybody) > (1024*1024*8): #limit story to 8mb
if len(storybody) > (1024*1024*10): #limit each story to 10mb
response_code = 400
response_body = (json.dumps({"success":False, "error":"Story is too long!"}).encode())
else:

View file

@ -3605,7 +3605,11 @@ bool llama_model::load_tensors(llama_model_loader & ml) {
// output
output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0);
output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0);
output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED);
// if output is NULL, init from the input tok embed
if (output == NULL) {
output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED);
}
for (int i = 0; i < n_layer; ++i) {
auto & layer = layers[i];
@ -4891,7 +4895,7 @@ struct llm_build_deci : public llm_graph_context {
}
// FFN-free layer of Llama-3_1-Nemotron-Ultra-253B
if (n_head == 0 && n_ff == 0) {
if (n_ff == 0) {
continue;
}