{#-
============================================================================
Custom Chat Template (Jinja2) — Tool-Calling destekli
----------------------------------------------------------------------------
Roller : system | user | assistant | tool
Özel token'lar: <|im_start|> ... <|im_end|> (ChatML tarzı, tek satırda net)
Tool desteği : - `tools` değişkeni verilirse araç şemaları system bloğuna
JSON olarak gömülür.
- assistant mesajındaki `tool_calls` -> {...}
- tool (fonksiyon) sonucu -> role="tool" bloğu içinde döner.
Değişkenler : messages, tools, add_generation_prompt, bos_token
============================================================================
-#}
{{- bos_token -}}
{#- 1) Araç (tool) tanımlarını system mesajına enjekte et --------------------#}
{%- if tools %}
{%- set tool_json = tools | tojson(indent=2) %}
{%- set system_prefix %}Sen bir tool-calling asistanısın. Yalnızca aşağıda tanımlı araçları kullanabilirsin.
Bir aracı çağırman gerektiğinde, cevabını tam olarak şu formatta ver:
{"name": "arac_adi", "arguments": {"param": "deger"}}
Araç sonucu sana "tool" rolüyle döndürülecek. Yanıtlarını YALNIZCA araçtan dönen
gerçek veriye dayandır; veritabanında/araçta olmayan bilgiyi uydurma.
# Kullanilabilir Araclar
{{ tool_json }}{% endset %}
{%- endif %}
{#- 2) İlk mesaj system ise onu prefix ile birleştir --------------------------#}
{%- set loop_messages = messages %}
{%- if messages[0]['role'] == 'system' %}
{%- set first_system = messages[0]['content'] %}
{%- set loop_messages = messages[1:] %}
{{- '<|im_start|>system\n' }}
{%- if tools %}{{- system_prefix + '\n\n' }}{% endif %}
{{- first_system | trim + '<|im_end|>\n' }}
{%- elif tools %}
{{- '<|im_start|>system\n' + system_prefix + '<|im_end|>\n' }}
{%- endif %}
{#- 3) Diyalog turlarını sırayla işle -----------------------------------------#}
{%- for message in loop_messages %}
{%- set role = message['role'] %}
{#- 3a) USER --------------------------------------------------------------#}
{%- if role == 'user' %}
{{- '<|im_start|>user\n' + message['content'] | trim + '<|im_end|>\n' }}
{#- 3b) ASSISTANT ---------------------------------------------------------#}
{%- elif role == 'assistant' %}
{{- '<|im_start|>assistant\n' }}
{%- set has_text = message['content'] is defined and message['content'] %}
{%- if has_text %}
{{- message['content'] | trim }}
{%- endif %}
{%- if message['tool_calls'] %}
{%- for tc in message['tool_calls'] %}
{%- set fn = tc['function'] if tc['function'] is defined else tc %}
{%- set args = fn['arguments'] %}
{%- if args is string %}{% set args_str = args %}
{%- else %}{% set args_str = args | tojson %}{% endif %}
{%- if not loop.first or has_text %}{{- '\n' }}{% endif %}
{{- '{"name": "' + fn['name'] + '", "arguments": ' + args_str + '}' }}
{%- endfor %}
{%- endif %}
{{- '<|im_end|>\n' }}
{#- 3c) TOOL (fonksiyon sonucu) -------------------------------------------#}
{%- elif role == 'tool' %}
{%- set content = message['content'] %}
{%- if content is not string %}{% set content = content | tojson %}{% endif %}
{{- '<|im_start|>tool\n' + content | trim + '<|im_end|>\n' }}
{#- 3d) Ek system mesajı (nadir) ------------------------------------------#}
{%- elif role == 'system' %}
{{- '<|im_start|>system\n' + message['content'] | trim + '<|im_end|>\n' }}
{%- endif %}
{%- endfor %}
{#- 4) Üretim istemi: modeli asistan turuna hazırla ---------------------------#}
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n' }}
{%- endif %}