@@ -563,8 +563,8 @@ class LlamaData {
563563
564564 private:
565565#ifdef LLAMA_USE_CURL
566- int download (const std::string & url, const std::vector<std:: string> & headers , const std::string & output_file ,
567- const bool progress , std::string * response_str = nullptr ) {
566+ int download (const std::string & url, const std::string & output_file , const bool progress ,
567+ const std::vector<std::string> & headers = {} , std::string * response_str = nullptr ) {
568568 HttpClient http;
569569 if (http.init (url, headers, output_file, progress, response_str)) {
570570 return 1 ;
@@ -573,14 +573,20 @@ class LlamaData {
573573 return 0 ;
574574 }
575575#else
576- int download (const std::string &, const std::vector<std:: string> &, const std::string &, const bool ,
576+ int download (const std::string &, const std::string &, const bool , const std::vector<std:: string> & ,
577577 std::string * = nullptr ) {
578578 printe (" %s: llama.cpp built without libcurl, downloading from an url not supported.\n " , __func__);
579579 return 1 ;
580580 }
581581#endif
582582
583- int huggingface_dl (const std::string & model, const std::vector<std::string> headers, const std::string & bn) {
583+ int huggingface_dl (const std::string & model, const std::string & bn) {
584+ std::vector<std::string> headers = {};
585+ if (model.find (' /' ) != std::string::npos) {
586+ headers.push_back (" User-Agent: llama-cpp" );
587+ headers.push_back (" Accept: application/json" );
588+ }
589+
584590 // Find the second occurrence of '/' after protocol string
585591 size_t pos = model.find (' /' );
586592 pos = model.find (' /' , pos + 1 );
@@ -591,10 +597,12 @@ class LlamaData {
591597 const std::string hfr = model.substr (0 , pos);
592598 const std::string hff = model.substr (pos + 1 );
593599 const std::string url = " https://huggingface.co/" + hfr + " /resolve/main/" + hff;
594- return download (url, headers, bn, true );
600+ return download (url, bn, true , headers );
595601 }
596602
597- int ollama_dl (std::string & model, const std::vector<std::string> headers, const std::string & bn) {
603+ int ollama_dl (std::string & model, const std::string & bn) {
604+ const std::vector<std::string> headers = { " --header" ,
605+ " Accept: application/vnd.docker.distribution.manifest.v2+json" };
598606 if (model.find (' /' ) == std::string::npos) {
599607 model = " library/" + model;
600608 }
@@ -608,7 +616,7 @@ class LlamaData {
608616
609617 std::string manifest_url = " https://registry.ollama.ai/v2/" + model + " /manifests/" + model_tag;
610618 std::string manifest_str;
611- const int ret = download (manifest_url, headers, " " , false , &manifest_str);
619+ const int ret = download (manifest_url, " " , false , {} , &manifest_str);
612620 if (ret) {
613621 return ret;
614622 }
@@ -623,7 +631,7 @@ class LlamaData {
623631 }
624632
625633 std::string blob_url = " https://registry.ollama.ai/v2/" + model + " /blobs/" + layer;
626- return download (blob_url, headers, bn, true );
634+ return download (blob_url, bn, true , headers );
627635 }
628636
629637 std::string basename (const std::string & path) {
@@ -653,22 +661,18 @@ class LlamaData {
653661 return ret;
654662 }
655663
656- const std::string bn = basename (model_);
657- const std::vector<std::string> headers = { " --header" ,
658- " Accept: application/vnd.docker.distribution.manifest.v2+json" };
664+ const std::string bn = basename (model_);
659665 if (string_starts_with (model_, " hf://" ) || string_starts_with (model_, " huggingface://" )) {
660666 rm_until_substring (model_, " ://" );
661- ret = huggingface_dl (model_, headers, bn);
667+ ret = huggingface_dl (model_, bn);
662668 } else if (string_starts_with (model_, " hf.co/" )) {
663669 rm_until_substring (model_, " hf.co/" );
664- ret = huggingface_dl (model_, headers, bn);
665- } else if (string_starts_with (model_, " ollama://" )) {
666- rm_until_substring (model_, " ://" );
667- ret = ollama_dl (model_, headers, bn);
670+ ret = huggingface_dl (model_, bn);
668671 } else if (string_starts_with (model_, " https://" )) {
669- ret = download (model_, headers, bn, true );
670- } else {
671- ret = ollama_dl (model_, headers, bn);
672+ ret = download (model_, bn, true );
673+ } else { // ollama:// or nothing
674+ rm_until_substring (model_, " ://" );
675+ ret = ollama_dl (model_, bn);
672676 }
673677
674678 model_ = bn;
0 commit comments