"이 데이터로 발표용 PPT 좀 만들어줘." 사이드 프로젝트에서 이 요청을 받고 처음엔 막막했다. LLM한테 슬라이드 내용을 텍스트로 뽑게 한 다음, 그걸 python-pptx로 파싱해서 파일로 조립하는 파이프라인을 짜야 하나 싶었다. 실제로 그렇게 만들면 레이아웃이며 스타일이며 손볼 게 끝도 없다.
그러다 Claude의 Agent Skills를 알게 됐다. pptx, xlsx, docx, pdf 같은 문서 작업을 Anthropic이 미리 패키징해둔 스킬로 제공하는데, Messages API 요청에 스킬만 붙이면 Claude가 코드 실행 샌드박스 안에서 알아서 파일을 만들어낸다. 내가 조립 코드를 짤 필요가 없다.
문제: LLM은 텍스트만 뱉는다
기본적으로 LLM은 텍스트를 생성한다. .pptx는 사실 XML 여러 개를 압축한 바이너리 포맷이라 모델이 직접 뱉을 수 있는 게 아니다. Agent Skills는 이 간극을 코드 실행으로 메운다. Claude가 컨테이너 안에서 python-pptx를 돌려 실제 파일을 만들고, 그 결과물을 Files API로 돌려주는 구조다.
붙이는 법
핵심은 요청에 세 가지를 넣는 것이다. container.skills로 쓸 스킬을 지정하고, code_execution 도구를 켜고, 베타 헤더 두 개를 붙인다.
const response = await client.beta.messages.create({
model: 'claude-opus-5',
max_tokens: 16000,
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: {
skills: [{ type: 'anthropic', skill_id: 'pptx', version: 'latest' }],
},
tools: [{ type: 'code_execution_20260521', name: 'code_execution' }],
messages: [
{
role: 'user',
content: '이번 분기 매출 요약을 3장짜리 슬라이드로 만들어줘.',
},
],
});
skill_id만 xlsx나 docx로 바꾸면 엑셀, 워드도 그대로 만들어진다. 여러 개를 배열에 같이 넣어두면 Claude가 상황에 맞게 골라 쓴다.
파일 내려받기
생성된 파일은 응답 콘텐츠 안에 file_id로 들어온다. 이걸 Files API로 다운로드하면 끝이다.
for (const block of response.content) {
if (block.type === 'code_execution_tool_result') {
// 결과에서 file_id를 찾아 저장
const file = await client.beta.files.download(fileId);
fs.writeFileSync('report.pptx', Buffer.from(await file.arrayBuffer()));
}
}
써보고 느낀 점
직접 조립 코드를 짤 때와 결과물 완성도가 확실히 다르다. 슬라이드 제목·본문 레이아웃이나 엑셀 수식 정도는 프롬프트에서 별도로 지시하지 않아도 알아서 깔끔하게 잡아준다. 스타일이나 템플릿을 맞춰야 하면 프롬프트에 명시해주면 된다.
주의할 점은 container.skills는 Managed Agents 쪽 client.beta.agents와 헷갈리기 쉽다는 것. 문서 하나 뽑는 용도라면 위처럼 Messages API에 스킬만 얹으면 충분하다. 리포트나 발표 자료를 서버에서 자동 생성해야 하는 프로젝트라면 한 번 붙여볼 만하다.