콘텐츠로 이동

워크플로우

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": "Upgrade your plan to continue"
}
// 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. Upgrade your plan to use it."
}
// 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/* 라우트를 사용해야 합니다.