はじめに:I.R.I.S.とは?
I.R.I.S.は、GitHubのイシュー(問題や課題の報告)を自動的に分析し、適切なラベル(タグのようなもの)を付けてくれるAIアシスタントです。例えば、バグ報告なのか、新機能の要望なのか、ドキュメントの改善提案なのかを自動で判断し、それに合ったラベルを付けてくれます。
これにより、開発者は素早くイシューの内容を把握でき、効率的に作業を進められるようになります。
主な更新点
v0.2.0では、以下の主要な更新が行われました:
- Google Generative AI の統合
- ラベル管理システムの改善
- イシュー処理スクリプトの大幅なリファクタリング
- ワークフローの改善と日本語化
- ユーザビリティの向上(READMEの改善など)
それでは、これらの更新点について詳しく見ていきましょう!
新機能の詳細解説
Google Generative AI の統合
Google Generative AI(別名:Gemini)が新たに統合されました。これにより、イシューの分析がより高度になりました。
設定方法
- Google AI Studio で API キーを取得します。
- GitHub リポジトリの Secrets に
GEMINI_API_KEY
として API キーを追加します。
コードでの使用例
# Google Generative AI(Gemini)を使用するための設定
from litellm import completion
# Geminiモデルの指定
MODEL_NAME = "gemini/gemini-1.5-pro-latest"
# Geminiを使用してイシューを分析する関数
def analyze_issue_with_gemini(issue_content):
# プロンプトの作成
prompt = f"以下のGitHubイシューを分析し、適切なラベルを提案してください:\n\n{issue_content}"
# Geminiモデルを使用して分析
response = completion(model=MODEL_NAME, messages=[
{"role": "system", "content": "あなたはGitHubイシューを分析し、適切なラベルを提案する助手です。"},
{"role": "user", "content": prompt}
])
# 分析結果(提案されたラベル)を返す
return response['choices'][0]['message']['content']
# 使用例
issue_content = "アプリがクラッシュする問題が発生しています。..."
suggested_labels = analyze_issue_with_gemini(issue_content)
print(f"提案されたラベル: {suggested_labels}")
この例では、Google Generative AI(Gemini)を使用してイシューを分析し、適切なラベルを提案する方法を示しています。
ラベル管理システムの改善
ラベルの管理がより柔軟になりました。新しく追加された .github/labels.csv
ファイルを使って、プロジェクト固有のラベルを簡単に定義できるようになりました。
labels.csv の例
label,description
bug,何かが正常に動作していません
feature,新機能または要望
documentation,ドキュメントの改善または追加
enhancement,既存機能の改善
question,さらなる情報が必要です
good first issue,初心者に適しています
ラベル読み込みと検証のコード例
import csv
import re
# CSVファイルからラベルを読み込む関数
def load_labels_from_csv(file_path):
# ラベルを格納する辞書を初期化
labels = {}
# CSVファイルを開いて読み込む
with open(file_path, mode='r', encoding='utf-8') as file:
# CSVリーダーを作成
reader = csv.DictReader(file)
# 各行を処理
for row in reader:
# ラベル名を前処理(小文字に変換し、空白を削除)
label_name = preprocess_label(row['label'])
# ラベル名と説明を辞書に追加
labels[label_name] = row['description']
return labels
# ラベル名を前処理する関数
def preprocess_label(label):
# ラベル名を小文字に変換し、空白とアスタリスクを削除
return re.sub(r'[\s*]', '', label.lower())
# 提案されたラベルを検証する関数
def validate_labels(suggested_labels, valid_labels):
# 検証済みラベルを格納するリストを初期化
validated_labels = []
# 各提案ラベルについて処理
for label in suggested_labels:
# ラベル名を前処理
preprocessed_label = preprocess_label(label)
# 前処理したラベル名が有効なラベルリストに含まれているか確認
if preprocessed_label in valid_labels:
# 元のラベル名(大文字小文字を保持)を検証済みリストに追加
original_label = next(k for k in valid_labels.keys() if preprocess_label(k) == preprocessed_label)
validated_labels.append(original_label)
return validated_labels
# 使用例
csv_path = '.github/labels.csv'
valid_labels = load_labels_from_csv(csv_path)
suggested_labels = ['bug', 'enhancement', 'invalid_label']
validated_labels = validate_labels(suggested_labels, valid_labels)
print(f"検証済みラベル: {validated_labels}")
このコードでは、CSVファイルからラベルを読み込み、AIが提案したラベルを検証して、有効なラベルのみを使用する方法を示しています。
イシュー処理スクリプトの改良
イシュー処理のメインスクリプトが大幅に改良され、より構造化されたコードになりました。
主な改善点
LLMIntegration
クラスの導入- 複数のAIモデルのサポート
- エラーハンドリングの強化
- コードの可読性向上
改良されたスクリプトの一部
import os
from github import Github
from litellm import completion
from enum import Enum
# 使用するAIモデルを定義するEnum
class LLMModel(Enum):
GEMINI = "gemini/gemini-1.5-pro-latest"
GPT4 = "gpt-4"
CLAUDE = "anthropic/claude-2"
# LLM(大規模言語モデル)との統合を管理するクラス
class LLMIntegration:
def __init__(self):
# 環境変数から必要な情報を取得
self.github_token = os.getenv("GITHUB_TOKEN")
self.github_repo = os.getenv("GITHUB_REPOSITORY")
self.issue_number = int(os.getenv("ISSUE_NUMBER", 0))
# API キーのセットアップ
self.setup_api_keys()
# ラベルの読み込み
self.labels = self.load_labels_from_csv()
# 各AIサービスのAPIキーをセットアップ
def setup_api_keys(self):
os.environ['GEMINI_API_KEY'] = os.getenv("GEMINI_API_KEY", "")
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY", "")
os.environ['ANTHROPIC_API_KEY'] = os.getenv("ANTHROPIC_API_KEY", "")
# 指定されたAIモデルを使用してレスポンスを取得
def get_llm_response(self, model: LLMModel, messages: List[Dict[str, str]]) -> str:
try:
# litellmライブラリを使用して、指定されたモデルにリクエストを送信
response = completion(model=model.value, messages=messages)
# レスポンスの内容を返す
return response['choices'][0]['message']['content']
except Exception as e:
# エラーが発生した場合はログに記録
print(f"{model.value}からのレスポンス取得中にエラーが発生しました: {str(e)}")
return ""
# GitHubイシューを分析し、ラベルを提案
def analyze_github_issue(self) -> List[str]:
# GitHubクライアントの初期化
g = Github(self.github_token)
repo = g.get_repo(self.github_repo)
issue = repo.get_issue(number=self.issue_number)
# イシューの内容を取得
issue_content = f"タイトル: {issue.title}\n\n本文: {issue.body}"
# ラベル提案用のプロンプトを作成
prompt = self.create_label_prompt(issue_content)
# AIモデルを使用してラベルを提案
response = self.get_llm_response(LLMModel.GEMINI, [
{"role": "system", "content": "あなたはGitHubイシューを分析し、適切なラベルを提案する助手です。"},
{"role": "user", "content": prompt}
])
# 提案されたラベルを検証
suggested_labels = response.strip().split(', ')
return self.validate_labels(suggested_labels)
# メイン処理を実行
def process_issue(self):
suggested_labels = self.analyze_github_issue()
self.apply_labels_and_comment(suggested_labels)
# スクリプトのメイン処理
if __name__ == "__main__":
llm_integration = LLMIntegration()
llm_integration.process_issue()
この改良されたスクリプトでは、コードがより構造化され、各機能が明確に分離されています。また、複数のAIモデルを簡単に切り替えられるようになっています。
ワークフローの変更
GitHub Actionsのワークフローも更新され、より分かりやすくなりました。主な変更点は以下の通りです:
- ワークフロー名の日本語化
- 新しい依存関係の追加(Google Generative AI)
- 環境変数の追加(GEMINI_API_KEY)
更新されたワークフローファイル(.github/workflows/issue-review.yml
)の例:
name: イシュー自動ラベリング
on:
issues:
types: [opened]
jobs:
process_issue:
runs-on: ubuntu-latest
steps:
- name: リポジトリのチェックアウト
uses: actions/checkout@v2
- name: Pythonのセットアップ
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: 依存関係のインストール
run: |
python -m pip install --upgrade pip
pip install litellm
pip install PyGithub
pip install -q -U google-generativeai
- name: LLMによるイシュー処理
env:
GITHUB_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
GITHUB_REPOSITORY: ${{ github.repository }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
run: python .github/scripts/process_issue.py
このワークフローファイルでは、新しい依存関係が追加され、必要な環境変数が設定されています。
セットアップ方法の更新
I.R.I.S. v0.2.0を使用するための新しいセットアップ手順は以下の通りです:
-
リポジトリをクローンまたはフォークします。
-
.github/workflows/issue-review.yml
ファイルをあなたのリポジトリの.github/workflows/
ディレクトリにコピーします。 -
GitHub Secrets に以下のキーを設定します:
OPENAI_API_KEY
: OpenAI の API キーGH_ACCESS_TOKEN
: GitHub のパーソナルアクセストークンGEMINI_API_KEY
: Google AI Studio の API キー(オプション、Gemini を使用する場合)ANTHROPIC_API_KEY
: Anthropic の API キー(オプション、Claude を使用する場合)
-
.github/labels.csv
ファイルを確認し、必要に応じてプロジェクト固有のラベルを追加または編集します。 -
GitHub Actions が有効になっていることを確認します。リポジトリの「Settings」→「Actions」→「General」で、「Allow all actions and reusable workflows」が選択されていることを確認してください。
これらの手順を完了すると、新しいイシューが作成されるたびに I.R.I.S. が自動的に起動し、ラベルの提案と適用を行います。
新しいワークフロー図の解説
I.R.I.S. v0.2.0 の新しいワークフローを視覚化した図を見てみましょう。
この図は、I.R.I.S. の動作を視覚的に表現しています。各ステップを詳しく見ていきましょう:
-
ユーザーがイシューを作成: 開発者や貢献者が新しいイシューを GitHub リポジトリに作成します。
-
GitHub Action のトリガー: 新しいイシューが作成されると、GitHub Actions が I.R.I.S. を起動します。
-
イシュー内容の取得: I.R.I.S. が GitHub API を使って、新しく作成されたイシューの詳細を取得します。
-
AI モデルによる分析: 取得したイシュー内容を AI モデル(OpenAI GPT-4、Google Gemini、Anthropic Claude など)に送信し、適切なラベルの提案を要求します。
-
ラベルの提案: AI モデルがイシューの内容を分析し、適切だと判断したラベルを提案します。
-
ラベルの照合: 提案されたラベルを
.github/labels.csv
ファイルに定義された有効なラベルと照合します。 -
検証済みラベルの適用: 照合の結果、有効と判断されたラベルをイシューに適用します。
-
コメントの追加: I.R.I.S. が適用したラベルとその説明をイシューにコメントとして追加します。
-
ユーザーへの通知: GitHub がイシューの更新(ラベルの追加とコメント)をユーザーに通知します。
この新しいワークフローでは、ラベルの検証ステップが追加されたことで、より正確で一貫性のあるラベリングが可能になりました。
開発者向けのヒント
I.R.I.S. v0.2.0 の新機能を最大限に活用するためのヒントをいくつか紹介します:
AI モデルの使い分け:
異なる AI モデルは異なる強みを持っています。例えば、特定の種類のイシューに対して Gemini が優れた結果を出す場合、そのイシューカテゴリには Gemini を使用するようにカスタマイズできます。
# イシューの種類に応じてAIモデルを選択する例
def select_ai_model(issue_content):
if "バグ" in issue_content.lower():
return LLMModel.GPT4
elif "機能要望" in issue_content.lower():
return LLMModel.GEMINI
else:
return LLMModel.CLAUDE
# 使用例
selected_model = select_ai_model(issue_content)
response = self.get_llm_response(selected_model, messages)
カスタムラベルの追加:
プロジェクト固有のラベルを .github/labels.csv
に追加することで、より細かなイシュー分類が可能になります。
label,description
performance,パフォーマンスに関する問題や改善
security,セキュリティに関する問題や改善
ui/ux,ユーザーインターフェースやユーザー体験に関する問題や改善
プロンプトのカスタマイズ:
AI モデルへのプロンプトをカスタマイズすることで、より正確なラベル提案を得られる可能性があります。
def create_custom_prompt(issue_content):
return f"""
以下のGitHubイシューを分析し、最も適切なラベルを1つだけ提案してください。
可能なラベル: バグ, 機能要望, 文書化, パフォーマンス, セキュリティ, UI/UX
イシューの内容:
{issue_content}
回答は以下の形式で提供してください:
推奨ラベル: [ラベル名]
理由: [簡潔な説明]
"""
# 使用例
custom_prompt = create_custom_prompt(issue_content)
response = self.get_llm_response(LLMModel.GEMINI, [
{"role": "system", "content": "あなたはGitHubイシューを分析する専門家です。"},
{"role": "user", "content": custom_prompt}
])
まとめ
I.R.I.S. v0.2.0 は、以下の点で大きく進化しました:
-
複数の AI モデルのサポート: OpenAI GPT-4、Google Gemini、Anthropic Claude など、複数の高性能 AI モデルを利用可能になりました。
-
柔軟なラベル管理: CSV ファイルを使用したラベル管理により、プロジェクト固有のニーズに合わせたカスタマイズが容易になりました。
-
改善されたコード構造: リファクタリングにより、コードの可読性と保守性が向上しました。
-
強化されたエラーハンドリング: 様々な状況に対応できるよう、エラーハンドリングが改善されました。
-
日本語対応の強化: ワークフローやコメントの日本語化により、日本語話者にとってより使いやすくなりました。
これらの改善により、I.R.I.S. はより柔軟で強力なツールとなり、開発チームの生産性向上に大きく貢献します。ぜひ、あなたのプロジェクトに I.R.I.S. v0.2.0 を導入して、イシュー管理の効率化を体験してください!
質問やフィードバックがありましたら、GitHub の Issues や Discussions でお気軽にお問い合わせください。I.R.I.S. の改善に皆様のご意見をお待ちしています。
Happy coding! 🚀✨
コメント