はじめに
個人開発でホームサーバー上の 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_URL | GitLab の 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ブロックのシステムプロンプトの例です。

更新後のコンテンツを 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 のリポジトリファイルを更新する仕組みを作ることができました。 要件管理以外にも、チャットで気軽にドキュメントを更新したい場面で活用できると思います。ぜひ試してみてください。


コメント