HiAPI
블로그

튜토리얼

HiAPI API로 flux-2-klein-4b/text-to-image를 호출하는 방법: curl, Python 그리고 실제로 동작하는 요청

경제적인 이미지 계층을 파이프라인에 연결하는 실전 튜토리얼

Oct 31, 2026
平面玻璃风格封面图:数层半透明玻璃斜向叠压,把浅灰底场折射成冷蓝色带,构图安静克制。

flux-2-klein-4b/text-to-image가 비용 민감 워크로드에 적합한 이유

모든 이미지 파이프라인이 카탈로그에서 가장 무거운 모델을 필요로 하는 것은 아닙니다. 프로덕션 트래픽의 상당 부분은 반복적입니다. 상품 이미지, 변형 미리보기, 상품 목록 썸네일, 동일한 템플릿으로 생성되는 소셜 카드 등이 그렇습니다. 이러한 시나리오에서 flux-2-klein-4b/text-to-image는 의도적으로 더 가벼운 계층으로 설계되었습니다. 약간의 최고 충실도를 내주는 대신 처리량과 예측 가능성을 얻으며, 수천 개의 에셋을 일정에 따라 배치 생성할 때 이것이 보통 올바른 선택입니다.

가장 큰 혜택을 보는 워크로드는 두 가지입니다.

  • 전자상거래 상품 이미지. 보통 깔끔한 기본 설명(“무광 세라믹 머그, 350ml, 웜 그레이, 이음새 없는 흰색 배경 위”)이 있고 색상, 각도, 구도를 아우르는 많은 렌더 변형을 생성해야 합니다. 일관성이 예술적 표현보다 중요합니다.
  • 내부용 또는 롱테일 인터페이스를 위한 대량 생성. 카테고리 배너, A/B 테스트 크리에이티브, 초안 목록의 플레이스홀더 이미지 등에서 한계 품질 향상은 더 무거운 실행 비용을 정당화하지 못합니다.

키 비주얼, 정교한 텍스처, 그리고 구도 자체가 곧 제품인 경우에는 더 무거운 계층을 선택하세요. 생성량, 지연 시간, 이미지당 비용이 결정을 지배한다면 flux-2-klein-4b/text-to-image를 선택하세요. 이 튜토리얼의 나머지 부분에서는 요청 구조, curl 호출, Python 헬퍼 함수, 종횡비 전략, 비동기 수명 주기를 이 계층으로 엔드투엔드로 다룹니다.

요청을 보내기 전 준비 사항

첫 호출 전에 세 가지를 확정해야 합니다.

1. HiAPI에서 발급받은 API 키

HiAPI 콘솔에서 키를 생성하세요. 여기서 설명하는 모든 요청은 이 키로 인증하며, 키가 필요한 유일한 자격 증명입니다. 모델별 등록 절차는 따로 없습니다.

2. 키를 소스 코드 관리에서 멀리 두기

다른 어떤 비밀과도 똑같이 취급하세요. 검증된 방법 하나는 다음과 같습니다.

export HIAPI_API_KEY="your-key-here"

그런 다음 셸과 Python에서 환경 변수에서 읽으세요. 절대 커밋하지 말고, dotfile 로더를 사용한다면 .env를 .gitignore에 추가하세요. 키가 유출되면 기록을 정리하려 하지 말고 콘솔에서 키를 교체하세요.

3. 모델 식별자 확인

식별자 문자열은 요청 본문에 그대로 사용되며, 일부 구성에서는 URL에도 나타납니다.

flux-2-klein-4b/text-to-image

정확히 복사하세요. 4b와 /text-to-image 접미사가 모두 이름의 일부입니다. 여기서의 오타는 404 또는 “unknown model” 오류의 가장 흔한 원인입니다. 환경에 키가 있고 식별자를 확인했다면 이제 페이로드를 구성할 수 있습니다.

flux-2-klein-4b/text-to-image 요청의 구성

HiAPI의 텍스트-이미지 요청은 의도적으로 간결하게 유지됩니다. 모델 식별자와 생성 파라미터 페이로드를 제공하면, 해당 모델 엔드포인트가 구성된 방식에 따라 결과 또는 작업 핸들이 반환됩니다.

