메인 콘텐츠로 건너뛰기
이 가이드는 CrewAI AMP에 배포할 때 프라이빗 PyPI 레지스트리(Azure DevOps Artifacts, GitHub Packages, GitLab, AWS CodeArtifact 등)에서 Python 패키지를 설치하도록 CrewAI 프로젝트를 구성하는 방법을 다룹니다.

이 가이드가 필요한 경우

프로젝트가 공개 PyPI가 아닌 프라이빗 레지스트리에 호스팅된 내부 또는 독점 Python 패키지에 의존하는 경우, 다음을 수행해야 합니다:
  1. UV에 패키지를 어디서 찾을지 알려줍니다 (index URL)
  2. UV에 어떤 패키지가 해당 index에서 오는지 알려줍니다 (source 매핑)
  3. UV가 설치 중에 인증할 수 있도록 자격 증명을 제공합니다
CrewAI AMP는 의존성 해결 및 설치에 UV를 사용합니다. UV는 pyproject.toml 구성과 자격 증명용 환경 변수를 결합하여 인증된 프라이빗 레지스트리를 지원합니다.

1단계: pyproject.toml 구성

pyproject.toml에서 세 가지 요소가 함께 작동합니다:

1a. 의존성 선언

프라이빗 패키지를 다른 의존성과 마찬가지로 [project.dependencies]에 추가합니다:
[project]
dependencies = [
    "crewai[tools]>=0.100.1,<1.0.0",
    "my-private-package>=1.2.0",
]

1b. index 정의

프라이빗 레지스트리를 [[tool.uv.index]] 아래에 명명된 index로 등록합니다:
[[tool.uv.index]]
name = "my-private-registry"
url = "https://pkgs.dev.azure.com/my-org/_packaging/my-feed/pypi/simple/"
explicit = true
name 필드는 중요합니다 — UV는 이를 사용하여 인증을 위한 환경 변수 이름을 구성합니다 (아래 2단계를 참조하세요).explicit = true를 설정하면 UV가 모든 패키지에 대해 이 index를 검색하지 않습니다 — [tool.uv.sources]에서 명시적으로 매핑한 패키지만 검색합니다. 이렇게 하면 프라이빗 레지스트리에 대한 불필요한 쿼리를 방지하고 의존성 혼동 공격을 차단할 수 있습니다.

1c. 패키지를 index에 매핑

[tool.uv.sources]를 사용하여 프라이빗 index에서 해결해야 할 패키지를 UV에 알려줍니다:
[tool.uv.sources]
my-private-package = { index = "my-private-registry" }

전체 예시

[project]
name = "my-crew-project"
version = "0.1.0"
requires-python = ">=3.10,<=3.13"
dependencies = [
    "crewai[tools]>=0.100.1,<1.0.0",
    "my-private-package>=1.2.0",
]

[tool.crewai]
type = "crew"

[[tool.uv.index]]
name = "my-private-registry"
url = "https://pkgs.dev.azure.com/my-org/_packaging/my-feed/pypi/simple/"
explicit = true

[tool.uv.sources]
my-private-package = { index = "my-private-registry" }
pyproject.toml을 업데이트한 후 lock 파일을 다시 생성합니다:
uv lock
업데이트된 uv.lock을 항상 pyproject.toml 변경 사항과 함께 커밋하세요. lock 파일은 배포에 필수입니다 — 배포 준비하기를 참조하세요.

2단계: 인증 자격 증명 설정

UV는 pyproject.toml에서 정의한 index 이름을 기반으로 한 명명 규칙을 따르는 환경 변수를 사용하여 프라이빗 index에 인증합니다:
UV_INDEX_{UPPER_NAME}_USERNAME
UV_INDEX_{UPPER_NAME}_PASSWORD
여기서 {UPPER_NAME}은 index 이름을 대문자로 변환하고 하이픈을 언더스코어로 대체한 것입니다. 예를 들어, my-private-registry라는 이름의 index는 다음을 사용합니다:
변수
UV_INDEX_MY_PRIVATE_REGISTRY_USERNAME레지스트리 사용자 이름 또는 토큰 이름
UV_INDEX_MY_PRIVATE_REGISTRY_PASSWORD레지스트리 비밀번호 또는 토큰/PAT
이 환경 변수는 CrewAI AMP 환경 변수 설정을 통해 반드시 추가해야 합니다 — 전역적으로 또는 배포 수준에서. .env 파일에 설정하거나 프로젝트에 하드코딩할 수 없습니다.아래 AMP에서 환경 변수 설정을 참조하세요.

레지스트리 제공업체 참조

