发布

  • fix(llama-cpp): stop reinterpreting plain-string message content as JSON (#10524) (#10538)

    frostbyte_neo 发布于 2026-06-26 23:42:05 +00:00 | 1103 次提交 在此版本后已推送到 master

    The llama-cpp gRPC backend reconstructs OpenAI messages from proto for the
    tokenizer-template path and blindly json::parse'd each message's content
    string. LocalAI's Go layer always flattens content to a plain string, so a
    user prompt that merely looks like JSON (e.g. mealie's ingredient array
    ["1/4 cup brown sugar", ...]) was reinterpreted as structured content parts and
    rejected by oaicompat_chat_params_parse with "unsupported content[].type".

    Normalize content per role instead: user/system/developer content is opaque
    text and is never JSON-sniffed; assistant/tool content still collapses a literal
    JSON null/object (tool-call bookkeeping) to a string, but a plain string is
    never turned into an array/scalar. The array defense is role-independent, so the
    role gate only governs the benign null/object case.

    While here, extract the duplicated per-message reconstruction and the
    pre-template content sanitization into shared, unit-tested helpers
    (message_content.h) so the streaming (PredictStream) and non-streaming (Predict)
    paths cannot drift. This removes ~490 lines of copy-pasted defensive code, the
    dead tool-role parse branches, and the redundant Predict-only tool_calls branch,
    while preserving the prior #7324 (null content -> "") and #7528 (tool array
    content -> string) fixes.

    Tests:

    • backend/cpp/llama-cpp/message_content_test.cpp: standalone C++ unit tests for
      all three helpers (#10524, #7324, #7528, multimodal), discovered and run by
      make test-backend-cpp and a new generic tests-backend-cpp CI job. Also wired
      as an opt-in CMake/ctest target (-DLLAMA_GRPC_BUILD_TESTS=ON).
    • core/schema/message_test.go: Go regression pinning that ToProto flattens a
      JSON-array-looking text part to the verbatim string.
    • prepare.sh now copies message_content.h into the build tree.

    Assisted-by: Claude:claude-opus-4-8 [Claude Code]

    Signed-off-by: Ettore Di Giacinto mudler@localai.io
    Co-authored-by: Ettore Di Giacinto mudler@localai.io

    下载附件