가장 중요한 필드

  • model — 정확한 식별자, flux-2-klein-4b/text-to-image.
  • prompt — 이미지를 설명하는 문자열. 출력 품질에 가장 큰 영향을 미치는 필드입니다. 다른 무엇을 바꾸기 전에 여기에 노력을 쏟으세요.
  • 크기 또는 종횡비 — 출력의 프레이밍을 지정하는 방식. 하드코딩된 픽셀 쌍보다 종횡비 형식의 사양을 선호하세요. 기본 해상도 동작이 바뀌어도 안정적으로 유지되기 때문입니다.

응답의 모습

응답은 두 가지 형태로 나뉘며, 클라이언트는 둘 다 처리해야 합니다.

  1. 동기식 페이로드 — 응답에 생성 이미지의 위치(URL)가 직접 포함됩니다.
  2. 비동기 작업 페이로드 — 응답에 작업 식별자와 상태(pending, processing, succeeded, failed가 일반적인 상태)가 포함됩니다. 그런 다음 해당 식별자로 상태 엔드포인트를 폴링하여 종료 상태에 도달하고 페이로드가 출력 위치를 담을 때까지 기다립니다.

검증할 수 없는 파라미터를 만들어내지 마세요. 모델의 문서화된 요청에 속하지 않는 필드는 포함하지 마세요. 알 수 없는 필드는 혼란스러운 400 오류의 두 번째로 흔한 원인입니다. model, prompt, 종횡비로 시작해 먼저 사용 가능한 이미지 하나를 얻은 다음, 선택적 파라미터를 하나씩 추가하고 매 변경 후 출력을 확인하세요.

첫 번째로 사용 가능한 curl 호출

아래는 터미널에 붙여넣을 수 있는 전체 요청입니다. HIAPI_API_KEY가 위와 같이 내보내졌다고 가정합니다.

curl -sS -X POST "https://api.hiapi.ai/v1/images/generations" \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "flux-2-klein-4b/text-to-image",
    "prompt": "Studio product photo of a matte ceramic mug, warm grey, soft diffused light, seamless white background, centered composition",
    "aspect_ratio": "1:1"
  }'

JSON 포매터(| jq .)를 통해 처리하여 응답을 읽으세요. 이미지 URL이 직접 보이거나 id와 status가 있는 작업 객체가 보일 것입니다.

결과 해석

  • 이미지 URL을 얻었다면 브라우저에서 여세요. 키, 모델 식별자, 프롬프트가 모두 정상 동작함을 확인해 줍니다.
  • 작업 객체를 얻었다면 id를 기록하세요. 이후 장에서 이 작업을 폴링하게 됩니다.

일반적인 실패 진단

  • 401 / 403 — 키가 없거나, 형식이 잘못되었거나, Authorization: Bearer 헤더로 전달되지 않았습니다. curl을 실행하는 셸에서 환경 변수가 실제로 내보내졌는지 확인하세요.
  • 404 또는 “unknown model” — 식별자가 잘못되었습니다. 정확히 flux-2-klein-4b/text-to-image여야 합니다.
  • 검증 메시지가 있는 400 — 보통 prompt 누락, 지원되지 않는 파라미터 이름, 또는 허용 집합에 없는 종횡비입니다. 페이로드를 핵심 세 필드로 다시 줄이고 재시도하세요.
  • 429 — 계층에서 허용하는 것보다 빠르게 요청을 보내고 있습니다. 촘촘한 루프에서 재시도하지 말고 백오프를 추가하세요.

curl이 정상 동작하면, Python 버전에 문제가 생겼을 때 대조할 수 있는 정상 동작 요청을 확보한 것입니다.

같은 요청을 Python으로 이식하기

Python 버전은 같은 페이로드를 감싸는 얇은 래퍼입니다. 파이프라인의 나머지 부분이 HTTP 로직을 반복하지 않고 호출할 수 있도록 함수로 구성하세요.

import os
import time
import requests

API_BASE = "https://api.hiapi.ai/v1"
MODEL = "flux-2-klein-4b/text-to-image"

