Difyでリポジトリの要件定義をチャットで更新する方法

AI

はじめに

個人開発でホームサーバー上の GitLab を使用しており、プロジェクトの要件定義を requirements.md として管理しています。 出先などのPCの前にいない状態でも、チャットベースで要件を変更できる仕組みを Dify で作ってみました。 外部ネットワークからアクセスする方法としてTailScaleを使用していますが、こちらは別の機会に紹介しようかと思います。 同一ネットワーク内であればネットワーク内のIPアドレスを指定するだけでもアクセスできると思います。

本記事では、Dify のチャットボットから GitLab の requirements.md を取得・更新する手順を紹介します。

前提

  • GitLab が使用できること(本記事ではホームサーバー上の GitLab を使用しています)
  • 対象リポジトリが作成済みであること
  • リポジトリ内に requirements.md が存在すること

手順

1. Dify で新しいチャットボットを作成する

Dify のダッシュボードから新しいチャットフローを作成します。

2. GitLab のプロジェクトアクセストークンを作成する

GitLab のプロジェクト設定から、read_repository および write_repository 権限を持つプロジェクトアクセストークンを作成します。

注意:更新対象のブランチに対して書き込める権限が必要です。筆者の環境ではmainブランチを更新する場合はメンテナー以上の権限が必要でした。

3. チャットボットに環境変数を設定する

作成したチャットボットの環境変数に以下の情報を設定します。

変数名説明
GITLAB_URLGitLab の URL(例: http://gitlab.home-server
GITLAB_TOKEN作成したプロジェクトアクセストークン
GITLAB_PROJECT_ID対象プロジェクトの ID

4. HTTP リクエストブロックで requirements.md を取得する

HTTP リクエストブロックを使用して、GitLab API からファイルの内容を取得します。

  • メソッド: GET
  • URL: {{GITLAB_URL}}/api/v4/projects/{{GITLAB_PROJECT_ID}}/repository/files/requirements.md/raw?ref=main
  • ヘッダー: PRIVATE-TOKEN: {{GITLAB_TOKEN}}

5. Base64 デコードでファイル内容を取得する

GitLab API のレスポンスはファイル内容が Base64 エンコードされているため、コードブロックでデコードします。

import base64
import json

def main(args):
    # 文字列 → 辞書に変換
    data = json.loads(args)

    content = data["content"]

    decoded = base64.b64decode(content).decode("utf-8")

    return {
        "result": decoded
    }

6. 質問分類器でユーザーの意図を判定する

取得したファイル内容とユーザーの入力を質問分類器ブロックに渡し、要件変更の意図があるかどうかを判定します。

分類は「要件変更あり」と「要件変更なし」の 2 つに分けると管理しやすくなります。

7. 要件変更がある場合:更新リクエストを作成する

要件変更の意図があると判定された場合、LLM ブロックでユーザーの入力をもとに requirements.md の内容を更新します。

以下はLLMブロックのシステムプロンプトの例です。

LLMブロックの設定例
LLMブロックの設定例

更新後のコンテンツを GitLab API のリクエスト形式に整形するため、コードブロックで JSON を組み立てます。

function main({content, id}) {
    const jsonStr = {
        branch: "dev",
        commit_message: "update: requirements",
        content,
        file_path: "requirements.md",
        id,
    }
    return {
        result: JSON.stringify(jsonStr)
    }
}

8. HTTP リクエストブロックで requirements.md を更新する

7 で作成したリクエストをもとに、GitLab API に PUT リクエストを送ってファイルを更新します。

  • メソッド: PUT
  • URL: {{GITLAB_URL}}/api/v4/projects/{{GITLAB_PROJECT_ID}}/repository/files/requirements.md
  • ヘッダー: PRIVATE-TOKEN: {{GITLAB_TOKEN}}
  • ボディ(json): 7 で作成したリクエストの内容

9. 要件変更がない場合:質問に回答する

要件変更の意図がないと判定された場合は、通常の LLM ブロックでユーザーの質問に対して適切な回答を返します。requirements.md の内容をコンテキストとして渡すことで、要件に関する質問にも回答できるようになります。

10. ワークフロー全体図

ワークフロー全体図
ワークフロー全体図

まとめ

Dify の HTTP リクエストブロックと質問分類器を組み合わせることで、チャットから GitLab のリポジトリファイルを更新する仕組みを作ることができました。 要件管理以外にも、チャットで気軽にドキュメントを更新したい場面で活用できると思います。ぜひ試してみてください。

コメント

タイトルとURLをコピーしました