| import gradio as gr | |
| from datetime import datetime, timedelta | |
| import google.generativeai as genai | |
| from github import Github, GithubException | |
| import docx | |
| def generate_release_notes(github_url, github_token, gemini_api_key, start_date, end_date): | |
| try: | |
| g = Github(github_token) | |
| repo = g.get_repo(github_url) | |
| start_date = datetime.strptime(start_date, "%Y-%m-%d") | |
| end_date = datetime.strptime(end_date, "%Y-%m-%d") | |
| commits = list(repo.get_commits(since=start_date, until=end_date)) | |
| commit_messages = [commit.commit.message for commit in commits] | |
| commit_text = "\n".join(commit_messages) | |
| if not commit_text: | |
| return "No commits found in the specified date range.", None | |
| genai.configure(api_key=gemini_api_key) | |
| model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25') | |
| prompt = f"""Based on the following commit messages, generate comprehensive release notes: | |
| {commit_text} | |
| Please organize the release notes into sections such as: | |
| 1. New Features | |
| 2. Bug Fixes | |
| 3. Improvements | |
| 4. Breaking Changes (if any) | |
| Provide a concise summary for each item. Do not include any links, but keep issue numbers if present. | |
| Important formatting instructions: | |
| - Do not use any Markdown syntax (*, #, `, etc.) | |
| - Use plain text only | |
| - For section headers, simply use the text as is (e.g., "New Features:") | |
| - For list items, use simple numbers or bullet points (•) followed by a space | |
| - Keep the text structure simple and easy to convert to a Word document format | |
| """ | |
| response = model.generate_content(prompt) | |
| release_notes = response.text | |
| doc = docx.Document() | |
| doc.add_heading('Release Notes', 0) | |
| for line in release_notes.split('\n'): | |
| if line.strip().endswith(':'): | |
| doc.add_heading(line.strip(), level=1) | |
| elif line.strip().startswith('•') or line.strip()[0].isdigit(): | |
| doc.add_paragraph(line.strip(), style='List Bullet') | |
| else: | |
| doc.add_paragraph(line) | |
| temp_file = "release_notes.docx" | |
| doc.save(temp_file) | |
| return release_notes, temp_file | |
| except GithubException as e: | |
| if e.status == 401: | |
| return "Error: Invalid GitHub token or insufficient permissions.", None | |
| elif e.status == 404: | |
| return f"Error: Repository not found. Please check the GitHub URL. Attempted to access: {github_url}", None | |
| else: | |
| return f"GitHub API error: {str(e)}", None | |
| except Exception as e: | |
| return f"An error occurred: {str(e)}", None | |
| default_end_date = datetime.now() | |
| default_start_date = default_end_date - timedelta(days=30) | |
| iface = gr.Interface( | |
| fn=generate_release_notes, | |
| inputs=[ | |
| gr.Textbox(label="GitHub Repository Name", placeholder="MicroHealthLLC/maiko-assistant"), | |
| gr.Textbox(label="GitHub Personal Access Token", type="password"), | |
| gr.Textbox(label="Gemini API Key", type="password"), | |
| gr.Textbox( | |
| label="Start Date", | |
| placeholder="YYYY-MM-DD", | |
| value=default_start_date.strftime("%Y-%m-%d"), | |
| ), | |
| gr.Textbox( | |
| label="End Date", | |
| placeholder="YYYY-MM-DD", | |
| value=default_end_date.strftime("%Y-%m-%d"), | |
| ) | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="Generated Release Notes"), | |
| gr.File(label="Download Release Notes") | |
| ], | |
| title="Automated Release Notes Generator", | |
| description="Generate release notes based on GitHub commits using Gemini AI. Enter start and end dates (YYYY-MM-DD) to define the time range for commits.", | |
| allow_flagging="never", | |
| theme="default", | |
| analytics_enabled=False, | |
| ) | |
| iface.launch() |