콘텐츠로 이동

워크플로우

Show:

워크플로우(workflow) API를 사용하면 블록(block)과 엣지(edge)로 구성된 결정적인 DAG(방향성 비순환 그래프) 기반 파이프라인(pipeline)을 만들 수 있는다. 빈 그래프(graph)나 내장 템플릿(template)으로 시작해 워크플로우를 프로그래밍 방식으로 생성하고, 동기 또는 비동기로 실행(run)하며, 실행과 로그를 조회하고, 워크플로우 정의를 YAML로 임포트(import)하거나 익스포트(export)할 수 있는다.

모든 워크플로우 라우트는 API 키로 인증되며, 해당 키를 소유한 조직(organization) 범위에서 동작한다.

참고: 대시보드 사용자는 /v1/organizations/\{org_id\}/workflows라는 조직(organization) 범위 라우트를 통해 워크플로우를 관리할 수도 있는다. 아래 라우트는 공개 API 키 인터페이스이다.

모든 요청에 Bearer API 키가 포함되어야 한다:

Terminal window
curl -H "Authorization: Bearer $SCHIFT_API_KEY" \
https://api.schift.io/v1/workflows

모든 워크플로우 엔드포인트는 다음 경로에 호스팅된다:

https://api.schift.io/v1/workflows

워크플로우(workflow)는 블록(block)과 엣지(edge)로 구성된 DAG(방향성 비순환 그래프)이다.

항목타입설명
idstring워크플로우 식별자.
namestring사람이 읽기 쉬운 이름.
descriptionstring선택적 설명.
statusstringdraft, published, 또는 archived.
graph.nodesarray워크플로우 내 블록 목록.
graph.edgesarray블록 간 연결.
created_atstringISO 8601 타임스탬프.
updated_atstringISO 8601 타임스탬프.

새로운 워크플로우(workflow)를 생성한다. 빈 그래프(graph)에서 시작하거나 내장 템플릿(template)에서 시작할 수 있는다.

매개변수타입필수 여부설명
namestring워크플로우 이름.
descriptionstring아니오선택적 설명.
templatestring아니오내장 템플릿(template) ID 중 하나이다. graph와 함께 사용할 수 없는다.
graphobject아니오nodesedges로 구성된 초기 DAG이다.

내장 템플릿(template): basic_rag, document_qa, conversational_rag, multi_source_rag, agentic_rag, image_ocr_ingest, chat_rag, chatroom_memory_search.

Terminal window
curl -X POST https://api.schift.io/v1/workflows \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Document QA",
"description": "Upload, parse, chunk, embed, and store documents.",
"template": "document_qa"
}'
{
"id": "wf_abc123def456",
"name": "Document QA",
"description": "Upload, parse, chunk, embed, and store documents.",
"status": "draft",
"graph": {
"nodes": [
{
"id": "start_001",
"type": "start",
"title": "Start",
"position": {"x": 100, "y": 100},
"config": {}
}
],
"edges": []
},
"created_at": "2026-06-19T05:00:00+00:00",
"updated_at": "2026-06-19T05:00:00+00:00"
}
// 400
{
"detail": "Code blocks are disabled in hosted workflows"
}

인증된 조직(organization)의 모든 워크플로우(workflow)를 조회한다.

[
{
"id": "wf_abc123def456",
"name": "Document QA",
"description": "Upload, parse, chunk, embed, and store documents.",
"status": "draft",
"block_count": 1,
"updated_at": "2026-06-19T05:00:00+00:00"
}
]

전체 그래프(graph)를 포함한 단일 워크플로우(workflow) 정의를 조회한다.

이름타입설명
workflow_idstring워크플로우 식별자.
// 404
{
"detail": "Workflow not found"
}

워크플로우(workflow)의 메타데이터 또는 그래프(graph)를 업데이트한다. 그래프를 변경하면 검증(validate)이 실행된다.

매개변수타입필수 여부설명
namestring아니오새로운 워크플로우 이름.
descriptionstring아니오새로운 설명.
statusstring아니오draft, published, 또는 archived.
graphobject아니오nodesedges로 구성된 대체 DAG이다.