아래 표는 일반적인 레지스트리 제공업체의 index URL 형식과 자격 증명 값을 보여줍니다. 자리 표시자 값을 실제 조직 및 피드 세부 정보로 대체하세요.
제공업체Index URL사용자 이름비밀번호
Azure DevOps Artifactshttps://pkgs.dev.azure.com/{org}/_packaging/{feed}/pypi/simple/비어 있지 않은 임의의 문자열 (예: token)Packaging Read 범위의 Personal Access Token (PAT)
GitHub Packageshttps://pypi.pkg.github.com/{owner}/simple/GitHub 사용자 이름read:packages 범위의 Personal Access Token (classic)
GitLab Package Registryhttps://gitlab.com/api/v4/projects/{project_id}/packages/pypi/simple/__token__read_api 범위의 Project 또는 Personal Access Token
AWS CodeArtifactaws codeartifact get-repository-endpoint의 URL 사용awsaws codeartifact get-authorization-token의 토큰
Google Artifact Registryhttps://{region}-python.pkg.dev/{project}/{repo}/simple/_json_key_base64Base64로 인코딩된 서비스 계정 키
JFrog Artifactoryhttps://{instance}.jfrog.io/artifactory/api/pypi/{repo}/simple/사용자 이름 또는 이메일API 키 또는 ID 토큰
자체 호스팅 (devpi, Nexus 등)레지스트리의 simple API URL레지스트리 사용자 이름레지스트리 비밀번호
AWS CodeArtifact의 경우 인증 토큰이 주기적으로 만료됩니다. 만료되면 UV_INDEX_*_PASSWORD 값을 갱신해야 합니다. CI/CD 파이프라인에서 이를 자동화하는 것을 고려하세요.

AMP에서 환경 변수 설정

프라이빗 레지스트리 자격 증명은 CrewAI AMP에서 환경 변수로 구성해야 합니다. 두 가지 옵션이 있습니다:
  1. CrewAI AMP에 로그인합니다
  2. 자동화로 이동합니다
  3. Environment Variables 탭을 엽니다
  4. 각 변수 (UV_INDEX_*_USERNAMEUV_INDEX_*_PASSWORD)에 값을 추가합니다
자세한 내용은 AMP에 배포하기 — 환경 변수 설정하기 단계를 참조하세요.
자격 증명을 저장소에 절대 커밋하지 마세요. 모든 비밀 정보에는 AMP 환경 변수를 사용하세요. .env 파일은 .gitignore에 포함되어야 합니다.
기존 배포의 자격 증명을 업데이트하려면 Crew 업데이트하기 — 환경 변수를 참조하세요.

전체 동작 흐름

CrewAI AMP가 자동화를 빌드할 때, 해결 흐름은 다음과 같이 작동합니다:
1

빌드 시작

AMP가 저장소를 가져오고 pyproject.tomluv.lock을 읽습니다.
2

UV가 의존성 해결

UV가 [tool.uv.sources]를 읽어 각 패키지가 어떤 index에서 와야 하는지 결정합니다.
3

UV가 인증

각 프라이빗 index에 대해 UV가 AMP에서 구성한 환경 변수에서 UV_INDEX_{NAME}_USERNAMEUV_INDEX_{NAME}_PASSWORD를 조회합니다.
4

패키지 설치

UV가 공개(PyPI) 및 프라이빗(레지스트리) 패키지를 모두 다운로드하고 설치합니다.
5

자동화 실행

모든 의존성이 사용 가능한 상태에서 crew 또는 flow가 시작됩니다.

문제 해결

빌드 중 인증 오류

증상: 프라이빗 패키지를 해결할 때 401 Unauthorized 또는 403 Forbidden으로 빌드가 실패합니다. 확인사항:
  • UV_INDEX_* 환경 변수 이름이 index 이름과 정확히 일치하는지 확인합니다 (대문자, 하이픈 -> 언더스코어)
  • 자격 증명이 로컬 .env뿐만 아니라 AMP 환경 변수에 설정되어 있는지 확인합니다
  • 토큰/PAT에 패키지 피드에 필요한 읽기 권한이 있는지 확인합니다
  • 토큰이 만료되지 않았는지 확인합니다 (특히 AWS CodeArtifact의 경우)

패키지를 찾을 수 없음

증상: No matching distribution found for my-private-package. 확인사항:
  • pyproject.toml의 index URL이 /simple/로 끝나는지 확인합니다
  • [tool.uv.sources] 항목이 올바른 패키지 이름을 올바른 index 이름에 매핑하는지 확인합니다
  • 패키지가 실제로 프라이빗 레지스트리에 게시되어 있는지 확인합니다
  • 동일한 자격 증명으로 로컬에서 uv lock을 실행하여 해결이 작동하는지 확인합니다

Lock 파일 충돌

증상: 프라이빗 index를 추가한 후 uv lock이 실패하거나 예상치 못한 결과를 생성합니다. 해결책: 로컬에서 자격 증명을 설정하고 다시 생성합니다:
export UV_INDEX_MY_PRIVATE_REGISTRY_USERNAME=token
export UV_INDEX_MY_PRIVATE_REGISTRY_PASSWORD=your-pat
uv lock
그런 다음 업데이트된 uv.lock을 커밋합니다.

관련 가이드

배포 준비하기

배포 전에 프로젝트 구조와 의존성을 확인합니다.

AMP에 배포하기

crew 또는 flow를 배포하고 환경 변수를 구성합니다.

Crew 업데이트하기

환경 변수를 업데이트하고 실행 중인 배포에 변경 사항을 푸시합니다.