create.go 16 KB

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