status.go 810 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package llm
  2. import (
  3. "bytes"
  4. "os"
  5. )
  6. // StatusWriter is a writer that captures error messages from the llama runner process
  7. type StatusWriter struct {
  8. LastErrMsg string
  9. out *os.File
  10. }
  11. func NewStatusWriter(out *os.File) *StatusWriter {
  12. return &StatusWriter{
  13. out: out,
  14. }
  15. }
  16. // TODO - regex matching to detect errors like
  17. // libcublasLt.so.11: cannot open shared object file: No such file or directory
  18. var errorPrefixes = []string{
  19. "error:",
  20. "CUDA error",
  21. "cudaMalloc failed",
  22. "\"ERR\"",
  23. }
  24. func (w *StatusWriter) Write(b []byte) (int, error) {
  25. var errMsg string
  26. for _, prefix := range errorPrefixes {
  27. if _, after, ok := bytes.Cut(b, []byte(prefix)); ok {
  28. errMsg = prefix + string(bytes.TrimSpace(after))
  29. }
  30. }
  31. if errMsg != "" {
  32. w.LastErrMsg = errMsg
  33. }
  34. return w.out.Write(b)
  35. }