def generate_image(prompt: str, aspect_ratio: str = "1:1") -> dict:
    """Submit a text-to-image job and return the parsed response."""
    api_key = os.environ["HIAPI_API_KEY"]
    payload = {
        "model": MODEL,
        "prompt": prompt,
        "aspect_ratio": aspect_ratio,
    }
    response = requests.post(
        f"{API_BASE}/images/generations",
        headers={
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json",
        },
        json=payload,
        timeout=60,
    )
    if response.status_code >= 400:
        # Surface the server's message rather than a bare status code.
        raise RuntimeError(f"HiAPI error {response.status_code}: {response.text}")
    return response.json()

즉시 효과를 보는 습관 몇 가지:

  • 함수 내부에서 환경으로부터 키를 읽으세요, 임포트 시점이 아닙니다. 그러면 같은 모듈을 노트북, 스크립트, 예약 작업에서 그대로 사용할 수 있습니다.
  • 상태 코드를 명시적으로 확인하고 응답 본문을 예외에 포함하세요. HiAPI의 검증 메시지는 어떤 필드가 틀렸는지 알려줍니다. 순수한 raise_for_status()는 이를 감춥니다.
  • 타임아웃을 설정하세요. 타임아웃이 없으면 정체된 연결이 작업 프로세스를 무기한 멈춰 세울 수 있습니다.
  • 페이로드를 dict로 유지하세요. 문자열 포매팅을 다시 작성하지 않고도 기록하고, diff하고, 선택적 파라미터를 확장할 수 있습니다.

이제 최소한의 드라이버입니다.

result = generate_image(
    "Studio product photo of a matte ceramic mug, warm grey, "
    "soft diffused light, seamless white background, centered composition"
)
print(result)

프로덕션에서 견디는 종횡비 선택

종횡비는 다운스트림 시스템이 프레이밍을 가정하기 때문에 나중에 재작업을 일으킬 가능성이 가장 큰 파라미터입니다. 요청별이 아니라 인터페이스별로 결정하세요.

실용적인 매핑

  • 정사각형 (1:1) — 마켓플레이스 목록, 상품 그리드, 아바타, 썸네일 위치. 대부분의 상품 타일이 정사각형이고 자르면 결과가 나빠지므로 전자상거래의 안전한 기본값입니다.
  • 세로형 (3:4 또는 4:5) — 소셜 피드 위치와 룩북 스타일 상품 이미지. 병이나 의류 같은 세로형 제품에 검은 여백 없이 공간을 제공합니다.
  • 가로형 (16:9) — 배너, 키 비주얼 스트립, 이메일 헤더, 동영상 썸네일.

왜 비율을 업스트림에서 고정해야 하는가

렌더링 시점에 마침 API를 호출하는 코드가 비율을 선택하면, 상품 카탈로그의 절반은 정사각형이고 절반은 세로형이 되어 고치기 위해 재생성 비용을 치르게 됩니다. 대신 비율을 콘텐츠 모델에 인코딩하세요. 결정적으로 비율로 매핑되는 surface 또는 placement 필드를 두고 그 필드에서 생성하세요. 자르기를 견디는 위치에는 1:1을, 고정 레이아웃이 있는 위치에는 레이아웃이 요구하는 비율을 사용하세요.

같은 원칙이 프롬프트에도 적용됩니다. 프레이밍 힌트(“중앙 구도”, “전체 제품이 프레임 안에”, “카피를 위한 왼쪽 여백”)를 호출마다 즉석으로 만드는 문자열이 아니라 프롬프트 템플릿에 포함하세요. 템플릿은 천 개의 생성 이미지가 같은 파이프라인에서 나온 것처럼 보이게 하며, 이것이 바로 상품 카탈로그에 필요한 것입니다.

한 가지 주의: 모든 모델이 모든 비율을 받아들이지는 않습니다. 선택한 비율을 한 번 보내 성공을 확인한 다음에야 전체 배치로 확대하세요.

비동기 작업을 완료될 때까지 폴링하기

flux-2-klein-4b/text-to-image가 이미지 대신 작업 핸들을 반환하면 이를 상태 머신으로 다루세요. 흐름은 제출 → 작업 ID 수신 → 상태 폴링 → 종료 상태 → 출력 읽기입니다.

