플로우 API
GitLab v19.3Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
이 API를 사용하여 GitLab Duo Agent Platform에서 플로우를 생성하고 관리합니다. 성공 시 201 Created 및 다음 응답 속성을 반환합니다: ai_catalog_item_consumer_id를 사용하기 전에 GraphQL API를 사용하여 AI 카탈로그에서 ID를 조회해야 합니다.
이 API를 사용하여 GitLab Duo Agent Platform에서 플로우를 생성하고 관리합니다. 플로우는 버그 수정, 코드 작성, 취약점 해결과 같은 개발자 작업을 완료하기 위해 함께 작동하는 AI 에이전트의 조합입니다.
플로우 트리거#
새 플로우를 트리거하고 시작합니다.
POST /ai/duo_workflows/workflows
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
| additional_context | 객체 배열 | 아니요 | 플로우의 추가 컨텍스트. 각 요소는 최소한 Category (문자열) 및 Content (문자열, 직렬화된 JSON) 키를 포함하는 객체여야 합니다. |
| agent_privileges | 정수 배열 | 아니요 | 에이전트가 사용할 수 있는 권한 ID. 기본값은 모든 권한입니다. 모든 에이전트 권한 나열을 참조하세요. |
| ai_catalog_item_consumer_id | 정수 | 아니요 | 실행할 카탈로그 항목을 구성하는 AI 카탈로그 항목 소비자의 ID. project_id가 필요합니다. workflow_definition과 함께 사용할 수 없으며, 둘 다 제공되면 ai_catalog_item_consumer_id가 우선합니다. 소비자 ID 조회를 참조하세요. |
| ai_catalog_item_version_id | 정수 | 아니요 | 플로우 구성의 소스인 AI 카탈로그 항목 버전의 ID. |
| allow_agent_to_request_user | 부울 | 아니요 | true(기본값)이면 에이전트가 진행 전에 사용자에게 질문하기 위해 일시 중지할 수 있습니다. false이면 에이전트가 사용자 입력 없이 완료까지 실행됩니다. |
| environment | 문자열 | 아니요 | 실행 환경. ide, web, chat_partial, chat, ambient 중 하나. |
| goal | 문자열 | 아니요 | 에이전트가 완료해야 할 작업의 설명. 예: Fix the failing pipeline. |
| image | 문자열 | 아니요 | CI 파이프라인에서 플로우를 실행할 때 사용할 컨테이너 이미지. 사용자 정의 이미지 요구 사항을 충족해야 합니다. 예: registry.gitlab.com/gitlab-org/duo-workflow/custom-image:latest. |
| issue_id | 정수 | 아니요 | 플로우와 연결할 이슈의 IID. project_id가 필요합니다. |
| merge_request_id | 정수 | 아니요 | 플로우와 연결할 머지 리퀘스트의 IID. project_id가 필요합니다. |
| namespace_id | 문자열 | 아니요 | 플로우와 연결할 네임스페이스의 ID 또는 경로. |
| pre_approved_agent_privileges | 정수 배열 | 아니요 | 에이전트가 사용자 승인 없이 사용할 수 있는 권한 ID. agent_privileges의 하위 집합이어야 합니다. |
| project_id | 문자열 | 아니요 | 플로우와 연결할 프로젝트의 ID 또는 경로. |
| shallow_clone | 부울 | 아니요 | 실행 중 리포지터리의 얕은 복제를 사용할지 여부. 기본값: true. |
| source_branch | 문자열 | 아니요 | CI 파이프라인의 소스 브랜치. 기본값은 프로젝트의 기본 브랜치. |
| start_workflow | 부울 | 아니요 | true이면 생성 후 즉시 플로우를 시작합니다. |
| workflow_definition | 문자열 | 아니요 | 플로우 유형 식별자. 예: developer/v1. ai_catalog_item_consumer_id와 함께 사용할 수 없으며, 둘 다 제공되면 ai_catalog_item_consumer_id가 우선합니다. |
| source | 문자열 | 아니요 | UI에서 세션이 트리거된 위치. |
성공 시 201 Created 및 다음 응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
| agent_privileges | 정수 배열 | 에이전트에 할당된 권한 ID. |
| agent_privileges_names | 문자열 배열 | agent_privileges에 대응하는 이름. |
| ai_catalog_item_version_id | 정수 | AI 카탈로그 항목 버전의 ID. 설정되지 않은 경우 null. |
| allow_agent_to_request_user | 부울 | true이면 에이전트가 사용자 입력을 위해 일시 중지할 수 있습니다. |
| environment | 문자열 | 실행 환경. 설정되지 않은 경우 null. |
| gitlab_url | 문자열 | GitLab 인스턴스의 기본 URL. |
| id | 정수 | 플로우의 ID. |
| image | 문자열 | CI 파이프라인 실행을 위한 컨테이너 이미지. 설정되지 않은 경우 null. |
| mcp_enabled | 부울 | 이 플로우에 MCP(Model Context Protocol) 도구가 활성화되어 있는지 여부. |
| namespace_id | 정수 | 연결된 네임스페이스의 ID. 설정되지 않은 경우 null. |
| pre_approved_agent_privileges | 정수 배열 | 에이전트가 승인 없이 사용할 수 있는 권한 ID. |
| pre_approved_agent_privileges_names | 문자열 배열 | pre_approved_agent_privileges에 대응하는 이름. |
| project_id | 정수 | 연결된 프로젝트의 ID. 설정되지 않은 경우 null. |
| status | 문자열 | 현재 플로우 상태. created, running, paused, finished, failed, stopped, input_required, plan_approval_required 또는 tool_call_approval_required 중 하나. |
| summary | 문자열 | 워크플로의 간단한 텍스트 요약. |
| title | 문자열 | 세션 제목. |
| workflow_definition | 문자열 | 플로우 유형 식별자. |
| workload | 객체 | 워크로드에 대한 정보. |
| workload.id | 문자열 | 워크로드의 ID. |
| workload.message | 문자열 | 워크로드의 상태 메시지. |
소비자 ID 조회#
ai_catalog_item_consumer_id를 사용하기 전에 GraphQL API를 사용하여 AI 카탈로그에서 ID를 조회해야 합니다.
항목이 이미 프로젝트에서 활성화되어 있어야 합니다.
query {
aiCatalogConfiguredItems(projectId: "gid://gitlab/Project/<project_id>") {
nodes {
id
item { name }
}
}
}
id 필드는 gid://gitlab/AiCatalogItemConsumer/<numeric_id> 형식의 전역 ID입니다.
ai_catalog_item_consumer_id 값으로 숫자 접미사를 사용하세요.
기본 제공 플로우 유형을 사용하는 요청 예시:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"project_id": "5",
"goal": "Fix the failing pipeline by correcting the syntax error in .gitlab-ci.yml",
"workflow_definition": "developer/v1",
"start_workflow": true
}' \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows"
카탈로그 구성 플로우를 사용하는 요청 예시:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"project_id": "5",
"goal": "Fix the failing pipeline by correcting the syntax error in .gitlab-ci.yml",
"ai_catalog_item_consumer_id": 12,
"start_workflow": true
}' \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows"
응답 예시:
{
"id": 1,
"project_id": 5,
"namespace_id": null,
"agent_privileges": [1, 2, 3, 4, 5, 6],
"agent_privileges_names": [
"read_write_files",
"read_only_gitlab",
"read_write_gitlab",
"run_commands",
"use_git",
"run_mcp_tools"
],
"pre_approved_agent_privileges": [],
"pre_approved_agent_privileges_names": [],
"workflow_definition": "developer/v1",
"status": "running",
"allow_agent_to_request_user": true,
"image": null,
"environment": null,
"ai_catalog_item_version_id": null,
"workload": {
"id": "abc-123",
"message": "Workflow started"
},
"mcp_enabled": false,
"gitlab_url": "https://gitlab.example.com"
}
플로우 콜백 엔드포인트 등록#
플로우 수명 주기 이벤트(flow.started, flow.completed, flow.failed)를 수신하는 HTTPS 엔드포인트를 등록합니다.
플로우를 트리거할 때 반환된 id를 callback_hook_id 속성으로 참조하면
상태를 폴링하는 대신 수명 주기 알림을 받을 수 있습니다.
URL과 시크릿은 저장 시 암호화되며, 등록 후에는 API가 절대 반환하지 않습니다.
사전 요구 사항:
- 조직에 대한 Owner 역할이 있어야 합니다.
POST /ai/duo_workflows/flow_callbacks
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
| url | 문자열 | 예 | 콜백을 수신하는 HTTPS URL. |
| name | 문자열 | 아니요 | 이 엔드포인트의 레이블. |
| signing_token | 문자열 | 아니요 | whsec_ |
| token | 문자열 | 아니요 | X-Gitlab-Token 헤더로 그대로 전송되는 공유 시크릿. 반환되지 않습니다. |
성공 시 201 Created 및 다음 응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
| created_at | 문자열 | 엔드포인트가 등록된 날짜와 시간. |
| id | 정수 | 플로우 콜백 엔드포인트의 ID. |
| name | 문자열 | 이 엔드포인트의 레이블. |
| signing_token_set | 부울 | signing_token이 설정되어 있는지 여부. |
| token_set | 부울 | token이 설정되어 있는지 여부. |
| url | 문자열 | 콜백을 수신하는 HTTPS URL. |
요청 예시:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--data '{
"url": "https://autoflow.example.com/duo/callbacks",
"name": "AutoFlow",
"signing_token": "whsec_<base64_encoded_32_byte_secret>"
}' \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/flow_callbacks"
응답 예시:
{
"id": 1,
"url": "https://autoflow.example.com/duo/callbacks",
"name": "AutoFlow",
"signing_token_set": true,
"token_set": false,
"created_at": "2026-07-22T11:37:00.000Z"
}
플로우 콜백 엔드포인트 나열#
조직에 등록된 플로우 콜백 엔드포인트를 나열합니다. 시크릿은 반환되지 않습니다.
사전 요구 사항:
- 조직에 대한 Owner 역할이 있어야 합니다.
GET /ai/duo_workflows/flow_callbacks
page 및 per_page 페이지네이션 파라미터를 사용하여
결과의 페이지네이션을 제어합니다.
성공 시 200 OK 및
플로우 콜백 엔드포인트 객체의 배열을 반환합니다.
요청 예시:
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/flow_callbacks"
플로우 콜백 엔드포인트 가져오기#
등록된 플로우 콜백 엔드포인트 하나를 반환합니다. 시크릿은 반환되지 않습니다.
사전 요구 사항:
- 조직에 대한 Owner 역할이 있어야 합니다.
GET /ai/duo_workflows/flow_callbacks/:id
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
| id | 정수 | 예 | 플로우 콜백 엔드포인트의 ID. |
성공 시 200 OK 및
플로우 콜백 엔드포인트 객체를 반환합니다.
요청 예시:
curl --request GET \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/flow_callbacks/1"
플로우 콜백 엔드포인트 삭제#
등록된 플로우 콜백 엔드포인트를 삭제하여 더 이상 전달을 수신하지 않도록 합니다.
사전 요구 사항:
- 조직에 대한 Owner 역할이 있어야 합니다.
DELETE /ai/duo_workflows/flow_callbacks/:id
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
| id | 정수 | 예 | 플로우 콜백 엔드포인트의 ID. |
성공 시 204 No Content를 반환합니다.
요청 예시:
curl --request DELETE \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/flow_callbacks/1"
워크플로 트레이스를 JSONL로 가져오기#
워크플로 세션의 ui_chat_log 항목을 JSON Lines(JSONL) 형식으로 반환합니다.
각 줄은 ui_chat_log 배열에서 하나의 항목을 나타내는 유효한 JSON 객체입니다.
이 엔드포인트를 사용하여 트레이스를 파싱하거나 jq와 같은 도구로 파이프합니다.
기본적으로 이 엔드포인트는 컨텍스트 압축 이전의 메시지를 포함하여 세션의 모든 스레드에 걸친 전체 대화를 반환합니다.
대신 단일 스레드를 반환하려면 thread 속성을 사용하세요.
GET /ai/duo_workflows/workflows/:workflow_id/trace.jsonl
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
| workflow_id | 정수 | 예 | 워크플로의 ID. |
| thread | 문자열 | 아니요 | 반환할 스레드. 모든 스레드에 걸친 전체 트레이스를 원하면 생략합니다. 가장 최근 스레드만 원하면 latest를, 특정 스레드를 원하면 스레드 ID를 사용합니다. |
성공 시 200 OK와 함께 반환합니다:
-
Content-Type:
application/x-ndjson -
Body: 각 줄이
ui_chat_log항목을 나타내는 JSON 객체 하나씩. 워크플로에 체크포인트가 없거나ui_chat_log항목이 없으면 빈 본문을 반환합니다.
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows/1/trace.jsonl"
응답 예시(각 줄은 별도의 JSON 객체):
{"status":"success","content":"Analyze the issue","message_type":"human"}
{"status":"success","content":"I'll start by reading the codebase.","message_type":"ai"}
출력을 jq로 파이프하여 유형별로 항목을 필터링할 수 있습니다:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows/1/trace.jsonl" \
| jq 'select(.message_type == "ai")'
모든 에이전트 권한 나열#
모든 사용 가능한 에이전트 권한을 해당 ID, 이름, 설명 및 기본 활성화 여부와 함께 나열합니다.
GET /ai/duo_workflows/workflows/agent_privileges
이 엔드포인트에는 지원되는 속성이 없습니다.
성공 시 200 OK 및 다음 응답 속성을 반환합니다:
| 속성 | 유형 | 설명 |
|---|---|---|
| all_privileges | 객체 배열 | 모든 사용 가능한 에이전트 권한. |
| all_privileges[].default_enabled | 부울 | 권한이 기본적으로 활성화되어 있는지 여부. |
| all_privileges[].description | 문자열 | 권한이 허용하는 것에 대한 사람이 읽을 수 있는 설명. |
| all_privileges[].id | 정수 | 권한 ID. |
| all_privileges[].name | 문자열 | 기계 판독 가능한 권한 이름. |
요청 예시:
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows/agent_privileges"
응답 예시:
{
"all_privileges": [
{
"id": 1,
"name": "read_write_files",
"description": "Allow local filesystem read/write access",
"default_enabled": true
},
{
"id": 2,
"name": "read_only_gitlab",
"description": "Allow read only access to GitLab APIs",
"default_enabled": true
},
{
"id": 3,
"name": "read_write_gitlab",
"description": "Allow write access to GitLab APIs",
"default_enabled": true
},
{
"id": 4,
"name": "run_commands",
"description": "Allow running any commands",
"default_enabled": true
},
{
"id": 5,
"name": "use_git",
"description": "Allow git commits, push and other git commands",
"default_enabled": true
},
{
"id": 6,
"name": "run_mcp_tools",
"description": "Allow running MCP tools",
"default_enabled": true
}
]
}