| |
| FROM ./model.gguf |
|
|
| TEMPLATE """{{- $lastUserIdx := -1 -}} |
| {{- range $idx, $msg := .Messages -}} |
| {{- if eq $msg.Role "user" }}{{ $lastUserIdx = $idx }}{{ end -}} |
| {{- end }} |
| {{- if or .System .Tools }}<|im_start|>system |
| {{ if .System }} |
| {{ .System }} |
| {{- end }} |
| {{- if .Tools }} |
|
|
| # 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> |
| {{- range .Tools }} |
| {"type": "function", "function": {{ .Function }}} |
| {{- end }} |
| </tools> |
|
|
| For each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags: |
| <tool_call> |
| {"name": <function-name>, "arguments": <args-json-object>} |
| </tool_call> |
| {{- end -}} |
| <|im_end|> |
| {{ end }} |
| {{- range $i, $_ := .Messages }} |
| {{- $last := eq (len (slice $.Messages $i)) 1 -}} |
| {{- if eq .Role "user" }}<|im_start|>user |
| {{ .Content }}<|im_end|> |
| {{ else if eq .Role "assistant" }}<|im_start|>assistant |
| {{ if (and $.IsThinkSet (and .Thinking (or $last (gt $i $lastUserIdx)))) -}} |
| <think>{{ .Thinking }}</think> |
| {{ end -}} |
| {{ if .Content }}{{ .Content }} |
| {{- else if .ToolCalls }}<tool_call> |
| {{ range .ToolCalls }}{"name": "{{ .Function.Name }}", "arguments": {{ .Function.Arguments }}} |
| {{ end }}</tool_call> |
| {{- end }}{{ if not $last }}<|im_end|> |
| {{ end }} |
| {{- else if eq .Role "tool" }}<|im_start|>user |
| <tool_response> |
| {{ .Content }} |
| </tool_response><|im_end|> |
| {{ end }} |
| {{- if and (ne .Role "assistant") $last }}<|im_start|>assistant |
| {{ if and $.IsThinkSet (not $.Think) -}} |
| <think> |
|
|
| </think> |
|
|
| {{ end -}} |
| {{ end }} |
| {{- end }}""" |
| |