Agent Skills는 지침, 스크립트 및 리소스의 체계적인 폴더를 통해 Claude의 기능을 확장합니다. 이 가이드는 Claude API와 함께 사전 구축된 Skills와 사용자 정의 Skills를 모두 사용하는 방법을 보여줍니다.
요청/응답 스키마 및 모든 매개변수를 포함한 완전한 API 참조는 다음을 참조하세요:

빠른 링크

개요

Agent Skills의 아키텍처와 실제 응용 프로그램에 대한 심층 분석을 위해서는 엔지니어링 블로그를 읽어보세요: Equipping agents for the real world with Agent Skills.
Skills는 코드 실행 도구를 통해 Messages API와 통합됩니다. Anthropic에서 관리하는 사전 구축된 Skills를 사용하든 업로드한 사용자 정의 Skills를 사용하든, 통합 형태는 동일합니다. 둘 다 코드 실행이 필요하고 동일한 container 구조를 사용합니다.

Skills 사용

Skills는 소스에 관계없이 Messages API에서 동일하게 통합됩니다. skill_id, type 및 선택적 version과 함께 container 매개변수에서 Skills를 지정하면 코드 실행 환경에서 실행됩니다. 두 가지 소스에서 Skills를 사용할 수 있습니다:
측면Anthropic Skills사용자 정의 Skills
Type 값anthropiccustom
Skill ID짧은 이름: pptx, xlsx, docx, pdf생성됨: skill_01AbCdEfGhIjKlMnOpQrStUv
버전 형식날짜 기반: 20251013 또는 latest에포크 타임스탬프: 1759178010641129 또는 latest
관리Anthropic에서 사전 구축 및 유지 관리Skills API를 통해 업로드 및 관리
가용성모든 사용자에게 제공워크스페이스에 비공개
두 skill 소스 모두 List Skills 엔드포인트에서 반환됩니다(source 매개변수를 사용하여 필터링). 통합 형태와 실행 환경은 동일하며, 유일한 차이점은 Skills의 출처와 관리 방법입니다.

전제 조건

Skills를 사용하려면 다음이 필요합니다:
  1. 콘솔에서 Anthropic API 키
  2. 베타 헤더:
    • code-execution-2025-08-25 - 코드 실행 활성화 (Skills에 필요)
    • skills-2025-10-02 - Skills API 활성화
    • files-api-2025-04-14 - 컨테이너에서 파일 업로드/다운로드용
  3. 요청에서 코드 실행 도구 활성화

Messages에서 Skills 사용

Container 매개변수

Skills는 Messages API의 container 매개변수를 사용하여 지정됩니다. 요청당 최대 8개의 Skills를 포함할 수 있습니다. 구조는 Anthropic Skills와 사용자 정의 Skills 모두에 대해 동일합니다. 필수 typeskill_id를 지정하고, 선택적으로 version을 포함하여 특정 버전에 고정할 수 있습니다:
import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {
                "type": "anthropic",
                "skill_id": "pptx",
                "version": "latest"
            }
        ]
    },
    messages=[{
        "role": "user",
        "content": "재생 에너지에 대한 프레젠테이션을 만들어주세요"
    }],
    tools=[{
        "type": "code_execution_20250825",
        "name": "code_execution"
    }]
)

생성된 파일 다운로드

Skills가 문서(Excel, PowerPoint, PDF, Word)를 생성할 때, 응답에서 file_id 속성을 반환합니다. 이러한 파일을 다운로드하려면 Files API를 사용해야 합니다. 작동 방식:
  1. Skills가 코드 실행 중에 파일을 생성
  2. 응답에 생성된 각 파일에 대한 file_id 포함
  3. Files API를 사용하여 실제 파일 콘텐츠 다운로드
  4. 로컬에 저장하거나 필요에 따라 처리
예시: Excel 파일 생성 및 다운로드
import anthropic

client = anthropic.Anthropic()

# 1단계: Skill을 사용하여 파일 생성
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
        ]
    },
    messages=[{
        "role": "user",
        "content": "간단한 예산 스프레드시트가 있는 Excel 파일을 만들어주세요"
    }],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

# 2단계: 응답에서 파일 ID 추출
def extract_file_ids(response):
    file_ids = []
    for item in response.content:
        if item.type == 'bash_code_execution_tool_result':
            content_item = item.content
            if content_item.type == 'bash_code_execution_result':
                for file in content_item.content:
                    if hasattr(file, 'file_id'):
                        file_ids.append(file.file_id)
    return file_ids

