플로 API
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
이 API를 사용하여 GitLab Duo Agent Platform에서 플로를 생성하고 관리합니다. 복합 ID 서비스 계정 요구 조건은 기능 플래그로 제어됩니다. 성공하면 201 Created와 다음 응답 속성을 반환합니다.
이 API를 사용하여 GitLab Duo Agent Platform에서 플로를 생성하고 관리합니다. 플로는 버그 수정, 코드 작성, 취약점 해결과 같은 개발 작업을 완료하기 위해 여러 AI 에이전트를 조합한 것입니다.
플로 트리거#
히스토리
start_workflow가true일 때 복합 ID(composite identity) 서비스 계정을 요구하는 조건이 GitLab 19.4에서enforce_composite_identity_for_api_started_workflows라는 이름의 기능 플래그와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다.callback_hook_id및client_reference속성이 GitLab 19.4에서duo_flow_callback_hooks라는 이름의 기능 플래그와 함께 도입되었습니다. 기본적으로 비활성화되어 있습니다.- GitLab 19.5에서 일반 공개되었습니다.
복합 ID 서비스 계정 요구 조건은 기능 플래그로 제어됩니다.
callback_hook_id 및 client_reference 속성의 사용 가능 여부는 별도의 기능 플래그로
제어됩니다. 자세한 내용은 히스토리를 참고합니다.
새 플로를 트리거하고 시작합니다.
사전 요구 사항:
enforce_composite_identity_for_api_started_workflows기능 플래그가 활성화되어 있고start_workflow가true이면, 해당 플로에 복합 ID 서비스 계정이 있어야 합니다. 이 서비스 계정은 AI Catalog에서 플로에 구성된 계정이거나, 요청의 복합 ID 뒤에 있는 서비스 계정입니다. 그렇지 않으면 GitLab 이403 Forbidden을 반환하고 플로를 시작하지 않습니다.
POST /ai/duo_workflows/workflows
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
additional_context |
array of objects | 아니요 | 플로에 제공할 추가 컨텍스트입니다. 각 요소는 최소한 Category(string)와 Content(string, 직렬화된 JSON) 키를 가진 객체여야 합니다. |
agent_privileges |
integer array | 아니요 | 에이전트가 사용할 수 있는 권한 ID 입니다. 기본값은 모든 권한입니다. 모든 에이전트 권한 조회를 참고합니다. |
ai_catalog_item_consumer_id |
integer | 아니요 | 실행할 카탈로그 항목을 지정하는 AI Catalog 항목 소비자의 ID 입니다. project_id가 필요합니다. workflow_definition과 함께 사용할 수 없으며, 둘 다 제공되면 ai_catalog_item_consumer_id가 우선합니다. 소비자 ID 조회를 참고합니다. |
ai_catalog_item_version_id |
integer | 아니요 | 플로 구성의 출처가 된 AI Catalog 항목 버전의 ID 입니다. |
allow_agent_to_request_user |
boolean | 아니요 | true(기본값)이면 에이전트가 진행하기 전에 사용자에게 질문하기 위해 일시 중지할 수 있습니다. false 이면 사용자 입력 없이 끝까지 실행합니다. |
callback_hook_id |
integer | 아니요 | GitLab Duo 플로 웹훅 콜백이 켜진 웹훅의 ID 입니다. GitLab 이 해당 웹훅으로 플로 수명 주기 이벤트를 전송하므로 플로 상태를 폴링할 필요가 없습니다. 웹훅은 플로가 실행되는 프로젝트나 네임스페이스, 또는 그 상위 그룹 중 하나에 속해야 합니다. 이 속성은 실험 기능입니다. |
client_reference |
string | 아니요 | 모든 콜백 페이로드에 그대로 반환되는 불투명 문자열로, 콜백과 플로를 트리거한 요청을 연결하는 데 사용합니다. 최대 255자입니다. callback_hook_id가 없으면 적용되지 않습니다. 이 속성은 실험 기능입니다. |
environment |
string | 아니요 | 실행 환경입니다. ide, web, chat_partial, chat, ambient 중 하나입니다. |
goal |
string | 아니요 | 에이전트가 완료할 작업에 대한 설명입니다. 예: Fix the failing pipeline. |
image |
string | 아니요 | 플로에 사용할 컨테이너 이미지입니다. 플로가 CI 파이프라인에서 실행될 때만 적용됩니다. 사용자 지정 이미지 요구 사항을 충족해야 합니다. 예: registry.gitlab.com/gitlab-org/duo-workflow/custom-image:latest. |
issue_id |
integer | 아니요 | 플로와 연결할 이슈의 IID 입니다. project_id가 필요합니다. |
merge_request_id |
integer | 아니요 | 플로와 연결할 머지 리퀘스트의 IID 입니다. project_id가 필요합니다. |
namespace_id |
string | 아니요 | 플로와 연결할 네임스페이스의 ID 또는 경로입니다. |
pre_approved_agent_privileges |
integer array | 아니요 | 에이전트가 사용자 승인을 요청하지 않고 사용할 수 있는 권한 ID 입니다. agent_privileges의 부분 집합이어야 합니다. |
project_id |
string | 아니요 | 플로와 연결할 프로젝트의 ID 또는 경로입니다. |
source |
string | 아니요 | 세션이 트리거된 위치입니다. GitLab 기능 진입점(예: merge_request_code_conflict) 중 하나 또는 세션을 생성한 클라이언트 화면(duo_cli_interactive, duo_cli_run, duo_cli_acp, ide_extension) 중 하나입니다. 세션의 source_type으로 저장됩니다. |
source_branch |
string | 아니요 | 플로의 소스 브랜치입니다. 플로가 CI 파이프라인에서 실행될 때만 적용됩니다. 지정하지 않으면 fix_pipeline/v1 또는 code_review/v1처럼 목표가 파이프라인이나 머지 리퀘스트인 플로는 해당 파이프라인 또는 머지 리퀘스트의 브랜치에서 실행됩니다. fix_pipeline/v1의 경우 additional_context의 merge_request 및 pipeline 항목도 파이프라인에서 채워집니다. 다른 플로는 프로젝트의 기본 브랜치에서 실행됩니다. |
start_workflow |
boolean | 아니요 | true 이면 생성 직후 플로를 시작합니다. |
workflow_definition |
string | 아니요 | 플로 유형 식별자입니다. 예: developer/v1. ai_catalog_item_consumer_id와 함께 사용할 수 없으며, 둘 다 제공되면 ai_catalog_item_consumer_id가 우선합니다. |
성공하면 201 Created와 다음 응답 속성을
반환합니다.
| 속성 | 유형 | 설명 |
|---|---|---|
agent_privileges |
integer array | 에이전트에 할당된 권한 ID 입니다. |
agent_privileges_names |
string array | agent_privileges에 대응하는 이름입니다. |
ai_catalog_item_version_id |
integer | AI Catalog 항목 버전의 ID 입니다. 설정되지 않은 경우 null 입니다. |
allow_agent_to_request_user |
boolean | true 이면 에이전트가 사용자 입력을 위해 일시 중지할 수 있습니다. |
environment |
string | 실행 환경입니다. 설정되지 않은 경우 null 입니다. |
gitlab_url |
string | GitLab 인스턴스의 기본 URL 입니다. |
id |
integer | 플로의 ID 입니다. |
image |
string | CI 파이프라인 실행에 사용할 컨테이너 이미지입니다. 설정되지 않은 경우 null 입니다. |
mcp_enabled |
boolean | 이 플로에서 MCP(Model Context Protocol) 도구가 활성화되어 있는지 여부입니다. |
namespace_id |
integer | 연결된 네임스페이스의 ID 입니다. 설정되지 않은 경우 null 입니다. |
pre_approved_agent_privileges |
integer array | 에이전트가 승인을 요청하지 않고 사용할 수 있는 권한 ID 입니다. |
pre_approved_agent_privileges_names |
string array | pre_approved_agent_privileges에 대응하는 이름입니다. |
project_id |
integer | 연결된 프로젝트의 ID 입니다. 설정되지 않은 경우 null 입니다. |
status |
string | 현재 플로 상태입니다. created, running, paused, finished, failed, stopped, input_required, plan_approval_required, tool_call_approval_required 중 하나입니다. GitLab에서 새 값을 추가할 수 있습니다. |
summary |
string | 워크플로의 짧은 텍스트 요약입니다. |
title |
string | 세션의 제목입니다. |
web_url |
string | GitLab UI에서 세션의 URL입니다. 세션이 프로젝트용이 아니면 null입니다. |
workflow_definition |
string | 플로 유형 식별자입니다. |
workload |
object | 워크로드에 대한 정보입니다. |
workload.id |
integer | 워크로드의 ID입니다. start_workflow가 true가 아닌 경우처럼 워크로드가 생성되지 않았다면 null입니다. |
workload.message |
string | 워크로드의 상태 메시지입니다. 워크로드가 생성되지 않았다면 null입니다. |
GitLab Duo Agent Platform을 사용하기 전에 사용자가 ID 확인을
완료해야 하는 경우, GitLab은 403 Forbidden과 함께 다음
message를 반환합니다.
{
"message": "403 Forbidden - Identity verification is required to use GitLab Duo Agent Platform"
}
callback_hook_id가 설정되어 있고 다음 중 하나에 해당하면 GitLab은
400 Bad request를 반환합니다.
- 플로가 실행되는 프로젝트나 네임스페이스의 최상위 그룹에
duo_flow_callback_hooks기능 플래그가 활성화되어 있지 않은 경우. - 해당 ID가 플로가 실행되는 프로젝트나 네임스페이스, 또는 그 상위 그룹 중 하나에서 GitLab Duo 플로 콜백이 켜진 웹훅을 가리키지 않는 경우.
소비자 ID 조회#
ai_catalog_item_consumer_id를 사용하려면 먼저 GraphQL API로 AI Catalog에서 해당 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,
"web_url": "https://gitlab.example.com/group/project/-/automate/agent-sessions/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"
}
플로 재시작#
실패했거나 중지된 플로를 같은 플로 파라미터로 새 플로를 시작하여 다시 시작합니다. 새 플로는
처음부터 실행됩니다. 원래 플로는 변경되지 않으며 failed 또는 stopped 상태로 유지됩니다.
상태가 failed 또는 stopped인 프로젝트 수준 플로만 재시작할 수 있습니다. 그 밖의 상태인 플로나 그룹 수준 플로를
재시작하면 403 Forbidden을 반환합니다. 재시작이 아직 진행 중인 상태에서 같은 플로를 다시 재시작하면
409 Conflict를 반환합니다.
POST /ai/duo_workflows/workflows/:workflow_id/restart
지원하는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
workflow_id |
integer | 예 | 재시작할 플로의 ID입니다. |
성공하면 201 Created와 플로 트리거와 같은 응답
속성을 반환합니다. 응답은 새 플로를 설명하므로 id는 재시작한 플로가 아니라 새 플로의 ID입니다.
요청 예시:
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/ai/duo_workflows/workflows/42/restart"
워크플로 트레이스를 JSONL로 가져오기#
워크플로 세션의 ui_chat_log 항목을
JSON Lines(JSONL) 형식으로 반환합니다.
각 줄은 ui_chat_log 배열의 항목 하나를 나타내는 유효한 JSON 객체입니다.
트레이스를 파싱하거나 jq 같은 도구로 전달할 때 이 엔드포인트를 사용합니다.
기본적으로 이 엔드포인트는 컨텍스트 압축 이전의 메시지를 포함하여 세션의 모든 스레드에 걸친
전체 대화를 반환합니다.
단일 스레드만 반환하려면 thread 속성을 사용합니다.
GET /ai/duo_workflows/workflows/:workflow_id/trace.jsonl
지원되는 속성:
| 속성 | 유형 | 필수 여부 | 설명 |
|---|---|---|---|
workflow_id |
integer | 예 | 워크플로의 ID 입니다. |
thread |
string | 아니요 | 반환할 스레드입니다. 모든 스레드에 걸친 전체 트레이스를 받으려면 생략합니다. 가장 최근 스레드만 받으려면 latest를, 특정 스레드를 받으려면 스레드 ID를 사용합니다. |
성공하면 200 OK와 함께 다음을 반환합니다.
- Content-Type:
application/x-ndjson - Body: 한 줄에 JSON 객체 하나씩이며, 각 객체는
ui_chat_log항목 하나를 나타냅니다. 워크플로에 체크포인트가 없거나ui_chat_log항목이 없으면 빈 본문을 반환합니다.
GitLab Duo Agent Platform을 사용하기 전에 사용자가 ID 확인을
완료해야 하는 경우, GitLab은 403 Forbidden과 함께 다음
message를 반환합니다.
{
"message": "403 Forbidden - Identity verification is required to use GitLab Duo Agent Platform"
}
요청 예시:
curl --request GET \
--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 --request GET \
--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 |
array of objects | 사용 가능한 모든 에이전트 권한입니다. |
all_privileges[].default_enabled |
boolean | 해당 권한이 기본적으로 활성화되어 있는지 여부입니다. |
all_privileges[].description |
string | 해당 권한이 허용하는 내용에 대한 설명입니다. |
all_privileges[].id |
integer | 권한 ID 입니다. |
all_privileges[].name |
string | 기계가 읽을 수 있는 권한 이름입니다. |
요청 예시:
curl --request GET \
--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
}
]
}