@@ -673,6 +673,39 @@ class LlamaData {
673673 return download (blob_url, bn, true , headers);
674674 }
675675
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 , end = 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+ return download (url, bn, true );
707+ }
708+
676709 std::string basename (const std::string & path) {
677710 const size_t pos = path.find_last_of (" /\\ " );
678711 if (pos == std::string::npos) {
@@ -707,8 +740,12 @@ class LlamaData {
707740 } else if (string_starts_with (model_, " hf.co/" )) {
708741 rm_until_substring (model_, " hf.co/" );
709742 ret = huggingface_dl (model_, bn);
710- } else if (string_starts_with (model_, " https://" )) {
743+ } else if (string_starts_with (model_, " https://" ) || string_starts_with (model_, " http:// " ) ) {
711744 ret = download (model_, bn, true );
745+ } else if (string_starts_with (model_, " github:" ) || string_starts_with (model_, " github://" )) {
746+ rm_until_substring (model_, " github://" );
747+ rm_until_substring (model_, " github:" );
748+ ret = github_dl (model_, bn);
712749 } else { // ollama:// or nothing
713750 rm_until_substring (model_, " ://" );
714751 ret = ollama_dl (model_, bn);
0 commit comments