PAR — Programmable Agent Runtime
English · 简体中文
모듈식이며 타입 안전한 (type-safe) 에이전트 런타임입니다. OCaml을 위한 LangChain + LangGraph와 같지만, 다른 언어(Python 또는 OCaml)를 사용하더라도 코드를 한 줄도 작성할 필요가 없습니다.
CLI가 필요한가요? 이 SDK를 기반으로 구축된 인터랙티브 코딩 에이전트인 par-code를 사용하세요.
Build Status
PyPI
License: MIT
OCaml
상태: v0.10.0 — 최고 수준의 취소 기능(first-class cancellation) 및 실행 가능한 도구 오류 처리 기능을 지원합니다. 1551개의 테스트가 통과했습니다.
최신 프리릴리즈: v0.12.0-beta.20261023 — 두 SDK 모두에 멀티모달 입력(하나의 메시지에 텍스트 + 이미지)을 지원하며, v0.11 도구 트레인 기능이 추가되었습니다. 해당 태그에서는 1639개의 OCaml 테스트가 진행됩니다. pip install --index-url https://pypi.org/simple par-runtime==0.12.0b20261023 명령어로 명시적으로 설치하세요.
PAR이란 무엇인가요?
PAR은 에이전트 런타임으로, 사용자가 자신의 에이전트 로직에만 집중할 수 있도록 인프라(plumbing)를 처리합니다. 이 인프라에는 ReAct 루프, 도구 디스패치(tool dispatch), 다중 제공업체 LLM 호출(multi-provider LLM calls), 영속성(persistence), 이벤트 버스(event bus), 미들웨어 등이 포함됩니다. 이는 OCaml로 작성되어 타입 안전성과 구조화된 동시성을 갖추었으며, 두 가지 인터페이스(OCaml SDK 및 Python 바인딩)를 통해 접근할 수 있는 LLM 기반 애플리케이션을 위한 서버 프레임워크라고 생각하시면 됩니다.
누가 사용해야 하나요?
- Python 백엔드 엔지니어: OCaml로 스택 전체를 재작성하지 않으면서 타입 안전한 에이전트 인프라가 필요한 경우 —
pip install par-runtime을 통해 Python에서도 동일한 런타임을 호출할 수 있습니다.
- OCaml 개발자: 프로덕션 LLM 애플리케이션을 구축하는 경우 — SDK는 최고 수준이며, 모든 공개 API는 타입이 지정된 인터페이스를 가집니다.
사용 예시 (Hero)
$ pip install par-runtime
$ python3 -c 'from par_runtime import Runtime, Agent; print(
| Aspect | LangChain (Python) | OpenAI Agents SDK | PAR (OCaml) |
|--------|--------------------|--------------------|-------------|
| Type safety | 런타임 충돌(Runtime crashes) | 런타임 충돌(Runtime crashes) | **컴파일 타임 보장(Compile-time guarantees)** |
...
## 빠른 설치 (Quick install)
**대화형 SDK 위자드 (Interactive SDK wizard)** (시스템을 감지하고 Python 또는 OCaml 선택):
```bash
curl -fsSL https://raw.githubusercontent.com/jcz2020/par/main/install.sh | bash
Python 바인딩 (Python binding) (Linux x86_64 + macOS arm64):
OCaml SDK:
opam pin add par https://github.com/jcz2020/par.git
소스에서 빌드 (Build from source):
git clone https://github.com/jcz2020/par.git && cd par
make install-dev
문서화 (Documentation)
전체 문서는 docs/에 있습니다 (또한 jcz2020.github.io/par에서도 게시됩니다):
- Quickstart — 30분 튜토리얼, 도구 호출을 사용하는 첫 에이전트
- Agent API —
agent_config, Runtime.invoke, 도구 핸들러(tool handlers)
- HITL API — 일시 중지-재개 승인(suspend-resume approval), 프로세스 간 지속성(cross-process persistence)
- Parallel Dispatch — 병렬 다중 에이전트 디스패치, 타입 지정 병합(typed merge)
- Workflow API — 순차적, 병렬적, 조건부, 맵-리듀스(map-reduce)
- Middleware — 로깅(Logging), 재시도(Retry), 속도 제한(Rate_limit), 시간 초과(Timeout), 인자 유효성 검사(Arg_validation), 출력 유효성 검사(Output_validation), PII 마스크(PII_mask), 사고 추적기 제거(Think_tag_strip)
- Tools — 타입 안전한 bash 및 원자적 패치 적용을 포함하는 24개 내장 도구
- MCP Client — 모든 Model Context Protocol 서버 연결 가능
- Streaming API — 토큰 스트리밍, 도구 호출 이벤트
- Generate API — 긴 출력 생성, on_max_tokens 정책
- RAG API — 임베딩(embeddings), 벡터 저장소(vector store), 검색(retrieval)
- Document Loaders — 텍스트, Markdown, HTML, CSV, PDF를
Document.t로 로드하여 RAG에 사용
Memory API — FTS5 검색 및 3개의 내장 도구를 갖춘 세션 간 에이전트 메모리
Skills API — 트리거가 있는 재사용 가능한 프롬프트 및 도구 번들
Architecture — PAR의 내부 작동 방식
How-to guides — 동시성(concurrency), 사용자 지정 제공업체(custom providers), 오류 처리
Doc index — 전체 목차
주요 기능 (Features)
- ReAct 에이전트 루프: 제한된 반복 횟수(bounded iterations)를 가지며, 모든 LLM/도구 경계에 미들웨어 적용.
- 워크플로우 엔진(Workflow engine): 체크포인트를 갖춘 순차적(sequential), 병렬적(parallel), 조건부(conditional), map-reduce 기능을 지원합니다.
Agent_call은 구조화된 출력을 위해 response_schema를 지원합니다.
- 다중 제공업체(Multi-provider) LLM: OpenAI, Anthropic, Ollama (로컬), Mock (테스트용)을 지원하며, 모든 OpenAI 호환 엔드포인트를 위한 사용자 지정 등록 기능이 추가되었습니다.
- 멀티모달 입력(Multimodal input): OCaml 및 Python의
Runtime.invoke_content는 혼합된 텍스트/이미지 블록을 수용합니다. URL, base64, 로컬 파일 도우미들은 기존 콘텐츠 블록 형식(content-block format)을 공유하며, Content blocks를 참조하십시오.
- MCP 클라이언트 (stdio + HTTP/SSE): 도구, 리소스, 프롬프트를 위해 모든 모델 컨텍스트 프로토콜(Model Context Protocol) 서버에 연결합니다.
- 내장 도구: 타입 안전한 bash(
Bash_safe_command ADT)를 포함하여 24개의 내장 도구가 제공됩니다. (예: 원자적 통합 차이 패치(atomic unified-diff patching) (apply_patch), 메모리 도구(recall_memory, remember_memory, search_history) 등)
- 미들웨어: 로깅(Logging), 재시도(Retry), 속도 제한(Rate_limit), 시간 초과(Timeout), 인자 유효성 검사(Arg_validation), 출력 유효성 검사(Output_validation), PII 마스킹(PII_mask), 도구 출력 정리(Sanitize_tool_output), Think 태그 제거(Think_tag_strip) 등 9가지 미들웨어를 제공합니다.
- SQLite 영속성(persistence): 세션 그룹화(작업 공간/사용자/테넌트)를 위한 일반적인 범위 차원(scope dimension)을 갖춘 내장 감사 로그가 포함됩니다. 테스트용 Noop 백엔드를 사용합니다.
- 구조화된 동시성(Structured concurrency): Eio를 사용한 OCaml 5.4 효과 처리로 고아 파이버(orphan fibers)나 콜백 지옥(callback hell)이 없습니다.
Eio.Fiber.with_binding을 통한 호출별 격리(invoke_context)는 Runtime.invoke가 재진입성(reentrancy), 병렬성, 및 invoke_async에 안전하도록 만듭니다.
- 에이전트 메모리(Agent memory): 세션 간
Memory_service(FTS5 키워드 검색)와 3개의 내장 도구를 제공합니다. invoke_context를 통해 세션별로 범위 지정되며, llm_service와 같이 플러그인 가능합니다.
- 동적 시스템 프롬프트(Dynamic system prompt) —
invoke_context를 통해 턴별(per-turn) system_prompt_appendix가 제공됩니다. 이는 템플릿 + 스킬 오버레이 + 도구 접미사 뒤에 추가됩니다. invoke/generate/handoff 경로 모두를 포괄합니다.
- HITL 승인(Human-In-The-Loop approval) (Sync / Async / Webhook) — 에이전트가 실행 중간에 인간의 승인을 위해 일시 중지되며, 상태를 SQLite에 영속화하고 외부 해결 후 재개됩니다. 승인 기록은 프로세스 재시작에도 유지됩니다.
- 병렬 다중 에이전트 디스패치(Parallel multi-agent dispatch) —
Runtime.invoke_parallel을 사용하면 타입 지정 병합(typed merge), 에이전트별 작업 공간 격리(per-agent workspace isolation), 그리고 에이전트별 승인 핸들러 재정의 기능을 갖추고 N개의 에이전트를 동시에 실행할 수 있습니다.
- 사용 중단 프레임워크(Deprecation framework) —
warn_once 헬퍼와 Deprecated_api_called 이벤트, [@@deprecated] 주석, 그리고 마이그레이션 가이드가 제공됩니다. 이제 하위 호환성 깨지는 변경 사항이 조용히 발생하지 않습니다.
- 점진적 도구 로딩(Progressive tool loading) —
max_tool_schema_tokens를 설정하면 50개 이상의 도구 등록으로 인한 프롬프트 비대화를 방지할 수 있습니다. 엔진은 항상 기본 레이어(Always-layer floor)와 tool_search 메타 도구를 노출하며, 모델은 호출 시점에 필요한 매칭된 도구를 요청에 따라 추천합니다. Tools를 참조하세요.
- Python ctypes 바인딩(Python ctypes binding) —
par_runtime 패키지는 스레드 안전하며 OCaml 런타임과 GIL(Global Interpreter Lock) 경합이 없습니다. 완전한 동시성 지원을 위해 Runtime별로 영속적인 Eio 도메인을 제공합니다.
- OCaml 및 Python 회귀 테스트 스위트(regression suites) — 전체 테스트 수와 릴리스별 커버리지는 CHANGES.md에 기록됩니다.
- 스킬 시스템(Skill system) —
skill.md 파일을 ~/.par/skills/<id>/ 디렉토리에 넣으면, 트리거 조건(Auto / Manual / Keyword)에 따라 Runtime.invoke 중에 자동으로 활성화됩니다. 자동 트리거 스킬은 더 이상 시스템 프롬프트를 대체하지 않습니다. Skills API를 참조하세요.
언어 바인딩 트랙 (Language tracks)
Python 바인딩 (Python binding)
from par_runtime import Runtime
import json
...
bindings/python/examples/basic_agent.py와 bindings/python/tests/를 참조하세요.
OCaml SDK
open Par
let () = Eio_main.run (fun _env ->
Eio.Switch.run (fun switch ->
...
전체 튜토리얼은 docs/quickstart.md를 참조하세요.
현황 및 로드맵
현재 버전: v0.10.0 — 1급 취소 지원 기능 (cancel_reason ADT, 합성 도구 결과를 사용한 재현 가능 복구(replay-valid recovery), 디스패치/청크 단위 협력 검사(dispatch/chunk-granularity cooperative checks), 취소 가능한 Python invoke_start/invoke_poll/invoke_cancel) 및 실행 가능한 도구 유효성 검사 오류 처리 기능 (teach-at-rejection 마커 [workspace]/[bash-policy], 편집 시 No-op 수정).
최신 베타 버전: v0.14.0-beta.20261102 (GitHub 프리릴리즈 및 PyPI 프리릴리즈)는 워크플로우에 내구성(durable)을 부여합니다. 충돌로 인해 중단된 실행은 시작 시 재활성화되며, Runtime.recover_workflow를 통해 마지막으로 완료된 단계 이후부터 다시 진행됩니다. 이 버전은 Python에서 MCP 사용이 가능해지고 자식 프로세스가 PAR의 환경을 상속받던 bash 보안 결함이 수정된 v0.13.x를 기반으로 합니다. 125개 스위트와 198개 Python 테스트에 걸쳐 총 1678개의 OCaml 테스트가 통과합니다. 안정적인 기본 버전은 여전히 v0.10.0입니다.
개발 중: 다음 단계는 아직 범위가 정해지지 않았습니다. 런타임 측면에서 남은 과제는 도구 실행 격리(tool-execution isolation)와 내구성 있는 실행(durable execution)이며, 둘 다 코딩에 앞서 설계 검토(design pass)가 필요합니다. 패키지 저장소 제출은 여전히 별도의 수동 작업이 필요합니다.
최근 릴리즈: v0.8.4 (test_mcp_runtime 모의 경로 이식성 수정) → v0.8.5 (테스트 모의 경로 이식성 수정 2차) → v0.8.6 (스트리밍 HTTP 오류 전파 수정) → v0.9.0 (Skill 활성화 API 완성) → v0.9.1 (tool_call_id 상관관계 수정) → v0.10.0 (1급 취소 지원 + 실행 가능한 도구 오류).
도움말 받기
기여하기
기여를 환영합니다. 개발 환경 설정(dev setup), PR 컨벤션, 코드 스타일은 CONTRIBUTING.md를 참조하십시오. 이 프로젝트는 Diataxis 문서화 프레임워크를 사용하므로, 문서를 추가할 때는 튜토리얼 / 방법 안내 / 참고 자료 / 설명 구조를 따르십시오.
라이선스 (License)
MIT. LICENSE를 참조하십시오.
감사의 말씀 (Acknowledgements)
PAR는 OCaml 5.4 effects, Eio 동시성 라이브러리(concurrency library), dune 빌드 시스템을 기반으로 구축되었으며, LangChain과 LangGraph로부터 아키텍처적 영감을 얻었습니다. PAR가 의존하는 모든 라이브러리의 유지 관리자들에게 감사드립니다.