참고: 워크플로우(workflow)를 실행(run)하려면 published 상태여야 한다.

// 400 invalid_graph
{
"error": "invalid_graph",
"errors": ["Missing required input on block chunk_001"]
}
// 400
{
"detail": "Code blocks are disabled in hosted workflows"
}

워크플로우(workflow)와 그 정의를 삭제한다. 성공 시 204 No Content를 반환한다.

// 404
{
"detail": "Workflow not found"
}

기존 워크플로우(workflow)에 블록(block)을 추가한다.

매개변수타입필수 여부설명
typestring블록(block) 타입이다. GET /v1/workflows/meta/block-types를 참조하세요.
titlestring아니오표시 제목이다. 지정하지 않으면 블록 타입 라벨이 사용된다.
positionobject아니오{"x": number, "y": number}. 기본값은 {"x": 0, "y": 0}이다.
configobject아니오블록(block)별 설정이다.
Terminal window
curl -X POST https://api.schift.io/v1/workflows/wf_abc123def456/blocks \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "llm",
"title": "Answer generator",
"position": {"x": 400, "y": 200},
"config": {
"model": "gemini-2.5-flash-lite",
"temperature": 0.7,
"max_tokens": 1024
}
}'
{
"id": "llm_7a8b9c0d",
"type": "llm",
"title": "Answer generator",
"config": {
"model": "gemini-2.5-flash-lite",
"temperature": 0.7,
"max_tokens": 1024
},
"position": {"x": 400, "y": 200}
}
// 400
{
"detail": "Code blocks are disabled in hosted workflows"
}

DELETE /v1/workflows/{workflow_id}/blocks/{block_id}

섹션 제목: “DELETE /v1/workflows/{workflow_id}/blocks/{block_id}”

워크플로우(workflow)에서 블록(block)을 제거한다. 연결된 엣지(edge)는 자동으로 제거된다.

이름타입설명
workflow_idstring워크플로우 식별자.
block_idstring블록 식별자.

성공 시 204 No Content를 반환한다.

두 블록(block) 사이에 엣지(edge)를 추가한다.

매개변수타입필수 여부설명
sourcestring소스 블록 ID.
targetstring타겟 블록 ID.
source_handlestring아니오출력 포트(port)이다. 기본값은 output이다.
target_handlestring아니오입력 포트(port)이다. 기본값은 input이다.
Terminal window
curl -X POST https://api.schift.io/v1/workflows/wf_abc123def456/edges \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source": "retriever_001",
"target": "llm_7a8b9c0d",
"source_handle": "results",
"target_handle": "vars"
}'
{
"id": "edge_a1b2c3d4",
"source": "retriever_001",
"target": "llm_7a8b9c0d",
"source_handle": "results",
"target_handle": "vars"
}
// 400
{
"detail": "Source block not found: retriever_001"
}

DELETE /v1/workflows/{workflow_id}/edges/{edge_id}

섹션 제목: “DELETE /v1/workflows/{workflow_id}/edges/{edge_id}”

워크플로우(workflow)에서 엣지(edge)를 제거한다. 성공 시 204 No Content를 반환한다.

워크플로우(workflow)를 실행(run)한다.

이름타입필수 여부설명
modestring아니오async(기본값) 또는 sync.
매개변수타입필수 여부설명
inputsobject아니오워크플로우(workflow)에 전달되는 키-값 입력값이다.

비동기 실행(run)은 백그라운드 작업으로 큐에 들어갑다. 응답에 포함된 실행 ID로 GET /v1/workflows/\{workflow_id\}/runs/\{run_id\}를 폴(poll)하여 조회할 수 있는다.

Terminal window
curl -X POST "https://api.schift.io/v1/workflows/wf_abc123def456/run?mode=async" \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputs": {"query": "What is vector search?"}
}'
{
"id": "run_9f8e7d6c",
"workflow_id": "wf_abc123def456",
"status": "pending"
}

동기 실행(run)은 워크플로우(workflow)가 끝날 때까지 기다린 뒤 최종 실행 상태를 반환한다.

