주요 콘텐츠로 이동

API 안내

Nano Banana 2 API

YingTu가 현재 사용하는 API 설정을 보여 줍니다. 실제 Key는 코드에 포함되지 않습니다.

LaoZhang 토큰 페이지 열기

빠른 시작

  1. 1

    LaoZhang API Key를 만들거나 선택합니다.

  2. 2

    현재 모델 ID와 Python 예시를 복사합니다.

  3. 3

    작은 요청을 한 번 실행하고 응답을 확인합니다.

요청 정보

생성 엔드포인트
POST /v1beta/models/gemini-3.1-flash-image:generateContent
편집 엔드포인트
POST /v1beta/models/gemini-3.1-flash-image:generateContent
Base URL
https://api2.laozhang.ai
인증
Bearer API Key
요청 유형
Gemini native
참고 이미지
지원
참고 이미지 수
YingTu에서 최대 5장 선택 가능(제공자 최대값 아님)
확인 상태
아직 확인되지 않음 — 확인 가능한 날짜 기록이 없습니다.
API 문서 열기

Python 예시

자리표시자 Key와 자신의 프롬프트를 바꾸세요.

텍스트 이미지 생성 예시

cURL
export LAOZHANG_API_KEY="replace-with-your-key"

curl --fail-with-body --max-time 500 \
  -X POST 'https://api2.laozhang.ai/v1beta/models/gemini-3.1-flash-image:generateContent' \
  -H "Authorization: Bearer ${LAOZHANG_API_KEY}" \
  -H "Content-Type: application/json" \
  --data '{"contents":[{"parts":[{"text":"A clean product photo of a matte ceramic coffee mug on a light stone table, soft window light, natural shadows, minimal styling."}]}],"generationConfig":{"responseModalities":["IMAGE"],"imageConfig":{"imageSize":"2K"}}}'

# The JSON response can contain base64 image data or an image URL.
# If this request times out, check request and billing logs before retrying.

참조 이미지 편집 예시

gemini-3.1-flash-image · edit
import base64
import mimetypes
import os
import sys

import requests

API_KEY = os.environ.get("LAOZHANG_API_KEY")
if not API_KEY:
    raise RuntimeError("Set the LAOZHANG_API_KEY environment variable before running this example.")

API_URL = "https://api2.laozhang.ai/v1beta/models/gemini-3.1-flash-image:generateContent"
REQUEST_TIMEOUT_SECONDS = 500

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

def encode_image(image_path):
    mime_type = mimetypes.guess_type(image_path)[0] or "image/jpeg"
    with open(image_path, "rb") as image_file:
        data = base64.b64encode(image_file.read()).decode("ascii")
    return {"mime_type": mime_type, "data": data}

reference_1 = encode_image("image_1.jpg")  # Replace with your image path

payload = {
    "contents": [{
        "parts": [
            {"text": "A clean product photo of a matte ceramic coffee mug on a light stone table, soft window light, natural shadows, minimal styling."},
            {"inline_data": reference_1}
        ]
    }],
    "generationConfig": {
        "responseModalities": ["IMAGE"],
        "imageConfig": {
            "imageSize": "2K"
        }
    }
}

try:
    response = requests.post(
        API_URL,
        headers=headers,
        json=payload,
        timeout=REQUEST_TIMEOUT_SECONDS,
    )
except requests.Timeout as error:
    print(
        "Request timed out after 500 seconds. The result status may be unknown; "
        "check call and billing logs before retrying.",
        file=sys.stderr,
    )
    raise SystemExit(1) from error

if response.status_code != 200:
    print(f"API error {response.status_code}: {response.text}", file=sys.stderr)
    raise SystemExit(1)

try:
    result = response.json()
except ValueError as error:
    print("API returned a non-JSON response.", file=sys.stderr)
    raise SystemExit(1) from error

if not isinstance(result, dict):
    print("API returned an unexpected JSON shape.", file=sys.stderr)
    raise SystemExit(1)

image_part = None
for candidate in result.get("candidates", []):
    for part in candidate.get("content", {}).get("parts", []):
        inline_data = part.get("inlineData") or part.get("inline_data")
        if inline_data and inline_data.get("data"):
            image_part = inline_data
            break
    if image_part:
        break

