module HuggingfaceModels
Hugging Face Hub model list/search API helpers (no IRC).
Constants
- DEFAULT_LIMIT
- MODELS_URL
- RECOMMEND_SECTIONS
Public Instance Methods
Source
# File lib/huggingface_models.rb, line 19 def account_ready_for_recommend?(account) return false unless account.is_a?(Hash) return false if account["token"].to_s.strip.empty? HuggingfaceHardware.hardware_label(account["hardware"]) end
Source
# File lib/huggingface_models.rb, line 33 def build_models_url(query: nil, moderation: nil, vram_gb: nil, limit: DEFAULT_LIMIT, sort: "downloads") filters = [] filters << censorship_filter(moderation) if moderation filters << "gguf" if vram_gb params = { limit: limit.to_i, sort: sort, direction: -1 } search = query.to_s.strip params[:search] = search unless search.empty? params[:filter] = filters.join(",") unless filters.empty? num_parameters = HuggingfaceHardware.vram_to_num_parameters(vram_gb) params[:num_parameters] = num_parameters if num_parameters query_string = params.map { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join("&") "#{MODELS_URL}?#{query_string}" end
Source
# File lib/huggingface_models.rb, line 64 def build_recommend_url(vram_gb:, sort:, limit: DEFAULT_LIMIT) build_models_url(vram_gb: vram_gb, limit: limit, sort: sort) end
Source
# File lib/huggingface_models.rb, line 54 def build_search_url(query:, moderation: nil, vram_gb: nil, limit: DEFAULT_LIMIT) build_models_url( query: query, moderation: moderation, vram_gb: vram_gb, limit: limit, sort: "downloads" ) end
Source
# File lib/huggingface_models.rb, line 26 def censorship_filter(moderation) case moderation when :censored then "not-for-all-audiences" when :uncensored then "uncensored" end end
Source
# File lib/huggingface_models.rb, line 104 def fetch_recommendations(vram_gb:, token: nil, limit: DEFAULT_LIMIT, fetch:) RECOMMEND_SECTIONS.transform_values do |sort| url = build_recommend_url(vram_gb: vram_gb, sort: sort, limit: limit) body = fetch.call(url, token: token) parse_models(body) rescue StandardError [] end end
Source
# File lib/huggingface_models.rb, line 82 def format_model_line(model, index: nil) prefix = index ? "#{index}. " : "" downloads = model[:downloads].to_i downloads_text = if downloads.positive? "#{downloads.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse} downloads" else "no downloads yet" end task = model[:pipeline_tag].to_s.strip meta = [downloads_text] meta << task unless task.empty? "#{prefix}#{model[:id]} โ #{meta.join(' ยท ')}" end
Source
# File lib/huggingface_models.rb, line 68 def parse_models(data) payload = data.is_a?(String) ? JSON.parse(data) : data Array(payload).map do |entry| { id: (entry["modelId"] || entry["id"]).to_s, downloads: entry["downloads"].to_i, pipeline_tag: entry["pipeline_tag"].to_s, tags: Array(entry["tags"]).map(&:to_s) } end rescue JSON::ParserError [] end
Source
# File lib/huggingface_models.rb, line 96 def search_models(query:, moderation: nil, vram_gb: nil, token: nil, limit: DEFAULT_LIMIT, fetch:) url = build_search_url(query: query, moderation: moderation, vram_gb: vram_gb, limit: limit) body = fetch.call(url, token: token) parse_models(body) rescue StandardError [] end