LlamaIndex 이미지 생성 도구: Sume Image API
POST /v1/images를 LlamaIndex FunctionTool로 감싸세요. sume/auto와 프롬프트를 보내고, 200이면 URL을, 202이면 Job id를 돌려주면 됩니다.

LlamaIndex 이미지 생성 도구를 만들려면 Sume의 POST /v1/images를 호출하는 Python 함수를 FunctionTool.from_defaults()로 감싸 FunctionAgent에 넘기세요. 이 함수는 model: "sume/auto"와 프롬프트를 보냅니다. 200이면 data[].url에 이미지 URL이 담겨 오고, 202이면 Job 봉투가 오며, 두 번째 도구가 그 id로 GET /v1/jobs/{id}/status를 확인합니다.
LlamaIndex 관련 내용은 LlamaIndex의 도구와 에이전트 가이드에서, Sume 관련 내용은 Image API (영문), Job과 결과 (영문), 인증 페이지와 Sume API 레퍼런스에서 가져왔습니다. 모두 2026-09-27에 확인했습니다. Sume에는 LlamaIndex 전용 연동이나 패키지가 없으며, 이 도구는 requests로 HTTPS를 직접 호출할 뿐입니다. 레퍼런스 이미지와 모델 선택은 레퍼런스 이미지 기반 이미지 생성 API에서 다룹니다.
이미지 생성 도구는 어떻게 작성하나요?
FunctionTool은 동기든 비동기든 어떤 Python 함수든 감쌀 수 있습니다. 기본적으로 도구 이름은 함수 이름이고 설명은 docstring입니다. LlamaIndex는 이름과 설명이 모델이 도구를 호출하는 방식에 큰 영향을 준다고 설명하므로, 둘 다 모델이 읽는다는 점을 염두에 두고 작성하세요. FunctionAgent는 LLM 공급자의 도구 호출(tool calling) 기능으로 도구를 실행하므로, 이 기능을 지원하는 LLM을 넘기세요. SUME_API_KEY는 에이전트가 실행되는 서버 환경에 두세요. Sume 문서는 키를 신뢰할 수 있는 서버에 두고, 프론트엔드 JavaScript에는 절대 넣지 말라고 안내합니다.
import os, requests
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.core.tools import FunctionTool
API = "https://api.sume.com/v1"
AUTH = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def generate_image(prompt: str) -> str:
"""Generate an image from a text prompt. Returns image URLs, or a job id to check later."""
r = requests.post(f"{API}/images", headers=AUTH, timeout=45, # Sume holds up to 30 s
json={"model": "sume/auto", "prompt": prompt})
r.raise_for_status() # 4xx, and 502 when the generation failed inside the wait
if r.status_code == 202: # still rendering: a job envelope, not images
return f"Still rendering. Call check_image_job with job_id {r.json()['data']['job']['id']}."
return "\n".join(image["url"] for image in r.json()["data"])
def check_image_job(job_id: str) -> str:
"""Check an image job started by generate_image. Returns its status, or image URLs."""
s = requests.get(f"{API}/jobs/{job_id}/status", headers=AUTH, timeout=30).json()["data"]
if not s["result_ready"]:
return f"Job status: {s['sume_status']}"
res = requests.get(s["result_url"], headers=AUTH, timeout=30).json()["data"]
return "\n".join(a["url"] for a in res["result"]["artifacts"])
tools = [FunctionTool.from_defaults(generate_image), FunctionTool.from_defaults(check_image_job)]
agent = FunctionAgent(tools=tools, llm=llm) # llm: any LlamaIndex LLM with tool calling도구는 왜 200과 202로 분기하나요?
POST /v1/images는 요청을 최대 30초 동안 붙잡아 두며, 대부분의 카탈로그 모델은 그 안에 끝나 이미지 본문과 함께 200으로 응답합니다. 그 예산이 끝났을 때 생성이 아직 진행 중이면 Sume는 대신 Job 봉투와 함께 202로 응답합니다. 4K, 높은 quality, 큰 n은 202를 받을 가능성이 가장 큰 느린 설정입니다. Sume의 규칙은 본문 형태가 아니라 상태 코드를 확인하라는 것입니다.
requests타임아웃은 30초보다 길게 설정하세요. Requests는timeout을 넘기지 않으면 절대 타임아웃되지 않으며, 그보다 작은 값을 주면 Sume가 응답하기 전에 예외가 발생할 수 있습니다.202를 받으면result_ready가 true가 될 때까지GET /v1/jobs/{id}/status를 폴링한 뒤result_url을 읽으세요. 이미지는 이미지 본문이 아니라 표준 Job 결과 형태로,result.artifacts[]아래에 담겨 옵니다.- 대기 중에 실패한 생성은
502를 반환하며,raise_for_status()는 모든 4xx와 5xx를HTTPError로 바꿉니다. - 이 라우트는 선택 사항인
Idempotency-Key헤더도 받습니다. 같은 페이로드로 키를 재사용한 재시도는 두 번째 Job 비용을 내는 대신 첫 번째 Job을 이어받습니다.
도구는 어떤 요청 필드를 보낼 수 있나요?
이 도구는 본문을 필드 두 개로만 구성합니다. 나머지 필드는 대부분 카탈로그에 따라 허용 여부가 정해지므로, 에이전트에 노출하기 전에 GET /v1/images/models에서 모델의 supported_parameters를 확인하세요.
| 필드 | 문서의 규칙 | 이 도구 |
|---|---|---|
model | 카탈로그 id, 또는 Sume가 패밀리를 고르게 하는 sume/auto입니다. Sume는 어느 패밀리가 실행됐는지 공개하지 않으며, sume/auto는 GET /v1/images/models에 나열되지 않습니다. | "sume/auto" |
prompt | 이미지를 설명하는 필수 텍스트입니다. | 에이전트의 프롬프트 |
n | 호출당 이미지 1~10개입니다. 모델별 상한은 이보다 낮습니다. | 생략 |
aspect_ratio, resolution, quality | 모델의 카탈로그 디스크립터에 나열된 값만 쓸 수 있습니다. 모델이 나열하지 않은 파라미터는 400 unsupported_parameter입니다. | 생략 |
seed, stream | 스키마에는 있지만 v1에서는 제공되지 않습니다. seed는 400 unsupported_parameter, stream: true는 400 streaming_not_supported입니다. | 보내지 않음 |
mode | 이 라우트의 기본값은 sync입니다. async나 webhook은 즉시 202를 반환합니다. | 기본값 |
에이전트는 이미지 URL을 어떻게 다뤄야 하나요?
Image API 문서는 data[].url을 Sume가 호스팅하는 서명된 URL로 설명하며, Sume 인증 문서는 서명된 다운로드 URL을 임시 시크릿으로 취급하라고 안내합니다. 그러니 이 URL을 공개하거나 기록으로 보관하지 말고, 남겨 둘 이미지는 내려받으세요. Sume 결과물별 URL 유형은 AI 생성 영상 URL은 만료되나요?에서 비교합니다.
과금은 전부 아니면 전무 방식입니다. 완료된 생성은 전액 청구되고, 200 본문의 usage.cost가 청구된 USD 금액이며, 실패한 생성은 청구되지 않습니다. 에이전트 스택이 원격 MCP를 지원한다면 Sume의 호스팅 MCP 서버도 동작하지만, Sume 문서는 호스팅 MCP가 현재 주 경로가 아니라고 설명합니다. 이 도구가 REST API를 호출하는 이유입니다.
출처
관련 글
연동 카테고리의 다른 글
- Make.com AI 영상 시나리오: Sume HTTP 요청과 웹훅
Make.com AI 영상 시나리오를 둘로 나누세요. Make a request가 Sume 실행을 시작하고, 커스텀 웹훅이 서명된 결과를 받아 sha256()으로 확인합니다.
- Mastra MCP 클라이언트: 에이전트를 Sume 호스팅 MCP에 연결
MCPClient로 Mastra 에이전트를 Sume 호스팅 MCP 서버에 연결하세요. requestInit에 넣는 API 키 헤더, 도구 허용 목록, 유료 호출 승인을 다룹니다.
- n8n AI 영상 워크플로: Sume 웹훅으로 Wait 노드 재개하기
n8n HTTP Request 노드에서 Sume Format 실행을 시작하고 Wait 노드의 재개 URL을 webhook_url로 넘긴 뒤, 끝난 실행을 API 키로 읽으세요.
- n8n Google Sheets로 행마다 Sume AI 아바타 영상 만들기
n8n Google Sheets 노드로 행을 읽고, 행마다 Sume 말하는 아바타 Job을 하나씩 제출한 뒤, 상한이 있는 루프로 폴링해 영상 URL을 시트에 기록하세요.
작성자 Sume