You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.3 KiB
190 lines
5.3 KiB
import requests
|
|
import datetime
|
|
from typing import List, Dict, Tuple
|
|
from loguru import logger
|
|
from swarms import Agent
|
|
from swarm_models import OpenAIChat
|
|
|
|
# GitHub API Configurations
|
|
GITHUB_REPO = "kyegomez/swarms" # Swarms GitHub repository
|
|
GITHUB_API_URL = f"https://api.github.com/repos/{GITHUB_REPO}/commits"
|
|
|
|
# Initialize Loguru
|
|
logger.add(
|
|
"commit_summary.log",
|
|
rotation="1 MB",
|
|
level="INFO",
|
|
backtrace=True,
|
|
diagnose=True,
|
|
)
|
|
|
|
|
|
# Step 1: Fetch the latest commits from GitHub
|
|
def fetch_latest_commits(
|
|
repo_url: str, limit: int = 5
|
|
) -> List[Dict[str, str]]:
|
|
"""
|
|
Fetch the latest commits from a public GitHub repository.
|
|
"""
|
|
logger.info(
|
|
f"Fetching the latest {limit} commits from {repo_url}"
|
|
)
|
|
try:
|
|
params = {"per_page": limit}
|
|
response = requests.get(repo_url, params=params)
|
|
response.raise_for_status()
|
|
|
|
commits = response.json()
|
|
commit_data = []
|
|
|
|
for commit in commits:
|
|
commit_data.append(
|
|
{
|
|
"sha": commit["sha"][:7], # Short commit hash
|
|
"author": commit["commit"]["author"]["name"],
|
|
"message": commit["commit"]["message"],
|
|
"date": commit["commit"]["author"]["date"],
|
|
}
|
|
)
|
|
|
|
logger.success("Successfully fetched commit data")
|
|
return commit_data
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error fetching commits: {e}")
|
|
raise
|
|
|
|
|
|
# Step 2: Format commits and fetch current time
|
|
def format_commits_with_time(
|
|
commits: List[Dict[str, str]]
|
|
) -> Tuple[str, str]:
|
|
"""
|
|
Format commit data into a readable string and return current time.
|
|
"""
|
|
current_time = datetime.datetime.now().strftime(
|
|
"%Y-%m-%d %H:%M:%S"
|
|
)
|
|
logger.info(f"Formatting commits at {current_time}")
|
|
|
|
commit_summary = "\n".join(
|
|
[
|
|
f"- `{commit['sha']}` by {commit['author']} on {commit['date']}: {commit['message']}"
|
|
for commit in commits
|
|
]
|
|
)
|
|
|
|
logger.success("Commits formatted successfully")
|
|
return current_time, commit_summary
|
|
|
|
|
|
# Step 3: Build a dynamic system prompt
|
|
def build_custom_system_prompt(
|
|
current_time: str, commit_summary: str
|
|
) -> str:
|
|
"""
|
|
Build a dynamic system prompt with the current time and commit summary.
|
|
"""
|
|
logger.info("Building the custom system prompt for the agent")
|
|
prompt = f"""
|
|
You are a software analyst tasked with summarizing the latest commits from the Swarms GitHub repository.
|
|
|
|
The current time is **{current_time}**.
|
|
|
|
Here are the latest commits:
|
|
{commit_summary}
|
|
|
|
**Your task**:
|
|
1. Summarize the changes into a clear and concise table in **markdown format**.
|
|
2. Highlight the key improvements and fixes.
|
|
3. End your output with the token `<DONE>`.
|
|
|
|
Make sure the table includes the following columns: Commit SHA, Author, Date, and Commit Message.
|
|
"""
|
|
logger.success("System prompt created successfully")
|
|
return prompt
|
|
|
|
|
|
# Step 4: Initialize the Agent
|
|
def initialize_agent() -> Agent:
|
|
"""
|
|
Initialize the Swarms agent with OpenAI model.
|
|
"""
|
|
logger.info("Initializing the agent with GPT-4o")
|
|
model = OpenAIChat(model_name="gpt-4o")
|
|
|
|
agent = Agent(
|
|
agent_name="Commit-Summarization-Agent",
|
|
agent_description="Fetch and summarize GitHub commits for Swarms repository.",
|
|
system_prompt="", # Will set dynamically
|
|
max_loops=1,
|
|
llm=model,
|
|
dynamic_temperature_enabled=True,
|
|
user_name="Kye",
|
|
retry_attempts=3,
|
|
context_length=8192,
|
|
return_step_meta=False,
|
|
output_type="str",
|
|
auto_generate_prompt=False,
|
|
max_tokens=4000,
|
|
stopping_token="<DONE>",
|
|
interactive=False,
|
|
)
|
|
logger.success("Agent initialized successfully")
|
|
return agent
|
|
|
|
|
|
# Step 5: Run the Agent with Data
|
|
def summarize_commits_with_agent(agent: Agent, prompt: str) -> str:
|
|
"""
|
|
Pass the system prompt to the agent and fetch the result.
|
|
"""
|
|
logger.info("Sending data to the agent for summarization")
|
|
try:
|
|
result = agent.run(
|
|
f"{prompt}",
|
|
all_cores=True,
|
|
)
|
|
logger.success("Agent completed the summarization task")
|
|
return result
|
|
except Exception as e:
|
|
logger.error(f"Agent encountered an error: {e}")
|
|
raise
|
|
|
|
|
|
# Main Execution
|
|
if __name__ == "__main__":
|
|
try:
|
|
logger.info("Starting commit summarization process")
|
|
|
|
# Fetch latest commits
|
|
latest_commits = fetch_latest_commits(GITHUB_API_URL, limit=5)
|
|
|
|
# Format commits and get current time
|
|
current_time, commit_summary = format_commits_with_time(
|
|
latest_commits
|
|
)
|
|
|
|
# Build the custom system prompt
|
|
custom_system_prompt = build_custom_system_prompt(
|
|
current_time, commit_summary
|
|
)
|
|
|
|
# Initialize agent
|
|
agent = initialize_agent()
|
|
|
|
# Set the dynamic system prompt
|
|
agent.system_prompt = custom_system_prompt
|
|
|
|
# Run the agent and summarize commits
|
|
result = summarize_commits_with_agent(
|
|
agent, custom_system_prompt
|
|
)
|
|
|
|
# Print the result
|
|
print("### Commit Summary in Markdown:")
|
|
print(result)
|
|
|
|
except Exception as e:
|
|
logger.critical(f"Process failed: {e}")
|