문서
워크플로우
DAG 기반 처리 파이프라인을 구성하고 실행합니다. YAML 또는 JSON으로 정의하고, SDK나 REST API로 관리하며, 한 번의 호출로 실행합니다.
포맷 선택 가이드
Schift 워크플로우는 YAML과 JSON 모두 지원합니다. 용도에 맞는 포맷을 선택하세요:
| 포맷 | 적합한 경우 | 사용법 |
|---|---|---|
| YAML | 버전 관리, 직접 편집, 코드 리뷰 | SDK push_yaml() / importYaml() 또는 REST POST /v1/workflows/import |
| JSON | 프로그래밍 생성, API 우선 워크플로우 | SDK create() 또는 REST POST /v1/workflows에 graph 본문 전달 |
| 템플릿 | 빠른 시작 | SDK create(template="BASIC_RAG") 또는 REST에 template 필드 |
요약
직접 파이프라인을 정의한다면 YAML을 사용하세요. 앱이 동적으로 생성한다면 JSON을 사용하세요. 둘 다 서버에 동일한 워크플로우를 만듭니다.
YAML 스키마 레퍼런스
워크플로우 YAML은 4개의 최상위 키로 구성됩니다: version, name, blocks, edges.
yamlversion: 1 # 필수. 항상 1.
name: "법률 문서 QA" # 필수. 표시 이름.
description: "리랭킹 포함 법률 문서 RAG 파이프라인"
blocks:
- id: start # 고유 ID (edges에서 참조)
type: start # 블록 타입 (아래 표 참조)
- id: retriever
type: retriever
title: "법률 문서 검색" # 선택적 표시 이름
config: # 블록별 매개변수
collection: "legal-kr"
top_k: 10
rerank: true
rerank_top_k: 3
- id: prompt
type: prompt_template
config:
template: |
컨텍스트:
{{results}}
질문: {{query}}
질문과 같은 언어로 답변하세요.
- id: llm
type: llm
config:
model: "openai/gpt-4.1-nano"
temperature: 0.3
max_tokens: 1024
- id: answer
type: answer
- id: end
type: end
edges:
- source: start
target: retriever
- source: retriever
target: prompt
- source: prompt
target: llm
- source: llm
target: answer
- source: answer
target: end블록 타입
GET /v1/workflows/meta/block-types로 사용 가능한 타입을 조회할 수 있습니다. 전체 레퍼런스:
| 카테고리 | 타입 | 설명 |
|---|---|---|
| 컨트롤 | start | 시작점. 모든 입력을 하위 블록으로 전달. |
| 컨트롤 | end | 종료 노드. 워크플로우 완료 표시. |
| 문서 | document_loader | PDF, DOCX, HWP, PPT, 이미지, URL 로드. |
| 문서 | document_parser | OCR 및 표/차트 추출. |
| 문서 | chunker | 텍스트 분할. 전략: recursive, semantic, sentence, fixed. |
| 임베딩 | embedder | Schift API로 임베딩 (자동 canonical projection). |
| 임베딩 | model_selector | 작업에 최적인 임베딩 모델 자동 선택. |
| 저장 | vector_store | 컨렉션에 벡터 upsert. |
| 저장 | collection | 기존 컨렉션 참조. |
| 검색 | retriever | 벡터 검색 + 선택적 메타데이터 필터 및 리랭킹. |
| 검색 | reranker | Cross-encoder 리랭킹. |
| LLM | llm | LLM 생성. 접두사 라우팅: openai/, anthropic/, google/. |
| LLM | prompt_template | Jinja2 템플릿으로 프롬프트 구성. |
| 로직 | condition | If/else 분기. |
| 로직 | router | 다중 경로 라우팅 (질문 분류기). |
| 로직 | ai_router | LLM 기반 동적 라우팅. |
| 로직 | loop | 리스트 항목 반복. |
| 변환 | code | Python 샌드박스로 커스텀 로직. |
| 변환 | merge | 여러 분기 출력 병합. |
| 변환 | variable | 워크플로우 변수 설정/조회. |
| 변환 | field_selector | 표에서 컨럼 또는 JSON에서 경로 선택. |
| 통합 | http_request | 외부 API 호출. |
| 통합 | webhook | 인바운드 웹훅 트리거. |
| 수집 | webhook_source | 인바운드 웹훅 -> 수집 파이프라인. |
| 수집 | ingest_bridge | 중복제거 + 다운로드 + 문서 생성. |
| 수집 | feed_poll | 주기적 RSS/API 폴링. |
| 수집 | notify | 작업 완료 시 아웃바운드 웹훅. |
| 출력 | answer | 채팅 스타일 응답 출력. |
| 출력 | metadata_extractor | 텍스트에서 구조화된 메타데이터 추출. |
SDK 빠른 시작
두 SDK 모두 전체 라이프사이클을 지원합니다: 생성, YAML 가져오기/내보내기, 실행, 관리.
pythonfrom schift import Schift
client = Schift(api_key="sch_xxx")
# 방법 1: YAML 파일에서 생성
wf = client.workflows.push_yaml("pipeline.yaml")
# 방법 2: 템플릿으로 생성
wf = client.workflows.create("My RAG", template="BASIC_RAG")
# 방법 3: 단계별 구성
wf = client.workflows.create("커스텀 파이프라인")
client.workflows.add_block(wf.id, "retriever", config={"collection": "docs", "top_k": 5})
client.workflows.add_block(wf.id, "llm", config={"model": "openai/gpt-4.1-nano"})
client.workflows.add_edge(wf.id, source="retriever", target="llm")
# 실행
result = client.workflows.run(wf.id, inputs={"query": "환불 정책이 뛰?"})
print(result.outputs)
# YAML로 내보내기 (버전 관리용)
yaml_str = client.workflows.to_yaml(wf.id, path="pipeline.yaml")typescriptimport { Schift } from "@schift-io/sdk";
const schift = new Schift({ apiKey: "sch_xxx" });
// 방법 1: YAML 문자열에서 가져오기 (js-yaml 필요)
const wf = await schift.workflows.importYaml(yamlString);
// 방법 2: 템플릿으로 생성
const wf2 = await schift.workflows.create({ name: "My RAG", template: "BASIC_RAG" });
// 방법 3: 단계별 구성
const wf3 = await schift.workflows.create({ name: "커스텀" });
await schift.workflows.addBlock(wf3.id, { type: "retriever", config: { collection: "docs" } });
await schift.workflows.addBlock(wf3.id, { type: "llm", config: { model: "openai/gpt-4.1-nano" } });
await schift.workflows.addEdge(wf3.id, { source: "retriever", target: "llm" });
// 실행
const run = await schift.workflows.run(wf3.id, { query: "환불 정책이 뛰?" });
// YAML로 내보내기
const yaml = await schift.workflows.exportYaml(wf3.id);REST API 레퍼런스
| 메서드 | 엔드포인트 | 설명 |
|---|---|---|
| POST | /v1/workflows | 워크플로우 생성 (빈, 템플릿, 또는 전체 그래프) |
| GET | /v1/workflows | 모든 워크플로우 목록 |
| GET | /v1/workflows/{id} | 단건 워크플로우 + 전체 그래프 |
| PATCH | /v1/workflows/{id} | 이름, 설명, 상태, 그래프 수정 |
| DELETE | /v1/workflows/{id} | 워크플로우 삭제 |
| POST | /v1/workflows/import | YAML 문자열에서 가져오기 |
| GET | /v1/workflows/{id}/export?format=yaml | YAML로 내보내기 (format=json도 가능) |
| POST | /v1/workflows/{id}/blocks | 블록 추가 |
| DELETE | /v1/workflows/{id}/blocks/{block_id} | 블록 삭제 |
| POST | /v1/workflows/{id}/edges | 엣지 추가 |
| DELETE | /v1/workflows/{id}/edges/{edge_id} | 엣지 삭제 |
| POST | /v1/workflows/{id}/validate | 그래프 검증 (순환, 누락된 연결) |
| POST | /v1/workflows/{id}/run | 입력값으로 실행 |
| GET | /v1/workflows/{id}/runs | 실행 이력 목록 |
| GET | /v1/workflows/{id}/runs/{run_id} | 특정 실행 결과 |
| POST | /v1/workflows/{id}/webhook/{path} | 외부 웹훅으로 트리거 |
| POST | /v1/workflows/generate | 자연어로 AI 생성 (유료) |
bash# YAML 파일을 REST로 가져오기
curl -X POST https://api.schift.io/v1/workflows/import \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-d '{"yaml": "version: 1\nname: My Pipeline\nblocks:\n - id: start\n type: start\n - id: end\n type: end\nedges:\n - source: start\n target: end"}'
# YAML로 내보내기
curl https://api.schift.io/v1/workflows/{id}/export?format=yaml \
-H "Authorization: Bearer $SCHIFT_API_KEY"
# JSON으로 내보내기
curl https://api.schift.io/v1/workflows/{id}/export?format=json \
-H "Authorization: Bearer $SCHIFT_API_KEY"LLM 프로바이더 라우팅
llm 블록은 모델 접두사로 프로바이더를 자동 라우팅합니다:
| 모델 형식 | 프로바이더 | 예시 |
|---|---|---|
openai/model-name | OpenAI | openai/gpt-4.1-nano |
anthropic/model-name | Anthropic | anthropic/claude-sonnet-4-6 |
google/model-name 또는 gemini-* | Google (Gemini) | gemini-2.5-flash |
API 키는 조직 설정을 우선 확인하고, 없으면 환경변수(OPENAI_API_KEY, ANTHROPIC_API_KEY, GOOGLE_API_KEY)를 사용합니다.
템플릿
GET /v1/workflows/meta/templates로 사용 가능한 템플릿을 조회할 수 있습니다.
| 템플릿 | 파이프라인 |
|---|---|
BASIC_RAG | Start -> Retriever -> Reranker -> Prompt -> LLM -> Answer -> End |
DOCUMENT_QA | 문서 QA + 출처 표시 |
CONVERSATIONAL_RAG | 다회전 대화형 RAG |
CHAT_RAG | 채팅 최적화 RAG |
IMAGE_OCR_INGEST | OCR -> Chunk -> Embed 수집 파이프라인 |
실행
여러 입력 변수를 전달할 수 있습니다. Start 노드가 모든 변수를 하위 블록으로 전달합니다.
bash# 실행 전 검증
curl -X POST https://api.schift.io/v1/workflows/{id}/validate \
-H "Authorization: Bearer $SCHIFT_API_KEY"
# 입력값으로 실행
curl -X POST https://api.schift.io/v1/workflows/{id}/run \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-d '{"inputs": {"query": "출산 휴가 정책", "language": "ko"}}'
# 실행 이력 조회
curl https://api.schift.io/v1/workflows/{id}/runs \
-H "Authorization: Bearer $SCHIFT_API_KEY"실행 응답에는 status, outputs, 블록별 block_states(소요 시간 포함), 실패 시 error가 포함됩니다.
웹훅 트리거
외부 시스템에서 워크플로우를 트리거할 수 있습니다. /v1/workflows/{id}/webhook/{path}로 POST하면 페이로드가 워크플로우 입력(body, headers, query_params)으로 전달됩니다.
AI 생성 (유료)
POST /v1/workflows/generate는 자연어 설명으로 워크플로우 그래프를 생성합니다. 생성된 그래프는 검토용으로 반환되며 자동 저장되지 않습니다.
bashcurl -X POST https://api.schift.io/v1/workflows/generate \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SCHIFT_API_KEY" \
-d '{"prompt": "문서 검색 후 리랭킹하고 GPT-4o로 요약"}'