sagent🪄
PyPI version
CI
Python 3.12+
License: Apache-2.0
Discord
A 코딩 에이전트 CLI이자 강력하게 타입 지정된 Python 라이브러리입니다 -- 자체 수정(self-mutating), 핫 스와핑(hot-swapping), 다중 제공자(multi-provider), 비동기 도구 호출(async tool calls) 및 양방향 재귀 생성(bidirectional recursive spawn) 기능을 갖추고 있습니다.
<p align="center">
<img alt="sagent logo" src="https://raw.githubusercontent.com/rekursiv-ai/sagent/main/assets/logo-custom.webp" width="180">
</p>
<p align="center">
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/tutorial.md">튜토리얼</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/concepts.md">개념(Concepts)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/providers.md">제공자(Providers)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/tools.md">도구(Tools)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/cli.md">CLI</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/sessions.md">세션(Sessions)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/security.md">보안(Security)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/architecture.md">아키텍처(Architecture)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/api.md">API</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/streaming.md">스트리밍(Streaming)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/compaction.md">압축(Compaction)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/slack.md">Slack</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/selfhosted.md">셀프 호스팅(Self-hosted)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/blob/main/docs/showcase.md">쇼케이스(Showcase)</a>
·
<a href="https://github.com/rekursiv-ai/sagent/tree/main/examples">예제(Examples)</a>
</p>
빠른 시작 (Quick Start)
더 나은 CLI
Claude Code, Codex CLI, 그리고 Gemini CLI가 할 수 없는 것들:
- 비동기 REPL. 작업이 실행되는 동안 에이전트와 작업에 대해 채팅할 수 있습니다.
Ctrl+B도 필요 없고, 수동으로 여러 가지를 조정할 필요도 없습니다.
- 실시간 자체 수정(Hot self-mutation). 세션 중간에 평범한 영어로 제공자, 모델 또는 사고 노력을 전환할 수 있습니다. 재시작이 필요하지 않습니다.
- 하나의 CLI, 모든 제공자. Anthropic, OpenAI, Google, Moonshot, DashScope, MiniMax, OpenAI와 호환되는 엔드포인트, 자체 호스팅 HuggingFace 모델, 그리고 관리형
llama.cpp 서버가 모두 하나의 바이너리 뒤에 있습니다.
- 통합 비용 추적. 세션 전체에서 모든 제공자에 대한 총 USD 금액이 계산됩니다. 서브 에이전트의 비용은 루트로 합산됩니다.
--max-budget-usd N으로 전체 트리를 제한할 수 있습니다.
- 자율 지시 에이전트 군단(Self-directing agent fleets). 에이전트는 작업 중간에 자체 런타임을 조정합니다. 즉, 제공자, 모델, 사고 과정, 컨텍스트 등을 조정하는 것입니다. 코디네이터는
AgentSend를 통해 워커들에게 다음과 같이 지시할 수 있습니다: "o1로 전환하고, 사고 과정을 강화하며, 파일 읽기는 압축하여 버려라."
- 재귀적 에이전트 메시징(Recursive agent messaging). 생성된 모든 에이전트는 다른 피어에게 직접 생성하고
AgentSend를 보낼 수 있으므로, 조정 구조가 별 모양이 아닌 트리 형태입니다. Claude Code의 실험적인 Agent Teams는 평면적입니다 (리드 하나, 중첩 없음); Codex와 Gemini에는 피어 메시징 기능이 없습니다.
- 중단 가능하고 분리 가능한 작업(Interruptible, detachable tasks). 멈춘 작업을 중지시키거나, 하나의 작업을 분리하여 계속 실행되도록 할 수 있습니다.
- 더 풍부한 내장 도구.
PaperSearch/PaperFetch는 인용 그래프를 탐색하고 PDF를 가져오며, 다중 백엔드 WebSearch, 마크다운 추출이 가능한 WebFetch, 파일 도구에 대한 원자적 읽기/쓰기 추적이 가능합니다.
- Unix 스타일 및 파이프 가능(Unix-aligned and pipeable).
stdin, stdout, 종료 코드, 그리고 --output-format json은 일급 시민(first-class)입니다. jq를 통해 파이프하거나, ipython에 바로 넣을 수 있습니다 (내부적으로 동일한 prompt_toolkit 사용).
독특하게도 API 역할도 수행합니다
- 하나의 런타임으로 모든 환경을 지원합니다. 동일한
Agent 클래스가 CLI, 애플리케이션 코드, 그리고 재귀적 서브 에이전트에 사용됩니다.
- 타입 지정 Python 객체입니다.
Agent, Tool, Model, Provider, 그리고 Message는 가져와서 조합하고 단위 테스트할 수 있는 프로토콜 및 dataclass입니다.
- 피어 투 피어(Peer-to-peer) 에이전트 메시징을 지원합니다. 생성된 모든 에이전트는 부모뿐만 아니라 다른 이름 지정된 피어에게도
AgentSend를 보낼 수 있습니다. 사용자 입력과 마찬가지로, 피어 메시지는 수신 에이전트의 도구 호출보다 우선하여 처리되므로, 어떤 에이전트가 막힌 자식(child)을 기다리느라 멈추는 일이 없습니다.
라이브러리로 사용하기:
from sagent import tools
from sagent.agent import Agent
from sagent.lib.codec import immutable
...
설치 (Install)
Sagent는 Python 3.12 이상을 요구합니다. ripgrep과 fd-find는 선택 사항이며, sagent에는 이들이 없을 때를 대비한 Python 폴백(fallback) 기능이 있지만, 더 빠른 Grep / Glob 처리를 위해 권장됩니다. PDF 렌더링은 번들된 pypdfium2 휠을 사용하므로 시스템 설치가 필요 없습니다. 위 빠른 시작 (Quick Start) 가 sagent CLI를 설치합니다.
sagent를 자체 프로젝트의 라이브러리로 추가하려면:
또는 소스 체크아웃에서 실행합니다:
git clone --depth 1 https://github.com/rekursiv-ai/sagent.git
cd sagent
uv run sagent --help
실행 (Run)
기본 sagent는 Anthropic을 사용하며 ANTHROPIC_API_KEY를 읽습니다:
export ANTHROPIC_API_KEY=...
sagent
다른 프로바이더를 사용하려면 해당 키를 설정하고 --provider 플래그를 전달하세요 ( Provider setup 참조):
export OPENAI_API_KEY=...
sagent --provider OpenAI
--provider는 기본적으로 --allow-providers의 첫 번째 이름을 따르며, 따라서 SAGENT_ALLOW_PROVIDERS만 설정해도 기본 백엔드가 선택되고 서브 에이전트가 사용할 수 있는 프로바이더 목록도 제한됩니다:
SAGENT_ALLOW_PROVIDERS=OpenAI sagent
비대화형 사용을 위해 stdin으로 프롬프트를 파이프합니다:
printf 'Say hi in one sentence.' | \
sagent --provider OpenAI --output-format json
현재 작업 디렉터리의 가장 최근 세션을 재개하려면 --continue를 사용하고, 명시적인 세션 디렉터리가 필요하면 --session PATH를 사용하며, 프롬프트와 자동 메모리를 디스크에 저장하지 않으려면 --ephemeral을 사용합니다. 현재 실행의 API 지출 상한선을 설정하려면 --max-budget-usd N을 사용하세요.
전체 플래그 세트(flag set)는 CLI와 Sessions를 참조하세요.
Quickstart: Python
import asyncio
from sagent import tools
...
Agent.run()은 prompt 키가 포함된 JSON 지시문을 받아 Message를 반환합니다.
더 자세한 내용은 API, Tutorial, 그리고 Concepts를 참조하세요.
Provider 설정
Sagent는 Anthropic, OpenAI, OpenAISubscription, Google, Moonshot, DashScope, MiniMax 및 일반적인 OpenAI 호환 엔드포인트를 위한 API 키 제공자(provider)와 사용자의 설치된 claude 로그인을 활용하는 구독 기반의 AnthropicCLI, 그리고 관리되는 로컬 LlamaCpp 제공자를 함께 제공합니다. 사용할 예정인 제공자에 대한 키를 설정하거나 (로그인을 실행하여) 다음을 수행하세요:
export ANTHROPIC_API_KEY=...
export OPENAI_API_KEY=...
export GOOGLE_API_KEY=...
...
그리고 --provider 플래그의 기본값을 설정하기 위해 다음을 실행하세요:
export SAGENT_ALLOW_PROVIDERS=...
| Provider | Environment variable | Example model |
|---|
Anthropic | ANTHROPIC_API_KEY | fable-5.1 |
| ... | | |
| 전체 제공자 매트릭스, 추론 규칙(inference rules), 그리고 OpenAI 호환 제공자 설정은 Providers를 참조하세요. | | |
자체 호스팅 모델 (Self-hosted models)
체크아웃(checkout)에서 로컬 런타임 추가(runtime extra)를 설치하세요:
uv sync --extra selfhosted
또는 PyPI에서 프로젝트에 추가하세요:
uv add
```bash
sagent --provider SelfHosted --model Qwen/Qwen3.6-27B+bfloat16+cuda
sagent --provider SelfHosted --model Qwen/Qwen3.6-27B+cuda+bfloat16
간단한 스모크 테스트를 위해:
sagent --provider SelfHosted --model Qwen/Qwen3-0.6B+float16+cuda \
--effort none --max-response-tokens 32 --max-tool-call-rounds 1
SelfHosted 옵션은 모델 이름 뒤에 + 접미사를 사용합니다. 장치(Device), 데이터 타입(dtype), 그리고 compile이 어떤 순서로든 나타날 수 있지만, 각 카테고리는 한 번만 나타나야 합니다.
LlamaCpp 프로바이더는 두 번째 로컬 옵션입니다. 이 옵션은 llama-server 서브프로세스를 관리하고 이를 OpenAI와 호환되는 엔드포인트를 통해 통신합니다. LLAMA_CPP_SERVER 환경 변수를 빌드된 llama-server 바이너리 경로로, 그리고 LLAMA_CPP_MODEL 환경 변수를 .gguf 파일 경로로 지정한 다음, sagent --provider LlamaCpp --model qwen3.6-27b-12gb를 실행합니다.
옵션, 로컬 스냅샷 경로 및 런타임 요구 사항은 Self-hosted Models를 참조하십시오.
예시 (Examples)
examples/ 디렉토리에는 작고 실행 가능한 예시들이 포함되어 있습니다:
offline_custom_tool.py: API 키 없이 에이전트/도구/모델 루프를 실행합니다.
decorator_tool.py: 함수를 도구로 래핑(wrap)합니다.
custom_tool.py: 전체 Tool 프로토콜을 구현합니다.
multi_agent_reviewer.py: 격리된 리뷰어 자식 프로세스를 생성합니다.
openai_compatible_provider.py: OpenAI와 호환되는 엔드포인트를 연결합니다.
튜토리얼부터 시작한 다음, 예시들을 복사 가능한 패턴으로 사용하십시오. 예시 (Examples)와 도구 (Tools)를 참조하십시오.
보안 및 개인 정보 보호 (Security and privacy)
Sagent는 샌드박스가 아니라 에이전트 런타임입니다. 활성화된 도구들은 현재 프로세스의 권한으로 실행됩니다: Bash는 로컬 명령을 실행하고, 파일 도구(file tools)는 접근 가능한 경로를 읽고 쓰며, 제공자/네트워크 도구(provider/network tools)는 구성된 서비스로 데이터를 전송합니다. 세션은 평문(plaintext)의 로컬 상태이며 프롬프트, 모델 응답, 도구 결과, 파일 스니펫, 경로 등을 포함할 수 있습니다.
좁은 범위의 도구 세트(narrow tool sets)를 사용하고, 일회성 민감한 프롬프트에는 --ephemeral을 전달하여 세션 및 자동 메모리 기능을 비활성화하며, 작업에 강력한 격리가 필요할 때는 Sagent를 자체 OS/컨테이너 샌드박스 내에서 실행하세요. 보안(Security)을 참조하십시오.
비교 (Comparison)
<details>
<summary>Sagent가 aider, LangChain, Claude Code, Codex CLI, Gemini CLI 및 기타 인접 프로젝트와 어떻게 비교되는지</summary>
아직 Sagent에 포함되지 않은 기능: MCP, LSP, 네이티브 샌드박싱(native sandboxing), 데스크톱 UI, tree-sitter 리포지토리 맵, 호스팅 서비스, 브라우저 자동화.
본 비교는 각 프로젝트의 모든 기능을 다루기보다는 런타임 형태에 초점을 맞추고 있습니다.
| | Sagent | aider | LangChain | OpenClaw | Cline | Claude Code | Codex CLI | Gemini CLI | Flue | Pi | Attractor | npcsh |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| Python 라이브러리 | ✅ | 🟡 | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ |
| ... |
✅ = 예(yes), 🟡 = 부분적(partial), ❌ = 아니오(no). 수정 사항은 환영합니다 -- PR 열기.
각 프로젝트의 작동 방식