SDK
Schift는 Python과 TypeScript용 일급 SDK(software development kit)와 터미널 워크플로우용 Python CLI(command-line interface)를 제공합니다. 세 가지 인터페이스(interface)는 모두 동일한 REST API를 호출하고 동일한 API key(API 키)로 인증합니다.
SDK 패키지
섹션 제목: “SDK 패키지”| 패키지 | 언어 | 설치 | 사용 사례 |
|---|---|---|---|
schift | Python | pip install schift | Python 앱, 노트북, 데이터 파이프라인 |
@schift-io/sdk | TypeScript | npm install @schift-io/sdk | Node, 브라우저, 대시보드 통합 |
schift-cli | Python CLI | pip install schift-cli | 반복 가능한 터미널 워크플로우 및 운영 |
참고: 레거시 배포·제공자·에이전트 워크플로우와의 호환성을 위해 오래된 npm
@schift-io/cli가 여전히 존재합니다. 버킷(bucket)·카탈로그(catalog)·사용량(usage)·벤치마크(benchmark)·마이그레이션(migration) 워크플로우를 유지보수하려면 Pythonschift-cli패키지를 사용하세요.
워크스페이스(workspace) 대시보드에서 API key(API 키)를 생성한 다음, 환경 변수(environment variable)나 명시적인 생성자 인자(constructor argument)로 구성합니다.
export SCHIFT_API_KEY=sch_your_key_hereexport SCHIFT_API_URL=<your-api-url>/v1이 환경에서는 SCHIFT_API_URL을 {apiUrl}/v1(으)로 설정하세요. SDK는 API origin(API 기본 주소)을 찾을 때 fallback(대체 값)으로 SCHIFT_BASE_URL도 읽습니다. CLI는 먼저 SCHIFT_API_KEY를 읽고, 그 다음 schift auth login으로 기록된 ~/.schift/config.json을 fallback(대체 값)으로 사용합니다.
환경 변수
섹션 제목: “환경 변수”| 변수 | 사용 대상 | 용도 |
|---|---|---|
SCHIFT_API_KEY | Python SDK, TypeScript SDK, CLI | API 키 (sch_...) |
SCHIFT_API_URL | Python SDK, TypeScript SDK, CLI | 전체 API 기본 URL, 보통 /v1로 끝남 |
SCHIFT_BASE_URL | Python SDK, TypeScript SDK | /v1 경로를 제외한 API origin |
참고:
SCHIFT_API_URL이 없을 때 SDK와 CLI는 운영 origin을 가정하지 않습니다. 로컬·스테이징·호스팅 워크스페이스에 대해 명시적으로 설정하세요.
Python SDK
섹션 제목: “Python SDK”Python SDK는 두 가지 클라이언트 스타일을 제공합니다.
WorkspaceClient: 버킷(bucket) ingest(수집)·search(검색)·embedding(임베딩)·usage(사용량)·hosted workflow(호스팅 워크플로우) 등 실시간 API 작업용 모듈형 클라이언트입니다.Client: 로컬에서 실행되는Projection객체를 fitting(학습)하고 다운로드하는 레거시 projection(투영) 클라이언트입니다.
WorkspaceClient
섹션 제목: “WorkspaceClient”from schift import WorkspaceClient
with WorkspaceClient() as client: bucket = client.buckets.create(name="finance-docs") upload = client.buckets.upload( bucket["id"], [("files", ("q1-report.pdf", open("q1-report.pdf", "rb").read(), "application/pdf"))], ) hits = client.buckets.search( bucket["id"], "revenue guidance", top_k=5, )WorkspaceClient는 공유 httpx.Client를 유지하므로, 짧게 실행되는 스크립트에는 context manager(컨텍스트 매니저) 사용을 권장합니다. 장기 실행 프로세스의 경우 인스턴스 하나를 유지하고 종료 시 close()를 호출하세요.
핵심 모듈
섹션 제목: “핵심 모듈”| 모듈 | 예시 호출 | 용도 |
|---|---|---|
catalog | client.catalog.list() | 임베딩 모델 목록 조회 |
embed | client.embed(text, model=...) | 단일 텍스트 임베딩 |
embed.batch | client.embed.batch(texts=[...]) | 배치 임베딩 |
buckets | client.buckets.create(name=...) | 버킷 수집 및 검색 |
db | client.db.upsert(collection=...) | 원시 벡터 및 문서 upsert |
query | client.query("...", bucket=...) | 호스팅 버킷 또는 패스스루 검색 |
rerank | client.rerank(query, documents=[...]) | 후보 재정렬 |
providers | client.providers.set("openai", api_key=...) | BYOK 제공자 키 |
routing | client.routing.set(primary=..., fallback=...) | 서버 측 모델 라우팅 |
pii | client.redact_pii(text, types=[...]) | 한국 PII 마스킹 |
usage | client.usage.get(period="30d") | 사용량 요약 |
workflow | client.workflow.create_rag(name=...) | 워크플로우 CRUD 및 실행 |
bench | client.bench.run(source=..., target=...) | 마이그레이션 품질 벤치마크 |
레거시 projection 클라이언트
섹션 제목: “레거시 projection 클라이언트”from schift import Client
legacy = Client(api_key="sch_your_key_here")projection = legacy.fit( source=source_pairs, target=target_pairs, source_model="openai/text-embedding-3-small", target_model="google/gemini-embedding-001", project_name="openai-to-gemini",)projection.save("./projection-openai-to-gemini")저장된 Projection(투영)은 오프라인으로 다시 불러와 로컬 migration(마이그레이션) 엔진에 적용할 수 있습니다:
from schift import Projectionfrom schift.migrate import migratefrom schift.adapters.file import NpyAdapter
projection = Projection.load("./projection-openai-to-gemini")source = NpyAdapter("old_embeddings.npy")sink = NpyAdapter("new_embeddings.npy")
migrate(source=source, sink=sink, projection=projection, batch_size=2048)TypeScript SDK
섹션 제목: “TypeScript SDK”TypeScript SDK는 WorkspaceClient를 중심으로 구성됩니다.
import { WorkspaceClient } from "@schift-io/sdk";
const client = new WorkspaceClient({ apiKey: process.env.SCHIFT_API_KEY!, baseUrl: process.env.SCHIFT_API_URL!,});
await client.createBucket({ name: "company-docs" });const file = new File([await readFile("manual.pdf")], "manual.pdf", { type: "application/pdf",});await client.db.upload("company-docs", { files: [file] });
const results = await client.bucketSearch("company-docs", { query: "refund policy", topK: 5,});핵심 메서드
섹션 제목: “핵심 메서드”| 메서드 | 용도 |
|---|---|
embed(request) | 단일 텍스트 임베딩 |
embedBatch(request) | 배치 임베딩 |
search(request) | 벡터 검색 |
bucketSearch(nameOrId, request) | 버킷 검색 |
chat(request) | 버킷 기반 RAG 채팅 |
chatStream(request) | 스트리밍 RAG 채팅 |
webSearch(query, maxResults?) | 웹 검색 |
redactPii(request) | 한국 PII 마스킹 |
mask(text, options) | 편의 PII 마스크 |
restorePii(request) | PII 토큰 로컬 복원 |
providers.set(provider, config) | BYOK 제공자 키 등록 |
workflows.create(request) | 워크플로우 생성 |
workflows.run(id, inputs) | 워크플로우 실행 |
tools.openai() / tools.anthropic() / tools.vercelAI() | 제공자 SDK용 도구 정의 |
참고: 완전한 TypeScript 클래스 및 타입 참고 자료는 SDK API 레퍼런스를 참조하세요.
CLI
섹션 제목: “CLI”Python schift-cli 패키지는 schift 실행 파일을 설치합니다.
pip install schift-clischift auth loginschift auth status명령 그룹
섹션 제목: “명령 그룹”| 명령 | 용도 |
|---|---|
schift auth ... | 로컬 인증 상태 관리 |
schift catalog ... | 지원되는 임베딩 모델 조회 |
schift embed ... | 텍스트에서 임베딩 생성 |
schift bench ... | 두 모델 간 마이그레이션 품질 평가 |
schift migrate ... | 투영 적합 및 데이터베이스 마이그레이션 실행 |
schift db ... | 버킷 생성, 목록 조회, 상세 조회 |
schift upload ... | 버킷에 파일 업로드 |
schift jobs ... | 수집 작업 조회, 재처리, 취소 |
schift search ... | 버킷 검색 실행 |
schift query ... | 버킷 검색의 호환성 별칭 |
schift usage ... | 집계된 사용량 및 과금 요약 표시 |
일반적인 워크플로우
섹션 제목: “일반적인 워크플로우”export SCHIFT_API_KEY=sch_your_key_hereexport SCHIFT_API_URL=<your-api-url>/v1
schift upload ./handbook.pdf --bucket company-docsschift jobs list --bucket company-docsschift search "revenue report" --bucket company-docs --top-k 5SchiftIndex
섹션 제목: “SchiftIndex”SchiftIndex는 워크스페이스(workspace) 버킷(bucket)으로 반복 가능한 소스 수집을 위한 SDK 관리 sync surface(동기화 표면)입니다. 팀이 로컬 manifest(매니페스트)·text diff(텍스트 차이)·checkpointed sync(체크포인트 동기화)·retry(재시도)·Obsidian vault(옵시디언 볼트) 동기화 같은 소스별 adapter(어댑터)가 필요할 때 사용하세요.
cd "/path/to/Obsidian Vault"schift-index init --manifest schift.index.json --template dot-vaultSCHIFT_API_KEY=... schift-index sync --manifest schift.index.json --cloud오류 처리
섹션 제목: “오류 처리”Python SDK 오류:
from schift import WorkspaceClientfrom schift import AuthError, QuotaError, SDKError
try: with WorkspaceClient() as client: client.catalog.list()except AuthError: ...except QuotaError: ...except SDKError: ...TypeScript SDK 오류 클래스:
import { AuthError, QuotaError, PlatformError } from "@schift-io/sdk";
try { await client.embed({ text: "test" });} catch (err) { if (err instanceof AuthError) { // 401 } else if (err instanceof QuotaError) { // 402 } else if (err instanceof PlatformError) { // 403, 422, 429, 500, 502 }}