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

Sign up or log in to comment