* mtmd: fix silent prompt truncation on embedded NUL
mtmd_input_text carried the prompt as a bare const char* with no
length, so a NUL byte in message content cut the prompt at the
tokenizer boundary and dropped every later message plus the assistant
marker, with no log. Add an explicit text_len and thread it through,
matching llama_tokenize and the text only path.
* cleanup
---------
Co-authored-by: Xuan Son Nguyen <redacted>
LOG_DBG("formatted_chat.prompt: %s\n", formatted_chat.c_str());
mtmd_input_text text;
- text.text = formatted_chat.c_str();
+ text.text = formatted_chat.data();
+ text.text_len = formatted_chat.size();
text.add_special = add_bos;
text.parse_special = true;
struct mtmd_tokenizer {
mtmd_context * ctx;
- std::string input_text;
+ std::string input_text; // note: can contain null bytes; do not use c_str()
bool add_special;
bool parse_special;
const llama_vocab * vocab;
size_t n_bitmaps) : ctx(ctx) {
add_special = text->add_special;
parse_special = text->parse_special;
- input_text = text->text;
vocab = ctx->vocab;
+ input_text.assign(text->text, text->text_len);
+
std::vector<const mtmd_bitmap *> bitmaps(bmps, bmps + n_bitmaps);
auto parts_str = split_text(input_text, ctx->media_marker);
size_t i_bm = 0;
struct mtmd_input_text {
const char * text;
+ size_t text_len;
bool add_special;
bool parse_special;
};
std::vector<server_tokens> inputs;
// multimodal
mtmd_input_text inp_txt = {
- prompt.c_str(),
+ prompt.data(),
+ prompt.size(),
/* add_special */ true,
/* parse_special */ true,
};