DifyとLLMを用いてgitlabの自動コード・レビューを作成しましょう(2)

それでは“REPEAT”ノードを見てみましょう。
![image-20250224171554801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/373af4e1-7808-4d3b-8483-28ce659713fd.png)

“REPEAT”ノードの入力データはARRAYの形に受け取ってARRAYの長さくらいに繰り返します。このノードの内でARRAY内のアイテムを用いて処理ができます。

“REPEAT”ノードの内で初めて来るのはコード・ノードである“ADD DIFFS”です。Pythonコードを用いました。

![image-20250224172417714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/a93266fc-200e-45ed-a559-84c16f924408.png)

```python
def main(arg1: str) -> dict:

    mrIID = arg1.split("/")[-1]

    apiUrl = "https://gitlab.example.com/api/v4/projects/5935/merge_requests/" + mrIID +"/diffs"

    return {
        "result": apiUrl
    }
```

次のノードは‘HTTP要請’である“GET DIFF”ノードです。前からもらったURLをgitlab APIに伝えてResponseを貰います。

![image-20250224175736830.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/d0c63eb7-7ea2-4b23-93d3-3b771678e2b3.png)

gitlab APIを使うための認証のためヘッダにPrivate-Tokenセクションを作り、ここに「Start」で受けているPrivateTokenの値を割り当てます。

Responseのデータの仕組みは以下のようです。

* body
* status_code
* headers
* files

このデータは次のノードであるLLMに伝えられます。

![image-20250225111458632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/9b95c7c9-771b-4b98-8005-738d6b1a7d11.png)

LLMノードでは前からもらったデータを基づいて分析が行われるんです。ここにはまだただで使えるグーグルのGeminiを使用しました。LLMのモデルの設定は右の上でユーザー名をクリックして「設定⇨モデルプロバイダー」で登録ができます。

「コンテキスト」は前のノードの「body]データで割り当てます。そしてプロンプトは以下のように設定しました。

```
Prompt:
You are an AI designed to automate code reviews for a team of six junior developers. Below is the Diff information from a GitLab Merge Request.
Focus on the modified code and provide feedback specifically on these changes. The feedback should include:
﻿﻿﻿An explanation of the functional changes in the modified code.
﻿﻿﻿Advice on code style and best practices relevant to the changes.
﻿﻿﻿Suggestions for improving the performance and efficiency of the modified code.
﻿﻿﻿Explanations of related concepts or technologies in a way that junior developers can understand.
﻿﻿﻿Recommendations for additional learning materials or resources.
﻿﻿﻿Identification of any issues or mistakes in the modified code, with suggestions on how to fix them. Provide example code if necessary.
When writing the feedback, be kind and clear. The goal is to help junior developers grow. Please provide the review in Japanese.
Diff Information:

/コンテキスト
```
最後の`/コンテキスト`部分は直接`/`をタイピングして入力します。

このノードの出力はtextです。

次のノードは「コード」である「**MAKENOTESURL**」です。ここには「**LLM**」ノードのレビュー結果とその結果に用いられたURLを入力データとして受け取ってURLのみgitlabの「コメント」用URLで変更して次のノードに伝達します。

![image-20250225122800589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/b4a7769d-fd35-481c-a8b3-4cfd3d973120.png)

ここのコードは以下のようです。

```python
def replace_last_segment(url: str, old_segment: str, new_segment: str) -> str:
    if url.endswith(old_segment):
        return url[: -len(old_segment)] + new_segment
    return url

def main(url: str, text: str) -> dict:

    updated_url = replace_last_segment(url, "/diffs", "/notes")
    
    return {
        "result": updated_url,
        "comments" : text,
    }
```

では「**REPEAT**]内の「HTTP要請」ノードの「**WRITENOTES**」です。MRでコメントの書くURLを受け取ってgitlab APIに伝達する役割をします。

![image-20250225124612068.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/08ad9738-20f2-4a5a-8d72-9ce7c1bb8180.png)

gitlab APIの認証のためヘッダーに「Private-Token」を設定し、コメントの内容は本文のの「body」に入れました。出力は前の「**GET DIFF**」と同じく「body, status_code, header, files」です。

最後の「**END**」ノードでは「GET DIFF」の「status_code」をArrayタイプに受け取ってこれを出力することで終了します。


![image-20250225130010918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55902/9b72416f-f56a-4540-99e6-bbbe5a7e2a77.png)

では次の投稿ではこの結果をもってgitlabのwebhookと連結してみましょう。