Skip to content

API Reference

import { Agent } from "@schift-io/sdk";
new Agent(options: AgentOptions)
OptionTypeDefaultRequired
namestringYes
instructionsstringYes
modelModelId | string"gpt-4o-mini"No
transportTransportOne of transport or baseUrl
baseUrlstringOne of transport or baseUrl
apiKeystringNo
toolsAgentTool[][]No
ragRAGNo
memoryMemoryConfigNo
maxStepsnumber10No
toolTimeoutMsnumber30000No
maxToolCallsnumbermaxSteps * 5No
parallelToolExecutionbooleanfalseNo
skillsSkillsConfigNo
extensionsArray<ExtensionInitFn | string>No
mcpMCPServerConfig[]No
MethodReturnsDescription
run(input, options?)Promise<AgentRunResult>Run the agent with a user message
on(type, handler)() => voidSubscribe to events. Returns unsubscribe fn
off(type, handler)voidUnsubscribe from events
toolCountnumberNumber of registered tools (getter)

import { RAG } from "@schift-io/sdk";
new RAG(config: RAGConfig, transport: Transport)
OptionTypeDefault
bucketstringrequired
topKnumber7
PropertyTypeValue
MAX_QUERY_LENGTHnumber8000
MethodReturnsDescription
search(query: string)Promise<SearchResultItem[]>Semantic search over bucket
chat(query: string)Promise<ChatResult>Search + LLM answer
asTool(name?: string)AgentToolConvert to agent tool

import { WebSearch } from "@schift-io/sdk";
new WebSearch(config?: WebSearchConfig, transport?: Transport)
OptionTypeDefault
maxResultsnumber5
providerWebSearchProvider"schift"
providerApiKeystring
MethodReturnsDescription
search(query: string)Promise<WebSearchResultItem[]>Search the web
asTool(name?: string)AgentToolConvert to agent tool

import { DeepResearch } from "@schift-io/sdk";
new DeepResearch(config?: DeepResearchConfig, llm: LLMFn, transport?: Transport)
OptionTypeDefault
maxIterationsnumber3
resultsPerSearchnumber5
queriesPerIterationnumber2
queryModelModelId | string"gpt-4o-mini"
synthesisModelModelId | string"gpt-4o-mini"
webSearchWebSearchConfig
MethodReturnsDescription
run(question: string)Promise<ResearchReport>Run deep research
asTool(name?: string)AgentToolConvert to agent tool

import { ConversationMemory } from "@schift-io/sdk";
new ConversationMemory(config?: MemoryConfig)
OptionTypeDefault
maxMessagesnumber50
transformContext(messages: ChatMessage[]) => ChatMessage[]
MethodReturnsDescription
add(message: ChatMessage)voidAdd message to history
getMessages()ChatMessage[]Get all messages
clear()voidClear non-system messages
lengthnumberMessage count (getter)

import { ToolRegistry } from "@schift-io/sdk";
MethodReturnsDescription
register(tool: AgentTool)voidRegister a tool
get(name: string)AgentTool | undefinedGet tool by name
has(name: string)booleanCheck if tool exists
list()AgentTool[]List all tools
execute(name, args)Promise<ToolResult>Execute a tool by name
filtered(allowedNames: Set<string>)ToolRegistryNew registry with only allowed tools
without(blockedNames: Set<string>)ToolRegistryNew registry excluding blocked tools
toOpenAI()ArrayGenerate OpenAI-compatible tool definitions
toAnthropic()ArrayGenerate Anthropic-compatible tool definitions

import { AgentEventEmitter } from "@schift-io/sdk";
MethodReturnsDescription
on(type, handler)() => voidSubscribe to event. Returns unsubscribe fn
on("*", handler)() => voidSubscribe to all events
off(type, handler)voidUnsubscribe from event
emit(event)voidEmit an event
removeAll()voidRemove all handlers

