status.go 889 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. "error loading model",
  24. "GGML_ASSERT",
  25. "Deepseek2 does not support K-shift",
  26. }
  27. func (w *StatusWriter) Write(b []byte) (int, error) {
  28. var errMsg string
  29. for _, prefix := range errorPrefixes {
  30. if _, after, ok := bytes.Cut(b, []byte(prefix)); ok {
  31. errMsg = prefix + string(bytes.TrimSpace(after))
  32. }
  33. }
  34. if errMsg != "" {
  35. w.LastErrMsg = errMsg
  36. }
  37. return w.out.Write(b)
  38. }