> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# 템플릿 빠른 시작

이 튜토리얼에서는 Python 또는 TypeScript 스크립트로 공개 템플릿을 실행합니다. 이 템플릿은 의류를 찍은 평범한 휴대폰 사진을 깔끔한 제품 사진으로 바꾸고, 스크립트는 결과를 원본 옆에 저장합니다. 튜토리얼은 약 5분이 걸리며, 실제 실행 시간은 1분 이내입니다.

![휴대폰 사진 및 제품 사진](/docs/_fern-img/6afed41d4d791df68c87f183bd8db1d4aca8b4be3e946cc518534bda902f9528.webp)

**템플릿**은 게시된 [ElevenCreative Flow](/docs/ko/eleven-creative/products/flows)입니다. 즉, 정해진 **입력** 세트를 받아 정해진 **출력** 세트를 생성하는 모델 체인입니다. 여기서 실행할 [Phone Photo to Packshot](https://elevenlabs.io/app/templates/Yz4DETxRv4uXyIo5PnEy)은 이미지 하나를 받아 이미지 하나를 반환합니다. 작성자가 이미 모델과 프롬프트를 선택했으므로, 코드에서는 사진만 전달하면 됩니다.

> **Warning**
>
> 템플릿을 실행하려면 프로 플랜 이상이 필요합니다.

## 설정

#### API 키 만들기

대시보드에서 [API 키를 생성](https://elevenlabs.io/app/settings/api-keys)하세요. 이 키로 [API에 안전하게 액세스](/docs/ko/api-reference/authentication)할 수 있습니다.

키는 관리형 시크릿으로 저장하고, `.env` 파일을 통한 환경 변수 또는 앱 구성에서 직접 SDK에 전달하세요.

**`.env`**

```js title=".env"
ELEVENLABS_API_KEY=<your_api_key_here>
```

키에 **이미지 & 비디오** 권한을 부여합니다.

#### SDK 설치

#### SDK

환경 변수에서 API 키를 불러오기 위해 `dotenv` 라이브러리도 사용합니다.

```python
pip install elevenlabs
pip install python-dotenv
```

```typescript
npm install @elevenlabs/elevenlabs-js
npm install dotenv
```

#### CLI

ElevenLabs CLI를 설치하세요. Homebrew(macOS)와 Scoop(Windows)을 권장합니다.

**`Homebrew (macOS)`**

```bash title="Homebrew (macOS)"
brew install elevenlabs/tap/elevenlabs
```

**`Scoop (Windows)`**

```powershell title="Scoop (Windows)"
scoop bucket add elevenlabs https://github.com/elevenlabs/scoop-bucket
scoop install elevenlabs
```

**`npm`**

```bash title="npm"
npm install -g @elevenlabs/cli
```

**`curl`**

```bash title="curl"
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/elevenlabs/cli/releases/latest/download/elevenlabs-cli-installer.sh | sh
```

> **Tip**
>
> AI 코딩 어시스턴트와 작업하시나요? 프로젝트에서 `elevenlabs generate-skills`를 실행하면 모든 명령 그룹의
> `SKILL.md`가 `skills/`에 작성되어, 문서를 붙여넣지 않아도 어시스턴트가 CLI의 전체 기능을 알 수 있습니다.
> 다른 위치에 저장하려면 `--output-dir`을 사용하세요. 이 기능은 CLI 자체에 내장된 API 정의를 읽으므로
> API 키가 필요 없고 오프라인에서도 작동하며, 설치된 CLI 버전에 맞춰 최신 상태를 유지합니다.

그런 다음 인증하세요. 브라우저가 열리며 CLI를 승인할 수 있습니다.

```bash
elevenlabs auth login
```

#### 사진 가져오기

스크립트를 만들 폴더에 샘플 사진을 다운로드합니다.

```bash
curl -o garment.jpg https://storage.googleapis.com/eleven-public-cdn/documentation_assets/templates/garment.jpg
```

## 템플릿 코드 찾기

ElevenLabs 앱에서 [Phone Photo to Packshot](https://elevenlabs.io/app/templates/Yz4DETxRv4uXyIo5PnEy)을 열고 **API** 탭을 선택합니다. 모든 템플릿에는 이를 실행하는 cURL, Python, TypeScript 코드가 포함된 API 탭이 있습니다.

![템플릿 API 탭](/docs/_fern-img/801c9d2e2736964b35f5bad954092c973b21eedc03801128f1ed8bf31ea095b1.webp)

이 탭은 세 단계를 안내합니다. API 키 가져오기, 결과 수신 방법 선택, 템플릿 실행입니다. **결과 수신 방법 선택**에서 기본적으로 **결과 대기**가 선택되어 있습니다. 세 번째 단계의 코드는 cURL로 열립니다. **Python** 또는 **TypeScript**를 선택하면 단계가 **실행하고 결과 대기**로 바뀝니다. 이 스니펫은 실행을 시작하고, 완료될 때까지 기다린 다음 각 출력을 출력합니다. 템플릿의 각 입력에 대해 입력 ID를 키로 하여 `inputs` 아래에 값 하나를 전달하고, 각 결과는 출력 ID로 `outputs`에서 읽습니다. 이 템플릿에는 `garment_photo`라는 입력 하나와 `packshot`이라는 출력 하나가 있습니다. 코드에 필요한 이름은 이 두 ID뿐입니다.

## 템플릿 실행

`packshot.py` 또는 `packshot.mts`를 만듭니다. API 탭의 스니펫에 다음 변경 사항을 적용한 버전입니다.

* API 키를 `.env` 파일에서 로드합니다.
* ElevenLabs에 이미 업로드된 파일의 ID인 `YOUR_ASSET_ID` 대신 사진을 base64로 전달합니다.
* 실행이 진행되는 동안 스크립트가 한 줄을 출력하고, 제품 사진 URL을 출력하는 대신 `packshot.jpg`로 저장합니다.

**`packshot.py`**

```python title="packshot.py" maxLines=0
import base64
import os
import urllib.request

from dotenv import load_dotenv
from elevenlabs import ElevenLabs, TemplateInputReference_InlineBase64

load_dotenv()

client = ElevenLabs(api_key=os.environ["ELEVENLABS_API_KEY"])

with open("garment.jpg", "rb") as f:
    photo = base64.b64encode(f.read()).decode()

print("Running the template, this takes up to a minute...")

# Starts a run and waits for it to finish, checking back as often as the API
# asks. In production, receive the result by webhook instead.
run = client.flows.templates.runs.create_and_wait(
    template_id="Yz4DETxRv4uXyIo5PnEy",
    # Pins the version this tutorial was written against.
    version_id="Kqs4nRrpndEjQ54BhbwE",
    inputs={
        "garment_photo": TemplateInputReference_InlineBase64(
            content_base_64=photo,
            mime_type="image/jpeg",
        ),
    },
)

packshot = run.outputs["packshot"]
# Checking `type` tells your editor this output is an image, which has a content_url.
if packshot.type == "image" and packshot.status == "completed" and packshot.content_url:
    urllib.request.urlretrieve(packshot.content_url, "packshot.jpg")
    print("Saved packshot.jpg")
else:
    print("The run failed:", packshot.failure_reason)

```

**`packshot.mts`**

```typescript title="packshot.mts" maxLines=0
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import "dotenv/config";
import { readFile, writeFile } from "fs/promises";

const client = new ElevenLabsClient({
  apiKey: process.env.ELEVENLABS_API_KEY,
});

const photo = await readFile("garment.jpg");

console.log("Running the template, this takes up to a minute...");

// Starts a run and waits for it to finish, checking back as often as the API
// asks. In production, receive the result by webhook instead.
const run = await client.flows.templates.runs.createAndWait("Yz4DETxRv4uXyIo5PnEy", {
  // Pins the version this tutorial was written against.
  versionId: "Kqs4nRrpndEjQ54BhbwE",
  inputs: {
    garment_photo: {
      type: "inline_base64",
      contentBase64: photo.toString("base64"),
      mimeType: "image/jpeg",
    },
  },
});

const packshot = run.outputs["packshot"];
// Checking `type` tells TypeScript this output is an image, which has a contentUrl.
if (packshot.type === "image" && packshot.status === "completed" && packshot.contentUrl) {
  const response = await fetch(packshot.contentUrl);
  await writeFile("packshot.jpg", Buffer.from(await response.arrayBuffer()));
  console.log("Saved packshot.jpg");
} else {
  console.error("The run failed:", packshot.failureReason);
}

```

`create_and_wait`(TypeScript에서는 `createAndWait`)는 실행을 시작한 후 모든 출력이 완료될 때까지 API가 제안하는 간격으로 상태를 확인합니다. 실패한 실행은 예외를 발생시키지 않고 반환되므로, 스크립트는 읽기 전에 출력의 `status`를 확인합니다. `version_id`는 이 튜토리얼에서 사용한 템플릿 버전을 고정하므로, 나중에 템플릿을 수정해도 스크립트가 손상되지 않습니다.

스크립트를 실행합니다. 이 템플릿을 한 번 실행하면 약 1,020 크레딧을 사용하며, 앱에서 실행할 때와 동일합니다.

```python
python packshot.py
```

```typescript
npx tsx packshot.mts
```

30초에서 1분 후 스크립트가 다음을 출력합니다.

```text
Running the template, this takes up to a minute...
Saved packshot.jpg
```

`packshot.jpg`를 엽니다. 사진 속 의류는 이제 단색 스튜디오 배경의 마네킹에 놓여 있으며, 침대와 조명은 사라집니다.

> **Note**
>
> `create_and_wait`는 스크립트와 템플릿을 시험해 볼 때 사용합니다. 프로덕션에서는 실행이 진행되는 동안
> 애플리케이션이 요청을 열어 둔 상태로 유지하지 않도록, 대신 [webhook](/docs/ko/eleven-api/guides/how-to/image-and-video/webhooks)으로 완료된 실행을
> 수신하세요. 방법은 [팀의 템플릿 실행](/docs/ko/eleven-api/guides/how-to/templates/run-a-template)에서 확인할 수 있습니다.

## 직접 찍은 사진으로 실행하기

휴대폰으로 의류를 하나 찍습니다. 좋은 사진일 필요는 없습니다. 침대 위의 티셔츠나 의자에 걸친 재킷도 괜찮습니다. 이를 `garment.jpg`라는 JPEG 파일로 저장하고 스크립트를 다시 실행합니다.

템플릿의 모든 실행은 동일한 모델과 설정을 거치므로, 동일한 스튜디오 스타일로 의류 제품 사진을 얻습니다. 같은 사진을 사용해도 세부 사항은 실행마다 달라질 수 있습니다.

## 배운 내용

* 템플릿은 이름이 지정된 **입력**을 받아 이름이 지정된 **출력**을 생성하며, **API** 탭에는 이를 실행하는 코드가 표시됩니다.
* `flows.templates.runs.create_and_wait`는 입력 ID당 하나의 값으로 **실행**을 시작하고 완료되면 반환합니다. 각 출력은 ID로 읽고 `status`를 확인합니다.
* 프로덕션에서는 **webhook**이 완료된 각 실행을 전달하므로 아무것도 대기하지 않습니다.

## 다음 단계

#### [팀의 템플릿 실행](/docs/ko/eleven-api/guides/how-to/templates/run-a-template)

API 탭에서 템플릿 코드를 복사하고, 각 입력 유형을 채우고, webhook으로 결과를 수신하고,
버전을 고정합니다.

#### [Webhook](/docs/ko/eleven-api/guides/how-to/image-and-video/webhooks)

프로덕션 webhook을 설정하고, 서명을 직접 검증하며, 재시도와 중복 이벤트를 처리합니다.

#### [템플릿 만들기](/docs/ko/eleven-creative/products/flows#creating-a-template)

팀에서 Flow를 템플릿으로 전환하는 방법을 알아봅니다. 입력과 출력을 선택하고 공유합니다.

#### [API 레퍼런스](/docs/ko/api-reference/flows/templates/runs/create)

템플릿 실행의 모든 파라미터를 확인합니다.