if not image_part:
    response_id = result.get("responseId", "not provided")
    print(f"No image data in response. responseId={response_id}", file=sys.stderr)
    raise SystemExit(1)

mime_type = image_part.get("mimeType") or image_part.get("mime_type") or "image/png"
encoded_image = image_part["data"]
if encoded_image.startswith("data:"):
    header, encoded_image = encoded_image.split(",", 1)
    mime_type = header[5:].split(";", 1)[0] or mime_type

extension_by_mime = {
    "image/jpeg": "jpg",
    "image/png": "png",
    "image/webp": "webp",
    "image/gif": "gif",
}
extension = extension_by_mime.get(mime_type, "bin")
output_path = f"output.{extension}"

with open(output_path, "wb") as output_file:
    output_file.write(base64.b64decode(encoded_image, validate=True))

print(f"Image saved: {output_path} ({mime_type})")
실제 사용 전 LaoZhang 계정에서 최신 가격, 잔액, 권한을 확인하세요.

요청 파라미터

현재 YingTu 클라이언트와 코드 예시에 맞춘 필드입니다.

model
필수. 이 페이지의 정확한 모델 ID를 사용합니다.
prompt
필수. 이미지 지시를 보내며 API Key는 포함하지 않습니다.
출력 설정
generationConfig.imageConfig.aspectRatioimageSize; 자동 비율은 보내지 않습니다.
참고 이미지
선택 사항. YingTu 브라우저에서는 최대 5장을 contents[].parts[].inline_data로 보냅니다.

응답 및 시간 제한

이미지 응답
candidates[].content.parts[].inlineData 또는 inline_data의 base64 이미지와 MIME 유형을 읽습니다.
이미지가 아닌 응답
이미지 데이터가 없으면 성공으로 처리하지 않습니다. 차단/종료 이유와 response ID가 있으면 표시합니다.

클라이언트 500초 제한

500초 후 YingTu 클라이언트는 대기를 중단합니다. 이때 결과와 청구 상태는 알 수 없을 수 있습니다.

자동 재시도 없음

YingTu는 자동 재시도하지 않습니다. 다시 유료 호출하기 전에 요청 및 청구 로그를 확인하세요.

일반적인 오류

인증
환경 변수의 Key와 Bearer 인증 헤더를 확인하세요.
권한 또는 잔액
LaoZhang에서 모델 권한, 잔액, 청구 및 계정 제한을 확인하세요.
요청 제한
동시 실행 수를 낮추고 반환된 상위 또는 계정 메시지를 확인하세요.
이미지 없음
차단/종료 이유, API 메시지 및 response ID를 확인하세요.
시간 초과
최종 상태가 불명확할 수 있으므로 재시도 전에 호출 및 청구 로그를 확인하세요.

알려진 제한

생성 결과를 사용하기 전에 다음 내용을 확인하세요.

  • 다운로드한 파일의 실제 크기를 확인하세요.
  • 정체성, 로고, 포장, 색상과 작은 세부 사항을 확인하세요.
  • 사용 가능 여부와 대기 시간은 달라질 수 있습니다.
  • 가격, 잔액, 권한 및 청구는 LaoZhang에서 확인하세요.

API FAQ

API Key는 어디에 저장하나요?

코드 예시의 환경 변수를 사용하고 코드, 로그, 프롬프트에 전체 Key를 남기지 마세요.

시간 초과는 실패인가요?

항상 그렇지는 않습니다. 500초 후에도 결과나 청구가 불명확할 수 있으므로 로그를 확인하세요.

참고 이미지 수는 제공자 최대값인가요?

아닙니다. 모델 레지스트리에 있는 현재 YingTu 브라우저 제한입니다.

가격과 권한은 어디서 확인하나요?

최신 가격, 잔액, 권한과 청구는 LaoZhang 계정에서 확인하세요.

가격 및 청구

페이지에는 참고 가격이 표시됩니다. 최신 가격, 잔액, 권한, 청구는 LaoZhang 계정에서 확인하세요.

모델 정보
모델 ID
gemini-3.1-flash-image
참고 가격
$0.055/회
출력 크기
512 / 1K / 2K / 4K
API 형식
Gemini native

스튜디오에서 이 모델 테스트

현재 이미지 스튜디오에서 사용할 수 있는 설정입니다.

YingTuLaoZhang