# 3단계: Files API를 사용하여 파일 다운로드
for file_id in extract_file_ids(response):
    file_metadata = client.beta.files.retrieve_metadata(
        file_id=file_id,
        betas=["files-api-2025-04-14"]
    )
    file_content = client.beta.files.download(
        file_id=file_id,
        betas=["files-api-2025-04-14"]
    )

    # 4단계: 디스크에 저장
    file_content.write_to_file(file_metadata.filename)
    print(f"다운로드됨: {file_metadata.filename}")
추가 Files API 작업:
# 파일 메타데이터 가져오기
file_info = client.beta.files.retrieve_metadata(
    file_id=file_id,
    betas=["files-api-2025-04-14"]
)
print(f"파일명: {file_info.filename}, 크기: {file_info.size_bytes} 바이트")

# 모든 파일 나열
files = client.beta.files.list(betas=["files-api-2025-04-14"])
for file in files.data:
    print(f"{file.filename} - {file.created_at}")

# 파일 삭제
client.beta.files.delete(
    file_id=file_id,
    betas=["files-api-2025-04-14"]
)
Files API에 대한 완전한 세부 정보는 Files API 문서를 참조하세요.

다중 턴 대화

컨테이너 ID를 지정하여 여러 메시지에서 동일한 컨테이너를 재사용합니다:
# 첫 번째 요청이 컨테이너 생성
response1 = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
        ]
    },
    messages=[{"role": "user", "content": "이 판매 데이터를 분석해주세요"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

# 동일한 컨테이너로 대화 계속
messages = [
    {"role": "user", "content": "이 판매 데이터를 분석해주세요"},
    {"role": "assistant", "content": response1.content},
    {"role": "user", "content": "총 수익은 얼마였나요?"}
]

response2 = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "id": response1.container.id,  # 컨테이너 재사용
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
        ]
    },
    messages=messages,
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

장기 실행 작업

Skills는 여러 턴이 필요한 작업을 수행할 수 있습니다. pause_turn 중지 이유를 처리합니다:
messages = [{"role": "user", "content": "이 대용량 데이터셋을 처리해주세요"}]
max_retries = 10

response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
        ]
    },
    messages=messages,
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

# 장기 작업에 대한 pause_turn 처리
for i in range(max_retries):
    if response.stop_reason != "pause_turn":
        break

    messages.append({"role": "assistant", "content": response.content})
    response = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=4096,
        betas=["code-execution-2025-08-25", "skills-2025-10-02"],
        container={
            "id": response.container.id,
            "skills": [
                {"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
            ]
        },
        messages=messages,
        tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
    )
응답에는 pause_turn 중지 이유가 포함될 수 있으며, 이는 API가 장기 실행 Skill 작업을 일시 중지했음을 나타냅니다. Claude가 턴을 계속하도록 후속 요청에서 응답을 그대로 제공하거나, 대화를 중단하고 추가 지침을 제공하려는 경우 콘텐츠를 수정할 수 있습니다.

여러 Skills 사용

복잡한 워크플로를 처리하기 위해 단일 요청에서 여러 Skills를 결합합니다:
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {
                "type": "anthropic",
                "skill_id": "xlsx",
                "version": "latest"
            },
            {
                "type": "anthropic",
                "skill_id": "pptx",
                "version": "latest"
            },
            {
                "type": "custom",
                "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
                "version": "latest"
            }
        ]
    },
    messages=[{
        "role": "user",
        "content": "판매 데이터를 분석하고 프레젠테이션을 만들어주세요"
    }],
    tools=[{
        "type": "code_execution_20250825",
        "name": "code_execution"
    }]
)

사용자 정의 Skills 관리

Skill 생성

사용자 정의 Skill을 업로드하여 워크스페이스에서 사용할 수 있도록 합니다. 디렉토리 경로 또는 개별 파일 객체를 사용하여 업로드할 수 있습니다.
import anthropic

client = anthropic.Anthropic()

# 옵션 1: files_from_dir 헬퍼 사용 (Python 전용, 권장)
from anthropic.lib import files_from_dir

skill = client.beta.skills.create(
    display_title="재무 분석",
    files=files_from_dir("/path/to/financial_analysis_skill"),
    betas=["skills-2025-10-02"]
)

# 옵션 2: zip 파일 사용
skill = client.beta.skills.create(
    display_title="재무 분석",
    files=[("skill.zip", open("financial_analysis_skill.zip", "rb"))],
    betas=["skills-2025-10-02"]
)

# 옵션 3: 파일 튜플 사용 (filename, file_content, mime_type)
skill = client.beta.skills.create(
    display_title="재무 분석",
    files=[
        ("financial_skill/SKILL.md", open("financial_skill/SKILL.md", "rb"), "text/markdown"),
        ("financial_skill/analyze.py", open("financial_skill/analyze.py", "rb"), "text/x-python"),
    ],
    betas=["skills-2025-10-02"]
)