import { SkillLoader, loadSkills } from "@schift-io/sdk";
new SkillLoader(skillsDir: string)
MethodReturnsDescription
loadAll(options?)Promise<SkillSummary[]>Load all skill files
get(name: string)Promise<Skill | undefined>Get a skill by name
getAll()Promise<Skill[]>Get all loaded skills
reload(name: string)Promise<Skill | undefined>Reload a specific skill
const loader = await loadSkills("./skills");
// Equivalent to: new SkillLoader("./skills") + loadAll()

import { SkillResolver } from "@schift-io/sdk";
new SkillResolver(loader: SkillLoader)
MethodReturnsDescription
resolve(query)Promise<Skill[]>Get all skills
resolvePrimary(query)Promise<ResolvedSkill | undefined>Best-matching skill for query
buildPromptSection(skills){ promptText, allowedTools }Build prompt injection section

import { PolicyEngine, policyViolation } from "@schift-io/sdk";
new PolicyEngine(contract: SkillContract)
MethodReturnsDescription
beforeTool(input)PolicyDecisionCheck if tool call is allowed
afterTool(input)PolicyDecisionValidate tool result
policyViolation(reason: string): ToolResult
// Returns { success: false, data: null, error: "POLICY_VIOLATION:reason" }

import { ExtensionHost } from "@schift-io/sdk";
MethodReturnsDescription
load(extension)Promise<void>Load an extension (function or module path)

Server-side managed agents — create, configure, and run agents via the Schift Cloud API.

const client = schift.agents;
MethodReturnsDescription
create(req: CreateAgentRequest)Promise<AgentResponse>Create a managed agent
list()Promise<AgentResponse[]>List all agents
get(id: string)Promise<AgentResponse>Get agent by ID
update(id, req)Promise<AgentResponse>Update an agent
delete(id: string)Promise<void>Delete an agent
runs(agentId: string)RunsClientGet runs client for an agent
const runs = schift.agents.runs("agt_abc123");
MethodReturnsDescription
create(req: CreateRunRequest)Promise<RunResponse>Start a run
list()Promise<RunResponse[]>List all runs
get(runId: string)Promise<RunResponse>Get run by ID
streamEvents(runId, afterSeq?)AsyncGenerator<RunEvent>Stream run events

import { Schift } from "@schift-io/sdk";
new Schift(config: SchiftConfig)
OptionTypeDefault
apiKeystringrequired (must start with sch_)
baseUrlstring"https://api.schift.io"
timeoutnumber60000
PropertyTypeDescription
transportHttpTransportHTTP transport for Agent/RAG
workflowsWorkflowClientWorkflow sub-client
agentsAgentsClientManaged Agents sub-client
modelsModelsClientModel catalog
dbDBClientBucket/document management
toolsSchiftToolsTool definition helpers
MethodReturnsDescription
embed(request)Promise<EmbedResponse>Generate embeddings
embedBatch(request)Promise<EmbedBatchResponse>Batch embeddings
search(request)Promise<SearchResult[]>Vector search
chat(request)Promise<ChatResponse>RAG chat
chatStream(request)AsyncGenerator<ChatStreamEvent>RAG chat with SSE streaming
webSearch(query, maxResults?)Promise<WebSearchResultItem[]>Web search
aggregate(request)Promise<AggregateResponse>Metadata aggregation
rerank(request)Promise<RerankResult>Rerank documents
similarity(request)Promise<{ score: number }>Text similarity score
cluster(request)Promise<ClusterResult>Text clustering
classify(request)Promise<ClassifyResult>Zero-shot classification
MethodReturnsDescription
listBuckets()Promise<Bucket[]>List all buckets
createBucket(request)Promise<Bucket>Create a bucket
deleteBucket(nameOrId)Promise<void>Delete a bucket
bucketSearch(nameOrId, request)Promise<SearchResult>Search a bucket
bucketGraph(nameOrId, query?, topK?)Promise<GraphResult>Graph query on a bucket
db.upload(bucket, options)Promise<BucketUploadResult>Upload files to a bucket
MethodReturnsDescription
addEdges(nameOrId, edges)Promise<{ count: number }>Add graph edges
listEdges(nameOrId, nodeId, options?)Promise<EdgeListResult>List edges for a node
deleteEdge(nameOrId, source, target, relation?)Promise<void>Delete an edge
MethodReturnsDescription
listCollections()Promise<Collection[]>List collections
getCollection(id)Promise<Collection>Get collection by ID
createCollection(request)Promise<Collection>Create a collection
deleteCollection(id)Promise<void>Delete a collection
collectionStats(id)Promise<Stats>Get collection statistics
collectionAdd(collection, request)Promise<Result>Add documents to collection
collectionSearch(collection, request)Promise<SearchResult>Search a collection
upsertVectors(collection, vectors)Promise<Result>Upsert raw vectors
deleteVectors(collection, ids)Promise<Result>Delete vectors by ID
upsertDocuments(collection, documents, model)Promise<Result>Upsert documents with embedding
MethodReturnsDescription
chatCompletion(request)Promise<ChatCompletionResult>OpenAI-compatible chat completions
listModels()Promise<Model[]>List available LLM models
getRouting()Promise<RoutingConfig>Get current routing config
setRouting(request)Promise<RoutingConfig>Set routing config
MethodReturnsDescription
usage()Promise<Usage>Get current usage
usageSummary()Promise<UsageSummary>Get usage summary
getJob(jobId)Promise<Job>Get job status
listJobs(options?)Promise<Job[]>List jobs
cancelJob(jobId)Promise<Job>Cancel a job
reprocessJob(jobId)Promise<Job>Reprocess a failed job

