This is a continuation of the previous article1.
Supporting code snippets:
1. Fetch_issues.py:
import requests, os, json
from datetime import datetime, timedelta
repo = os.environ["GITHUB_REPOSITORY"]
token = os.environ["GH_TOKEN"]
since = (datetime.utcnow() - timedelta(days=30)).isoformat()
url = f"https://api.github.com/repos/{repo}/issues?state=all&since={since}"
headers = {"Authorization": f"token {token}"}
issues = requests.get(url, headers=headers).json()
print(json.dumps(issues, indent=2))
2. embed_and_cluster.py:
import json, os
import numpy as np
from sklearn.cluster import KMeans
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-02-15-preview"
)
issues = json.load(open("issues.json"))
texts = [i["title"] + "\n" + i.get("body", "") for i in issues]
embeddings = []
for t in texts:
e = client.embeddings.create(
model="text-embedding-3-large",
input=t
).data[0].embedding
embeddings.append(e)
X = np.array(embeddings)
kmeans = KMeans(n_clusters=5, random_state=42).fit(X)
labels = kmeans.labels_
clusters = {}
for label, issue in zip(labels, issues):
clusters.setdefault(int(label), []).append(issue)
print(json.dumps(clusters, indent=2))
3. generate_report.py:
import json, os
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
api_version="2024-02-15-preview"
)
clusters = json.load(open("clusters.json"))
prompt = f"""
You are an expert Terraform and Databricks architect.
Generate a monthly insights report with:
- Executive summary
- Top recurring problems
- Modules with the most issues
- Common root causes
- Suggested improvements to Terraform modules
- Hotspots in Databricks workspace deployments
- Action plan for next month
Data:
{json.dumps(clusters)}
"""
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
max_tokens=2000,
temperature=0.2
)
print(resp.choices[0].message.content)
No comments:
Post a Comment