print(f"생성된 skill: {skill.id}")
print(f"최신 버전: {skill.latest_version}")
요구사항:
  • 최상위 레벨에 SKILL.md 파일이 포함되어야 함
  • 모든 파일은 경로에서 공통 루트 디렉토리를 지정해야 함
  • 총 업로드 크기는 8MB 미만이어야 함
  • YAML frontmatter: name (최대 64자), description (최대 1024자)
완전한 요청/응답 스키마는 Create Skill API 참조를 참조하세요.

Skills 나열

Anthropic 사전 구축 Skills와 사용자 정의 Skills를 포함하여 워크스페이스에서 사용 가능한 모든 Skills를 검색합니다. source 매개변수를 사용하여 skill 유형별로 필터링합니다:
# 모든 Skills 나열
skills = client.beta.skills.list(
    betas=["skills-2025-10-02"]
)

for skill in skills.data:
    print(f"{skill.id}: {skill.display_title} (소스: {skill.source})")

# 사용자 정의 Skills만 나열
custom_skills = client.beta.skills.list(
    source="custom",
    betas=["skills-2025-10-02"]
)
페이지네이션 및 필터링 옵션은 List Skills API 참조를 참조하세요.

Skill 검색

특정 Skill에 대한 세부 정보를 가져옵니다:
skill = client.beta.skills.retrieve(
    skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
    betas=["skills-2025-10-02"]
)

print(f"Skill: {skill.display_title}")
print(f"최신 버전: {skill.latest_version}")
print(f"생성일: {skill.created_at}")

Skill 삭제

Skill을 삭제하려면 먼저 모든 버전을 삭제해야 합니다:
# 1단계: 모든 버전 삭제
versions = client.beta.skills.versions.list(
    skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
    betas=["skills-2025-10-02"]
)

for version in versions.data:
    client.beta.skills.versions.delete(
        skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
        version=version.version,
        betas=["skills-2025-10-02"]
    )

# 2단계: Skill 삭제
client.beta.skills.delete(
    skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
    betas=["skills-2025-10-02"]
)
기존 버전이 있는 Skill을 삭제하려고 시도하면 400 오류가 반환됩니다.

버전 관리

Skills는 업데이트를 안전하게 관리하기 위한 버전 관리를 지원합니다: Anthropic 관리 Skills:
  • 버전은 날짜 형식 사용: 20251013
  • 업데이트가 이루어질 때 새 버전 출시
  • 안정성을 위해 정확한 버전 지정
사용자 정의 Skills:
  • 자동 생성된 에포크 타임스탬프: 1759178010641129
  • 항상 최신 버전을 가져오려면 "latest" 사용
  • Skill 파일을 업데이트할 때 새 버전 생성
# 새 버전 생성
from anthropic.lib import files_from_dir

new_version = client.beta.skills.versions.create(
    skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
    files=files_from_dir("/path/to/updated_skill"),
    betas=["skills-2025-10-02"]
)