Terminal window
curl -X POST "https://api.schift.io/v1/workflows/wf_abc123def456/run?mode=sync" \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"inputs": {"query": "What is vector search?"}
}'
{
"id": "run_9f8e7d6c",
"workflow_id": "wf_abc123def456",
"status": "completed",
"inputs": {"query": "What is vector search?"},
"outputs": {"answer": "Vector search finds similar vectors in a database."},
"block_states": {
"llm_7a8b9c0d": {
"block_id": "llm_7a8b9c0d",
"status": "completed",
"inputs": {"vars": {"query": "What is vector search?"}},
"outputs": {"response": "Vector search finds similar vectors in a database."},
"error": null,
"started_at": "2026-06-19T05:05:00+00:00",
"finished_at": "2026-06-19T05:05:01+00:00",
"duration_ms": 1200
}
},
"error": null,
"started_at": "2026-06-19T05:05:00+00:00",
"finished_at": "2026-06-19T05:05:02+00:00"
}
// 409 workflow_not_published
{
"error": "workflow_not_published",
"message": "Publish workflow before running",
"status": "draft"
}
// 403
{
"detail": "Contracted scope exhausted. Contact us to extend it."
}
// 402
{
"allowed": false,
"reason": "quota_exceeded"
}
// 400
{
"detail": "Workflow exceeds maximum of 100 blocks (has 120)"
}

POST /v1/workflows/{workflow_id}/webhook/{path}

섹션 제목: “POST /v1/workflows/{workflow_id}/webhook/{path}”

수신된 웹훅(webhook)으로 워크플로우(workflow) 실행(run)을 트리거한다. 요청 본문, 헤더, 쿼리 매개변수, 메서드, 경로가 워크플로우의 입력값으로 전달된다.

이름타입설명
workflow_idstring워크플로우 식별자.
pathstring나머지 웹훅(webhook) 경로.
Terminal window
curl -X POST https://api.schift.io/v1/workflows/wf_abc123def456/webhook/incoming \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"event": "document.uploaded"}'
{
"id": "run_a1b2c3d4",
"workflow_id": "wf_abc123def456",
"status": "pending"
}
// 413
{
"detail": "Workflow webhook body exceeds 1MB cap"
}
// 400
{
"detail": "Invalid JSON body: Expecting value"
}

워크플로우(workflow)의 실행(run) 목록을 조회한다.

[
{
"id": "run_9f8e7d6c",
"workflow_id": "wf_abc123def456",
"status": "completed",
"inputs": {"query": "What is vector search?"},
"outputs": {"answer": "Vector search finds similar vectors in a database."},
"started_at": "2026-06-19T05:05:00+00:00",
"finished_at": "2026-06-19T05:05:02+00:00"
}
]

GET /v1/workflows/{workflow_id}/runs/{run_id}

섹션 제목: “GET /v1/workflows/{workflow_id}/runs/{run_id}”

블록(block) 수준 상태를 포함한 단일 실행(run)을 조회한다.

// 404
{
"detail": "Workflow run not found"
}

GET /v1/workflows/{workflow_id}/runs/{run_id}/logs

섹션 제목: “GET /v1/workflows/{workflow_id}/runs/{run_id}/logs”

실행(run)의 실행 로그를 폴(poll) 형태로 조회한다.

이름타입필수 여부설명
after_seqinteger아니오이 시퀀스 번호 이후의 로그를 반환한다. 기본값은 0이다.
{
"run_id": "run_9f8e7d6c",
"status": "completed",
"logs": [
{"seq": 1, "level": "info", "message": "Run started", "timestamp": "2026-06-19T05:05:00+00:00"},
{"seq": 2, "level": "info", "message": "Block llm_7a8b9c0d completed", "timestamp": "2026-06-19T05:05:01+00:00"}
]
}

워크플로우(workflow) 그래프(graph)를 수정하지 않고 검증(validate)한다.

{
"valid": true,
"errors": []
}
{
"valid": false,
"errors": ["Block llm_7a8b9c0d has unconnected required input"]
}

YAML에서 워크플로우(workflow)를 임포트(import)한다.

