using it in LM Studio

#4
by Zimdin12 - opened

I had some template issues when i tried using it with agents via lm studio.

So i used template from this repo to generate new working template for lm studio.
If somebody needs it then here it is (I have not tested it too much, but I shall edit and comment here if something comes up):

{#- Unsloth template fixes - Modified for agent compatibility #}
{#- Default system message if no system prompt is passed. #}
{%- set default_system_message = '' %}

{#- Begin of sequence token. #}
{{- bos_token }}

{#- Handle system prompt if it exists. #}
{#- System prompt supports text content or text chunks. #}
{%- if messages[0]['role'] == 'system' %}
{{- '[SYSTEM_PROMPT]' -}}
{%- if messages[0]['content'] is string %}
{{- messages[0]['content'] -}}
{%- else %}
{%- for block in messages[0]['content'] %}
{%- if block['type'] == 'text' %}
{{- block['text'] }}
{%- else %}
{{- raise_exception('Only text chunks are supported in system message contents.') }}
{%- endif %}
{%- endfor %}
{%- endif %}
{{- '[/SYSTEM_PROMPT]' -}}
{%- set loop_messages = messages[1:] %}
{%- else %}
{%- set loop_messages = messages %}
{%- if default_system_message != '' %}
{{- '[SYSTEM_PROMPT]' + default_system_message + '[/SYSTEM_PROMPT]' }}
{%- endif %}
{%- endif %}

{#- Tools definition #}
{%- set tools_definition = '' %}
{%- set has_tools = false %}
{%- if tools is defined and tools is not none and tools|length > 0 %}
{%- set has_tools = true %}
{%- set tools_definition = '[AVAILABLE_TOOLS]' + (tools| tojson) + '[/AVAILABLE_TOOLS]' %}
{{- tools_definition }}
{%- endif %}

{#- REMOVED STRICT ALTERNATION CHECK - agents need flexibility #}

{#- Handle conversation messages. #}
{%- set ns = namespace(last_role='') %}
{%- for message in loop_messages %}

{#- User messages supports text content or text and image chunks. #}
{%- if message['role'] == 'user' %}
    {#- Add empty assistant turn if multiple user messages in a row #}
    {%- if ns.last_role == 'user' %}
        {{- eos_token }}
    {%- endif %}
    
    {%- if message['content'] is string %}
        {{- '[INST]' + message['content'] + '[/INST]' }}
    {%- elif message['content'] | length > 0 %}
        {{- '[INST]' }}
        {%- if message['content'] | length == 2 %}
            {%- set blocks = message['content'] | sort(attribute='type') %}
        {%- else %}
            {%- set blocks = message['content'] %}
        {%- endif %}
        {%- for block in blocks %}
            {%- if block['type'] == 'text' %}
                {{- block['text'] }}
            {%- elif block['type'] in ['image', 'image_url'] %}
                {{- '[IMG]' }}
            {%- else %}
                {{- raise_exception('Only text, image and image_url chunks are supported in user message content.') }}
            {%- endif %}
        {%- endfor %}
        {{- '[/INST]' }}
    {%- else %}
        {{- raise_exception('User message must have a string or a list of chunks in content') }}
    {%- endif %}
    {%- set ns.last_role = 'user' %}

{#- Assistant messages supports text content or text and image chunks. #}
{%- elif message['role'] == 'assistant' %}
    {%- if (message['content'] is none or message['content'] == '' or message['content']|length == 0) and (message['tool_calls'] is not defined or message['tool_calls'] is none or message['tool_calls']|length == 0) %}
        {{- raise_exception('Assistant message must have a string or a list of chunks in content or a list of tool calls.') }}
    {%- endif %}

    {%- if message['content'] is string %}
        {{- message['content'] }}
    {%- elif message['content'] is iterable and message['content'] | length > 0 %}
        {%- for block in message['content'] %}
            {%- if block['type'] == 'text' %}
                {{- block['text'] }}
            {%- else %}
                {{- raise_exception('Only text chunks are supported in assistant message contents.') }}
            {%- endif %}
        {%- endfor %}
    {%- endif %}
    
    {%- if message['tool_calls'] is defined and message['tool_calls'] is not none and message['tool_calls']|length > 0 %}
        {%- for tool in message['tool_calls'] %}
            {%- set arguments = tool['function']['arguments'] %}
            {%- if arguments is not string %}
                {%- set arguments = arguments|tojson %}
            {%- elif arguments == '' %}
                {%- set arguments = '{}' %}
            {%- endif %}
            {{- '[TOOL_CALLS]' + tool['function']['name'] + '[ARGS]' + arguments }}
        {%- endfor %}
    {%- endif %}

    {#- End of sequence token for each assistant messages. #}
    {{- eos_token }}
    {%- set ns.last_role = 'assistant' %}

{#- Tool messages only supports text content. #}
{%- elif message['role'] == 'tool' %}
    {{- '[TOOL_RESULTS]' + message['content']|string + '[/TOOL_RESULTS]' }}
    {%- set ns.last_role = 'tool' %}

{#- Raise exception for unsupported roles. #}
{%- else %}
    {{- raise_exception('Only user, assistant and tool roles are supported, got ' + message['role'] + '.') }}
{%- endif %}

{%- endfor %}
{#- Copyright 2025-present Unsloth. Apache 2.0 License. #}

Unsloth AI org

Can you try using our new update and system prompt? We just udpated it 2 hrs ago @Zimdin12

I have a copy of the model I downloaded on the 18th (judging by the file date), and roo code didn't work until I used the above jinja from Zimdin12. (The default model jinja did work with basic queries in LM Studio, but Roo Code makes additional requests that apparently require something additional.)

Sign up or log in to comment