開発現場ではチーム単位でMRなどが発生の時人間がコードをレビューします。普段は経歴者が導いて行うので意味があるレビュー情報が十分に出ます。
でもブートキャンプなどの教育機関でチームメンバがみんな初心者なので、お互いにコード・レビューをしても無意味な情報ばかり交換される可能性が高いです。
意味があるレビューのため外部からのレビューが必要しました。そのため、他の教育機関ではパートタイマーを雇いてコード・レビューをさせます。僕はその役割をGPTみたいなLLMに任せるのがいいじゃないかと思いました。AIの狂風が吹いてるこの時期で充分に考えられるのではないでしょうか。
私が所属するブートキャンプで学生たちはgitlabでコードを管理します。だからgitlabでwebhookを設定しそれと連携されるサーバーを作ってそこから生成型AIに情報をわたして分析結果を受け取る形になります。
まずDIFYのフローの全体図は以下のようです。
一応「Start」ノードから見てみましょう。
“Start”ノードは五つの入力データをもらいます。
- Private_token : gitlabから発行されるAccess Token値です。
- prjid : MRなどイベントが発生するプロジェクトのIDです。
- siteurl : gitlabのサーバーURLです(例:https://examle.gitlab.com/)
- branch : 情報を取得するブランチです。
- state : どんな状態のMRを持ってくるかの情報です。(opened or closed)
スクロールを下るとエラー・ブランチの設定が表示されてます。
GetMRListの特性は“コード”です。DifyはJavaScriptまたPython Scriptを支援します。ここでにpythonを使いました。
import requests
import json
def main(prvtoken:str, prjid:str, siteurl:str, branch:str, state:str) -> dict:
url = f"{siteurl}/api/v4/projects/{prjid}/merge_requests"
headers = {"Private-Token": prvtoken}
params = {
"state": state,
"target_branch": branch
}
response = requests.get(url, headers=headers, params=params)
urlList = []
if response.status_code == 200:
mrs = response.json()
# web_urlのみ洗い出し
urls = [mr["web_url"] for mr in mrs if "web_url" in mr]
# 結果出力
for url in urls:
urlList.append(url)
else:
print("Fail to call API")
return {
"results": urlList,
"count" : len(urlList)
}
入力データは前のノードからもらったデータをそのままもらいます。これをgitlab APIで伝えるURLとParam形で加工してrequestをGETで投げて返事をもらいます。返事の中で我々が必要なのはMRのURLので、このURLのみ洗い出してDictionaryで返す仕組みです。入力データ五つと出力変数二つをノードに設定します。
エラーが発生する時エラー対応方法もノードで決められます。ここには“枝”を作って成功枝と失敗枝で分けました。エラーの時では“End”ノードに外してエラー・コードまたメッセージを出力します。成功すれば次のノードである“REPEAT”に繋がります。以下のイメージはエラー処理のための“End”ノードです。