create.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. package server
  2. import (
  3. "bytes"
  4. "cmp"
  5. "context"
  6. "encoding/json"
  7. "errors"
  8. "fmt"
  9. "io"
  10. "io/fs"
  11. "log/slog"
  12. "net/http"
  13. "os"
  14. "path/filepath"
  15. "slices"
  16. "strings"
  17. "github.com/gin-gonic/gin"
  18. "github.com/ollama/ollama/api"
  19. "github.com/ollama/ollama/convert"
  20. "github.com/ollama/ollama/envconfig"
  21. "github.com/ollama/ollama/format"
  22. "github.com/ollama/ollama/fs/ggml"
  23. "github.com/ollama/ollama/llama"
  24. "github.com/ollama/ollama/template"
  25. "github.com/ollama/ollama/types/errtypes"
  26. "github.com/ollama/ollama/types/model"
  27. )
  28. var (
  29. errNoFilesProvided = errors.New("no files provided to convert")
  30. errOnlyOneAdapterSupported = errors.New("only one adapter is currently supported")
  31. errOnlyGGUFSupported = errors.New("supplied file was not in GGUF format")
  32. errUnknownType = errors.New("unknown type")
  33. errNeitherFromOrFiles = errors.New("neither 'from' or 'files' was specified")
  34. errFilePath = errors.New("file path must be relative")
  35. )
  36. func (s *Server) CreateHandler(c *gin.Context) {
  37. var r api.CreateRequest
  38. if err := c.ShouldBindJSON(&r); errors.Is(err, io.EOF) {
  39. c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "missing request body"})
  40. return
  41. } else if err != nil {
  42. c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  43. return
  44. }
  45. for v := range r.Files {
  46. if !fs.ValidPath(v) {
  47. c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": errFilePath.Error()})
  48. return
  49. }
  50. }
  51. name := model.ParseName(cmp.Or(r.Model, r.Name))
  52. if !name.IsValid() {
  53. c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": errtypes.InvalidModelNameErrMsg})
  54. return
  55. }
  56. name, err := getExistingName(name)
  57. if err != nil {
  58. c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  59. return
  60. }
  61. ch := make(chan any)
  62. go func() {
  63. defer close(ch)
  64. fn := func(resp api.ProgressResponse) {
  65. ch <- resp
  66. }
  67. oldManifest, _ := ParseNamedManifest(name)
  68. var baseLayers []*layerGGML
  69. if r.From != "" {
  70. slog.Debug("create model from model name")
  71. fromName := model.ParseName(r.From)
  72. if !fromName.IsValid() {
  73. ch <- gin.H{"error": errtypes.InvalidModelNameErrMsg, "status": http.StatusBadRequest}
  74. return
  75. }
  76. ctx, cancel := context.WithCancel(c.Request.Context())
  77. defer cancel()
  78. baseLayers, err = parseFromModel(ctx, fromName, fn)
  79. if err != nil {
  80. ch <- gin.H{"error": err.Error()}
  81. }
  82. } else if r.Files != nil {
  83. baseLayers, err = convertModelFromFiles(r.Files, baseLayers, false, fn)
  84. if err != nil {
  85. for _, badReq := range []error{errNoFilesProvided, errOnlyGGUFSupported, errUnknownType} {
  86. if errors.Is(err, badReq) {
  87. ch <- gin.H{"error": err.Error(), "status": http.StatusBadRequest}
  88. return
  89. }
  90. }
  91. ch <- gin.H{"error": err.Error()}
  92. return
  93. }
  94. } else {
  95. ch <- gin.H{"error": errNeitherFromOrFiles.Error(), "status": http.StatusBadRequest}
  96. return
  97. }
  98. var adapterLayers []*layerGGML
  99. if r.Adapters != nil {
  100. adapterLayers, err = convertModelFromFiles(r.Adapters, baseLayers, true, fn)
  101. if err != nil {
  102. for _, badReq := range []error{errNoFilesProvided, errOnlyOneAdapterSupported, errOnlyGGUFSupported, errUnknownType, errFilePath} {
  103. if errors.Is(err, badReq) {
  104. ch <- gin.H{"error": err.Error(), "status": http.StatusBadRequest}
  105. return
  106. }
  107. }
  108. ch <- gin.H{"error": err.Error(), "status": http.StatusBadRequest}
  109. return
  110. }
  111. }
  112. if len(adapterLayers) > 0 {
  113. baseLayers = append(baseLayers, adapterLayers...)
  114. }
  115. if err := createModel(r, name, baseLayers, fn); err != nil {
  116. if errors.Is(err, errBadTemplate) {
  117. ch <- gin.H{"error": err.Error(), "status": http.StatusBadRequest}
  118. return
  119. }
  120. ch <- gin.H{"error": err.Error()}
  121. return
  122. }
  123. if !envconfig.NoPrune() && oldManifest != nil {
  124. if err := oldManifest.RemoveLayers(); err != nil {
  125. ch <- gin.H{"error": err.Error()}
  126. }
  127. }
  128. ch <- api.ProgressResponse{Status: "success"}
  129. }()
  130. if r.Stream != nil && !*r.Stream {
  131. waitForStream(c, ch)
  132. return
  133. }
  134. streamResponse(c, ch)
  135. }
  136. func convertModelFromFiles(files map[string]string, baseLayers []*layerGGML, isAdapter bool, fn func(resp api.ProgressResponse)) ([]*layerGGML, error) {
  137. switch detectModelTypeFromFiles(files) {
  138. case "safetensors":
  139. layers, err := convertFromSafetensors(files, baseLayers, isAdapter, fn)
  140. if err != nil {
  141. slog.Error("error converting from safetensors", "error", err)
  142. return nil, err
  143. }
  144. return layers, nil
  145. case "gguf":
  146. if len(files) == 0 {
  147. return nil, errNoFilesProvided
  148. } else if len(files) > 1 && isAdapter {
  149. return nil, errOnlyOneAdapterSupported
  150. }
  151. var digest string
  152. var allLayers []*layerGGML
  153. for _, v := range files {
  154. digest = v
  155. layers, err := ggufLayers(digest, fn)
  156. if err != nil {
  157. return nil, err
  158. }
  159. allLayers = append(allLayers, layers...)
  160. }
  161. return allLayers, nil
  162. default:
  163. return nil, errUnknownType
  164. }
  165. }
  166. func detectModelTypeFromFiles(files map[string]string) string {
  167. for fn := range files {
  168. if strings.HasSuffix(fn, ".safetensors") {
  169. return "safetensors"
  170. } else if strings.HasSuffix(fn, ".gguf") {
  171. return "gguf"
  172. } else {
  173. // try to see if we can find a gguf file even without the file extension
  174. blobPath, err := GetBlobsPath(files[fn])
  175. if err != nil {
  176. slog.Error("error getting blobs path", "file", fn)
  177. return ""
  178. }
  179. f, err := os.Open(blobPath)
  180. if err != nil {
  181. slog.Error("error reading file", "error", err)
  182. return ""
  183. }
  184. defer f.Close()
  185. buf := make([]byte, 4)
  186. _, err = f.Read(buf)
  187. if err != nil {
  188. slog.Error("error reading file", "error", err)
  189. return ""
  190. }
  191. ct := ggml.DetectContentType(buf)
  192. if ct == "gguf" {
  193. return "gguf"
  194. }
  195. }
  196. }
  197. return ""
  198. }
  199. func convertFromSafetensors(files map[string]string, baseLayers []*layerGGML, isAdapter bool, fn func(resp api.ProgressResponse)) ([]*layerGGML, error) {
  200. tmpDir, err := os.MkdirTemp("", "ollama-safetensors")
  201. if err != nil {
  202. return nil, err
  203. }
  204. defer os.RemoveAll(tmpDir)
  205. // Set up a root to validate paths
  206. root, err := os.OpenRoot(tmpDir)
  207. if err != nil {
  208. return nil, err
  209. }
  210. defer root.Close()
  211. for fp, digest := range files {
  212. if !fs.ValidPath(fp) {
  213. return nil, fmt.Errorf("%w: %s", errFilePath, fp)
  214. }
  215. if _, err := root.Stat(fp); err != nil && !errors.Is(err, fs.ErrNotExist) {
  216. // Path is likely outside the root
  217. return nil, fmt.Errorf("%w: %s: %s", errFilePath, err, fp)
  218. }
  219. blobPath, err := GetBlobsPath(digest)
  220. if err != nil {
  221. return nil, err
  222. }
  223. if err := createLink(blobPath, filepath.Join(tmpDir, fp)); err != nil {
  224. return nil, err
  225. }
  226. }
  227. t, err := os.CreateTemp(tmpDir, "fp16")
  228. if err != nil {
  229. return nil, err
  230. }
  231. defer t.Close()
  232. var mediaType string
  233. if !isAdapter {
  234. fn(api.ProgressResponse{Status: "converting model"})
  235. mediaType = "application/vnd.ollama.image.model"
  236. if err := convert.ConvertModel(os.DirFS(tmpDir), t); err != nil {
  237. return nil, err
  238. }
  239. } else {
  240. kv, err := kvFromLayers(baseLayers)
  241. if err != nil {
  242. return nil, err
  243. }
  244. fn(api.ProgressResponse{Status: "converting adapter"})
  245. mediaType = "application/vnd.ollama.image.adapter"
  246. if err := convert.ConvertAdapter(os.DirFS(tmpDir), t, kv); err != nil {
  247. return nil, err
  248. }
  249. }
  250. if _, err := t.Seek(0, io.SeekStart); err != nil {
  251. return nil, err
  252. }
  253. layer, err := NewLayer(t, mediaType)
  254. if err != nil {
  255. return nil, err
  256. }
  257. bin, err := layer.Open()
  258. if err != nil {
  259. return nil, err
  260. }
  261. defer bin.Close()
  262. f, _, err := ggml.Decode(bin, 0)
  263. if err != nil {
  264. return nil, err
  265. }
  266. layers := []*layerGGML{{layer, f}}
  267. if !isAdapter {
  268. return detectChatTemplate(layers)
  269. }
  270. return layers, nil
  271. }
  272. func kvFromLayers(baseLayers []*layerGGML) (ggml.KV, error) {
  273. for _, l := range baseLayers {
  274. if l.GGML != nil {
  275. return l.KV(), nil
  276. }
  277. }
  278. return ggml.KV{}, fmt.Errorf("no base model was found")
  279. }
  280. func createModel(r api.CreateRequest, name model.Name, baseLayers []*layerGGML, fn func(resp api.ProgressResponse)) (err error) {
  281. config := ConfigV2{
  282. OS: "linux",
  283. Architecture: "amd64",
  284. RootFS: RootFS{
  285. Type: "layers",
  286. },
  287. }
  288. var layers []Layer
  289. for _, layer := range baseLayers {
  290. if layer.GGML != nil {
  291. quantType := strings.ToUpper(cmp.Or(r.Quantize, r.Quantization))
  292. if quantType != "" && layer.GGML.Name() == "gguf" && layer.MediaType == "application/vnd.ollama.image.model" {
  293. want, err := ggml.ParseFileType(quantType)
  294. if err != nil {
  295. return err
  296. }
  297. ft := layer.GGML.KV().FileType()
  298. if !slices.Contains([]string{"F16", "F32"}, ft.String()) {
  299. return errors.New("quantization is only supported for F16 and F32 models")
  300. } else if ft != want {
  301. layer, err = quantizeLayer(layer, quantType, fn)
  302. if err != nil {
  303. return err
  304. }
  305. }
  306. }
  307. config.ModelFormat = cmp.Or(config.ModelFormat, layer.GGML.Name())
  308. config.ModelFamily = cmp.Or(config.ModelFamily, layer.GGML.KV().Architecture())
  309. config.ModelType = cmp.Or(config.ModelType, format.HumanNumber(layer.GGML.KV().ParameterCount()))
  310. config.FileType = cmp.Or(config.FileType, layer.GGML.KV().FileType().String())
  311. config.ModelFamilies = append(config.ModelFamilies, layer.GGML.KV().Architecture())
  312. }
  313. layers = append(layers, layer.Layer)
  314. }
  315. if r.Template != "" {
  316. layers, err = setTemplate(layers, r.Template)
  317. if err != nil {
  318. return err
  319. }
  320. }
  321. if r.System != "" {
  322. layers, err = setSystem(layers, r.System)
  323. if err != nil {
  324. return err
  325. }
  326. }
  327. if r.License != nil {
  328. switch l := r.License.(type) {
  329. case string:
  330. if l != "" {
  331. layers, err = setLicense(layers, l)
  332. if err != nil {
  333. return err
  334. }
  335. }
  336. case any:
  337. var licenses []string
  338. b, _ := json.Marshal(l) // re-marshal to JSON
  339. if err := json.Unmarshal(b, &licenses); err != nil {
  340. return err
  341. }
  342. for _, v := range licenses {
  343. layers, err = setLicense(layers, v)
  344. if err != nil {
  345. return err
  346. }
  347. }
  348. default:
  349. return fmt.Errorf("unknown license type: %T", l)
  350. }
  351. }
  352. layers, err = setParameters(layers, r.Parameters)
  353. if err != nil {
  354. return err
  355. }
  356. layers, err = setMessages(layers, r.Messages)
  357. if err != nil {
  358. return err
  359. }
  360. configLayer, err := createConfigLayer(layers, config)
  361. if err != nil {
  362. return err
  363. }
  364. for _, layer := range layers {
  365. if layer.status != "" {
  366. fn(api.ProgressResponse{Status: layer.status})
  367. }
  368. }
  369. fn(api.ProgressResponse{Status: "writing manifest"})
  370. if err := WriteManifest(name, *configLayer, layers); err != nil {
  371. return err
  372. }
  373. return nil
  374. }
  375. func quantizeLayer(layer *layerGGML, quantizeType string, fn func(resp api.ProgressResponse)) (*layerGGML, error) {
  376. ft := layer.GGML.KV().FileType()
  377. fn(api.ProgressResponse{Status: fmt.Sprintf("quantizing %s model to %s", ft, quantizeType)})
  378. want, err := ggml.ParseFileType(quantizeType)
  379. if err != nil {
  380. return nil, err
  381. }
  382. blob, err := GetBlobsPath(layer.Digest)
  383. if err != nil {
  384. return nil, err
  385. }
  386. temp, err := os.CreateTemp(filepath.Dir(blob), quantizeType)
  387. if err != nil {
  388. return nil, err
  389. }
  390. defer temp.Close()
  391. defer os.Remove(temp.Name())
  392. if err := llama.Quantize(blob, temp.Name(), uint32(want)); err != nil {
  393. return nil, err
  394. }
  395. newLayer, err := NewLayer(temp, layer.MediaType)
  396. if err != nil {
  397. return nil, err
  398. }
  399. if _, err := temp.Seek(0, io.SeekStart); err != nil {
  400. return nil, err
  401. }
  402. f, _, err := ggml.Decode(temp, 0)
  403. if err != nil {
  404. slog.Error(fmt.Sprintf("error decoding ggml: %s\n", err))
  405. return nil, err
  406. }
  407. return &layerGGML{newLayer, f}, nil
  408. }
  409. func ggufLayers(digest string, fn func(resp api.ProgressResponse)) ([]*layerGGML, error) {
  410. var layers []*layerGGML
  411. fn(api.ProgressResponse{Status: "parsing GGUF"})
  412. blobPath, err := GetBlobsPath(digest)
  413. if err != nil {
  414. return nil, err
  415. }
  416. blob, err := os.Open(blobPath)
  417. if err != nil {
  418. return nil, err
  419. }
  420. defer blob.Close()
  421. sr := io.NewSectionReader(blob, 0, 512)
  422. contentType, err := detectContentType(sr)
  423. if err != nil {
  424. return nil, err
  425. }
  426. if contentType != "gguf" {
  427. slog.Error(fmt.Sprintf("unsupported content type: %s", contentType))
  428. return nil, errOnlyGGUFSupported
  429. }
  430. stat, err := blob.Stat()
  431. if err != nil {
  432. return nil, err
  433. }
  434. var offset int64
  435. for offset < stat.Size() {
  436. f, n, err := ggml.Decode(blob, 0)
  437. if errors.Is(err, io.EOF) {
  438. break
  439. } else if err != nil {
  440. return nil, err
  441. }
  442. mediatype := "application/vnd.ollama.image.model"
  443. if f.KV().Kind() == "adapter" {
  444. mediatype = "application/vnd.ollama.image.adapter"
  445. } else if _, ok := f.KV()[fmt.Sprintf("%s.vision.block_count", f.KV().Architecture())]; ok || f.KV().Kind() == "projector" {
  446. mediatype = "application/vnd.ollama.image.projector"
  447. }
  448. var layer Layer
  449. if digest != "" && n == stat.Size() && offset == 0 {
  450. layer, err = NewLayerFromLayer(digest, mediatype, blob.Name())
  451. if err != nil {
  452. slog.Debug("could not create new layer from layer", "error", err)
  453. return nil, err
  454. }
  455. }
  456. // Fallback to creating layer from file copy (either NewLayerFromLayer failed, or digest empty/n != stat.Size())
  457. if layer.Digest == "" {
  458. layer, err = NewLayer(io.NewSectionReader(blob, offset, n), mediatype)
  459. if err != nil {
  460. return nil, err
  461. }
  462. }
  463. layers = append(layers, &layerGGML{layer, f})
  464. offset = n
  465. }
  466. return detectChatTemplate(layers)
  467. }
  468. func removeLayer(layers []Layer, mediatype string) []Layer {
  469. return slices.DeleteFunc(layers, func(layer Layer) bool {
  470. if layer.MediaType != mediatype {
  471. return false
  472. }
  473. if err := layer.Remove(); err != nil {
  474. slog.Warn("couldn't remove blob", "digest", layer.Digest, "error", err)
  475. return true
  476. }
  477. return true
  478. })
  479. }
  480. func setTemplate(layers []Layer, t string) ([]Layer, error) {
  481. layers = removeLayer(layers, "application/vnd.ollama.image.template")
  482. if _, err := template.Parse(t); err != nil {
  483. return nil, fmt.Errorf("%w: %s", errBadTemplate, err)
  484. }
  485. if _, err := template.Parse(t); err != nil {
  486. return nil, fmt.Errorf("%w: %s", errBadTemplate, err)
  487. }
  488. blob := strings.NewReader(t)
  489. layer, err := NewLayer(blob, "application/vnd.ollama.image.template")
  490. if err != nil {
  491. return nil, err
  492. }
  493. layers = append(layers, layer)
  494. return layers, nil
  495. }
  496. func setSystem(layers []Layer, s string) ([]Layer, error) {
  497. layers = removeLayer(layers, "application/vnd.ollama.image.system")
  498. if s != "" {
  499. blob := strings.NewReader(s)
  500. layer, err := NewLayer(blob, "application/vnd.ollama.image.system")
  501. if err != nil {
  502. return nil, err
  503. }
  504. layers = append(layers, layer)
  505. }
  506. return layers, nil
  507. }
  508. func setLicense(layers []Layer, l string) ([]Layer, error) {
  509. blob := strings.NewReader(l)
  510. layer, err := NewLayer(blob, "application/vnd.ollama.image.license")
  511. if err != nil {
  512. return nil, err
  513. }
  514. layers = append(layers, layer)
  515. return layers, nil
  516. }
  517. func setParameters(layers []Layer, p map[string]any) ([]Layer, error) {
  518. if p == nil {
  519. p = make(map[string]any)
  520. }
  521. for _, layer := range layers {
  522. if layer.MediaType != "application/vnd.ollama.image.params" {
  523. continue
  524. }
  525. digestPath, err := GetBlobsPath(layer.Digest)
  526. if err != nil {
  527. return nil, err
  528. }
  529. fn, err := os.Open(digestPath)
  530. if err != nil {
  531. return nil, err
  532. }
  533. defer fn.Close()
  534. var existing map[string]any
  535. if err := json.NewDecoder(fn).Decode(&existing); err != nil {
  536. return nil, err
  537. }
  538. for k, v := range existing {
  539. if _, exists := p[k]; exists {
  540. continue
  541. }
  542. p[k] = v
  543. }
  544. }
  545. if len(p) == 0 {
  546. return layers, nil
  547. }
  548. layers = removeLayer(layers, "application/vnd.ollama.image.params")
  549. var b bytes.Buffer
  550. if err := json.NewEncoder(&b).Encode(p); err != nil {
  551. return nil, err
  552. }
  553. layer, err := NewLayer(&b, "application/vnd.ollama.image.params")
  554. if err != nil {
  555. return nil, err
  556. }
  557. layers = append(layers, layer)
  558. return layers, nil
  559. }
  560. func setMessages(layers []Layer, m []api.Message) ([]Layer, error) {
  561. // this leaves the old messages intact if no new messages were specified
  562. // which may not be the correct behaviour
  563. if len(m) == 0 {
  564. return layers, nil
  565. }
  566. fmt.Printf("removing old messages\n")
  567. layers = removeLayer(layers, "application/vnd.ollama.image.messages")
  568. var b bytes.Buffer
  569. if err := json.NewEncoder(&b).Encode(m); err != nil {
  570. return nil, err
  571. }
  572. layer, err := NewLayer(&b, "application/vnd.ollama.image.messages")
  573. if err != nil {
  574. return nil, err
  575. }
  576. layers = append(layers, layer)
  577. return layers, nil
  578. }
  579. func createConfigLayer(layers []Layer, config ConfigV2) (*Layer, error) {
  580. digests := make([]string, len(layers))
  581. for i, layer := range layers {
  582. digests[i] = layer.Digest
  583. }
  584. config.RootFS.DiffIDs = digests
  585. var b bytes.Buffer
  586. if err := json.NewEncoder(&b).Encode(config); err != nil {
  587. return nil, err
  588. }
  589. layer, err := NewLayer(&b, "application/vnd.docker.container.image.v1+json")
  590. if err != nil {
  591. return nil, err
  592. }
  593. return &layer, nil
  594. }
  595. func createLink(src, dst string) error {
  596. // make any subdirs for dst
  597. if err := os.MkdirAll(filepath.Dir(dst), 0o755); err != nil {
  598. return err
  599. }
  600. _ = os.Remove(dst)
  601. if err := os.Symlink(src, dst); err != nil {
  602. if err := copyFile(src, dst); err != nil {
  603. return err
  604. }
  605. }
  606. return nil
  607. }
  608. func copyFile(src, dst string) error {
  609. srcFile, err := os.Open(src)
  610. if err != nil {
  611. return err
  612. }
  613. defer srcFile.Close()
  614. dstFile, err := os.Create(dst)
  615. if err != nil {
  616. return err
  617. }
  618. defer dstFile.Close()
  619. _, err = io.Copy(dstFile, srcFile)
  620. return err
  621. }