要在Dify中自动评审GitLab合并请求,需配置GITLAB_TOKEN环境变量,通过HTTP节点调用GitLab API获取MR详情与diff,用Script节点处理分页限制,LLM节点按指定格式生成评审意见,最后POST提交至GitLab评论接口。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify中自动评审GitLab的合并请求(Merge Request),必须让Dify能调用GitLab API获取MR详情、评论和代码差异,再结合LLM生成评审意见并回传至GitLab评论区。这要求Dify工作流具备外部API调用能力、敏感凭据安全存储机制,且GitLab实例支持Personal Access Token认证。
配置GitLab Personal Access Token
登录GitLab → Settings → Access Tokens → 勾选 【api】 和 【read_repository】 权限 → 创建Token并立即复制保存——该Token仅显示一次,丢失需重新生成。
进入Dify控制台 → 项目设置 → Environment Variables → 新建变量 GITLAB_TOKEN,值设为刚复制的Token字符串。注意:变量名必须全大写且含下划线,否则后续HTTP节点无法读取。
在Dify工作流中添加HTTP请求节点获取MR数据
打开Dify工作流编辑器 → 点击“+ 添加节点” → 选择“HTTP Request” → 设置Method为GET → URL填写:https://gitlab.example.com/api/v4/projects/{project_id}/merge_requests/{mr_iid},其中{project_id}需URL编码(如将数字ID或namespace%2Fname格式填入),{mr_iid}为MR编号(如123)。
在Headers中添加:Authorization: Bearer {{GITLAB_TOKEN}},使用双大括号引用环境变量。不加此头会导致401错误,且GitLab不会返回具体拒绝原因,只返回空响应体。
启用“Parse JSON response”选项,确保后续节点能直接访问response.body.title、response.body.diff_refs.base_sha等字段。
提取代码变更内容用于LLM分析
添加一个“Code”节点(或“Script”节点),输入代码如下:
const mr = $input; const projectId = mr.project_id; const mrIid = mr.iid; const diffUrl = `https://gitlab.example.com/api/v4/projects/${projectId}/merge_requests/${mrIid}/diffs`; return { diffUrl };
接着再连一个HTTP Request节点,Method设为GET,URL填入上一步输出的diffUrl,Headers同样携带Authorization: Bearer {{GITLAB_TOKEN}}。GitLab的/diffs接口返回的是数组,每个元素含old_path、new_path、diff字段,需拼接所有diff字段为单个字符串传给LLM。
在后续“Text Concatenate”节点中,用表达式{{map($input, item => item.diff).join('\n\n')}}聚合全部差异块。若MR涉及大量文件,GitLab默认只返回前20个diff项,需在URL末尾追加?per_page=100并处理分页——但Dify当前不支持循环分页,建议先限制MR文件变更数不超过5个。
构造评审提示词并调用LLM生成意见
添加“LLM”节点 → 选择部署的模型(如Qwen2.5-7B-Instruct)→ 在Prompt中写入:
你是一名资深后端工程师,正在评审以下GitLab合并请求:\n标题:{{mr.title}}\n描述:{{mr.description}}\n变更摘要:\n{{diff_text}}\n请严格按三部分输出:1. 风险点(最多3条,每条以⚠️开头);2. 改进建议(最多3条,每条以?开头);3. 总体结论(仅用“通过”或“拒绝”二字)。不加任何额外说明、不换行、不加序号。
注意:prompt中{{diff_text}}必须来自上一步拼接后的完整diff字符串,若此处传入为空或截断,LLM会因缺乏上下文胡乱输出“未发现风险”。
将评审结果以评论形式提交回GitLab
第一步:添加“HTTP Request”节点,Method设为POST,URL为https://gitlab.example.com/api/v4/projects/{project_id}/merge_requests/{mr_iid}/notes。
第二步:在Body中选择JSON格式,填入:
{"body": "{{llm_output}}"},其中{{llm_output}}直接引用LLM节点的原始输出。
第三步:Headers中仍需Authorization: Bearer {{GITLAB_TOKEN}},且必须设置Content-Type: application/json——漏掉此项会导致GitLab返回415 Unsupported Media Type错误,且错误信息不明确。
第四步:勾选“Ignore SSL errors”(仅限自托管GitLab且证书不可信时启用),生产环境应使用有效证书,避免开启此选项。


















