Skip to content

SDK 示例

MoonApiX API 可以直接使用 HTTP 调用。OpenAI-compatible 接口也可以使用兼容 OpenAI SDK 的方式接入。

cURL

bash
curl https://moonapix.com/v1/chat/completions \
  -H "Authorization: Bearer <MOONAPIX_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "moonapix-chat",
    "messages": [
      {
        "role": "user",
        "content": "写一句简短的产品宣传语"
      }
    ]
  }'

JavaScript 基础请求

js
const MOONAPIX_API_KEY = process.env.MOONAPIX_API_KEY
const MOONAPIX_BASE_URL = 'https://moonapix.com'

async function moonapix(path, options = {}) {
  const response = await fetch(`${MOONAPIX_BASE_URL}${path}`, {
    ...options,
    headers: {
      Authorization: `Bearer ${MOONAPIX_API_KEY}`,
      'Content-Type': 'application/json',
      ...options.headers
    }
  })

  const data = await response.json().catch(() => null)

  if (!response.ok) {
    const message = data?.error?.message || `MoonApiX request failed: ${response.status}`
    throw new Error(message)
  }

  return data
}

const result = await moonapix('/v1/chat/completions', {
  method: 'POST',
  body: JSON.stringify({
    model: 'moonapix-chat',
    messages: [
      {
        role: 'user',
        content: '写一句简短的产品宣传语'
      }
    ]
  })
})

console.log(result)

JavaScript 等待任务

js
async function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms))
}

async function waitTask(taskId, { timeoutMs = 10 * 60 * 1000 } = {}) {
  const startedAt = Date.now()

  while (Date.now() - startedAt < timeoutMs) {
    const task = await moonapix(`/v1/tasks/${taskId}`)

    if (task.status === 'succeeded') return task
    if (task.status === 'failed' || task.status === 'canceled') {
      throw new Error(task.error?.message || `Task ended with status: ${task.status}`)
    }

    await sleep(5000)
  }

  throw new Error(`Task timeout: ${taskId}`)
}

const task = await moonapix('/v1/videos', {
  method: 'POST',
  body: JSON.stringify({
    model: 'seedance-2.0-kz-fast',
    prompt: 'A cinematic product shot with slow camera movement.',
    duration: 5,
    aspect_ratio: '16:9'
  })
})

const completed = await waitTask(task.id)
console.log(completed.output)

Python 基础请求

python
import os
import requests

MOONAPIX_API_KEY = os.environ["MOONAPIX_API_KEY"]
MOONAPIX_BASE_URL = "https://moonapix.com"


def moonapix(path, method="GET", **kwargs):
    headers = kwargs.pop("headers", {})
    headers["Authorization"] = f"Bearer {MOONAPIX_API_KEY}"

    response = requests.request(
        method,
        f"{MOONAPIX_BASE_URL}{path}",
        headers=headers,
        timeout=60,
        **kwargs,
    )

    try:
        data = response.json()
    except ValueError:
        data = None

    if response.status_code >= 400:
        message = (data or {}).get("error", {}).get("message") or response.text
        raise RuntimeError(message)

    return data


result = moonapix(
    "/v1/chat/completions",
    method="POST",
    json={
        "model": "moonapix-chat",
        "messages": [
            {
                "role": "user",
                "content": "写一句简短的产品宣传语",
            }
        ],
    },
)

print(result)

Python 等待任务

python
import time


def wait_task(task_id, timeout_seconds=600):
    started_at = time.time()

    while time.time() - started_at < timeout_seconds:
        task = moonapix(f"/v1/tasks/{task_id}")
        status = task.get("status")

        if status == "succeeded":
            return task

        if status in {"failed", "canceled"}:
            error = task.get("error") or {}
            raise RuntimeError(error.get("message") or f"Task ended with status: {status}")

        time.sleep(5)

    raise TimeoutError(f"Task timeout: {task_id}")


task = moonapix(
    "/v1/videos",
    method="POST",
    json={
        "model": "seedance-2.0-kz-fast",
        "prompt": "A cinematic product shot with slow camera movement.",
        "duration": 5,
        "aspect_ratio": "16:9",
    },
)

completed = wait_task(task["id"])
print(completed.get("output"))

素材上传

python
with open("product.png", "rb") as file:
    response = requests.post(
        "https://moonapix.com/v1/assets/uploads",
        headers={"Authorization": f"Bearer {MOONAPIX_API_KEY}"},
        files={"file": file},
        data={
            "type": "image",
            "purpose": "video_reference",
        },
        timeout=60,
    )

response.raise_for_status()
print(response.json())

音乐任务

bash
curl https://moonapix.com/v1/tasks \
  -H "Authorization: Bearer <MOONAPIX_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-music-v5.5",
    "prompt": "A bright electronic pop track for a product launch.",
    "style": "Electronic, Pop, Bright",
    "title": "Launch Day",
    "customMode": true
  }'

OpenAI-compatible SDK

如果使用兼容 OpenAI SDK 的客户端,请把 baseURLbase_url 设置为 MoonApiX API 域名,并使用 MoonApiX API Key。

text
base_url = https://moonapix.com/v1
api_key = <MOONAPIX_API_KEY>

不同 SDK 的参数名称可能不同,请以对应 SDK 文档为准。