| 
									
										
										
										
											2024-03-15 01:24:13 +08:00
										 |  |  | package llm | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"bytes" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StatusWriter is a writer that captures error messages from the llama runner process
 | 
					
						
							|  |  |  | type StatusWriter struct { | 
					
						
							|  |  |  | 	LastErrMsg string | 
					
						
							|  |  |  | 	out        *os.File | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func NewStatusWriter(out *os.File) *StatusWriter { | 
					
						
							|  |  |  | 	return &StatusWriter{ | 
					
						
							|  |  |  | 		out: out, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // TODO - regex matching to detect errors like
 | 
					
						
							|  |  |  | // libcublasLt.so.11: cannot open shared object file: No such file or directory
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var errorPrefixes = []string{ | 
					
						
							|  |  |  | 	"error:", | 
					
						
							|  |  |  | 	"CUDA error", | 
					
						
							|  |  |  | 	"cudaMalloc failed", | 
					
						
							|  |  |  | 	"\"ERR\"", | 
					
						
							| 
									
										
										
										
											2024-07-04 08:04:30 +08:00
										 |  |  | 	"error loading model", | 
					
						
							| 
									
										
										
										
											2024-08-06 00:28:07 +08:00
										 |  |  | 	"GGML_ASSERT", | 
					
						
							| 
									
										
										
										
											2024-11-20 08:26:57 +08:00
										 |  |  | 	"Deepseek2 does not support K-shift", | 
					
						
							| 
									
										
										
										
											2024-03-15 01:24:13 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (w *StatusWriter) Write(b []byte) (int, error) { | 
					
						
							|  |  |  | 	var errMsg string | 
					
						
							|  |  |  | 	for _, prefix := range errorPrefixes { | 
					
						
							|  |  |  | 		if _, after, ok := bytes.Cut(b, []byte(prefix)); ok { | 
					
						
							|  |  |  | 			errMsg = prefix + string(bytes.TrimSpace(after)) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if errMsg != "" { | 
					
						
							|  |  |  | 		w.LastErrMsg = errMsg | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return w.out.Write(b) | 
					
						
							|  |  |  | } |