| | import gradio as gr |
| | from datetime import datetime, timedelta |
| | import google.generativeai as genai |
| | from github import Github, GithubException |
| | import docx |
| | import re |
| |
|
| | def generate_release_notes(github_repo, github_token, gemini_api_key, start_date, end_date): |
| | try: |
| | g = Github(github_token) |
| | |
| | repo = g.get_repo(github_repo) |
| | |
| | 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 a single bullet point (•) followed by a space |
| | - Do not use multiple bullet points or numbers for a single item |
| | - 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'): |
| | line = line.strip() |
| | if line.endswith(':'): |
| | doc.add_heading(line, level=1) |
| | elif line.startswith('•'): |
| | |
| | cleaned_line = re.sub(r'^•+\s*', '• ', line) |
| | doc.add_paragraph(cleaned_line, style='List Bullet') |
| | elif line: |
| | 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 repository name. Attempted to access: {github_repo}", 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() |