#pragma once #include #include struct common_params_model; using common_header = std::pair; using common_header_list = std::vector; struct common_remote_params { common_header_list headers; long timeout = 0; // in seconds, 0 means no timeout long max_size = 0; // unlimited if 0 }; // get remote file content, returns std::pair> common_remote_get_content(const std::string & url, const common_remote_params & params); // split HF repo with tag into , for example: // - "ggml-org/models:F16" -> <"ggml-org/models", "F16"> // tag is optional and can be empty std::pair common_download_split_repo_tag(const std::string & hf_repo_with_tag); // Result of common_list_cached_models struct common_cached_model_info { std::string repo; std::string tag; std::string to_string() const { return repo + ":" + tag; } }; // Options for common_download_model struct common_download_model_opts { bool download_mmproj = false; bool offline = false; }; // Result of common_download_model struct common_download_model_result { std::string model_path; std::string mmproj_path; }; // Download model from HuggingFace repo or URL // // input (via model struct): // - model.hf_repo: HF repo with optional tag, see common_download_split_repo_tag // - model.hf_file: specific file in the repo (requires hf_repo) // - model.url: simple download (used if hf_repo is empty) // - model.path: local file path // // tag matching (for HF repos without model.hf_file): // - if tag is specified, searches for GGUF matching that quantization // - if no tag, searches for Q4_K_M, then Q4_0, then first available GGUF // // split GGUF: multi-part files like "model-00001-of-00003.gguf" are automatically // detected and all parts are downloaded // // caching: // - HF repos: uses HuggingFace cache // - URLs: uses ETag-based caching // // when opts.offline=true, no network requests are made // when download_mmproj=true, searches for mmproj in same directory as model or any parent directory // then with the closest quantization bits // // returns result with model_path and mmproj_path (empty on failure) common_download_model_result common_download_model( const common_params_model & model, const std::string & bearer_token, const common_download_model_opts & opts = {}, const common_header_list & headers = {} ); // returns list of cached models std::vector common_list_cached_models(); // download single file from url to local path // returns status code or -1 on error // skip_etag: if true, don't read/write .etag files (for HF cache where filename is the hash) int common_download_file_single(const std::string & url, const std::string & path, const std::string & bearer_token, bool offline, const common_header_list & headers = {}, bool skip_etag = false); // resolve and download model from Docker registry // return local path to downloaded model file std::string common_docker_resolve_model(const std::string & docker);