Tool calling helpers that generate provider-specific tool definitions. Automatically created on schift.tools.

// OpenAI format
const tools = schift.tools.openai();
// Anthropic format
const tools = schift.tools.anthropic();
// Vercel AI SDK format
const tools = schift.tools.vercelAI();
// Handle any tool call (auto-detects format)
const result = await schift.tools.handle(toolCall);
MethodReturnsDescription
openai()object[]OpenAI-compatible tool definitions
anthropic()object[]Anthropic-compatible tool definitions
vercelAI()Record<string, object>Vercel AI SDK tool definitions
handle(toolCall)Promise<string>Execute a tool call from any provider

interface AgentTool {
name: string; // Must match /^[a-zA-Z_][a-zA-Z0-9_]*$/
description: string;
parameters?: JSONSchema;
handler: (args: Record<string, unknown>) => Promise<ToolResult>;
maxCallsPerRun?: number; // Per-run call limit
}
interface ToolResult {
success: boolean;
data: unknown;
error?: string;
}
interface AgentRunResult {
steps: AgentStep[];
output: string;
totalDurationMs: number;
}
interface AgentStep {
id: string;
type: "think" | "tool_call" | "tool_result" | "final_answer" | "error";
content?: string;
toolName?: string;
toolArgs?: Record<string, unknown>;
toolResult?: ToolResult;
durationMs: number;
}
interface RunOptions {
requestId?: string;
signal?: AbortSignal;
}
interface ChatMessage {
role: "system" | "user" | "assistant" | "tool";
content: string;
toolCallId?: string;
toolName?: string;
}
interface SkillsConfig {
loader: SkillLoader;
autoResolve?: boolean; // Default: true
}
interface SkillContract {
skillName: string;
model?: string;
allowedTools?: string[];
blockedTools?: string[];
procedures?: string[];
constraints?: string[];
}
interface SkillFrontmatter {
name: string;
description: string;
model?: string;
"allowed-tools"?: string[];
"blocked-tools"?: string[];
procedures?: string[];
constraints?: string[];
rag?: string;
}
interface PolicyDecision {
allowed: boolean;
stage: "before_tool" | "after_tool" | "procedure" | "constraint";
reason?: string;
}
interface ExtensionAPI {
registerTool(tool: AgentTool): void;
on<K extends AgentEventType>(type: K, handler: (event: AgentEventMap[K]) => void): () => void;
off<K extends AgentEventType>(type: K, handler: (event: AgentEventMap[K]) => void): void;
readonly agentName: string;
}
interface MCPServerConfig {
transport: "stdio" | "sse";
command?: string;
args?: string[];
url?: string;
toolPrefix?: string;
}
interface CreateAgentRequest {
name: string;
model?: string;
instructions?: string;
tools?: AgentToolDef[];
ragConfig?: RagConfig;
metadata?: Record<string, unknown>;
}
interface AgentResponse {
id: string;
orgId: string;
name: string;
model: string;
instructions: string;
tools: AgentToolDef[];
ragConfig: RagConfig;
metadata: Record<string, unknown>;
createdAt: string;
updatedAt: string;
}
interface RunResponse {
id: string;
agentId: string;
orgId: string;
status: "pending" | "running" | "success" | "error" | "timeout";
inputText: string;
outputText?: string;
error?: string;
tokensUsed: number;
durationMs?: number;
createdAt: string;
finishedAt?: string;
}
interface RunEvent {
seq: number;
eventType: string;
[key: string]: unknown;
}
type AgentEventType =
| "agent_start"
| "turn_start"
| "tool_call"
| "tool_result"
| "message_delta"
| "agent_end"
| "error"
| "policy_violation";

