123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- package server
- import (
- "fmt"
- "os"
- "path/filepath"
- "runtime"
- "strings"
- )
- type ModelPath struct {
- ProtocolScheme string
- Registry string
- Namespace string
- Repository string
- Tag string
- }
- const (
- DefaultRegistry = "registry.ollama.ai"
- DefaultNamespace = "library"
- DefaultTag = "latest"
- DefaultProtocolScheme = "https"
- )
- func ParseModelPath(name string) ModelPath {
- slashParts := strings.Split(name, "/")
- var registry, namespace, repository, tag string
- switch len(slashParts) {
- case 3:
- registry = slashParts[0]
- namespace = slashParts[1]
- repository = strings.Split(slashParts[2], ":")[0]
- case 2:
- registry = DefaultRegistry
- namespace = slashParts[0]
- repository = strings.Split(slashParts[1], ":")[0]
- case 1:
- registry = DefaultRegistry
- namespace = DefaultNamespace
- repository = strings.Split(slashParts[0], ":")[0]
- default:
- fmt.Println("Invalid image format.")
- return ModelPath{}
- }
- colonParts := strings.Split(name, ":")
- if len(colonParts) == 2 {
- tag = colonParts[1]
- } else {
- tag = DefaultTag
- }
- return ModelPath{
- ProtocolScheme: DefaultProtocolScheme,
- Registry: registry,
- Namespace: namespace,
- Repository: repository,
- Tag: tag,
- }
- }
- func (mp ModelPath) GetNamespaceRepository() string {
- return fmt.Sprintf("%s/%s", mp.Namespace, mp.Repository)
- }
- func (mp ModelPath) GetFullTagname() string {
- return fmt.Sprintf("%s/%s/%s:%s", mp.Registry, mp.Namespace, mp.Repository, mp.Tag)
- }
- func (mp ModelPath) GetShortTagname() string {
- if mp.Registry == DefaultRegistry {
- if mp.Namespace == DefaultNamespace {
- return fmt.Sprintf("%s:%s", mp.Repository, mp.Tag)
- }
- return fmt.Sprintf("%s/%s:%s", mp.Namespace, mp.Repository, mp.Tag)
- }
- return fmt.Sprintf("%s/%s/%s:%s", mp.Registry, mp.Namespace, mp.Repository, mp.Tag)
- }
- func (mp ModelPath) GetManifestPath(createDir bool) (string, error) {
- home, err := os.UserHomeDir()
- if err != nil {
- return "", err
- }
- path := filepath.Join(home, ".ollama", "models", "manifests", mp.Registry, mp.Namespace, mp.Repository, mp.Tag)
- if createDir {
- if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
- return "", err
- }
- }
- return path, nil
- }
- func GetManifestPath() (string, error) {
- home, err := os.UserHomeDir()
- if err != nil {
- return "", err
- }
- return filepath.Join(home, ".ollama", "models", "manifests"), nil
- }
- func GetBlobsPath(digest string) (string, error) {
- home, err := os.UserHomeDir()
- if err != nil {
- return "", err
- }
- if runtime.GOOS == "windows" {
- digest = strings.ReplaceAll(digest, ":", "-")
- }
- path := filepath.Join(home, ".ollama", "models", "blobs", digest)
- if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
- return "", err
- }
- return path, nil
- }
|