[Bug]: MiniCPM5 chat template may lose text after <tool_sep> due to loop-local assignments
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 62/100
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, andjinjaand 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
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de OpenBMB/MiniCPM
-
Verify evals on Papers with CodeAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
-
Permission request: non-commercial research mirror of tokenized UltraData sets (SHADOW-125M)Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 15/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
-
feature
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Todos los issues de OpenBMB/MiniCPM
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
NousResearch/hermes-plugin-claude-subscription-directsdk#67 ·
Los mantenedores suelen responder en 1 día
-
area:dictation bug P2
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
uttrflow/uttrflow-swift#2539 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día
-
comp/tools P3 type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
NousResearch/hermes-agent#126059 ·
Los mantenedores suelen responder en 1 día
-
factory-active factory-automatic harness/codex task-bug-reproduction-success task-identify-harness-labels-done task-identify-issue-type-done
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
vercel/ai#21582 · 3 comentarios ·
Los mantenedores suelen responder en 1 día