이 문서는 본 스캐폴드(템플릿)로 생성된 프로젝트를 빠르게 이해하고, 올바르게 사용하는 방법을 안내합니다.
- 템플릿 이름: Backand (slug: backand, snake: backand)
- 워크스페이스 구성:
uv멀티 패키지(workspace) –[tool.uv.workspace].members = ["casts/*"] - 그래프 레지스트리:
langgraph.json의graphs키를 통해 그래프 엔트리 등록
- LangGraph 기반의 모듈화/계층화된 그래프 구조를 제공합니다.
casts/디렉터리에 개별 Cast를 패키지로 관리합니다(pyproject.toml포함).- 공통 베이스는
casts/base_node.py,casts/base_graph.py에서 가져옵니다. - 각 Cast는
modules/(에이전트/조건/미들웨어/모델/노드/프롬프트/상태/툴/유틸),graph.py로 구성됩니다. - 상태 관리는 분리된 스키마를 사용합니다: 입력용
InputState, 출력용OutputState, 내부 처리용State.
backand/
├── casts/
│ ├── __init__.py
│ ├── base_node.py
│ ├── base_graph.py
│ └── chat/
│ ├── modules/
│ │ ├── __init__.py
│ │ ├── agents.py (선택)
│ │ ├── conditions.py (선택)
│ │ ├── middlewares.py (선택)
│ │ ├── models.py (선택)
│ │ ├── nodes.py (필수)
│ │ ├── prompts.py (선택)
│ │ ├── state.py (필수)
│ │ ├── tools.py (선택)
│ │ └── utils.py (선택)
│ ├── __init__.py
│ ├── graph.py
│ ├── pyproject.toml
│ └── README.md
├── tests/
│ ├── __init__.py
│ ├── cast_tests/
│ └── node_tests/
├── langgraph.json
├── pyproject.toml
└── README.md
- Python 3.11 이상
uv(의존성/실행/빌드)ruff(코드 품질/포맷)
pip install uv- 전체 워크스페이스(모든 Cast 패키지) + 개발 의존성 설치
uv sync --all-packages- 특정 Cast 패키지 설치(워크스페이스 멤버명 사용)
# 예: chat 만 설치
uv sync --package chat멤버명은
casts/<cast_name>하위의 각pyproject.toml의[project].name과 일치합니다.
langgraph.json에서 노출할 그래프를 선언합니다. 기본 예시는 다음과 같습니다.
{
"dependencies": ["."],
"graphs": {
"main": "./casts/graph.py:main_graph",
"chat": "./casts/chat/graph.py:chat_graph"
},
"env": ".env"
}- 특정 Cast만 사용한다면 해당 Cast 키만 남겨도 됩니다.
.env경로는 환경변수 파일을 가리킵니다(필요 시 수정).
개발/디버깅을 위해 인메모리 서버를 실행합니다.
uv run langgraph dev- 크롬 이외 브라우저 사용 시(터널 모드):
uv run langgraph dev --tunnel서버 실행 후 접속 URL
- API: http://127.0.0.1:2024
- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
- API 문서: http://127.0.0.1:2024/docs
참고: 본 서버는 개발/테스트용 인메모리 서버입니다. 프로덕션은 LangGraph Cloud 사용을 권장합니다.
종료 방법: 터미널에서 Ctrl + C(Windows), Cmd + C(macOS)
- 각 Cast는
casts/chat/modules/state.py에서 세 가지 구분된 상태 스키마를 사용합니다:- InputState: 그래프 호출을 위한 입력 스키마 정의
- OutputState: 그래프가 반환하는 출력 스키마 정의
- State: 메인 상태 컨테이너 (메시지 처리를 위해
MessagesState를 상속)
- 실행 시 Studio UI 좌측 패널에 표시되는 입력 필드에 값을 지정한 뒤 Invoke 하십시오.
- 그래프는 자동으로
InputState에 대해 입력을 검증하고OutputState에 따라 출력 형식을 지정합니다.
새로운 그래프/기능을 별도 Cast로 추가하려면 act cast 명령을 사용합니다. Act Operator는 이미 dev 의존성 그룹에 포함되어 있습니다.
# 의존성이 설치되어 있는지 확인
uv sync --all-packages
# 새 Cast 추가 (대화형 모드)
uv run act cast
# 또는 Cast 이름을 직접 지정
uv run act cast my-new-cast
# 또는 전체 옵션과 함께
uv run act cast --path . --cast-name "새 Cast 이름"수행 내용:
- Act 프로젝트 구조 검증
- 필수 파일이 포함된 완전한 Cast 디렉터리 생성
langgraph.json자동 업데이트- Cast를 workspace member로 구성
Cast 생성 후:
# 모든 패키지 설치 (새 Cast 포함)
uv sync --all-packages이 프로젝트는 개발을 지원하기 위해 .claude/skills/에 사전 구성된 Claude 스킬을 포함하고 있습니다. Claude Code나 Cursor에서 @skill-name 구문을 사용하여 호출할 수 있습니다.
| 스킬 | 목적 | 사용 시점 |
|---|---|---|
@architecting-act |
아키텍처 설계 | 새 cast 계획, 구조 불명확, CLAUDE.md 필요 시 |
@engineering-act |
프로젝트 설정 | cast 패키지 생성, 의존성 추가, 환경 동기화 |
@developing-cast |
코드 구현 | 노드/에이전트/툴 구현, LangGraph 패턴 필요 시 |
@testing-cast |
테스트 작성 | pytest 테스트 생성, 모킹 전략, 픽스처 |
-
스킬 호출: 프롬프트에
@skill-name을 입력합니다@architecting-act RAG 파이프라인 설계를 도와줘 @developing-cast CLAUDE.md의 SearchNode를 구현해줘 @engineering-act 이 cast에 langchain-openai를 추가해줘 @testing-cast MyNode에 대한 테스트를 작성해줘 -
스킬 워크플로우: 각 스킬은 해당 도메인에 맞게 안내합니다
architecting-act: 대화형 Q&A →CLAUDE.md생성developing-cast:CLAUDE.md읽기(선택) → 코드 구현engineering-act: 패키지 및 의존성 관리testing-cast: pytest 테스트 파일 생성
1. @architecting-act → 설계 & CLAUDE.md 생성
↓
2. @engineering-act → (필요 시) cast 생성, 의존성 추가
↓
3. @developing-cast → 노드, 에이전트, 그래프, 기타 모듈 구현
↓
4. @testing-cast → 테스트 작성 및 실행
각 Cast는 서로 다른 사용 사례를 위한 두 가지 유형의 베이스 노드를 포함합니다:
- BaseNode: 동기 작업용 (파일 I/O, 데이터베이스 쿼리)
- AsyncBaseNode: 비동기 작업용 (API 호출, 동시 작업)
노드에 필요한 것에 따라 적절한 시그니처를 선택하세요:
# 단순 - state만 필요
def execute(self, state):
return {"result": "value"}
# config 포함 - thread_id, tags 등이 필요
def execute(self, state, config):
thread_id = config.get("configurable", {}).get("thread_id")
return {"result": "value"}
# runtime 포함 - store, stream 기능이 필요
def execute(self, state, runtime):
runtime.store.put(("memories", "1"), {"key": "value"})
return {"result": "value"}
# 전체 - 모든 기능이 필요
def execute(self, state, config, runtime):
# 모든 기능에 접근
return {"result": "value"}Node (동기) 및 AsyncNode (비동기)의 실제 예제는 casts/chat/modules/nodes.py를 참조하세요.
uv run pytest -quv run ruff check . --fix
uv run ruff format .본 템플릿은 pre-commit 구성을 포함합니다.
ruff: 코드 품질 점검/포맷/임포트 정리uv-lock: 의존성 락 파일 동기화
검사 실패 시 커밋이 차단됩니다. 모든 훅을 통과해야 커밋이 완료됩니다.
이 모노레포 템플릿의 구조와 도구는 Proact0의 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다.
- Q. 특정 Cast만 개발하려는데 의존성 설치를 최소화할 수 있나요?
- A.
uv sync --package <패키지명>으로 필요한 Cast만 설치하세요.
- A.
- Q. 새 그래프 키를 추가했는데 Studio UI에 보이지 않습니다.
- A.
langgraph.json의graphs에 올바른 경로(path:callable)로 등록되어 있는지 확인하고, 서버를 재시작하세요.
- A.
- Q. 포맷/린트 기준은 어디서 확인하나요?
- A.
pyproject.toml의[tool.ruff]설정을 확인하세요.
- A.
- LangGraph: https://docs.langchain.com/oss/python/langgraph/overview
- Claude Agent Skills: https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview
- uv: https://docs.astral.sh/uv/
본 템플릿은 Proact0에서 관리하고 있습니다.