images.go 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  1. package server
  2. import (
  3. "bytes"
  4. "context"
  5. "crypto/sha256"
  6. "encoding/hex"
  7. "encoding/json"
  8. "errors"
  9. "fmt"
  10. "io"
  11. "log"
  12. "net/http"
  13. "net/url"
  14. "os"
  15. "path/filepath"
  16. "reflect"
  17. "runtime"
  18. "strconv"
  19. "strings"
  20. "text/template"
  21. "golang.org/x/exp/slices"
  22. "github.com/jmorganca/ollama/api"
  23. "github.com/jmorganca/ollama/llm"
  24. "github.com/jmorganca/ollama/parser"
  25. "github.com/jmorganca/ollama/version"
  26. )
  27. type RegistryOptions struct {
  28. Insecure bool
  29. Username string
  30. Password string
  31. Token string
  32. }
  33. type Model struct {
  34. Name string `json:"name"`
  35. ShortName string
  36. ModelPath string
  37. OriginalModel string
  38. AdapterPaths []string
  39. Template string
  40. System string
  41. License []string
  42. Digest string
  43. Options map[string]interface{}
  44. }
  45. func (m *Model) Prompt(request api.GenerateRequest) (string, error) {
  46. t := m.Template
  47. if request.Template != "" {
  48. t = request.Template
  49. }
  50. tmpl, err := template.New("").Parse(t)
  51. if err != nil {
  52. return "", err
  53. }
  54. var vars struct {
  55. First bool
  56. System string
  57. Prompt string
  58. }
  59. vars.First = len(request.Context) == 0
  60. vars.System = m.System
  61. vars.Prompt = request.Prompt
  62. if request.System != "" {
  63. vars.System = request.System
  64. }
  65. var sb strings.Builder
  66. if err := tmpl.Execute(&sb, vars); err != nil {
  67. return "", err
  68. }
  69. return sb.String(), nil
  70. }
  71. type ManifestV2 struct {
  72. SchemaVersion int `json:"schemaVersion"`
  73. MediaType string `json:"mediaType"`
  74. Config Layer `json:"config"`
  75. Layers []*Layer `json:"layers"`
  76. }
  77. type Layer struct {
  78. MediaType string `json:"mediaType"`
  79. Digest string `json:"digest"`
  80. Size int64 `json:"size"`
  81. From string `json:"from,omitempty"`
  82. }
  83. type LayerReader struct {
  84. Layer
  85. io.Reader
  86. }
  87. type ConfigV2 struct {
  88. ModelFormat string `json:"model_format"`
  89. ModelFamily string `json:"model_family"`
  90. ModelType string `json:"model_type"`
  91. FileType string `json:"file_type"`
  92. RootFS RootFS `json:"rootfs"`
  93. // required by spec
  94. Architecture string `json:"architecture"`
  95. OS string `json:"os"`
  96. }
  97. type RootFS struct {
  98. Type string `json:"type"`
  99. DiffIDs []string `json:"diff_ids"`
  100. }
  101. func (m *ManifestV2) GetTotalSize() (total int64) {
  102. for _, layer := range m.Layers {
  103. total += layer.Size
  104. }
  105. total += m.Config.Size
  106. return total
  107. }
  108. func GetManifest(mp ModelPath) (*ManifestV2, string, error) {
  109. fp, err := mp.GetManifestPath()
  110. if err != nil {
  111. return nil, "", err
  112. }
  113. if _, err = os.Stat(fp); err != nil {
  114. return nil, "", err
  115. }
  116. var manifest *ManifestV2
  117. bts, err := os.ReadFile(fp)
  118. if err != nil {
  119. return nil, "", fmt.Errorf("couldn't open file '%s'", fp)
  120. }
  121. shaSum := sha256.Sum256(bts)
  122. shaStr := hex.EncodeToString(shaSum[:])
  123. if err := json.Unmarshal(bts, &manifest); err != nil {
  124. return nil, "", err
  125. }
  126. return manifest, shaStr, nil
  127. }
  128. func GetModel(name string) (*Model, error) {
  129. mp := ParseModelPath(name)
  130. manifest, digest, err := GetManifest(mp)
  131. if err != nil {
  132. return nil, err
  133. }
  134. model := &Model{
  135. Name: mp.GetFullTagname(),
  136. ShortName: mp.GetShortTagname(),
  137. Digest: digest,
  138. Template: "{{ .Prompt }}",
  139. License: []string{},
  140. }
  141. for _, layer := range manifest.Layers {
  142. filename, err := GetBlobsPath(layer.Digest)
  143. if err != nil {
  144. return nil, err
  145. }
  146. switch layer.MediaType {
  147. case "application/vnd.ollama.image.model":
  148. model.ModelPath = filename
  149. model.OriginalModel = layer.From
  150. case "application/vnd.ollama.image.embed":
  151. // Deprecated in versions > 0.1.2
  152. // TODO: remove this warning in a future version
  153. log.Print("WARNING: model contains embeddings, but embeddings in modelfiles have been deprecated and will be ignored.")
  154. case "application/vnd.ollama.image.adapter":
  155. model.AdapterPaths = append(model.AdapterPaths, filename)
  156. case "application/vnd.ollama.image.template":
  157. bts, err := os.ReadFile(filename)
  158. if err != nil {
  159. return nil, err
  160. }
  161. model.Template = string(bts)
  162. case "application/vnd.ollama.image.system":
  163. bts, err := os.ReadFile(filename)
  164. if err != nil {
  165. return nil, err
  166. }
  167. model.System = string(bts)
  168. case "application/vnd.ollama.image.prompt":
  169. bts, err := os.ReadFile(filename)
  170. if err != nil {
  171. return nil, err
  172. }
  173. model.Template = string(bts)
  174. case "application/vnd.ollama.image.params":
  175. params, err := os.Open(filename)
  176. if err != nil {
  177. return nil, err
  178. }
  179. defer params.Close()
  180. // parse model options parameters into a map so that we can see which fields have been specified explicitly
  181. if err = json.NewDecoder(params).Decode(&model.Options); err != nil {
  182. return nil, err
  183. }
  184. case "application/vnd.ollama.image.license":
  185. bts, err := os.ReadFile(filename)
  186. if err != nil {
  187. return nil, err
  188. }
  189. model.License = append(model.License, string(bts))
  190. }
  191. }
  192. return model, nil
  193. }
  194. func filenameWithPath(path, f string) (string, error) {
  195. // if filePath starts with ~/, replace it with the user's home directory.
  196. if strings.HasPrefix(f, fmt.Sprintf("~%s", string(os.PathSeparator))) {
  197. parts := strings.Split(f, string(os.PathSeparator))
  198. home, err := os.UserHomeDir()
  199. if err != nil {
  200. return "", fmt.Errorf("failed to open file: %v", err)
  201. }
  202. f = filepath.Join(home, filepath.Join(parts[1:]...))
  203. }
  204. // if filePath is not an absolute path, make it relative to the modelfile path
  205. if !filepath.IsAbs(f) {
  206. f = filepath.Join(filepath.Dir(path), f)
  207. }
  208. return f, nil
  209. }
  210. func CreateModel(ctx context.Context, name string, path string, fn func(resp api.ProgressResponse)) error {
  211. mp := ParseModelPath(name)
  212. var manifest *ManifestV2
  213. var err error
  214. var noprune string
  215. // build deleteMap to prune unused layers
  216. deleteMap := make(map[string]bool)
  217. if noprune = os.Getenv("OLLAMA_NOPRUNE"); noprune == "" {
  218. manifest, _, err = GetManifest(mp)
  219. if err != nil && !errors.Is(err, os.ErrNotExist) {
  220. return err
  221. }
  222. if manifest != nil {
  223. for _, l := range manifest.Layers {
  224. deleteMap[l.Digest] = true
  225. }
  226. deleteMap[manifest.Config.Digest] = true
  227. }
  228. }
  229. mf, err := os.Open(path)
  230. if err != nil {
  231. fn(api.ProgressResponse{Status: fmt.Sprintf("couldn't open modelfile '%s'", path)})
  232. return fmt.Errorf("failed to open file: %w", err)
  233. }
  234. defer mf.Close()
  235. fn(api.ProgressResponse{Status: "parsing modelfile"})
  236. commands, err := parser.Parse(mf)
  237. if err != nil {
  238. return err
  239. }
  240. config := ConfigV2{
  241. Architecture: "amd64",
  242. OS: "linux",
  243. }
  244. var layers []*LayerReader
  245. params := make(map[string][]string)
  246. var sourceParams map[string]any
  247. for _, c := range commands {
  248. log.Printf("[%s] - %s\n", c.Name, c.Args)
  249. switch c.Name {
  250. case "model":
  251. fn(api.ProgressResponse{Status: "looking for model"})
  252. mp := ParseModelPath(c.Args)
  253. mf, _, err := GetManifest(mp)
  254. if err != nil {
  255. modelFile, err := filenameWithPath(path, c.Args)
  256. if err != nil {
  257. return err
  258. }
  259. if _, err := os.Stat(modelFile); err != nil {
  260. // the model file does not exist, try pulling it
  261. if errors.Is(err, os.ErrNotExist) {
  262. fn(api.ProgressResponse{Status: "pulling model file"})
  263. if err := PullModel(ctx, c.Args, &RegistryOptions{}, fn); err != nil {
  264. return err
  265. }
  266. mf, _, err = GetManifest(mp)
  267. if err != nil {
  268. return fmt.Errorf("failed to open file after pull: %v", err)
  269. }
  270. } else {
  271. return err
  272. }
  273. } else {
  274. // create a model from this specified file
  275. fn(api.ProgressResponse{Status: "creating model layer"})
  276. file, err := os.Open(modelFile)
  277. if err != nil {
  278. return fmt.Errorf("failed to open file: %v", err)
  279. }
  280. defer file.Close()
  281. ggml, err := llm.DecodeGGML(file)
  282. if err != nil {
  283. return err
  284. }
  285. config.ModelFormat = ggml.Name()
  286. config.ModelFamily = ggml.ModelFamily()
  287. config.ModelType = ggml.ModelType()
  288. config.FileType = ggml.FileType()
  289. // reset the file
  290. file.Seek(0, io.SeekStart)
  291. l, err := CreateLayer(file)
  292. if err != nil {
  293. return fmt.Errorf("failed to create layer: %v", err)
  294. }
  295. l.MediaType = "application/vnd.ollama.image.model"
  296. layers = append(layers, l)
  297. }
  298. }
  299. if mf != nil {
  300. fn(api.ProgressResponse{Status: "reading model metadata"})
  301. sourceBlobPath, err := GetBlobsPath(mf.Config.Digest)
  302. if err != nil {
  303. return err
  304. }
  305. sourceBlob, err := os.Open(sourceBlobPath)
  306. if err != nil {
  307. return err
  308. }
  309. defer sourceBlob.Close()
  310. var source ConfigV2
  311. if err := json.NewDecoder(sourceBlob).Decode(&source); err != nil {
  312. return err
  313. }
  314. // copy the model metadata
  315. config.ModelFamily = source.ModelFamily
  316. config.ModelType = source.ModelType
  317. config.ModelFormat = source.ModelFormat
  318. config.FileType = source.FileType
  319. for _, l := range mf.Layers {
  320. if l.MediaType == "application/vnd.ollama.image.params" {
  321. sourceParamsBlobPath, err := GetBlobsPath(l.Digest)
  322. if err != nil {
  323. return err
  324. }
  325. sourceParamsBlob, err := os.Open(sourceParamsBlobPath)
  326. if err != nil {
  327. return err
  328. }
  329. defer sourceParamsBlob.Close()
  330. if err := json.NewDecoder(sourceParamsBlob).Decode(&sourceParams); err != nil {
  331. return err
  332. }
  333. }
  334. newLayer, err := GetLayerWithBufferFromLayer(l)
  335. if err != nil {
  336. return err
  337. }
  338. newLayer.From = mp.GetNamespaceRepository()
  339. layers = append(layers, newLayer)
  340. }
  341. }
  342. case "adapter":
  343. fn(api.ProgressResponse{Status: fmt.Sprintf("creating model %s layer", c.Name)})
  344. fp, err := filenameWithPath(path, c.Args)
  345. if err != nil {
  346. return err
  347. }
  348. // create a model from this specified file
  349. fn(api.ProgressResponse{Status: "creating model layer"})
  350. file, err := os.Open(fp)
  351. if err != nil {
  352. return fmt.Errorf("failed to open file: %v", err)
  353. }
  354. defer file.Close()
  355. l, err := CreateLayer(file)
  356. if err != nil {
  357. return fmt.Errorf("failed to create layer: %v", err)
  358. }
  359. l.MediaType = "application/vnd.ollama.image.adapter"
  360. layers = append(layers, l)
  361. case "license":
  362. fn(api.ProgressResponse{Status: fmt.Sprintf("creating model %s layer", c.Name)})
  363. mediaType := fmt.Sprintf("application/vnd.ollama.image.%s", c.Name)
  364. layer, err := CreateLayer(strings.NewReader(c.Args))
  365. if err != nil {
  366. return err
  367. }
  368. if layer.Size > 0 {
  369. layer.MediaType = mediaType
  370. layers = append(layers, layer)
  371. }
  372. case "template", "system", "prompt":
  373. fn(api.ProgressResponse{Status: fmt.Sprintf("creating model %s layer", c.Name)})
  374. // remove the layer if one exists
  375. mediaType := fmt.Sprintf("application/vnd.ollama.image.%s", c.Name)
  376. layers = removeLayerFromLayers(layers, mediaType)
  377. layer, err := CreateLayer(strings.NewReader(c.Args))
  378. if err != nil {
  379. return err
  380. }
  381. if layer.Size > 0 {
  382. layer.MediaType = mediaType
  383. layers = append(layers, layer)
  384. }
  385. default:
  386. // runtime parameters, build a list of args for each parameter to allow multiple values to be specified (ex: multiple stop sequences)
  387. params[c.Name] = append(params[c.Name], c.Args)
  388. }
  389. }
  390. // Create a single layer for the parameters
  391. if len(params) > 0 {
  392. fn(api.ProgressResponse{Status: "creating parameter layer"})
  393. layers = removeLayerFromLayers(layers, "application/vnd.ollama.image.params")
  394. formattedParams, err := formatParams(params)
  395. if err != nil {
  396. return fmt.Errorf("couldn't create params json: %v", err)
  397. }
  398. for k, v := range sourceParams {
  399. if _, ok := formattedParams[k]; !ok {
  400. formattedParams[k] = v
  401. }
  402. }
  403. if config.ModelType == "65B" {
  404. if numGQA, ok := formattedParams["num_gqa"].(int); ok && numGQA == 8 {
  405. config.ModelType = "70B"
  406. }
  407. }
  408. bts, err := json.Marshal(formattedParams)
  409. if err != nil {
  410. return err
  411. }
  412. l, err := CreateLayer(bytes.NewReader(bts))
  413. if err != nil {
  414. return fmt.Errorf("failed to create layer: %v", err)
  415. }
  416. l.MediaType = "application/vnd.ollama.image.params"
  417. layers = append(layers, l)
  418. }
  419. digests, err := getLayerDigests(layers)
  420. if err != nil {
  421. return err
  422. }
  423. var manifestLayers []*Layer
  424. for _, l := range layers {
  425. manifestLayers = append(manifestLayers, &l.Layer)
  426. delete(deleteMap, l.Layer.Digest)
  427. }
  428. // Create a layer for the config object
  429. fn(api.ProgressResponse{Status: "creating config layer"})
  430. cfg, err := createConfigLayer(config, digests)
  431. if err != nil {
  432. return err
  433. }
  434. layers = append(layers, cfg)
  435. delete(deleteMap, cfg.Layer.Digest)
  436. if err := SaveLayers(layers, fn, false); err != nil {
  437. return err
  438. }
  439. // Create the manifest
  440. fn(api.ProgressResponse{Status: "writing manifest"})
  441. err = CreateManifest(name, cfg, manifestLayers)
  442. if err != nil {
  443. return err
  444. }
  445. if noprune == "" {
  446. fn(api.ProgressResponse{Status: "removing any unused layers"})
  447. err = deleteUnusedLayers(nil, deleteMap, false)
  448. if err != nil {
  449. return err
  450. }
  451. }
  452. fn(api.ProgressResponse{Status: "success"})
  453. return nil
  454. }
  455. func removeLayerFromLayers(layers []*LayerReader, mediaType string) []*LayerReader {
  456. return slices.DeleteFunc(layers, func(layer *LayerReader) bool {
  457. return layer.MediaType == mediaType
  458. })
  459. }
  460. func SaveLayers(layers []*LayerReader, fn func(resp api.ProgressResponse), force bool) error {
  461. // Write each of the layers to disk
  462. for _, layer := range layers {
  463. fp, err := GetBlobsPath(layer.Digest)
  464. if err != nil {
  465. return err
  466. }
  467. _, err = os.Stat(fp)
  468. if os.IsNotExist(err) || force {
  469. fn(api.ProgressResponse{Status: fmt.Sprintf("writing layer %s", layer.Digest)})
  470. out, err := os.Create(fp)
  471. if err != nil {
  472. log.Printf("couldn't create %s", fp)
  473. return err
  474. }
  475. defer out.Close()
  476. if _, err = io.Copy(out, layer.Reader); err != nil {
  477. return err
  478. }
  479. } else {
  480. fn(api.ProgressResponse{Status: fmt.Sprintf("using already created layer %s", layer.Digest)})
  481. }
  482. }
  483. return nil
  484. }
  485. func CreateManifest(name string, cfg *LayerReader, layers []*Layer) error {
  486. mp := ParseModelPath(name)
  487. manifest := ManifestV2{
  488. SchemaVersion: 2,
  489. MediaType: "application/vnd.docker.distribution.manifest.v2+json",
  490. Config: Layer{
  491. MediaType: cfg.MediaType,
  492. Size: cfg.Size,
  493. Digest: cfg.Digest,
  494. },
  495. Layers: layers,
  496. }
  497. manifestJSON, err := json.Marshal(manifest)
  498. if err != nil {
  499. return err
  500. }
  501. fp, err := mp.GetManifestPath()
  502. if err != nil {
  503. return err
  504. }
  505. if err := os.MkdirAll(filepath.Dir(fp), 0o755); err != nil {
  506. return err
  507. }
  508. return os.WriteFile(fp, manifestJSON, 0o644)
  509. }
  510. func GetLayerWithBufferFromLayer(layer *Layer) (*LayerReader, error) {
  511. fp, err := GetBlobsPath(layer.Digest)
  512. if err != nil {
  513. return nil, err
  514. }
  515. file, err := os.Open(fp)
  516. if err != nil {
  517. return nil, fmt.Errorf("could not open blob: %w", err)
  518. }
  519. defer file.Close()
  520. newLayer, err := CreateLayer(file)
  521. if err != nil {
  522. return nil, err
  523. }
  524. newLayer.MediaType = layer.MediaType
  525. return newLayer, nil
  526. }
  527. // formatParams converts specified parameter options to their correct types
  528. func formatParams(params map[string][]string) (map[string]interface{}, error) {
  529. opts := api.Options{}
  530. valueOpts := reflect.ValueOf(&opts).Elem() // names of the fields in the options struct
  531. typeOpts := reflect.TypeOf(opts) // types of the fields in the options struct
  532. // build map of json struct tags to their types
  533. jsonOpts := make(map[string]reflect.StructField)
  534. for _, field := range reflect.VisibleFields(typeOpts) {
  535. jsonTag := strings.Split(field.Tag.Get("json"), ",")[0]
  536. if jsonTag != "" {
  537. jsonOpts[jsonTag] = field
  538. }
  539. }
  540. out := make(map[string]interface{})
  541. // iterate params and set values based on json struct tags
  542. for key, vals := range params {
  543. if opt, ok := jsonOpts[key]; ok {
  544. field := valueOpts.FieldByName(opt.Name)
  545. if field.IsValid() && field.CanSet() {
  546. switch field.Kind() {
  547. case reflect.Float32:
  548. floatVal, err := strconv.ParseFloat(vals[0], 32)
  549. if err != nil {
  550. return nil, fmt.Errorf("invalid float value %s", vals)
  551. }
  552. out[key] = float32(floatVal)
  553. case reflect.Int:
  554. intVal, err := strconv.ParseInt(vals[0], 10, 64)
  555. if err != nil {
  556. return nil, fmt.Errorf("invalid int value %s", vals)
  557. }
  558. out[key] = intVal
  559. case reflect.Bool:
  560. boolVal, err := strconv.ParseBool(vals[0])
  561. if err != nil {
  562. return nil, fmt.Errorf("invalid bool value %s", vals)
  563. }
  564. out[key] = boolVal
  565. case reflect.String:
  566. out[key] = vals[0]
  567. case reflect.Slice:
  568. // TODO: only string slices are supported right now
  569. out[key] = vals
  570. default:
  571. return nil, fmt.Errorf("unknown type %s for %s", field.Kind(), key)
  572. }
  573. }
  574. }
  575. }
  576. return out, nil
  577. }
  578. func getLayerDigests(layers []*LayerReader) ([]string, error) {
  579. var digests []string
  580. for _, l := range layers {
  581. if l.Digest == "" {
  582. return nil, fmt.Errorf("layer is missing a digest")
  583. }
  584. digests = append(digests, l.Digest)
  585. }
  586. return digests, nil
  587. }
  588. // CreateLayer creates a Layer object from a given file
  589. func CreateLayer(f io.ReadSeeker) (*LayerReader, error) {
  590. digest, size := GetSHA256Digest(f)
  591. f.Seek(0, io.SeekStart)
  592. layer := &LayerReader{
  593. Layer: Layer{
  594. MediaType: "application/vnd.docker.image.rootfs.diff.tar",
  595. Digest: digest,
  596. Size: size,
  597. },
  598. Reader: f,
  599. }
  600. return layer, nil
  601. }
  602. func CopyModel(src, dest string) error {
  603. srcModelPath := ParseModelPath(src)
  604. srcPath, err := srcModelPath.GetManifestPath()
  605. if err != nil {
  606. return err
  607. }
  608. destModelPath := ParseModelPath(dest)
  609. destPath, err := destModelPath.GetManifestPath()
  610. if err != nil {
  611. return err
  612. }
  613. if err := os.MkdirAll(filepath.Dir(destPath), 0o755); err != nil {
  614. return err
  615. }
  616. // copy the file
  617. input, err := os.ReadFile(srcPath)
  618. if err != nil {
  619. fmt.Println("Error reading file:", err)
  620. return err
  621. }
  622. err = os.WriteFile(destPath, input, 0o644)
  623. if err != nil {
  624. fmt.Println("Error reading file:", err)
  625. return err
  626. }
  627. return nil
  628. }
  629. func deleteUnusedLayers(skipModelPath *ModelPath, deleteMap map[string]bool, dryRun bool) error {
  630. fp, err := GetManifestPath()
  631. if err != nil {
  632. return err
  633. }
  634. walkFunc := func(path string, info os.FileInfo, _ error) error {
  635. if info.IsDir() {
  636. return nil
  637. }
  638. dir, file := filepath.Split(path)
  639. dir = strings.Trim(strings.TrimPrefix(dir, fp), string(os.PathSeparator))
  640. tag := strings.Join([]string{dir, file}, ":")
  641. fmp := ParseModelPath(tag)
  642. // skip the manifest we're trying to delete
  643. if skipModelPath != nil && skipModelPath.GetFullTagname() == fmp.GetFullTagname() {
  644. return nil
  645. }
  646. // save (i.e. delete from the deleteMap) any files used in other manifests
  647. manifest, _, err := GetManifest(fmp)
  648. if err != nil {
  649. return nil
  650. }
  651. for _, layer := range manifest.Layers {
  652. delete(deleteMap, layer.Digest)
  653. }
  654. delete(deleteMap, manifest.Config.Digest)
  655. return nil
  656. }
  657. if err := filepath.Walk(fp, walkFunc); err != nil {
  658. return err
  659. }
  660. // only delete the files which are still in the deleteMap
  661. for k, v := range deleteMap {
  662. if v {
  663. fp, err := GetBlobsPath(k)
  664. if err != nil {
  665. log.Printf("couldn't get file path for '%s': %v", k, err)
  666. continue
  667. }
  668. if !dryRun {
  669. if err := os.Remove(fp); err != nil {
  670. log.Printf("couldn't remove file '%s': %v", fp, err)
  671. continue
  672. }
  673. } else {
  674. log.Printf("wanted to remove: %s", fp)
  675. }
  676. }
  677. }
  678. return nil
  679. }
  680. func PruneLayers() error {
  681. deleteMap := make(map[string]bool)
  682. p, err := GetBlobsPath("")
  683. if err != nil {
  684. return err
  685. }
  686. blobs, err := os.ReadDir(p)
  687. if err != nil {
  688. log.Printf("couldn't read dir '%s': %v", p, err)
  689. return err
  690. }
  691. for _, blob := range blobs {
  692. name := blob.Name()
  693. if runtime.GOOS == "windows" {
  694. name = strings.ReplaceAll(name, "-", ":")
  695. }
  696. deleteMap[name] = true
  697. }
  698. log.Printf("total blobs: %d", len(deleteMap))
  699. err = deleteUnusedLayers(nil, deleteMap, false)
  700. if err != nil {
  701. return err
  702. }
  703. log.Printf("total unused blobs removed: %d", len(deleteMap))
  704. return nil
  705. }
  706. func PruneDirectory(path string) error {
  707. info, err := os.Lstat(path)
  708. if err != nil {
  709. return err
  710. }
  711. if info.IsDir() && info.Mode()&os.ModeSymlink == 0 {
  712. entries, err := os.ReadDir(path)
  713. if err != nil {
  714. return err
  715. }
  716. for _, entry := range entries {
  717. if err := PruneDirectory(filepath.Join(path, entry.Name())); err != nil {
  718. return err
  719. }
  720. }
  721. entries, err = os.ReadDir(path)
  722. if err != nil {
  723. return err
  724. }
  725. if len(entries) > 0 {
  726. return nil
  727. }
  728. return os.Remove(path)
  729. }
  730. return nil
  731. }
  732. func DeleteModel(name string) error {
  733. mp := ParseModelPath(name)
  734. manifest, _, err := GetManifest(mp)
  735. if err != nil {
  736. return err
  737. }
  738. deleteMap := make(map[string]bool)
  739. for _, layer := range manifest.Layers {
  740. deleteMap[layer.Digest] = true
  741. }
  742. deleteMap[manifest.Config.Digest] = true
  743. err = deleteUnusedLayers(&mp, deleteMap, false)
  744. if err != nil {
  745. return err
  746. }
  747. fp, err := mp.GetManifestPath()
  748. if err != nil {
  749. return err
  750. }
  751. err = os.Remove(fp)
  752. if err != nil {
  753. log.Printf("couldn't remove manifest file '%s': %v", fp, err)
  754. return err
  755. }
  756. return nil
  757. }
  758. func ShowModelfile(model *Model) (string, error) {
  759. var mt struct {
  760. *Model
  761. From string
  762. Parameters map[string][]any
  763. }
  764. mt.Parameters = make(map[string][]any)
  765. for k, v := range model.Options {
  766. if s, ok := v.([]any); ok {
  767. mt.Parameters[k] = s
  768. continue
  769. }
  770. mt.Parameters[k] = []any{v}
  771. }
  772. mt.Model = model
  773. mt.From = model.ModelPath
  774. if model.OriginalModel != "" {
  775. mt.From = model.OriginalModel
  776. }
  777. modelFile := `# Modelfile generated by "ollama show"
  778. # To build a new Modelfile based on this one, replace the FROM line with:
  779. # FROM {{ .ShortName }}
  780. FROM {{ .From }}
  781. TEMPLATE """{{ .Template }}"""
  782. {{- if .System }}
  783. SYSTEM """{{ .System }}"""
  784. {{- end }}
  785. {{- range $adapter := .AdapterPaths }}
  786. ADAPTER {{ $adapter }}
  787. {{- end }}
  788. {{- range $k, $v := .Parameters }}
  789. {{- range $parameter := $v }}
  790. PARAMETER {{ $k }} {{ printf "%#v" $parameter }}
  791. {{- end }}
  792. {{- end }}`
  793. tmpl, err := template.New("").Parse(modelFile)
  794. if err != nil {
  795. log.Printf("error parsing template: %q", err)
  796. return "", err
  797. }
  798. var buf bytes.Buffer
  799. if err = tmpl.Execute(&buf, mt); err != nil {
  800. log.Printf("error executing template: %q", err)
  801. return "", err
  802. }
  803. return buf.String(), nil
  804. }
  805. func PushModel(ctx context.Context, name string, regOpts *RegistryOptions, fn func(api.ProgressResponse)) error {
  806. mp := ParseModelPath(name)
  807. fn(api.ProgressResponse{Status: "retrieving manifest"})
  808. if mp.ProtocolScheme == "http" && !regOpts.Insecure {
  809. return fmt.Errorf("insecure protocol http")
  810. }
  811. manifest, _, err := GetManifest(mp)
  812. if err != nil {
  813. fn(api.ProgressResponse{Status: "couldn't retrieve manifest"})
  814. return err
  815. }
  816. var layers []*Layer
  817. layers = append(layers, manifest.Layers...)
  818. layers = append(layers, &manifest.Config)
  819. for _, layer := range layers {
  820. if err := uploadBlob(ctx, mp, layer, regOpts, fn); err != nil {
  821. log.Printf("error uploading blob: %v", err)
  822. return err
  823. }
  824. }
  825. fn(api.ProgressResponse{Status: "pushing manifest"})
  826. requestURL := mp.BaseURL()
  827. requestURL = requestURL.JoinPath("v2", mp.GetNamespaceRepository(), "manifests", mp.Tag)
  828. manifestJSON, err := json.Marshal(manifest)
  829. if err != nil {
  830. return err
  831. }
  832. headers := make(http.Header)
  833. headers.Set("Content-Type", "application/vnd.docker.distribution.manifest.v2+json")
  834. resp, err := makeRequestWithRetry(ctx, http.MethodPut, requestURL, headers, bytes.NewReader(manifestJSON), regOpts)
  835. if err != nil {
  836. return err
  837. }
  838. defer resp.Body.Close()
  839. fn(api.ProgressResponse{Status: "success"})
  840. return nil
  841. }
  842. func PullModel(ctx context.Context, name string, regOpts *RegistryOptions, fn func(api.ProgressResponse)) error {
  843. mp := ParseModelPath(name)
  844. var manifest *ManifestV2
  845. var err error
  846. var noprune string
  847. // build deleteMap to prune unused layers
  848. deleteMap := make(map[string]bool)
  849. if noprune = os.Getenv("OLLAMA_NOPRUNE"); noprune == "" {
  850. manifest, _, err = GetManifest(mp)
  851. if err != nil && !errors.Is(err, os.ErrNotExist) {
  852. return err
  853. }
  854. if manifest != nil {
  855. for _, l := range manifest.Layers {
  856. deleteMap[l.Digest] = true
  857. }
  858. deleteMap[manifest.Config.Digest] = true
  859. }
  860. }
  861. if mp.ProtocolScheme == "http" && !regOpts.Insecure {
  862. return fmt.Errorf("insecure protocol http")
  863. }
  864. fn(api.ProgressResponse{Status: "pulling manifest"})
  865. manifest, err = pullModelManifest(ctx, mp, regOpts)
  866. if err != nil {
  867. return fmt.Errorf("pull model manifest: %s", err)
  868. }
  869. var layers []*Layer
  870. layers = append(layers, manifest.Layers...)
  871. layers = append(layers, &manifest.Config)
  872. for _, layer := range layers {
  873. if err := downloadBlob(
  874. ctx,
  875. downloadOpts{
  876. mp: mp,
  877. digest: layer.Digest,
  878. regOpts: regOpts,
  879. fn: fn,
  880. }); err != nil {
  881. return err
  882. }
  883. delete(deleteMap, layer.Digest)
  884. }
  885. delete(deleteMap, manifest.Config.Digest)
  886. fn(api.ProgressResponse{Status: "verifying sha256 digest"})
  887. for _, layer := range layers {
  888. if err := verifyBlob(layer.Digest); err != nil {
  889. if errors.Is(err, errDigestMismatch) {
  890. // something went wrong, delete the blob
  891. fp, err := GetBlobsPath(layer.Digest)
  892. if err != nil {
  893. return err
  894. }
  895. if err := os.Remove(fp); err != nil {
  896. // log this, but return the original error
  897. log.Printf("couldn't remove file with digest mismatch '%s': %v", fp, err)
  898. }
  899. }
  900. return err
  901. }
  902. }
  903. fn(api.ProgressResponse{Status: "writing manifest"})
  904. manifestJSON, err := json.Marshal(manifest)
  905. if err != nil {
  906. return err
  907. }
  908. fp, err := mp.GetManifestPath()
  909. if err != nil {
  910. return err
  911. }
  912. if err := os.MkdirAll(filepath.Dir(fp), 0o755); err != nil {
  913. return err
  914. }
  915. err = os.WriteFile(fp, manifestJSON, 0o644)
  916. if err != nil {
  917. log.Printf("couldn't write to %s", fp)
  918. return err
  919. }
  920. if noprune == "" {
  921. fn(api.ProgressResponse{Status: "removing any unused layers"})
  922. err = deleteUnusedLayers(nil, deleteMap, false)
  923. if err != nil {
  924. return err
  925. }
  926. }
  927. fn(api.ProgressResponse{Status: "success"})
  928. return nil
  929. }
  930. func pullModelManifest(ctx context.Context, mp ModelPath, regOpts *RegistryOptions) (*ManifestV2, error) {
  931. requestURL := mp.BaseURL().JoinPath("v2", mp.GetNamespaceRepository(), "manifests", mp.Tag)
  932. headers := make(http.Header)
  933. headers.Set("Accept", "application/vnd.docker.distribution.manifest.v2+json")
  934. resp, err := makeRequestWithRetry(ctx, http.MethodGet, requestURL, headers, nil, regOpts)
  935. if err != nil {
  936. return nil, err
  937. }
  938. defer resp.Body.Close()
  939. var m *ManifestV2
  940. if err := json.NewDecoder(resp.Body).Decode(&m); err != nil {
  941. return nil, err
  942. }
  943. return m, err
  944. }
  945. func createConfigLayer(config ConfigV2, layers []string) (*LayerReader, error) {
  946. config.RootFS = RootFS{
  947. Type: "layers",
  948. DiffIDs: layers,
  949. }
  950. configJSON, err := json.Marshal(config)
  951. if err != nil {
  952. return nil, err
  953. }
  954. digest, size := GetSHA256Digest(bytes.NewBuffer(configJSON))
  955. layer := &LayerReader{
  956. Layer: Layer{
  957. MediaType: "application/vnd.docker.container.image.v1+json",
  958. Digest: digest,
  959. Size: size,
  960. },
  961. Reader: bytes.NewBuffer(configJSON),
  962. }
  963. return layer, nil
  964. }
  965. // GetSHA256Digest returns the SHA256 hash of a given buffer and returns it, and the size of buffer
  966. func GetSHA256Digest(r io.Reader) (string, int64) {
  967. h := sha256.New()
  968. n, err := io.Copy(h, r)
  969. if err != nil {
  970. log.Fatal(err)
  971. }
  972. return fmt.Sprintf("sha256:%x", h.Sum(nil)), n
  973. }
  974. func makeRequestWithRetry(ctx context.Context, method string, requestURL *url.URL, headers http.Header, body io.ReadSeeker, regOpts *RegistryOptions) (*http.Response, error) {
  975. for try := 0; try < maxRetries; try++ {
  976. resp, err := makeRequest(ctx, method, requestURL, headers, body, regOpts)
  977. if err != nil {
  978. log.Printf("couldn't start upload: %v", err)
  979. return nil, err
  980. }
  981. switch {
  982. case resp.StatusCode == http.StatusUnauthorized:
  983. auth := resp.Header.Get("www-authenticate")
  984. authRedir := ParseAuthRedirectString(auth)
  985. token, err := getAuthToken(ctx, authRedir)
  986. if err != nil {
  987. return nil, err
  988. }
  989. regOpts.Token = token
  990. if body != nil {
  991. body.Seek(0, io.SeekStart)
  992. }
  993. continue
  994. case resp.StatusCode == http.StatusNotFound:
  995. return nil, os.ErrNotExist
  996. case resp.StatusCode >= http.StatusBadRequest:
  997. body, err := io.ReadAll(resp.Body)
  998. if err != nil {
  999. return nil, fmt.Errorf("%d: %s", resp.StatusCode, err)
  1000. }
  1001. return nil, fmt.Errorf("%d: %s", resp.StatusCode, body)
  1002. default:
  1003. return resp, nil
  1004. }
  1005. }
  1006. return nil, errMaxRetriesExceeded
  1007. }
  1008. func makeRequest(ctx context.Context, method string, requestURL *url.URL, headers http.Header, body io.Reader, regOpts *RegistryOptions) (*http.Response, error) {
  1009. if requestURL.Scheme != "http" && regOpts != nil && regOpts.Insecure {
  1010. requestURL.Scheme = "http"
  1011. }
  1012. req, err := http.NewRequestWithContext(ctx, method, requestURL.String(), body)
  1013. if err != nil {
  1014. return nil, err
  1015. }
  1016. if headers != nil {
  1017. req.Header = headers
  1018. }
  1019. if regOpts != nil {
  1020. if regOpts.Token != "" {
  1021. req.Header.Set("Authorization", "Bearer "+regOpts.Token)
  1022. } else if regOpts.Username != "" && regOpts.Password != "" {
  1023. req.SetBasicAuth(regOpts.Username, regOpts.Password)
  1024. }
  1025. }
  1026. req.Header.Set("User-Agent", fmt.Sprintf("ollama/%s (%s %s) Go/%s", version.Version, runtime.GOARCH, runtime.GOOS, runtime.Version()))
  1027. if s := req.Header.Get("Content-Length"); s != "" {
  1028. contentLength, err := strconv.ParseInt(s, 10, 64)
  1029. if err != nil {
  1030. return nil, err
  1031. }
  1032. req.ContentLength = contentLength
  1033. }
  1034. proxyURL, err := http.ProxyFromEnvironment(req)
  1035. if err != nil {
  1036. return nil, err
  1037. }
  1038. client := http.Client{
  1039. Transport: &http.Transport{
  1040. Proxy: http.ProxyURL(proxyURL),
  1041. },
  1042. }
  1043. resp, err := client.Do(req)
  1044. if err != nil {
  1045. return nil, err
  1046. }
  1047. return resp, nil
  1048. }
  1049. func getValue(header, key string) string {
  1050. startIdx := strings.Index(header, key+"=")
  1051. if startIdx == -1 {
  1052. return ""
  1053. }
  1054. // Move the index to the starting quote after the key.
  1055. startIdx += len(key) + 2
  1056. endIdx := startIdx
  1057. for endIdx < len(header) {
  1058. if header[endIdx] == '"' {
  1059. if endIdx+1 < len(header) && header[endIdx+1] != ',' { // If the next character isn't a comma, continue
  1060. endIdx++
  1061. continue
  1062. }
  1063. break
  1064. }
  1065. endIdx++
  1066. }
  1067. return header[startIdx:endIdx]
  1068. }
  1069. func ParseAuthRedirectString(authStr string) AuthRedirect {
  1070. authStr = strings.TrimPrefix(authStr, "Bearer ")
  1071. return AuthRedirect{
  1072. Realm: getValue(authStr, "realm"),
  1073. Service: getValue(authStr, "service"),
  1074. Scope: getValue(authStr, "scope"),
  1075. }
  1076. }
  1077. var errDigestMismatch = fmt.Errorf("digest mismatch, file must be downloaded again")
  1078. func verifyBlob(digest string) error {
  1079. fp, err := GetBlobsPath(digest)
  1080. if err != nil {
  1081. return err
  1082. }
  1083. f, err := os.Open(fp)
  1084. if err != nil {
  1085. return err
  1086. }
  1087. defer f.Close()
  1088. fileDigest, _ := GetSHA256Digest(f)
  1089. if digest != fileDigest {
  1090. return fmt.Errorf("%w: want %s, got %s", errDigestMismatch, digest, fileDigest)
  1091. }
  1092. return nil
  1093. }