@@ -673,6 +673,40 @@ class LlamaData {
673
673
return download (blob_url, bn, true , headers);
674
674
}
675
675
676
+ int github_dl (const std::string & model, const std::string & bn) {
677
+ std::string repository = model;
678
+ std::string branch = " main" ;
679
+ size_t at_pos = model.find (' @' );
680
+ if (at_pos != std::string::npos) {
681
+ repository = model.substr (0 , at_pos);
682
+ branch = model.substr (at_pos + 1 );
683
+ }
684
+
685
+ std::vector<std::string> repo_parts;
686
+ size_t start = 0 ;
687
+ for (size_t end = 0 ; (end = repository.find (' /' , start)) != std::string::npos; start = end + 1 ) {
688
+ repo_parts.push_back (repository.substr (start, end - start));
689
+ }
690
+
691
+ repo_parts.push_back (repository.substr (start));
692
+ if (repo_parts.size () < 3 ) {
693
+ printe (" Invalid GitHub repository format\n " );
694
+ return 1 ;
695
+ }
696
+
697
+ const std::string org = repo_parts[0 ];
698
+ const std::string project = repo_parts[1 ];
699
+ std::string project_path = repo_parts[2 ];
700
+ for (size_t i = 3 ; i < repo_parts.size (); ++i) {
701
+ project_path += " /" + repo_parts[i];
702
+ }
703
+
704
+ const std::string url =
705
+ " https://raw.githubusercontent.com/" + org + " /" + project + " /" + branch + " /" + project_path;
706
+
707
+ return download (url, bn, true );
708
+ }
709
+
676
710
std::string basename (const std::string & path) {
677
711
const size_t pos = path.find_last_of (" /\\ " );
678
712
if (pos == std::string::npos) {
@@ -707,8 +741,12 @@ class LlamaData {
707
741
} else if (string_starts_with (model_, " hf.co/" )) {
708
742
rm_until_substring (model_, " hf.co/" );
709
743
ret = huggingface_dl (model_, bn);
710
- } else if (string_starts_with (model_, " https://" )) {
744
+ } else if (string_starts_with (model_, " https://" ) || string_starts_with (model_, " http:// " ) ) {
711
745
ret = download (model_, bn, true );
746
+ } else if (string_starts_with (model_, " github:" ) || string_starts_with (model_, " github://" )) {
747
+ rm_until_substring (model_, " github://" );
748
+ rm_until_substring (model_, " github:" );
749
+ ret = github_dl (model_, bn);
712
750
} else { // ollama:// or nothing
713
751
rm_until_substring (model_, " ://" );
714
752
ret = ollama_dl (model_, bn);
0 commit comments