cache.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package server
  2. import (
  3. "cmp"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "github.com/ollama/ollama/client/registry"
  8. "github.com/ollama/ollama/types/model"
  9. )
  10. // cache is a simple demo disk cache. it does not validate anything
  11. type cache struct {
  12. dir string
  13. }
  14. func defaultCache() registry.Cache {
  15. homeDir, _ := os.UserHomeDir()
  16. if homeDir == "" {
  17. panic("could not determine home directory")
  18. }
  19. modelsDir := cmp.Or(
  20. os.Getenv("OLLAMA_MODELS"),
  21. filepath.Join(homeDir, ".ollama", "models"),
  22. )
  23. return &cache{modelsDir}
  24. }
  25. func invalidDigest(digest string) error {
  26. return fmt.Errorf("invalid digest: %s", digest)
  27. }
  28. func (c *cache) OpenLayer(d model.Digest) (registry.ReadAtSeekCloser, error) {
  29. return os.Open(c.LayerFile(d))
  30. }
  31. func (c *cache) LayerFile(d model.Digest) string {
  32. return filepath.Join(c.dir, "blobs", d.String())
  33. }
  34. func (c *cache) PutLayerFile(d model.Digest, fromPath string) error {
  35. if !d.IsValid() {
  36. return invalidDigest(d.String())
  37. }
  38. bfile := c.LayerFile(d)
  39. dir, _ := filepath.Split(bfile)
  40. if err := os.MkdirAll(dir, 0755); err != nil {
  41. return err
  42. }
  43. return os.Rename(fromPath, bfile)
  44. }
  45. func (c *cache) ManifestData(name model.Name) []byte {
  46. if !name.IsFullyQualified() {
  47. return nil
  48. }
  49. data, err := os.ReadFile(filepath.Join(c.dir, "manifests", name.Filepath()))
  50. if err != nil {
  51. return nil
  52. }
  53. return data
  54. }
  55. func (c *cache) SetManifestData(name model.Name, data []byte) error {
  56. if !name.IsFullyQualified() {
  57. return fmt.Errorf("invalid name: %s", name)
  58. }
  59. filep := filepath.Join(c.dir, "manifests", name.Filepath())
  60. dir, _ := filepath.Split(filep)
  61. if err := os.MkdirAll(dir, 0755); err != nil {
  62. return err
  63. }
  64. return os.WriteFile(filep, data, 0644)
  65. }