Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

[Bug]: MiniCPM5 chat template may lose text after <tool_sep> due to loop-local assignments

Abierto
#379 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
62/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
python
Área
ai

Línea de trabajo

Comienza renderizando el chat_template.jinja referenciado con la reproducción de Jinja2 proporcionada e inspecciona las líneas 84, 86, 112, 116 y 127. Verifica cómo afectan las asignaciones locales al bucle a processed_content y has_tool_sep. Se considera completado cuando tanto BEFORE como AFTER sobreviven alrededor de un bloque XML de herramienta emitido, con el comportamiento previsto confirmado.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Is there an existing issue?
  • I searched existing issues for tool_sep, processed_content, chat_template, and jinja and did not find this problem reported.
Describe the bug

MiniCPM5-2B's chat template appears to use loop-local set assignments to accumulate processed_content for use after the loops. Jinja2 does not propagate these assignments to the enclosing scope.

With assistant content BEFORE<tool_sep>AFTER and one tool call, the rendered prompt loses AFTER. The tool XML is emitted once by the later direct-output branch.

Template: openbmb/MiniCPM5-2B/chat_template.jinja, revision a063f08de1bd09dfc9ae4cf3da35e6064949e533.

To reproduce

Download the unchanged template as chat_template.jinja, then run this script in the same directory. It only requires Jinja2; no model weights or inference are involved.

from pathlib import Path

from jinja2 import Environment


template = Environment(trim_blocks=True, lstrip_blocks=True).from_string(
    Path("chat_template.jinja").read_text(encoding="utf-8")
)

for content in ["BEFORE", "BEFORE<tool_sep>AFTER"]:
    output = template.render(
        bos_token="",
        tools=[],
        messages=[
            {"role": "user", "content": "Question"},
            {
                "role": "assistant",
                "content": content,
                "tool_calls": [
                    {
                        "function": {
                            "name": "lookup",
                            "arguments": {"q": "weather"},
                        }
                    }
                ],
            },
        ],
        add_generation_prompt=False,
    )
    print("Input:", content)
    print("Contains AFTER:", "AFTER" in output)
    print("Tool XML count:", output.count('<function name="'))
    print(repr(output))

Observed output:

Input: BEFORE
Contains AFTER: False
Tool XML count: 1
'<|im_start|>user\nQuestion<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\nBEFORE\n<function name="lookup"><param name="q">weather</param></function><|im_end|>\n'
Input: BEFORE<tool_sep>AFTER
Contains AFTER: False
Tool XML count: 1
'<|im_start|>user\nQuestion<|im_end|>\n<|im_start|>assistant\n<think>\n\n</think>\n\nBEFORE\n<function name="lookup"><param name="q">weather</param></function><|im_end|>\n'
Expected behavior

Assuming <tool_sep> marks an in-place tool-call position, I would expect both surrounding text segments to survive, with the tool XML inserted between BEFORE and AFTER. Could you confirm whether this is the intended behavior?

Environment
  • Python 3.12.2
  • Jinja2 3.1.3
  • Direct rendering of the unchanged template with Environment(trim_blocks=True, lstrip_blocks=True)
Additional context

The assignments at template lines 84, 86, and 112 are inside nested loops. When line 116 reads processed_content, its enclosing value remains content_parts[0]. Jinja documents this assignment-scoping behavior and the use of namespace objects for cross-scope state.

The final tool-output condition at line 127 also reads has_tool_sep, which is not defined anywhere in this template or supplied by this reproducer. The condition is therefore true for the tool-calling messages above. If accumulation is changed to persist across loops, that final output condition should be reviewed together with it so that each tool call is emitted once.

Lenguaje dominante
Jupyter Notebook
Estrellas
11.1k
Forks
766
Merge medio
5 h 3 min
PR fusionados (30 d)
6

Preparar el entorno

Aún no hemos revisado los archivos de configuración de este proyecto. Empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de OpenBMB/MiniCPM

Todos los issues de OpenBMB/MiniCPM

Issues similares

Más issues de AI Infra & Agents

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.