2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								package  parser  
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"bytes" 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"crypto/sha256" 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"encoding/binary" 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"io" 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"os" 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"strings" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"unicode/utf16" 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/google/go-cmp/cmp" 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/stretchr/testify/assert" 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/stretchr/testify/require" 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-14 02:09:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"golang.org/x/text/encoding" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"golang.org/x/text/encoding/unicode" 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/ollama/ollama/api" 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-14 08:31:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/ollama/ollama/fs/ggml" 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileFile ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  model1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ADAPTER  adapter1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  MIT  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2  value2  
						 
					
						
							
								
									
										
										
										
											2024-07-02 00:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								TEMPLATE  "" " { {  if  . System  } } < | start_header_id | > system < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . System  } } < | eot_id | > { {  end  } } { {  if  . Prompt  } } < | start_header_id | > user < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . Prompt  } } < | eot_id | > { {  end  } } < | start_header_id | > assistant < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . Response  } } < | eot_id | > "" "      
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reader  :=  strings . NewReader ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									modelfile ,  err  :=  ParseFile ( reader ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									expectedCommands  :=  [ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "model" ,  Args :  "model1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "adapter" ,  Args :  "adapter1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "license" ,  Args :  "MIT" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param1" ,  Args :  "value1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param2" ,  Args :  "value2" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 00:43:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ Name :  "template" ,  Args :  "{{ if .System }}<|start_header_id|>system<|end_header_id|>\n\n{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>\n\n{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>\n\n{{ .Response }}<|eot_id|>" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									assert . Equal ( t ,  expectedCommands ,  modelfile . Commands ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 02:07:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileTrimSpace ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  "     model 1"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ADAPTER       adapter3  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  "MIT       "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1         value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2     value2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  "" "    { {  if  . System  } } < | start_header_id | > system < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . System  } } < | eot_id | > { {  end  } } { {  if  . Prompt  } } < | start_header_id | > user < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . Prompt  } } < | eot_id | > { {  end  } } < | start_header_id | > assistant < | end_header_id | >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . Response  } } < | eot_id | >    "" "      
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reader  :=  strings . NewReader ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									modelfile ,  err  :=  ParseFile ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									expectedCommands  :=  [ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "model" ,  Args :  "     model 1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "adapter" ,  Args :  "adapter3" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "license" ,  Args :  "MIT       " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param1" ,  Args :  "value1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param2" ,  Args :  "value2" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "template" ,  Args :  "   {{ if .System }}<|start_header_id|>system<|end_header_id|>\n\n{{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|>\n\n{{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|>\n\n{{ .Response }}<|eot_id|>   " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									assert . Equal ( t ,  expectedCommands ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileFrom ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										input     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  [ ] Command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err       error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 01:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM \"FOO  BAR  \"" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "FOO  BAR  " } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM \"FOO BAR\"\nPARAMETER param1 value1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "FOO BAR" } ,  { Name :  "param1" ,  Args :  "value1" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM     FOOO BAR    " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "FOOO BAR" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM /what/is/the path " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "/what/is/the path" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "foo" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM /path/to/model" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "/path/to/model" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM /path/to/model/fp16.bin" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "/path/to/model/fp16.bin" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM llama3:latest" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "llama3:latest" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"FROM llama3:7b-instruct-q4_K_M" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "model" ,  Args :  "llama3:7b-instruct-q4_K_M" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"" ,  nil ,  errMissingFrom , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"PARAMETER param1 value1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											errMissingFrom , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"PARAMETER param1 value1\nFROM foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { { Name :  "param1" ,  Args :  "value1" } ,  { Name :  "model" ,  Args :  "foo" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 01:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"PARAMETER what the \nFROM lemons make lemonade " , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 02:18:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											[ ] Command { { Name :  "what" ,  Args :  "the" } ,  { Name :  "model" ,  Args :  "lemons make lemonade" } } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 01:59:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( strings . NewReader ( c . input ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . ErrorIs ( t ,  err ,  c . err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  modelfile  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												assert . Equal ( t ,  c . expected ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileParametersMissingValue ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reader  :=  strings . NewReader ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_ ,  err  :=  ParseFile ( reader ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . ErrorIs ( t ,  err ,  io . ErrUnexpectedEOF ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-06 06:04:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileBadCommand ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-27 08:11:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								BADCOMMAND  param1  value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									parserError  :=  & ParserError { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LineNumber :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Msg :         errInvalidCommand . Error ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_ ,  err  :=  ParseFile ( strings . NewReader ( input ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! errors . As ( err ,  & parserError )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Errorf ( "unexpected error: expected: %s, actual: %s" ,  parserError . Error ( ) ,  err . Error ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-27 08:11:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												add qwen3-coder tool support
The format qwen3-coder uses is relatively unique, both in rendering and
in parsing. To implement parsing, I wrote a custom parser in similar
style to harmony. For the rendering, I found that the logic would be
much more difficult to follow in a template, so I introduced the concept
of a built-in renderer that uses go code, rather than a template to
generate prompts.
I set us up for future built-in parsers and renderers by making it so
they can be specified in a Modelfile like so:
```
RENDERER "qwen3-coder"
PARSER "qwen3-coder"
```
These need to be provided explicitly because the architecture alone is
not enough to understand what format the model expects to receive, and
what format we expect it to output (e.g., qwen3-coder is `qwen3moe`,
which includes other qwen3-family models as well)
I haven't converted harmony to be one of these "built-ins" yet, since
some of it is in flux with the changes @ParthSareen has been making to
move harmony to the runner. It is likely that many other built-ins will
need to move to the runner as well, but I'm able to slightly defer that
decision since qwen3-coder doesn't have thinking (and therefore doesn't
need to be in the runner to make structured outputs work). I expect to
unify harmony with this approach very soon.
Whether a particular model supports tools or thinking was previously
inferred from templates, but without a template we now also use the
parser itself to declare what it supports. If we have future models that
re-use the same parsing format, but have different capabilities, we'll
want to parameterize them and give them different names to be specified
as a `PARSER`.
Misc changes:
- I worked on the renderer by diffing outputs from the reference
  implementation and ours. To make it easier to do this, I extended
  <https://github.com/ollama/ollama/pull/11875> to also support
  returning the prompt via the openai compat layer
											 
										 
										
											2025-09-12 04:40:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileRenderer ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								RENDERER  renderer1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reader  :=  strings . NewReader ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									modelfile ,  err  :=  ParseFile ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									assert . Equal ( t ,  [ ] Command { { Name :  "model" ,  Args :  "foo" } ,  { Name :  "renderer" ,  Args :  "renderer1" } } ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestParseFileParser ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									input  :=  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARSER  parser1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									reader  :=  strings . NewReader ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									modelfile ,  err  :=  ParseFile ( reader ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									assert . Equal ( t ,  [ ] Command { { Name :  "model" ,  Args :  "foo" } ,  { Name :  "parser" ,  Args :  "parser1" } } ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileMessages ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										input     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  [ ] Command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err       error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  system  You  are  a  file  parser .  Always  parse  things .  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "system: You are a file parser. Always parse things." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  system  You  are  a  file  parser .  Always  parse  things . ` ,  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "system: You are a file parser. Always parse things." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  system  You  are  a  file  parser .  Always  parse  things .  
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  user  Hey  there !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  assistant  Hello ,  I  want  to  parse  all  the  things !  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "system: You are a file parser. Always parse things." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "user: Hey there!" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "assistant: Hello, I want to parse all the things!" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  system  "" "  
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You  are  a  multiline  file  parser .  Always  parse  things .  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "message" ,  Args :  "system: \nYou are a multiline file parser. Always parse things.\n" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2025-03-22 03:38:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  badguy  I ' m  a  bad  guy !  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
									
										
										
										
											2025-03-21 04:11:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
									
										
										
										
											2025-03-22 03:38:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											& ParserError { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												LineNumber :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Msg :         errInvalidMessageRole . Error ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  system  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											io . ErrUnexpectedEOF , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  system ` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											io . ErrUnexpectedEOF , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  tt  :=  range  cases  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( strings . NewReader ( tt . input ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  modelfile  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												assert . Equal ( t ,  tt . expected ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  tt . err  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													t . Fatalf ( "expected no error, but got %v" ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											switch  tt . err . ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											case  * ParserError : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												var  pErr  * ParserError 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												if  errors . As ( err ,  & pErr )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// got the correct type of error
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  errors . Is ( err ,  tt . err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-15 05:59:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Fatalf ( "unexpected error: expected: %v, actual: %v" ,  tt . err ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileQuoted ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										multiline  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected   [ ] Command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										err        error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This  is  a  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								multiline  system .  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "\nThis is a\nmultiline system.\n" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								This  is  a  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								multiline  system . "" "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "\nThis is a\nmultiline system." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" " This  is  a  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								multiline  system . "" "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "This is a\nmultiline system." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "This is a multiline system." ""  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "This is a multiline system." } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "This is a multiline system." "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											io . ErrUnexpectedEOF , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											io . ErrUnexpectedEOF , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								This  is  a  multiline  system  with  "quotes" .  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "\nThis is a multiline system with \"quotes\".\n" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "" ""  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  ""  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "'"  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  "'" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								SYSTEM  "" "''" ' "" ' "" '"' ''' ' "" ' "" ' "" "  
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 10:17:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Name :  "system" ,  Args :  ` ''"'""'""'"'''''""'""' ` } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  "" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ {  . Prompt  } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								"" " ` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "template" ,  Args :  "\n{{ .Prompt }}\n" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( strings . NewReader ( c . multiline ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . ErrorIs ( t ,  err ,  c . err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  modelfile  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												assert . Equal ( t ,  c . expected ,  modelfile . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileParameters ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  map [ string ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										name ,  value  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"numa true" :                     { "numa" ,  "true" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_ctx 1" :                     { "num_ctx" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_batch 1" :                   { "num_batch" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_gqa 1" :                     { "num_gqa" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_gpu 1" :                     { "num_gpu" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"main_gpu 1" :                    { "main_gpu" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"use_mmap true" :                 { "use_mmap" ,  "true" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_thread 1" :                  { "num_thread" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_keep 1" :                    { "num_keep" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"seed 1" :                        { "seed" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"num_predict 1" :                 { "num_predict" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"top_k 1" :                       { "top_k" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"top_p 1.0" :                     { "top_p" ,  "1.0" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 05:37:40 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"min_p 0.05" :                    { "min_p" ,  "0.05" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"typical_p 1.0" :                 { "typical_p" ,  "1.0" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"repeat_last_n 1" :               { "repeat_last_n" ,  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"temperature 1.0" :               { "temperature" ,  "1.0" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"repeat_penalty 1.0" :            { "repeat_penalty" ,  "1.0" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"presence_penalty 1.0" :          { "presence_penalty" ,  "1.0" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"frequency_penalty 1.0" :         { "frequency_penalty" ,  "1.0" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"penalize_newline true" :         { "penalize_newline" ,  "true" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop ### User:" :                { "stop" ,  "### User:" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 02:18:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"stop ### User: " :               { "stop" ,  "### User:" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"stop \"### User:\"" :            { "stop" ,  "### User:" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop \"### User: \"" :           { "stop" ,  "### User: " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop \"\"\"### User:\"\"\"" :    { "stop" ,  "### User:" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop \"\"\"### User:\n\"\"\"" :  { "stop" ,  "### User:\n" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop <|endoftext|>" :            { "stop" ,  "<|endoftext|>" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop <|eot_id|>" :               { "stop" ,  "<|eot_id|>" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"stop </s>" :                     { "stop" ,  "</s>" } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  k ,  v  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( k ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											var  b  bytes . Buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											fmt . Fprintln ( & b ,  "FROM foo" ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fmt . Fprintln ( & b ,  "PARAMETER" ,  k ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( & b ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 07:12:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											assert . Equal ( t ,  [ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  v . name ,  Args :  v . value } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} ,  modelfile . Commands ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileComments ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										input     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  [ ] Command 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  comment  
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											[ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Name :  "model" ,  Args :  "foo" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( strings . NewReader ( c . input ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											assert . Equal ( t ,  c . expected ,  modelfile . Commands ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-23 06:37:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-01-26 04:12:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestParseFileFormatParseFile ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-08-02 05:52:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] string { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ADAPTER  adapter1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  MIT  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2  value2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  template1  
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  system  You  are  a  file  parser .  Always  parse  things .  
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								MESSAGE  user  Hey  there !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  assistant  Hello ,  I  want  to  parse  all  the  things !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ADAPTER  adapter1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  MIT  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2  value2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  template1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  system  "" "  
						 
					
						
							
								
									
										
										
										
											2024-12-11 04:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You  are  a  store  greeter .  Always  respond  with  "Hello!" .  
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  user  Hey  there !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  assistant  Hello ,  I  want  to  parse  all  the  things !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ADAPTER  adapter1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  "" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Very  long  and  boring  legal  text .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Blah  blah  blah .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								"Oh look, a quote!"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  value1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2  value2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  template1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  system  "" "  
						 
					
						
							
								
									
										
										
										
											2024-12-11 04:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								You  are  a  store  greeter .  Always  respond  with  "Hello!" .  
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								"" "  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  user  Hey  there !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  assistant  Hello ,  I  want  to  parse  all  the  things !  
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:59:21 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								FROM  foo  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SYSTEM  ""  
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile ,  err  :=  ParseFile ( strings . NewReader ( c ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											modelfile2 ,  err  :=  ParseFile ( strings . NewReader ( modelfile . String ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-22 13:21:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-01 01:55:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											assert . Equal ( t ,  modelfile ,  modelfile2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-25 09:49:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestParseFileUTF16ParseFile ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									data  :=  ` FROM  bob 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param1  1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  param2  4096  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SYSTEM  You  are  a  utf16  file .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									expected  :=  [ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "model" ,  Args :  "bob" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param1" ,  Args :  "1" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "param2" ,  Args :  "4096" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "system" ,  Args :  "You are a utf16 file." } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-14 02:09:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Run ( "le" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  b  bytes . Buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  binary . Write ( & b ,  binary . LittleEndian ,  [ ] byte { 0xff ,  0xfe } ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  binary . Write ( & b ,  binary . LittleEndian ,  utf16 . Encode ( [ ] rune ( data ) ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-14 02:09:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										actual ,  err  :=  ParseFile ( & b ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-14 02:09:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										assert . Equal ( t ,  expected ,  actual . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Run ( "be" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  b  bytes . Buffer 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  binary . Write ( & b ,  binary . BigEndian ,  [ ] byte { 0xfe ,  0xff } ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  binary . Write ( & b ,  binary . BigEndian ,  utf16 . Encode ( [ ] rune ( data ) ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										actual ,  err  :=  ParseFile ( & b ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										assert . Equal ( t ,  expected ,  actual . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestParseMultiByte ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									input  :=  ` FROM  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									SYSTEM  你好 👋 ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									expect  :=  [ ] Command { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "model" ,  Args :  "test" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ Name :  "system" ,  Args :  "你好👋" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									encodings  :=  [ ] encoding . Encoding { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unicode . UTF8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unicode . UTF16 ( unicode . LittleEndian ,  unicode . UseBOM ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										unicode . UTF16 ( unicode . BigEndian ,  unicode . UseBOM ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  encoding  :=  range  encodings  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( fmt . Sprintf ( "%s" ,  encoding ) ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											s ,  err  :=  encoding . NewEncoder ( ) . String ( input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											actual ,  err  :=  ParseFile ( strings . NewReader ( s ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											assert . Equal ( t ,  expect ,  actual . Commands ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-21 02:26:45 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestCreateRequest ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										input     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  * api . CreateRequest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` FROM test ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { From :  "test" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` FROM  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								TEMPLATE  some  template  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												From :      "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Template :  "some template" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` FROM  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  single  license  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  temperature  0.5  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  user  Hello  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												From :        "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												License :     [ ] string { "single license" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Parameters :  map [ string ] any { "temperature" :  float32 ( 0.5 ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Messages :  [ ] api . Message { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													{ Role :  "user" ,  Content :  "Hello" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` FROM  test 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  temperature  0.5  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PARAMETER  top_k  1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SYSTEM  You  are  a  bot .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  license1  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								LICENSE  license2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  user  Hello  there !  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								MESSAGE  assistant  Hi !  How  are  you ?  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												From :        "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												License :     [ ] string { "license1" ,  "license2" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												System :      "You are a bot." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Parameters :  map [ string ] any { "temperature" :  float32 ( 0.5 ) ,  "top_k" :  int64 ( 1 ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Messages :  [ ] api . Message { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													{ Role :  "user" ,  Content :  "Hello there!" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													{ Role :  "assistant" ,  Content :  "Hi! How are you?" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s ,  err  :=  unicode . UTF8 . NewEncoder ( ) . String ( c . input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p ,  err  :=  ParseFile ( strings . NewReader ( s ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-11 08:14:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										actual ,  err  :=  p . CreateRequest ( "" ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  diff  :=  cmp . Diff ( actual ,  c . expected ) ;  diff  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Errorf ( "mismatch (-got +want):\n%s" ,  diff ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  getSHA256Digest ( t  * testing . T ,  r  io . Reader )  ( string ,  int64 )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Helper ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									h  :=  sha256 . New ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									n ,  err  :=  io . Copy ( h ,  r ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  fmt . Sprintf ( "sha256:%x" ,  h . Sum ( nil ) ) ,  n 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-05-07 02:20:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  createBinFile ( t  * testing . T ,  kv  map [ string ] any ,  ti  [ ] * ggml . Tensor )  ( string ,  string )  {  
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Helper ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f ,  err  :=  os . CreateTemp ( t . TempDir ( ) ,  "testbin.*.gguf" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  f . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-02-14 08:31:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  ggml . WriteGGUF ( f ,  kv ,  ti ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Calculate sha256 of file
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  _ ,  err  :=  f . Seek ( 0 ,  0 ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									digest ,  _  :=  getSHA256Digest ( t ,  f ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  f . Name ( ) ,  digest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestCreateRequestFiles ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2025-01-16 16:14:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									n1 ,  d1  :=  createBinFile ( t ,  nil ,  nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									n2 ,  d2  :=  createBinFile ( t ,  map [ string ] any { "foo" :  "bar" } ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										input     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  * api . CreateRequest 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-16 16:14:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fmt . Sprintf ( "FROM %s" ,  n1 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { Files :  map [ string ] string { n1 :  d1 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											fmt . Sprintf ( "FROM %s\nFROM %s" ,  n1 ,  n2 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											& api . CreateRequest { Files :  map [ string ] string { n1 :  d1 ,  n2 :  d2 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										s ,  err  :=  unicode . UTF8 . NewEncoder ( ) . String ( c . input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Fatal ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										p ,  err  :=  ParseFile ( strings . NewReader ( s ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-01-11 08:14:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										actual ,  err  :=  p . CreateRequest ( "" ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-01 10:02:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  diff  :=  cmp . Diff ( actual ,  c . expected ) ;  diff  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Errorf ( "mismatch (-got +want):\n%s" ,  diff ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}