Spaces:
Configuration error
Configuration error
package oci | |
import ( | |
"encoding/json" | |
"fmt" | |
"io" | |
"net/http" | |
ocispec "github.com/opencontainers/image-spec/specs-go/v1" | |
) | |
// Define the main struct for the JSON data | |
type Manifest struct { | |
SchemaVersion int `json:"schemaVersion"` | |
MediaType string `json:"mediaType"` | |
Config Config `json:"config"` | |
Layers []LayerDetail `json:"layers"` | |
} | |
// Define the struct for the "config" section | |
type Config struct { | |
Digest string `json:"digest"` | |
MediaType string `json:"mediaType"` | |
Size int `json:"size"` | |
} | |
// Define the struct for each item in the "layers" array | |
type LayerDetail struct { | |
Digest string `json:"digest"` | |
MediaType string `json:"mediaType"` | |
Size int `json:"size"` | |
} | |
func OllamaModelManifest(image string) (*Manifest, error) { | |
// parse the repository and tag from `image`. `image` should be for e.g. gemma:2b, or foobar/gemma:2b | |
// if there is a : in the image, then split it | |
// if there is no : in the image, then assume it is the latest tag | |
tag, repository, image := ParseImageParts(image) | |
// get e.g. https://registry.ollama.ai/v2/library/llama3/manifests/latest | |
req, err := http.NewRequest("GET", "https://registry.ollama.ai/v2/"+repository+"/"+image+"/manifests/"+tag, nil) | |
if err != nil { | |
return nil, err | |
} | |
req.Header.Set("Accept", "application/vnd.docker.distribution.manifest.v2+json") | |
client := &http.Client{} | |
resp, err := client.Do(req) | |
if err != nil { | |
return nil, err | |
} | |
// parse the JSON response | |
var manifest Manifest | |
err = json.NewDecoder(resp.Body).Decode(&manifest) | |
if err != nil { | |
return nil, err | |
} | |
return &manifest, nil | |
} | |
func OllamaModelBlob(image string) (string, error) { | |
manifest, err := OllamaModelManifest(image) | |
if err != nil { | |
return "", err | |
} | |
// find a application/vnd.ollama.image.model in the mediaType | |
for _, layer := range manifest.Layers { | |
if layer.MediaType == "application/vnd.ollama.image.model" { | |
return layer.Digest, nil | |
} | |
} | |
return "", nil | |
} | |
func OllamaFetchModel(image string, output string, statusWriter func(ocispec.Descriptor) io.Writer) error { | |
_, repository, imageNoTag := ParseImageParts(image) | |
blobID, err := OllamaModelBlob(image) | |
if err != nil { | |
return err | |
} | |
return FetchImageBlob(fmt.Sprintf("registry.ollama.ai/%s/%s", repository, imageNoTag), blobID, output, statusWriter) | |
} | |