def wait_for_job(job_id: str, timeout_s: int = 300, interval_s: int = 2) -> dict:
    api_key = os.environ["HIAPI_API_KEY"]
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        response = requests.get(
            f"{API_BASE}/jobs/{job_id}",
            headers={"Authorization": f"Bearer {api_key}"},
            timeout=30,
        )
        response.raise_for_status()
        job = response.json()
        status = job.get("status")
        if status == "succeeded":
            return job
        if status == "failed":
            raise RuntimeError(f"Job {job_id} failed: {job.get('error')}")
        time.sleep(interval_s)
    raise TimeoutError(f"Job {job_id} did not finish in {timeout_s}s")

각 상태 처리

  • pending / processing — 계속 기다리세요. 짧은 간격으로 시작하고 온화한 백오프(예: 상한까지 수면 시간 증가)를 고려해 긴 큐 동안 상태 엔드포인트를 자주 두드리지 않도록 하세요.
  • succeeded — 페이로드에 이제 출력 위치가 포함됩니다. 즉시 폴링을 중단하세요.
  • failed — 맹목적으로 재시도하지 마세요. 오류 메시지를 기록하세요. 프롬프트나 파라미터 문제라면 같은 요청을 재제출해도 같은 방식으로 실패합니다.

언제 멈출지 알기

항상 루프를 벽시계 마감 시각으로 제한하세요. 영원히 폴링하는 작업 프로세스는 누수되는 작업 프로세스입니다. 타임아웃 시 수동 점검을 위해 작업 ID를 노출하세요. 나중에 작업이 성공하면 여전히 출력을 검색할 수 있습니다. 배치의 경우 이미지마다 제출과 대기를 직렬화하지 말고 여러 작업을 동시에 실행하고 함께 폴링하세요.

출력 다운로드 및 저장

생성된 이미지는 작업 또는 생성 응답에서 검색 가능한 위치로 나타납니다. 서버 측에서 가져온 다음 직접 영속화하세요. 반환된 URL을 상품 페이지에 핫링크하지 마세요. 그것은 전달 산출물이지 당신의 스토리지 계층이 아닙니다.

def download_image(url: str, path: str) -> str:
    response = requests.get(url, timeout=120)
    response.raise_for_status()
    with open(path, "wb") as f:
        f.write(response.content)
    return path

예측 가능한 명명 체계 사용

images/{surface}/{sku}/{variant}-{ratio}.png 같은 경로는 세 가지를 줍니다. 에셋이 제품별로 자연스럽게 그룹화되고, 인터페이스가 어떤 프레이밍이 요청되었는지 알려주며, 파일 이름의 비율이 예기치 않은 중복을 명백하게 만듭니다. 같은 SKU의 변형을 재생성하면 파일 이름에 프롬프트의 짧은 해시를 포함하세요. 그러면 재실행이 비교하고 싶었을 이전 시도를 조용히 덮어쓰지 않습니다.

루프 닫기

작업 ID를 저장된 파일과 함께 매니페스트, 데이터베이스 행, 또는 부속 파일에 기록하세요. 다운스트림 시스템이 이미지 품질이 나쁘다고 보고할 때, 작업 ID는 원래 프롬프트와 파라미터를 되찾게 해주는 것입니다. 콘텐츠 주소 지정 파일 이름과 결합하면 저장된 에셋에서 그것을 생성한 정확한 요청으로 거슬러 올라가는 재현 가능한 감사 추적을 얻게 됩니다.

제출, 폴링, 다운로드를 연결하면 flux-2-klein-4b/text-to-image는 파이프라인의 평범한 한 단계가 됩니다. 작업을 큐에 넣고, 마감 시각과 함께 폴링하고, 안정적인 이름으로 저장하면 됩니다. 거기서부터 확장은 새 코드가 아니라 동시성과 템플릿의 문제일 뿐입니다.

영구 AI 아티팩트로 빌드 시작하기

API 키를 받아 태스크 기반의 하나의 API로 이미지, 비디오, 오디오 모델을 호출하세요.

API 문서 보기