> ## 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와 함께 Gemini Omni Flash Preview 사용하기

> Comfy Router를 통해 gemini-interactions/gemini-omni-flash-preview를 호출하는 방법을 설명합니다: endpoint, 요청 형태, 그리고 Router가 반환하는 응답입니다.

`gemini-interactions/gemini-omni-flash-preview`의 API 레퍼런스이며, Gemini Interactions에서 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 스니펫은 원시 HTTP를 통한 동일한 호출입니다.

**모델 ID:** `gemini-interactions/gemini-omni-flash-preview`

**엔드포인트:** `POST https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-preview`

<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(
              "gemini-interactions/gemini-omni-flash-preview",
              {
                  "input": "Reply with the single word: ok",
                  "stream": False,
              },
          )

      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("gemini-interactions/gemini-omni-flash-preview", {
        input: "Reply with the single word: ok",
        stream: false,
      });

      console.log(data);
      ```

      ```bash cURL theme={null}
      curl https://api.comfy.org/v2/models/gemini-interactions/gemini-omni-flash-preview \
        -H "X-API-Key: $COMFY_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d "{\"input\": \"Reply with the single word: ok\", \"stream\": false}"
      ```
    </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(
              "gemini-interactions/gemini-omni-flash-preview",
              {
                  "input": "Reply with the single word: ok",
                  "stream": False,
              },
          )
          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("gemini-interactions/gemini-omni-flash-preview", {
        input: "Reply with the single word: ok",
        stream: false,
      });
      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/gemini-interactions/gemini-omni-flash-preview/requests \
        -H "X-API-Key: $COMFY_API_KEY" \
        -H "Idempotency-Key: $(uuidgen)" \
        -H "Content-Type: application/json" \
        -d "{\"input\": \"Reply with the single word: ok\", \"stream\": false}"

      # 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/gemini-interactions/gemini-omni-flash-preview/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/gemini-interactions/gemini-omni-flash-preview/requests/$REQUEST_ID \
        -H "X-API-Key: $COMFY_API_KEY"
      ```
    </CodeGroup>
  </Tab>
</Tabs>

## 스키마

### 입력

<ParamField body="input" type="object" required>
  프롬프트 문자열 또는 타입이 지정된 콘텐츠 파트(텍스트, 이미지, 오디오, 비디오, 문서)의 배열입니다.
</ParamField>

<ParamField body="model" type="string">
  Gemini 모델 식별자입니다(예: `gemini-omni-flash-preview`). Comfy Router 경로 `POST /v2/models/gemini-interactions/{model}`에서는 경로에서 제공되므로 생략할 수 있습니다. 이 작업이 처리하는 표기, 즉 Comfy Router가 `gemini-interactions/<model>`로 주소를 지정하는 집합은 gemini-omni-flash-preview와 gemini-omni-1.1-flash(supportedGeminiInteractionModels)입니다. 여기서는 열거형으로 제한하지 않고 그대로 나열하는데, 이는 프록시가 모델 자체를 검증하고 자신이 처리하지 않는 표기에 대해서는 자체적인 400을 반환하기 때문입니다.
</ParamField>

<ParamField body="previous_interaction_id" type="string">
  이전에 저장된 상호작용의 ID로, 상태를 유지하는 다중 턴 비디오 편집을 가능하게 합니다.
</ParamField>

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

### 출력

<ResponseField name="id" type="string" />

<ResponseField name="model" type="string" />

<ResponseField name="object" type="string" />

<ResponseField name="status" type="string" required>
  Router 응답에서는 항상 `completed`입니다. 공급자의 다른 상태(`in_progress`, `requires_action`, `failed`, `cancelled`, `incomplete`, `budget_exceeded`)는 Router를 통해 200으로 호출자에게 전달되지 않습니다. 이들은 공급자의 본문을 담은 Comfy Router 오류로 반환됩니다.

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

<ResponseField name="steps" type="object[]" required>
  상호작용 타임라인으로, 순서대로 나열됩니다. `GeminiInteraction`의 타입이 지정되지 않은 `steps`에서 여기서 좁혀 출력 리프를 주소 지정할 수 있게 합니다. 공급자는 계속해서 단계 유형을 추가하므로 항목은 `additionalProperties: true`이며, Router 호출자가 읽는 필드만 선언됩니다.
</ResponseField>

<ResponseField name="steps[].content" type="object[]">
  이 단계의 타입이 지정된 콘텐츠 블록입니다.
</ResponseField>

<ResponseField name="steps[].content[].data" type="string">
  인라인으로 전달되는 미디어 블록에서 Base64로 인코딩된 인라인 미디어입니다. Google은 인라인 미디어를 4MB로 제한하며, 그 이상은 `delivery: uri`를 요구합니다.
</ResponseField>

<ResponseField name="steps[].content[].mime_type" type="string">
  미디어 블록에서 `data` 또는 `uri`의 미디어 유형입니다.
</ResponseField>

<ResponseField name="steps[].content[].text" type="string">
  생성된 텍스트입니다. `text` 블록에 존재하며, 이는 최신 테스트 버전(nightly) Router SDK 케이스가 검증하는 리프입니다. 구체적으로 `model_output` 단계에서입니다(`steps[type=model_output].content[].text`).
</ResponseField>

<ResponseField name="steps[].content[].type" type="string">
  블록 종류: `text`, `image`, `audio`, `video` 또는 `document`.
</ResponseField>

<ResponseField name="steps[].content[].uri" type="string">
  대역 외로 전달되는 미디어에 대한 참조로, 호출자가 지정한 URI에서 가져옵니다.
</ResponseField>

<ResponseField name="steps[].type" type="string">
  단계 종류입니다. `model_output`은 생성된 답변이고, `user_input`은 검색 경로에서 되돌려 보내는 호출자 자신의 턴이며, `thought`는 내부 추론입니다. 도구 단계(`function_call`, `function_result`, `code_execution_call`, `google_search_call`, ...)는 개방형이며 Google이 계속 추가합니다.
</ResponseField>

<ResponseField name="usage" type="object">
  Gemini 상호작용의 토큰 사용량입니다.
</ResponseField>

<ResponseField name="usage.input_tokens_by_modality" type="object[]">
  하나의 모달리티에 대한 토큰 수입니다.
</ResponseField>

<ResponseField name="usage.input_tokens_by_modality[].modality" type="string">
  `text`, `image`, `audio`, `video`, `document` 중 하나입니다.
</ResponseField>

<ResponseField name="usage.input_tokens_by_modality[].tokens" type="integer" />

<ResponseField name="usage.output_tokens_by_modality" type="object[]">
  하나의 모달리티에 대한 토큰 수입니다.
</ResponseField>

<ResponseField name="usage.output_tokens_by_modality[].modality" type="string">
  `text`, `image`, `audio`, `video`, `document` 중 하나입니다.
</ResponseField>

<ResponseField name="usage.output_tokens_by_modality[].tokens" type="integer" />

<ResponseField name="usage.total_cached_tokens" type="integer" />

<ResponseField name="usage.total_input_tokens" type="integer" />

<ResponseField name="usage.total_output_tokens" type="integer" />

<ResponseField name="usage.total_thought_tokens" type="integer" />

<ResponseField name="usage.total_tokens" type="integer" />

## 예시

### 입력

```json theme={null}
{
  "input": "Reply with the single word: ok",
  "stream": false
}
```

### 출력

```json theme={null}
{
  "id": "interactions/3f6c1a90-2b47-4d18-9a55-7c0e8b21d4f3",
  "object": "interaction",
  "status": "completed",
  "steps": [
    {
      "content": [
        {
          "text": "ok",
          "type": "text"
        }
      ],
      "type": "model_output"
    }
  ],
  "usage": {
    "input_tokens_by_modality": [
      {
        "modality": "text",
        "tokens": 9
      }
    ],
    "output_tokens_by_modality": [
      {
        "modality": "text",
        "tokens": 2
      }
    ],
    "total_cached_tokens": 0,
    "total_input_tokens": 9,
    "total_output_tokens": 2,
    "total_thought_tokens": 0,
    "total_tokens": 11
  }
}
```

## 배포 전 확인

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>
