|
import gradio as gr |
|
import google.generativeai as genai |
|
from github import Github |
|
import gitlab |
|
import requests |
|
import tempfile |
|
import docx |
|
|
|
def generate_guide(git_provider, repo_url, personal_access_token, gemini_api_key, guide_type): |
|
try: |
|
if git_provider == "GitHub": |
|
g = Github(personal_access_token) |
|
repo = g.get_repo(repo_url) |
|
content = repo.get_contents("") |
|
file_contents = "" |
|
for file in content: |
|
if file.name.endswith('.py'): |
|
file_contents += f"\n\n{file.name}:\n{file.decoded_content.decode()}" |
|
elif git_provider == "GitLab": |
|
gl = gitlab.Gitlab(url='https://gitlab.com', private_token=personal_access_token) |
|
project = gl.projects.get(repo_url) |
|
items = project.repository_tree(recursive=True) |
|
file_contents = "" |
|
for item in items: |
|
if item['type'] == 'blob' and item['name'].endswith('.py'): |
|
file_content = project.files.get(item['path'], ref='main') |
|
file_contents += f"\n\n{item['name']}:\n{file_content.decode().decode()}" |
|
elif git_provider == "Gitea": |
|
base_url = "https://gitea.com/api/v1" |
|
headers = {"Authorization": f"token {personal_access_token}"} |
|
response = requests.get(f"{base_url}/repos/{repo_url}/contents", headers=headers) |
|
response.raise_for_status() |
|
file_contents = "" |
|
for item in response.json(): |
|
if item['type'] == 'file' and item['name'].endswith('.py'): |
|
file_content = requests.get(item['download_url']).text |
|
file_contents += f"\n\n{item['name']}:\n{file_content}" |
|
else: |
|
return "Unsupported Git provider", None, None |
|
|
|
genai.configure(api_key=gemini_api_key) |
|
model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25') |
|
|
|
if guide_type == "User Guide": |
|
prompt = f"""Based on the following Python code, generate a comprehensive user guide: |
|
|
|
{file_contents} |
|
|
|
Please organize the user guide into sections such as: |
|
1. Introduction |
|
2. Getting Started |
|
3. Features and Functionality |
|
4. How to Use |
|
5. Tips and Best Practices |
|
6. Troubleshooting |
|
7. FAQ |
|
|
|
For each section, provide step-by-step instructions on how to use the software's features. |
|
Explain each functionality that the end user will interact with. |
|
Include examples where appropriate. |
|
|
|
Important formatting instructions: |
|
- The output should be in plain text |
|
- Use clear section titles |
|
- Number each step within sections |
|
- Provide clear, concise instructions for each step |
|
- Explain the purpose and benefit of each feature for non-technical users |
|
- Do not include any installation or configuration instructions |
|
""" |
|
else: |
|
prompt = f"""Based on the following Python code, generate a comprehensive administration guide: |
|
|
|
{file_contents} |
|
|
|
Please organize the administration guide into sections such as: |
|
1. System Overview |
|
2. Security and Access Control |
|
3. Performance Monitoring and Optimization |
|
4. Backup and Recovery |
|
5. Troubleshooting and Maintenance |
|
6. Customization and Configuration |
|
7. Best Practices for Administrators |
|
|
|
For each section, provide detailed information and step-by-step instructions for system administrators. |
|
Focus on backend operations, system management, and advanced configurations. |
|
Include examples and potential scenarios an administrator might encounter. |
|
|
|
Important formatting instructions: |
|
- The output should be in plain text |
|
- Use clear section titles |
|
- Number each step within sections |
|
- Provide clear, concise instructions for each step |
|
- Explain the purpose and implications of each administrative task |
|
- Include any relevant security considerations |
|
""" |
|
|
|
response = model.generate_content(prompt) |
|
guide = response.text |
|
|
|
|
|
doc = docx.Document() |
|
doc.add_heading(guide_type, 0) |
|
|
|
for line in guide.split('\n'): |
|
line = line.strip() |
|
if line.endswith(':'): |
|
doc.add_heading(line, level=1) |
|
elif line.startswith('Step'): |
|
doc.add_paragraph(line, style='List Number') |
|
else: |
|
doc.add_paragraph(line) |
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix='.docx') as temp_docx: |
|
doc.save(temp_docx.name) |
|
docx_path = temp_docx.name |
|
|
|
|
|
markdown_content = f"# {guide_type}\n\n" |
|
for line in guide.split('\n'): |
|
line = line.strip() |
|
if line.endswith(':'): |
|
markdown_content += f"\n## {line}\n\n" |
|
elif line.startswith('Step'): |
|
markdown_content += f"1. {line[5:]}\n" |
|
else: |
|
markdown_content += f"{line}\n" |
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix='.md', mode='w', encoding='utf-8') as temp_md: |
|
temp_md.write(markdown_content) |
|
md_path = temp_md.name |
|
|
|
return guide, docx_path, md_path |
|
|
|
except Exception as e: |
|
return f"An error occurred: {str(e)}", None, None |
|
|
|
iface = gr.Interface( |
|
fn=generate_guide, |
|
inputs=[ |
|
gr.Dropdown( |
|
choices=["GitHub", "GitLab", "Gitea"], |
|
label="Git Provider" |
|
), |
|
gr.Textbox(label="Repository URL", placeholder="owner/repo"), |
|
gr.Textbox(label="Personal Access Token", type="password"), |
|
gr.Textbox(label="Gemini API Key", type="password"), |
|
gr.Radio(["User Guide", "Administration Guide"], label="Guide Type") |
|
], |
|
outputs=[ |
|
gr.Textbox(label="Generated Guide"), |
|
gr.File(label="Download Guide (DOCX)"), |
|
gr.File(label="Download Guide (Markdown)") |
|
], |
|
title="Automated Guide Generator", |
|
description="Generate a user guide or administration guide based on the Python code in a Git repository using Gemini AI. Select a Git provider, enter repository details, choose the guide type, and let AI create a comprehensive guide.", |
|
allow_flagging="never", |
|
theme="default", |
|
analytics_enabled=False, |
|
) |
|
|
|
iface.launch() |