bluenevus's picture
Update app.py
e522fcf verified
raw
history blame
4.62 kB
import gradio as gr
import google.generativeai as genai
import paramiko
import io
def fetch_github_file(github_url, ssh_private_key):
try:
# Parse the GitHub URL
parts = github_url.split(':')[1].split('/')
owner = parts[0]
repo = parts[1].split('.git')[0]
branch = 'main' # You might want to make this configurable
file_path = '' # You might want to make this configurable
# Set up SSH client
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# Clean and format the SSH key
#ssh_private_key = '\n'.join(line.strip() for line in ssh_private_key.split('\n') if line.strip())
#if not ssh_private_key.startswith("-----BEGIN"):
# ssh_private_key = f"-----BEGIN OPENSSH PRIVATE KEY-----\n{ssh_private_key}\n-----END OPENSSH PRIVATE KEY-----"
# Format the SSH key
formatted_key = ssh_private_key.strip()
if not formatted_key.startswith("-----BEGIN"):
formatted_key = f"-----BEGIN OPENSSH PRIVATE KEY-----\n{formatted_key}\n-----END OPENSSH PRIVATE KEY-----"
# Load the private key
private_key = paramiko.RSAKey.from_private_key(io.StringIO(formatted_key))
# Connect to GitHub using SSH
ssh.connect('github.com', username='git', pkey=private_key)
# Construct the git command to fetch the file content
git_command = f"git archive [email protected]:{owner}/{repo}.git {branch} {file_path} | tar -xO"
# Execute the command
stdin, stdout, stderr = ssh.exec_command(git_command)
# Read the file content
file_content = stdout.read().decode('utf-8')
# Close the SSH connection
ssh.close()
if not file_content:
return "Error: File not found or empty."
return file_content
except paramiko.AuthenticationException:
return "Error: Authentication failed. Please check your SSH key."
except paramiko.SSHException as ssh_err:
return f"SSH Error: {str(ssh_err)}"
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("[email protected]:"):
return "Error: Invalid GitHub URL. Please use the format: [email protected]:username/repository.git"
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.TextArea(label="SSH Private Key (required if using GitHub URL)", lines=12),
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 repository URL to analyze open-source licenses.",
)
if __name__ == "__main__":
iface.launch()