statelyai/agent
Create state-machine-powered LLM agents using XState
Stately Agent – 안전한 상태 머신 기반 AI 에이전트
이것은 무엇인가
- XState 상태 머신으로 LLM 기반 에이전트를 구축할 수 있는 TypeScript/JavaScript 라이브러리입니다. 머신이 제어 흐름을 소유하고, 언어 모델은 머신이 검증하는 이벤트만 제안합니다.
왜 중요한가
- 모든 가능한 전이가 코드로 정의되고 가드되므로 에이전트가 잘못된 작업을 수행할 수 없음을 보장합니다.
- 라이브 API 키 없이도 에이전트를 결정적이고, 검사 가능하며, 재개 가능하고, 테스트 가능하게 만듭니다.
- 모든 JavaScript 런타임(Node, Vercel, 브라우저)에서 작동하며 Vercel AI SDK, OpenAI SDK 또는 TanStack AI와 함께 사용할 수 있습니다.
핵심 개념
| 개념 | 기능 |
|---|---|
| 머신 정의 | XState를 사용하여 에이전트의 상태, 가드, 타입이 지정된 요청을 설명합니다. |
| 모델 제안 | LLM은 이벤트(예: AUTO_REFUND)를 생성하도록 요청받습니다. |
| 가드 검증 | 상태 머신은 이벤트를 가드와 대조 확인합니다. 잘못된 이벤트는 거부되고 모델에 다시 요청합니다. |
| 실행기 | 선택한 AI 제공자를 호출하는 일반 함수(decide, generateText 등). 호스트가 제공하며 라이브러리에 내장되지 않습니다. |
| 환경 및 정책 | 비즈니스 규칙은 TypeScript 코드(environment)로 존재합니다. JSON 인코딩 정책은 모델이 편집할 수 있지만 verifyAgentConfig로 승격이 게이트됩니다. |
| 영속성 및 내구성 | XState의 스냅샷 API를 사용합니다. 스냅샷은 어디든 저장할 수 있습니다(파일, 데이터베이스, durable objects). |
빠른 시작(환불 요청 예시)
import { runAgent, setupAgent } from "@statelyai/agent";
import { z } from "zod";
const agentSetup = setupAgent({
context: z.object({ request: z.string(), amount: z.number() }),
input: z.object({ request: z.string(), amount: z.number() }),
output: z.object({ outcome: z.enum(["refunded", "review"]) }),
events: {
AUTO_REFUND: {},
REVIEW: z.object({ reason: z.string() })
}
});
const refundMachine = agentSetup.createMachine({
context: ({ input }) => input,
initial: "deciding",
states: {
deciding: {
invoke: { src: "agent.decide", input: ({ context }) => ({
model: "fast",
system: "Choose AUTO_REFUND for eligible requests. Otherwise choose REVIEW.",
prompt: `${context.request}\nAmount: $${context.amount}`,
allowedEvents: ["AUTO_REFUND", "REVIEW"]
}) },
on: {
AUTO_REFUND: ({ context }) =>
context.amount <= 100 ? { target: "refunded" } : undefined,
REVIEW: { target: "review" }
}
},
refunded: { type: "final", output: () => ({ outcome: "refunded" }) },
review: { type: "final", output: () => ({ outcome: "review" }) }
}
});
// Mock 실행기 – API 키 불필요
const result = await runAgent(refundMachine, {
input: { request: "I was charged twice", amount: 75 },
executors: { decide: async () => ({ event: { type: "AUTO_REFUND" } }) }
});
if (result.status === "done") console.log(result.output); // → { outcome: 'refunded' }
모델은 AUTO_REFUND 또는 REVIEW만 발행할 수 있습니다. AUTO_REFUND의 가드가 $100 제한을 강제하므로 잘못된 선택은 자동으로 거부됩니다.
설치
# 핵심 라이브러리 + XState (alpha) + Zod 스키마 검증
pnpm add @statelyai/agent@alpha xstate@6.0.0-alpha.64 zod
# 선택적 AI‑SDK 실행기 (Vercel AI SDK)
pnpm add ai@^7 @ai-sdk/openai@^4
# 또는 원시 OpenAI SDK 실행기
pnpm add openai
# 또는 TanStack AI 실행기
pnpm add @tanstack/ai @tanstack/ai-openai
Node 22.18+가 필요합니다.
작동 방식(아키텍처)
flowchart LR
M[에이전트 머신<br/>상태·가드·요청] -->|요청| R[runAgent]
R -->|실행기 호출| E[호스트 실행기<br/>generateText·streamText·decide]
E -->|API 호출| L[LLM 제공자]
L -->|결과| E
E -->|결과| R
R -->|이벤트/출력| M
- 머신은 에이전트가 무엇을 할 수 있는지 정의합니다.
runAgent는 머신을 호출하고 실행기에 제어를 넘깁니다.- 실행기는 선택한 LLM(AI SDK, OpenAI SDK 등)을 호출합니다.
- LLM은 이벤트를 반환하고, 머신은 가드에 대해 검증합니다.
- 유효하면 머신이 전이하고, 그렇지 않으면 모델에 다시 요청합니다.
주요 기능(README에 명시된 대로)
- 타입이 지정된 계약 –
zod스키마로 컨텍스트, 입력, 출력, 이벤트를 정의하여 컴파일 타임 안전성 보장. - 모델 비종속 – 실행기를 통해 모든 제공자를 플러그인할 수 있습니다. 코어는 AI SDK를 import하지 않습니다.
- JSON 정책 – 모델이 JSON 정책을 재작성할 수 있지만
verifyAgentConfig가 hold-out 테스트 이득을 기반으로 승격을 게이트합니다. - 내구성 있는 스냅샷 – XState의 네이티브 스냅샷 형식으로 에이전트를 어디서나 영속화하고 복원할 수 있습니다.
- 내장 패턴 – ReAct, plan-and-execute, RAG, supervisor 등이 단일 파일 템플릿으로 제공됩니다.
- 프로바이더 없이 테스트 –
MockLanguageModelV3를 사용하여 오프라인에서 에이전트를 단위 테스트할 수 있습니다. - 관찰 가능성 및 예산 – 문서에는 로깅, 사용량 추적, 예산 강제를 위한 훅이 포함되어 있습니다.
일반적인 사용 사례
- 고객 서비스 봇 – 규제 제한(예: 환불 상한, 데이터 프라이버시 규칙)을 따라야 하는 경우.
- 워크플로 자동화 – 각 단계가 검증된 상태 전이인 경우(승인 흐름, 티켓 트리아지).
- 도구 호출 에이전트 – 실행 전에 도구 인수의 엄격한 검증이 필요한 경우.
- 자기 개선 에이전트 – 배포 전에 자동으로 심사되는 정책 업데이트를 제안할 수 있는 경우.
- 모든 스택에 임베딩 – 서버리스 함수부터 장기 실행 durable objects까지, 제어 흐름이 전적으로 상태 머신에 있기 때문입니다.
자세히 알아보기
- 문서: https://stately.ai/docs/packages/agent
- 예시:
examples/폴더(Twenty Questions, Chameleon, Ticket triage 등) - LangGraph 비교:
docs/langgraph-comparison.md - 패턴 라이브러리:
docs/patterns.md
TL;DR
Stately Agent를 사용하면 LLM 기반 에이전트를 형식 상태 머신으로 작성할 수 있습니다. 모델은 이벤트를 제안할 뿐이며, 머신이 비즈니스 규칙을 강제하므로 모든 JavaScript 환경에서 안전하고, 테스트 가능하며, 이식 가능한 에이전트를 만들 수 있습니다.
관련
- 프로젝트
- Dispatch
- 프로젝트
- 프로젝트
- 프로젝트