> ## Documentation Index
> Fetch the complete documentation index at: https://docs.comfy.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Comfy Router에서 Remesh 사용하기

> Comfy Router를 통해 meshy/remesh를 호출합니다: 엔드포인트, 요청 형태, 그리고 Router가 반환하는 응답입니다.

# `meshy/remesh` API 레퍼런스: Meshy가 Comfy Router를 통해 제공

## 빠른 시작

[Comfy 워크스페이스](https://platform.comfy.org/profile/api-keys)에서 키를 생성하고 `COMFY_API_KEY`로 내보내세요. Python 및 TypeScript 스니펫은 Comfy SDK(`pip install comfy-sdk`, `npm install @comfyorg/sdk`)를 사용합니다. cURL 스니펫은 동일한 호출을 raw HTTP로 수행합니다.

**모델 ID:** `meshy/remesh`

**엔드포인트:** `POST https://api.comfy.org/v2/models/meshy/remesh`

<Tabs>
  <Tab title="Wait for the result">
    <CodeGroup>
      ```python Python theme={null}
      from comfy_sdk import Comfy

      # Reads COMFY_API_KEY from the environment.
      # The SDK automatically creates an idempotency key and reuses it for automatic retries.
      with Comfy() as client:
          result = client.models.run(
              "meshy/remesh",
              {
                  "input_task_id": "0193abcd-0000-0000-0000-000000000000",
                  "origin_at": "bottom",
                  "resize_height": 1,
                  "target_formats": ["glb", "fbx"],
                  "target_polycount": 50000,
                  "topology": "quad",
              },
          )

      print(result)
      ```

      ```typescript TypeScript theme={null}
      import { comfy } from "@comfyorg/sdk";

      // Reads COMFY_API_KEY from the environment.
      // The SDK automatically creates an idempotency key and reuses it for automatic retries.
      const { data } = await comfy.models.run("meshy/remesh", {
        input_task_id: "0193abcd-0000-0000-0000-000000000000",
        origin_at: "bottom",
        resize_height: 1,
        target_formats: ["glb", "fbx"],
        target_polycount: 50000,
        topology: "quad",
      });

      console.log(data);
      ```

      ```bash cURL theme={null}
      curl https://api.comfy.org/v2/models/meshy/remesh \
        -H "X-API-Key: $COMFY_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d "{\"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\", \"origin_at\": \"bottom\", \"resize_height\": 1, \"target_formats\": [\"glb\",\"fbx\"], \"target_polycount\": 50000, \"topology\": \"quad\"}"
      ```
    </CodeGroup>
  </Tab>

  <Tab title="Queue and collect later">
    <CodeGroup>
      ```python Python theme={null}
      from comfy_sdk import Comfy

      # Reads COMFY_API_KEY from the environment.
      # Each submit() call mints its own Idempotency-Key and reuses it for automatic retries.
      with Comfy() as client:
          handle = client.models.submit(
              "meshy/remesh",
              {
                  "input_task_id": "0193abcd-0000-0000-0000-000000000000",
                  "origin_at": "bottom",
                  "resize_height": 1,
                  "target_formats": ["glb", "fbx"],
                  "target_polycount": 50000,
                  "topology": "quad",
              },
          )
          print("request_id:", handle.request_id)  # with the model ID, all another process needs

          # Poll until the request completes, waiting the Retry-After the server names.
          for update in handle.iter_events():
              print(update.status, update.queue_position)

          # The provider's own payload, the same value models.run() returns.
          # A request that failed or was cancelled raises the typed Router error here.
          result = handle.get()

      print(result)
      ```

      ```typescript TypeScript theme={null}
      import { comfy } from "@comfyorg/sdk";

      // Reads COMFY_API_KEY from the environment.
      // Each submit() call mints its own Idempotency-Key and reuses it for automatic retries.
      const handle = await comfy.models.submit("meshy/remesh", {
        input_task_id: "0193abcd-0000-0000-0000-000000000000",
        origin_at: "bottom",
        resize_height: 1,
        target_formats: ["glb", "fbx"],
        target_polycount: 50000,
        topology: "quad",
      });
      console.log("requestId:", handle.requestId); // with the model ID, all another process needs

      // Poll until the request completes, waiting the Retry-After the server names.
      for await (const update of handle.events()) {
        console.log(update.status, update.queuePosition);
      }

      // The same result models.run() returns. A request that failed or was cancelled rejects here.
      const result = await handle.get();

      console.log(result.data);
      ```

      ```bash cURL theme={null}
      # 1. Submit. Router answers 201 with request_id, status_url, response_url and cancel_url.
      curl https://api.comfy.org/v2/models/meshy/remesh/requests \
        -H "X-API-Key: $COMFY_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d "{\"input_task_id\": \"0193abcd-0000-0000-0000-000000000000\", \"origin_at\": \"bottom\", \"resize_height\": 1, \"target_formats\": [\"glb\",\"fbx\"], \"target_polycount\": 50000, \"topology\": \"quad\"}"

      # 2. Poll until status is COMPLETED, waiting the Retry-After seconds each response names.
      REQUEST_ID="<request_id from the 201 body>"
      curl -i https://api.comfy.org/v2/models/meshy/remesh/requests/$REQUEST_ID/status \
        -H "X-API-Key: $COMFY_API_KEY"

      # 3. Collect. 200 with the model's native output, 202 with the status body while it is still running.
      curl https://api.comfy.org/v2/models/meshy/remesh/requests/$REQUEST_ID \
        -H "X-API-Key: $COMFY_API_KEY"
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## Schema

### 입력

<ParamField body="convert_format_only" type="boolean" default="false">
  참이면 입력 모델 파일의 형식만 변경하고, topology, resize\_height, target\_polycount 등 다른 입력은 무시합니다.
</ParamField>

<ParamField body="input_task_id" type="string">
  리메시할 완료된 Image to 3D 또는 Text to 3D 작업의 ID입니다. model\_url이 제공되지 않은 경우 필수입니다.
</ParamField>

<ParamField body="model_url" type="string">
  3D 모델에 대한 공개적으로 접근 가능한 URL 또는 데이터 URI입니다. 지원 형식은 glb, gltf, obj, fbx, stl입니다. input\_task\_id가 제공되지 않은 경우 필수입니다.
</ParamField>

<ParamField body="origin_at" type="string">
  원점의 위치입니다.

  가능한 값: `bottom`, `center`, \`\`
</ParamField>

<ParamField body="resize_height" type="number" default="0">
  모델의 크기를 미터 단위의 특정 높이로 조정합니다. 0은 크기 조정을 하지 않음을 의미합니다.
</ParamField>

<ParamField body="target_formats" type="`glb`, `fbx`, `obj`, `usdz`, `blend`, `stl`[]" default="[&#x22;glb&#x22;]">
  리메시된 모델의 대상 형식 목록입니다.
</ParamField>

<ParamField body="target_polycount" type="integer" default="30000">
  생성된 모델의 대상 폴리곤 수를 지정합니다. 유효 범위는 100에서 300,000입니다.

  범위: `100` \~ `300000`
</ParamField>

<ParamField body="topology" type="string" default="&#x22;triangle&#x22;">
  생성된 모델의 토폴로지를 지정합니다.

  가능한 값: `quad`, `triangle`
</ParamField>

Router가 `GET /v2/models/meshy/remesh/openapi.json`에서 제공하는 스키마에서 생성되었으며, 이는 요청이 공급자에게 도달하기 전에 호출을 검증하는 데 사용하는 것과 동일한 문서입니다.

### 출력

<ResponseField name="created_at" type="integer">
  작업이 생성된 시점의 타임스탬프(밀리초)입니다.

  형식: `int64`
</ResponseField>

<ResponseField name="finished_at" type="integer">
  작업이 완료된 시점의 타임스탬프(밀리초)입니다. 완료되지 않은 경우 0입니다.

  형식: `int64`
</ResponseField>

<ResponseField name="id" type="string" required>
  작업의 고유 식별자입니다.
</ResponseField>

<ResponseField name="model_urls" type="object">
  리메시된 3D 모델 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.blend" type="string">
  Blender 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.fbx" type="string">
  FBX 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.glb" type="string">
  GLB 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.obj" type="string">
  OBJ 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.stl" type="string">
  STL 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="model_urls.usdz" type="string">
  USDZ 파일의 다운로드 가능한 URL입니다.
</ResponseField>

<ResponseField name="preceding_tasks" type="integer">
  선행 작업의 수입니다. status가 PENDING일 때만 의미가 있습니다.
</ResponseField>

<ResponseField name="progress" type="integer">
  작업의 진행률입니다. 시작되지 않은 경우 0, 성공한 경우 100입니다.

  범위: `0` \~ `100`
</ResponseField>

<ResponseField name="started_at" type="integer">
  작업이 시작된 시점의 타임스탬프(밀리초)입니다. 시작되지 않은 경우 0입니다.

  형식: `int64`
</ResponseField>

<ResponseField name="status" type="string" required>
  가능한 값: `SUCCEEDED`
</ResponseField>

<ResponseField name="task_error" type="object">
  작업이 실패한 경우 오류 메시지를 포함하는 오류 객체입니다.
</ResponseField>

<ResponseField name="task_error.message" type="string">
  자세한 오류 메시지입니다.
</ResponseField>

<ResponseField name="type" type="string">
  Remesh 작업의 유형입니다.

  가능한 값: `remesh`
</ResponseField>

## 예제

### 입력

```json theme={null}
{
  "input_task_id": "0193abcd-0000-0000-0000-000000000000",
  "origin_at": "bottom",
  "resize_height": 1,
  "target_formats": [
    "glb",
    "fbx"
  ],
  "target_polycount": 50000,
  "topology": "quad"
}
```

### 출력

```json theme={null}
{
  "created_at": 1767225600000,
  "finished_at": 1767225663000,
  "id": "018f2c7a-4b1e-7c3d-9a05-6e2f8b41d0c9",
  "model_urls": {
    "fbx": "https://example.invalid/meshy/remesh/model.fbx",
    "glb": "https://example.invalid/meshy/remesh/model.glb",
    "obj": "https://example.invalid/meshy/remesh/model.obj"
  },
  "progress": 100,
  "started_at": 1767225601000,
  "status": "SUCCEEDED",
  "type": "remesh"
}
```

## 배포 전 확인

SDK는 `Idempotency-Key`를 생성하고 자동 재시도에서 재사용합니다. 수동 재시도 시에는 원래 키를 재사용하세요. Router는 연결을 최대 10분간 유지할 수 있습니다.

요청이 실패하면 Router는 이유를 설명하는 `X-Comfy-Error-Type` 응답 헤더를 보냅니다. `422`는 Router가 프로바이더를 호출하기 전에 입력을 거부했음을 의미합니다. 생성된 에셋은 [결과 URL이 만료](/ko/development/comfy-router/reference#결과-에셋)될 수 있으므로 즉시 다운로드하세요.

<CardGroup cols={3}>
  <Card title="헤더" icon="list" href="/ko/development/comfy-router/quickstart">
    인증, 멱등성, 요청 ID, 오류 분류, 재시도 간격, 지출 한도.
  </Card>

  <Card title="Router API 사용" icon="code" href="/ko/development/comfy-router/quickstart">
    모델 검색, 유효성 검사 오류, 재시도, 과금.
  </Card>

  <Card title="제한 사항" icon="triangle-exclamation" href="/ko/development/comfy-router/limitations">
    Router가 현재 지원하지 않는 기능과 대체 방법.
  </Card>
</CardGroup>