매개변수타입필수 여부설명
yamlstringYAML 워크플로우 정의.

YAML에는 version: 1, name, 그리고 최소한 하나의 블록(block)이 포함되어야 한다. code 블록은 임포트(import) 시 거부된다.

Terminal window
curl -X POST https://api.schift.io/v1/workflows/import \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"yaml": "version: 1\nname: Simple RAG\nblocks:\n - id: start\n type: start\nedges: []"
}'
{
"id": "wf_imported123",
"name": "Simple RAG",
"status": "draft",
"graph": {
"nodes": [{"id": "start", "type": "start", "title": "Start", "position": {"x": 0, "y": 0}, "config": {}}],
"edges": []
},
"created_at": "2026-06-19T05:10:00+00:00",
"updated_at": "2026-06-19T05:10:00+00:00"
}
// 400
{
"detail": "Missing required field: 'version'"
}
// 400
{
"detail": "Code blocks are disabled in hosted workflows"
}

워크플로우(workflow) 정의를 YAML 또는 JSON으로 익스포트(export)한다.

이름타입필수 여부설명
formatstring아니오yaml(기본값) 또는 json.

yaml 형식의 응답은 text/yaml이다. json 형식의 응답은 JSON이다.

자연어(natural language) 프롬프트로 워크플로우(workflow)를 생성한다. 이 기능은 프리미엄 기능이다.

매개변수타입필수 여부설명
promptstring생성할 워크플로우에 대한 설명.
modelstring아니오사용할 모델이다. 기본값은 gemini-2.5-flash-lite이다.
// 403
{
"error": "upgrade_required",
"message": "Agentic workflow generation is a premium feature. Contact us to add it to your scope."
}
// 502
{
"error": "upstream_error",
"message": "Workflow execution failed"
}

사용 가능한 모든 블록 타입(block type), 카테고리(category), 입력/출력 포트(port), 기본 설정을 조회한다.

노드(node) 디스크립터(descriptor)를 조회한다. 카테고리(category)나 검색어로 필터링할 수 있는다.

이름타입필수 여부설명
categorystring아니오블록 카테고리(category)로 필터링한다.
qstring아니오검색어.

GET /v1/workflows/meta/descriptors/grouped

섹션 제목: “GET /v1/workflows/meta/descriptors/grouped”

카테고리(category)별로 그룹화된 노드 디스크립터(descriptor)를 조회한다.

GET /v1/workflows/meta/descriptors/{block_type}

섹션 제목: “GET /v1/workflows/meta/descriptors/{block_type}”

단일 블록 타입(block type)의 디스크립터(descriptor)를 조회한다.

// 404
{
"detail": "No descriptor for block type 'unknown_block'"
}

내장 워크플로우 템플릿(template)을 조회한다.

[
{"id": "basic_rag", "label": "Basic Rag"},
{"id": "document_qa", "label": "Document Qa"},
{"id": "conversational_rag", "label": "Conversational Rag"}
]
제한비고
워크플로우당 블록 수100하드 제한.
워크플로우당 엣지 수200하드 제한(블록 제한의 2배).
웹훅(webhook) 본문 크기1 MBHTTP 413으로 거부된다.
동기 실행(run) 제한 시간60 s전체 워크플로우 제한 시간.
블록(block)당 제한 시간30 s개별 블록 제한 시간.
실행 컨텍스트 크기10 MB전체 변수 및 출력값.
하위 워크플로우(subworkflow) 깊이5최대 중첩 하위 워크플로우 호출 수.

기본 실행 사용량 상한:

사용량 상한
external_calls_total60
llm_calls20
web_search_calls10

실행(run)은 다음 상태 중 하나일 수 있는다:

상태설명
pending큐에 들어갔지만 시작되지 않음.
running현재 실행 중.
completed성공적으로 완료.
failed에러로 인해 중단.
cancelled완료 전 취소됨.
버전상태비고
v1현재여기에 문서화된 모든 /v1/workflows/* 라우트가 현재 공개 인터페이스이다.

현재 v2 워크플로우 API는 없는다. 새로운 연동은 /v1/workflows/* 라우트를 사용해야 한다.