123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package server
- import (
- "cmp"
- "fmt"
- "os"
- "path/filepath"
- "github.com/ollama/ollama/client/registry"
- "github.com/ollama/ollama/types/model"
- )
- // cache is a simple demo disk cache. it does not validate anything
- type cache struct {
- dir string
- }
- func defaultCache() registry.Cache {
- homeDir, _ := os.UserHomeDir()
- if homeDir == "" {
- panic("could not determine home directory")
- }
- modelsDir := cmp.Or(
- os.Getenv("OLLAMA_MODELS"),
- filepath.Join(homeDir, ".ollama", "models"),
- )
- return &cache{modelsDir}
- }
- func invalidDigest(digest string) error {
- return fmt.Errorf("invalid digest: %s", digest)
- }
- func (c *cache) OpenLayer(d model.Digest) (registry.ReadAtSeekCloser, error) {
- return os.Open(c.LayerFile(d))
- }
- func (c *cache) LayerFile(d model.Digest) string {
- return filepath.Join(c.dir, "blobs", d.String())
- }
- func (c *cache) PutLayerFile(d model.Digest, fromPath string) error {
- if !d.IsValid() {
- return invalidDigest(d.String())
- }
- bfile := c.LayerFile(d)
- dir, _ := filepath.Split(bfile)
- if err := os.MkdirAll(dir, 0755); err != nil {
- return err
- }
- return os.Rename(fromPath, bfile)
- }
- func (c *cache) ManifestData(name model.Name) []byte {
- if !name.IsFullyQualified() {
- return nil
- }
- data, err := os.ReadFile(filepath.Join(c.dir, "manifests", name.Filepath()))
- if err != nil {
- return nil
- }
- return data
- }
- func (c *cache) SetManifestData(name model.Name, data []byte) error {
- if !name.IsFullyQualified() {
- return fmt.Errorf("invalid name: %s", name)
- }
- filep := filepath.Join(c.dir, "manifests", name.Filepath())
- dir, _ := filepath.Split(filep)
- if err := os.MkdirAll(dir, 0755); err != nil {
- return err
- }
- return os.WriteFile(filep, data, 0644)
- }
|