Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import requests | |
| import json | |
| import shutil | |
| from huggingface_hub import HfApi, create_repo | |
| from typing import Union | |
| def download_file(media_type, digest, image): | |
| url = f"https://registry.ollama.ai/v2/library/{image}/blobs/{digest}" | |
| f_tag = media_type.split('.')[-1] | |
| if f_tag == "model": | |
| f_tag = "model.gguf" | |
| file_name = f"blobs/{f_tag}" | |
| # Create the directory if it doesn't exist | |
| os.makedirs(os.path.dirname(file_name), exist_ok=True) | |
| # Download the file | |
| print(f"Downloading {url} to {file_name}") | |
| response = requests.get(url, allow_redirects=True) | |
| if response.status_code == 200: | |
| with open(file_name, 'wb') as f: | |
| f.write(response.content) | |
| else: | |
| print(f"Failed to download {url}") | |
| def fetch_manifest(image, tag): | |
| manifest_url = f"https://registry.ollama.ai/v2/library/{image}/manifests/{tag}" | |
| response = requests.get(manifest_url) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| return None | |
| def upload_to_huggingface(repo_id, folder_path, oauth_token: Union[gr.OAuthToken, None]): | |
| token = oauth_token.token if oauth_token else None | |
| api = HfApi(token=token) | |
| repo_path = api.create_repo(repo_id=repo_id, repo_type="model", exist_ok=True) | |
| print(f"Repo created {repo_path}") | |
| try: | |
| api.upload_folder( | |
| folder_path=folder_path, | |
| repo_id=repo_id, | |
| repo_type="model", | |
| ) | |
| return "Upload successful", repo_path | |
| except Exception as e: | |
| return f"Upload failed: {str(e)}" | |
| def process_image_tag(image_tag, repo_id, oauth_token: Union[gr.OAuthToken, None]): | |
| try: | |
| # Extract image and tag from the input | |
| image, tag = image_tag.split(':') | |
| # Fetch the manifest JSON | |
| manifest_json = fetch_manifest(image, tag) | |
| if not manifest_json or 'errors' in manifest_json: | |
| return f"Failed to fetch the manifest for {image}:{tag}" | |
| # Save the manifest JSON to the blobs folder | |
| manifest_file_path = "blobs/manifest" | |
| os.makedirs(os.path.dirname(manifest_file_path), exist_ok=True) | |
| with open(manifest_file_path, 'w') as f: | |
| json.dump(manifest_json, f) | |
| # Extract the mediaType and digest values from the JSON | |
| layers = manifest_json.get('layers', []) | |
| for layer in layers: | |
| media_type = layer['mediaType'] | |
| digest = layer['digest'] | |
| download_file(media_type, digest, image) | |
| # Download the config file | |
| config_media_type = manifest_json.get('config', {}).get('mediaType') | |
| config_digest = manifest_json.get('config', {}).get('digest') | |
| if config_media_type and config_digest: | |
| download_file(config_media_type, config_digest, image) | |
| # Upload to Hugging Face Hub | |
| upload_result, repo_path = upload_to_huggingface(repo_id, 'blobs', oauth_token) | |
| # Delete the blobs folder | |
| shutil.rmtree('blobs') | |
| return (f'Find your repo <a href=\'{repo_path}\' target="_blank" style="text-decoration:underline">here</a>', "dramallama.jpg") | |
| except Exception as e: | |
| shutil.rmtree('blobs', ignore_errors=True) | |
| return (f"We got an error, my dude, here's what the error looks like: {str(e)}", "madllama.jpg") | |
| # Create the Gradio interface using gr.Blocks | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Ollama <> HF Hub 🤝") | |
| gr.Markdown("Enter the image and tag to download the corresponding files from the Ollama registry and upload them to the Hugging Face Hub.") | |
| gr.LoginButton() | |
| image_tag_input = gr.Textbox(placeholder="Enter Ollama ID", label="Image and Tag") | |
| repo_id_input = gr.Textbox(placeholder="Enter Hugging Face repo ID", label="Hugging Face Repo ID") | |
| result_output = gr.Markdown(label="Result") | |
| result_image = gr.Image(show_label=False) | |
| process_button = gr.Button("Process") | |
| process_button.click(fn=process_image_tag, inputs=[image_tag_input, repo_id_input], outputs=[result_output, result_image]) | |
| # Launch the Gradio app | |
| demo.launch() |