Each event includes type, runId, and timestamp. Additional fields vary by event type:

EventAdditional Fields
agent_startinput
turn_startturnIndex
tool_calltoolName, toolArgs, callId
tool_resulttoolName, callId, result, durationMs
message_deltacontent
agent_endoutput, totalDurationMs
errorerror
policy_violationskillName, stage, reason, toolName?
const WebSearchProvider = {
SCHIFT: "schift",
TAVILY: "tavily",
SERPER: "serper",
BRAVE: "brave",
} as const;
import { OpenAIModel, GeminiModel, ClaudeModel } from "@schift-io/sdk";
// OpenAI
OpenAIModel.GPT_5_4 // "gpt-5.4"
OpenAIModel.GPT_5_4_MINI // "gpt-5.4-mini"
OpenAIModel.GPT_5_4_NANO // "gpt-5.4-nano"
OpenAIModel.GPT_4_1 // "gpt-4.1"
OpenAIModel.GPT_4_1_MINI // "gpt-4.1-mini"
OpenAIModel.GPT_4_1_NANO // "gpt-4.1-nano"
OpenAIModel.GPT_4O // "gpt-4o"
OpenAIModel.GPT_4O_MINI // "gpt-4o-mini"
OpenAIModel.O3 // "o3"
OpenAIModel.O3_MINI // "o3-mini"
OpenAIModel.O3_PRO // "o3-pro"
OpenAIModel.O4_MINI // "o4-mini"
// Google
GeminiModel.GEMINI_3_1_PRO // "gemini-3.1-pro"
GeminiModel.GEMINI_3_1_FLASH // "gemini-3.1-flash"
GeminiModel.GEMINI_3_1_FLASH_LITE // "gemini-3.1-flash-lite"
GeminiModel.GEMINI_2_5_PRO // "gemini-2.5-pro"
GeminiModel.GEMINI_2_5_FLASH // "gemini-2.5-flash"
GeminiModel.GEMINI_2_5_FLASH_LITE // "gemini-2.5-flash-lite"
// Anthropic
ClaudeModel.OPUS_4_6 // "claude-opus-4-6"
ClaudeModel.SONNET_4_6 // "claude-sonnet-4-6"
ClaudeModel.HAIKU_4_5 // "claude-haiku-4-5-20251001"
import {
SchiftError, // Base error (status, code)
AuthError, // 401 - Invalid API key
QuotaError, // 402 - Quota exceeded
EntitlementError, // 403 - Upgrade required
AgentError, // Agent failure (stepId)
ToolError, // Tool execution failure (toolName)
MaxStepsError, // Max ReAct iterations reached
} from "@schift-io/sdk";