Files
homeai/homeai-llm/modelfiles/GLM-4.6V-Flash-MLX-4bit/chat_template.jinja
Aodhan Collins c4f3dbed77 Phase 4: OpenClaw agent setup + expanded model catalog
- Add OpenClaw launchd plist (gateway on port 8080)
- Update Llama-3.3-70B Modelfile: fix FROM path, add tool-calling TEMPLATE,
  set num_ctx 32768 (fits 70B in 64GB with safe headroom)
- Update Codestral-22B and Qwen3-32B Modelfiles
- Add Modelfiles for all models in ~/Models/LLM and ~/Models/MLX:
  EVA-LLaMA-3.33-70B, Midnight-Miqu-70B, QwQ-32B, Qwen3.5-35B,
  Qwen3-Coder-30B, Qwen3-Coder-Next, Qwen3-VL-30B, GLM-4.6V-Flash,
  DeepSeek-R1-8B, gemma-3-27b, and MLX variants
- Add import-local-models.sh helper script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 00:03:06 +00:00

140 lines
4.5 KiB
Django/Jinja

[gMASK]<sop>
{%- if tools -%}
<|system|>
# Tools
You may call one or more functions to assist with the user query.
You are provided with function signatures within <tools></tools> XML tags:
<tools>
{% for tool in tools %}
{{ tool | tojson(ensure_ascii=False) }}
{% endfor %}
</tools>
For each function call, output the function name and arguments within the following XML format:
<tool_call>{function-name}
<arg_key>{arg-key-1}</arg_key>
<arg_value>{arg-value-1}</arg_value>
<arg_key>{arg-key-2}</arg_key>
<arg_value>{arg-value-2}</arg_value>
...
</tool_call>{%- endif -%}
{%- macro visible_text(content) -%}
{%- if content is string -%}
{{- content }}
{%- elif content is iterable and content is not mapping -%}
{%- for item in content -%}
{%- if item is mapping and item.type == 'text' -%}
{{- item.text }}
{%- elif item is mapping and (item.type == 'image' or 'image' in item) -%}
<|begin_of_image|><|image|><|end_of_image|>
{%- elif item is mapping and (item.type == 'video' or 'video' in item) -%}
<|begin_of_video|><|video|><|end_of_video|>
{%- elif item is string -%}
{{- item }}
{%- endif -%}
{%- endfor -%}
{%- else -%}
{{- content }}
{%- endif -%}
{%- endmacro -%}
{%- set ns = namespace(last_user_index=-1) %}
{%- for m in messages %}
{%- if m.role == 'user' %}
{% set ns.last_user_index = loop.index0 -%}
{%- endif %}
{%- endfor %}
{% for m in messages %}
{%- if m.role == 'user' -%}<|user|>
{% if m.content is string %}
{{ m.content }}
{%- else %}
{%- for item in m.content %}
{% if item.type == 'video' or 'video' in item %}
<|begin_of_video|><|video|><|end_of_video|>{% elif item.type == 'image' or 'image' in item %}
<|begin_of_image|><|image|><|end_of_image|>{% elif item.type == 'text' %}
{{ item.text }}
{%- endif %}
{%- endfor %}
{%- endif %}
{{- '/nothink' if (enable_thinking is defined and not enable_thinking and not visible_text(m.content).endswith("/nothink")) else '' -}}
{%- elif m.role == 'assistant' -%}
<|assistant|>
{%- set reasoning_content = '' %}
{%- set content = visible_text(m.content) %}
{%- if m.reasoning_content is string %}
{%- set reasoning_content = m.reasoning_content %}
{%- else %}
{%- if '</think>' in content %}
{%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
{%- set content = content.split('</think>')[-1].lstrip('\n') %}
{%- endif %}
{%- endif %}
{%- if loop.index0 > ns.last_user_index and reasoning_content -%}
{{ '\n<think>' + reasoning_content.strip() + '</think>'}}
{%- else -%}
{{ '\n<think></think>' }}
{%- endif -%}
{%- if content.strip() -%}
{{ '\n' + content.strip() }}
{%- endif -%}
{% if m.tool_calls %}
{% for tc in m.tool_calls %}
{%- if tc.function %}
{%- set tc = tc.function %}
{%- endif %}
{{ '\n<tool_call>' + tc.name }}
{% set _args = tc.arguments %}
{% for k, v in _args.items() %}
<arg_key>{{ k }}</arg_key>
<arg_value>{{ v | tojson(ensure_ascii=False) if v is not string else v }}</arg_value>
{% endfor %}
</tool_call>{% endfor %}
{% endif %}
{%- elif m.role == 'tool' -%}
{%- if m.content is string -%}
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
{{- '<|observation|>' }}
{%- endif %}
{{- '\n<tool_response>\n' }}
{{- m.content }}
{{- '\n</tool_response>' }}
{% elif m.content is iterable and m.content is not mapping %}
{%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
{{- '<|observation|>' }}
{%- endif %}
{{- '\n<tool_response>\n' }}
{%- for tr in m.content -%}
{%- if tr is mapping and tr.type is defined -%}
{%- set t = tr.type | lower -%}
{%- if t == 'text' and tr.text is defined -%}
{{ tr.text }}
{%- elif t in ['image', 'image_url'] -%}
<|begin_of_image|><|image|><|end_of_image|>
{%- elif t in ['video', 'video_url'] -%}
<|begin_of_video|><|video|><|end_of_video|>
{%- else -%}
{{ tr | tojson(ensure_ascii=False) }}
{%- endif -%}
{%- else -%}
{{ tr.output if tr.output is defined else tr }}
{%- endif -%}
{%- endfor -%}
{{- '\n</tool_response>' }}
{%- else -%}
<|observation|>{% for tr in m.content %}
<tool_response>
{{ tr.output if tr.output is defined else tr }}
</tool_response>{% endfor -%}
{% endif -%}
{%- elif m.role == 'system' -%}
<|system|>
{{ visible_text(m.content) }}
{%- endif -%}
{%- endfor -%}
{%- if add_generation_prompt -%}
<|assistant|>
{{'<think></think>\n' if (enable_thinking is defined and not enable_thinking) else ''}}
{%- endif -%}