# 특정 버전 사용
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [{
            "type": "custom",
            "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
            "version": new_version.version
        }]
    },
    messages=[{"role": "user", "content": "업데이트된 Skill 사용"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

# 최신 버전 사용
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [{
            "type": "custom",
            "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
            "version": "latest"
        }]
    },
    messages=[{"role": "user", "content": "최신 Skill 버전 사용"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
완전한 세부 정보는 Create Skill Version API 참조를 참조하세요.

Skills 로드 방식

컨테이너에서 Skills를 지정할 때:
  1. 메타데이터 발견: Claude는 시스템 프롬프트에서 각 Skill의 메타데이터(이름, 설명)를 확인
  2. 파일 로딩: Skill 파일이 /skills/{directory}/의 컨테이너로 복사됨
  3. 자동 사용: Claude는 요청과 관련이 있을 때 자동으로 Skills를 로드하고 사용
  4. 구성: 복잡한 워크플로를 위해 여러 Skills가 함께 구성됨
점진적 공개 아키텍처는 효율적인 컨텍스트 사용을 보장합니다. Claude는 필요할 때만 전체 Skill 지침을 로드합니다.

사용 사례

조직 Skills

브랜드 및 커뮤니케이션
  • 문서에 회사별 형식(색상, 글꼴, 레이아웃) 적용
  • 조직 템플릿을 따르는 커뮤니케이션 생성
  • 모든 출력에서 일관된 브랜드 가이드라인 보장
프로젝트 관리
  • 회사별 형식(OKR, 의사결정 로그)으로 노트 구조화
  • 팀 규칙을 따르는 작업 생성
  • 표준화된 회의 요약 및 상태 업데이트 생성
비즈니스 운영
  • 회사 표준 보고서, 제안서 및 분석 생성
  • 회사별 분석 절차 실행
  • 조직 템플릿을 따르는 재무 모델 생성

개인 Skills

콘텐츠 생성
  • 사용자 정의 문서 템플릿
  • 전문 형식 및 스타일링
  • 도메인별 콘텐츠 생성
데이터 분석
  • 사용자 정의 데이터 처리 파이프라인
  • 전문 시각화 템플릿
  • 산업별 분석 방법
개발 및 자동화
  • 코드 생성 템플릿
  • 테스트 프레임워크
  • 배포 워크플로

예시: 재무 모델링

Excel과 사용자 정의 DCF 분석 Skills 결합:
# 사용자 정의 DCF 분석 Skill 생성
from anthropic.lib import files_from_dir

dcf_skill = client.beta.skills.create(
    display_title="DCF 분석",
    files=files_from_dir("/path/to/dcf_skill"),
    betas=["skills-2025-10-02"]
)

# Excel과 함께 사용하여 재무 모델 생성
response = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02"],
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
            {"type": "custom", "skill_id": dcf_skill.id, "version": "latest"}
        ]
    },
    messages=[{
        "role": "user",
        "content": "첨부된 재무제표로 SaaS 회사의 DCF 평가 모델을 구축해주세요"
    }],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

제한 사항 및 제약

요청 제한

  • 요청당 최대 Skills: 8개
  • 최대 Skill 업로드 크기: 8MB (모든 파일 합계)
  • YAML frontmatter 제한: name 64자, description 1024자

환경 제약

Skills는 다음 제한 사항이 있는 코드 실행 컨테이너에서 실행됩니다:
  • 네트워크 액세스 없음 - 외부 API 호출 불가
  • 런타임 패키지 설치 없음 - 사전 설치된 패키지만 사용 가능
  • 격리된 환경 - 각 요청마다 새로운 컨테이너 제공
사용 가능한 패키지는 코드 실행 도구 문서를 참조하세요.

모범 사례

여러 Skills 사용 시기

작업이 여러 문서 유형이나 도메인을 포함할 때 Skills를 결합합니다: 좋은 사용 사례:
  • 데이터 분석(Excel) + 프레젠테이션 생성(PowerPoint)
  • 보고서 생성(Word) + PDF로 내보내기
  • 사용자 정의 도메인 로직 + 문서 생성
피해야 할 것:
  • 사용하지 않는 Skills 포함 (성능에 영향)

버전 관리 전략

프로덕션용:
# 안정성을 위해 특정 버전에 고정
container={
    "skills": [{
        "type": "custom",
        "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
        "version": "1759178010641129"  # 특정 버전
    }]
}
개발용:
# 활발한 개발을 위해 latest 사용
container={
    "skills": [{
        "type": "custom",
        "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
        "version": "latest"  # 항상 최신 버전 가져오기
    }]
}

프롬프트 캐싱 고려사항

프롬프트 캐싱을 사용할 때 컨테이너의 Skills 목록을 변경하면 캐시가 깨집니다:
# 첫 번째 요청이 캐시 생성
response1 = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"}
        ]
    },
    messages=[{"role": "user", "content": "판매 데이터 분석"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)

# Skills 추가/제거는 캐시를 깨뜨림
response2 = client.messages.create(
    model="claude-sonnet-4-5-20250929",
    max_tokens=4096,
    betas=["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
            {"type": "anthropic", "skill_id": "pptx", "version": "latest"}  # 캐시 미스
        ]
    },
    messages=[{"role": "user", "content": "프레젠테이션 생성"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
)
최상의 캐싱 성능을 위해 요청 간에 Skills 목록을 일관되게 유지하세요.

오류 처리

Skill 관련 오류를 우아하게 처리합니다:
try:
    response = client.messages.create(
        model="claude-sonnet-4-5-20250929",
        max_tokens=4096,
        betas=["code-execution-2025-08-25", "skills-2025-10-02"],
        container={
            "skills": [
                {"type": "custom", "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv", "version": "latest"}
            ]
        },
        messages=[{"role": "user", "content": "데이터 처리"}],
        tools=[{"type": "code_execution_20250825", "name": "code_execution"}]
    )
except anthropic.BadRequestError as e:
    if "skill" in str(e):
        print(f"Skill 오류: {e}")
        # skill별 오류 처리
    else:
        raise

다음 단계