Spaces:
Runtime error
Runtime error
| import requests | |
| import json | |
| import os | |
| import struct | |
| import argparse | |
| def make_request(url, params=None): | |
| print(f"Making request to {url}...") | |
| response = requests.get(url, params=params) | |
| if response.status_code == 200: | |
| return json.loads(response.text) | |
| else: | |
| print(f"Request failed with status code {response.status_code}") | |
| return None | |
| def check_magic_and_version(filename): | |
| with open(filename, 'rb') as f: | |
| # Read the first 6 bytes from the file | |
| data = f.read(6) | |
| # Unpack the binary data, interpreting the first 4 bytes as a little-endian unsigned int | |
| # and the next 2 bytes as a little-endian unsigned short | |
| magic, version = struct.unpack('<I H', data) | |
| print(f"magic: 0x{magic:08x}, version: 0x{version:04x}, file: {filename}") | |
| return magic, version | |
| def download_file(url, destination): | |
| print(f"Downloading {url} to {destination}...") | |
| response = requests.get(url, stream=True) | |
| if response.status_code == 200: | |
| with open(destination, 'wb') as f: | |
| total_downloaded = 0 | |
| for chunk in response.iter_content(chunk_size=1024): | |
| if chunk: # filter out keep-alive new chunks | |
| f.write(chunk) | |
| total_downloaded += len(chunk) | |
| if total_downloaded >= 10485760: # 10 MB | |
| print('.', end='', flush=True) | |
| total_downloaded = 0 | |
| print("\nDownload complete.") | |
| # Creating a symbolic link from destination to "model.bin" | |
| if os.path.isfile("model.bin"): | |
| os.remove("model.bin") # remove the existing link if any | |
| os.symlink(destination, "model.bin") | |
| else: | |
| print(f"Download failed with status code {response.status_code}") | |
| def get_user_choice(model_list): | |
| # Print the enumerated list | |
| print("\n") | |
| for i, (model_id, rfilename) in enumerate(model_list): | |
| print(f"{i+1}: Model ID: {model_id}, RFilename: {rfilename}") | |
| # Get user's choice | |
| choice = input("Choose a model to download by entering the corresponding number: ") | |
| try: | |
| index = int(choice) - 1 | |
| if 0 <= index < len(model_list): | |
| # Return the chosen model | |
| return model_list[index] | |
| else: | |
| print("Invalid choice.") | |
| except ValueError: | |
| print("Invalid input. Please enter a number corresponding to a model.") | |
| except IndexError: | |
| print("Invalid choice. Index out of range.") | |
| return None | |
| def main(): | |
| # Create an argument parser | |
| parser = argparse.ArgumentParser(description='Process some parameters.') | |
| # Arguments | |
| parser.add_argument('-v', '--version', type=int, default=0x0003, | |
| help='hexadecimal version number of ggml file') | |
| parser.add_argument('-a', '--author', type=str, default='TheBloke', | |
| help='HuggingFace author filter') | |
| parser.add_argument('-t', '--tag', type=str, default='llama', | |
| help='HuggingFace tag filter') | |
| parser.add_argument('-s', '--search', type=str, default='', | |
| help='HuggingFace search filter') | |
| parser.add_argument('-f', '--filename', type=str, default='q5_1', | |
| help='HuggingFace model repository filename substring match') | |
| # Parse the arguments | |
| args = parser.parse_args() | |
| # Define the parameters | |
| params = { | |
| "author": args.author, | |
| "tags": args.tag, | |
| "search": args.search | |
| } | |
| models = make_request('https://huggingface.co/api/models', params=params) | |
| if models is None: | |
| return | |
| model_list = [] | |
| # Iterate over the models | |
| for model in models: | |
| model_id = model['id'] | |
| model_info = make_request(f'https://huggingface.co/api/models/{model_id}') | |
| if model_info is None: | |
| continue | |
| for sibling in model_info.get('siblings', []): | |
| rfilename = sibling.get('rfilename') | |
| if rfilename and args.filename in rfilename: | |
| model_list.append((model_id, rfilename)) | |
| # Choose the model | |
| model_list.sort(key=lambda x: x[0]) | |
| if len(model_list) == 0: | |
| print("No models found") | |
| exit(1) | |
| elif len(model_list) == 1: | |
| model_choice = model_list[0] | |
| else: | |
| model_choice = get_user_choice(model_list) | |
| if model_choice is not None: | |
| model_id, rfilename = model_choice | |
| url = f"https://huggingface.co/{model_id}/resolve/main/{rfilename}" | |
| dest = f"{model_id.replace('/', '_')}_{rfilename}" | |
| download_file(url, dest) | |
| _, version = check_magic_and_version(dest) | |
| if version != args.version: | |
| print(f"Warning: Expected version {args.version}, but found different version in the file.") | |
| else: | |
| print("Error - model choice was None") | |
| exit(2) | |
| if __name__ == '__main__': | |
| main() | |