import gradio as gr import requests import json import paramiko import os import google.generativeai as genai def fetch_github_file(github_url, ssh_private_key): try: # Parse the GitHub URL parts = github_url.split('/') owner = parts[3] repo = parts[4] branch = parts[6] file_path = '/'.join(parts[7:]) # Set up SSH client ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Create a temporary file to store the SSH private key with open('temp_key', 'w') as key_file: key_file.write(ssh_private_key) # Connect to GitHub using SSH ssh.connect('github.com', username='git', key_filename='temp_key') # Execute git command to fetch file content stdin, stdout, stderr = ssh.exec_command(f"git archive --remote=git@github.com:{owner}/{repo}.git {branch} {file_path} | tar -xO") file_content = stdout.read().decode('utf-8') # Close SSH connection and remove temporary key file ssh.close() os.remove('temp_key') if not file_content: return "Error: File not found or empty." return file_content except Exception as e: return f"Error accessing GitHub: {str(e)}" def process_with_gemini(file_content, gemini_api_key): genai.configure(api_key=gemini_api_key) model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25') prompt = f""" Analyze the following file content for open-source license information: {file_content} Please provide: 1. A list of dependencies and their versions 2. The licenses associated with each dependency (if available) 3. A summary of the project based on these dependencies 4. Any potential license conflicts or considerations 5. Suggestions for best practices in open-source license management for this project """ response = model.generate_content(prompt) return response.text def process_input(file, github_url, ssh_private_key, gemini_api_key): if file is not None and github_url: return "Error: Please either upload a file OR provide a GitHub URL, not both." if file is not None: file_content = file.decode('utf-8') elif github_url and ssh_private_key: if not github_url.startswith("https://github.com/"): return "Error: Invalid GitHub URL. Please use the format: https://github.com/username/repository/blob/branch/path/to/file" if not ssh_private_key.strip(): return "Error: SSH Private Key is empty. Please provide a valid key." file_content = fetch_github_file(github_url, ssh_private_key) if file_content.startswith("Error:"): return file_content else: return "Error: Please either upload a file OR provide both GitHub URL and SSH Private Key." try: # Process the file content with Gemini analysis = process_with_gemini(file_content, gemini_api_key) return analysis except Exception as e: return f"Error processing the file: {str(e)}" iface = gr.Interface( fn=process_input, inputs=[ gr.File(label="Upload dependency file (e.g., requirements.txt, package.json, Gemfile)"), gr.Textbox(label="GitHub File URL (optional)"), gr.Textbox(label="SSH Private Key (required if using GitHub URL)", type="password"), gr.Textbox(label="Gemini API Key", type="password"), ], outputs=gr.Textbox(label="License Information and Analysis"), title="Open Source License Extractor", description="Upload a dependency file OR provide a GitHub file URL to extract and analyze open-source license information.", ) if __name__ == "__main__": iface.launch()