快速開始
從取得金鑰到跑出第一張圖,一共三步。
第一步:建立金鑰
進入「帳號管理 → API 平台」,點右上角「建立金鑰」,給它取個能認出用途的名字。建立完成時金鑰會自動複製到剪貼簿;之後隨時可以在列表裡點複製按鈕再取一次。
金鑰等同於你的帳號,能直接花掉你的算力。列表頁隨時可以再複製,所以不必到處抄存副本——副本越多,外洩面越大。
第二步:看看有哪些模型
把金鑰放進環境變數,先查一次模型列表——回傳裡的 id 就是後面下單時 model 參數要傳的值。
bash
curl https://open.pikpikgo.com/v1/models \
-H "Authorization: Bearer $PIKPIK_API_KEY"第三步:出一張圖
bash
curl https://open.pikpikgo.com/v1/images/generations \
-H "Authorization: Bearer $PIKPIK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "賽博龐克風格的雨夜街道,霓虹倒影",
"size": "16:9",
"quality": "2k",
"n": 1
}'預設是同步的:介面會一直等到圖出完才回應,data[0].url 就是圖片位址,不需要再查任務。單張通常 30 秒以上,請把用戶端逾時放寬到 300 秒。
json
{
"created": 1786000246,
"data": [
{ "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "賽博龐克風格的雨夜街道,霓虹倒影" }
],
"id": "2608101909450810293847",
"object": "image.generation",
"model": "img-std-1",
"status": "succeeded",
"n": 1,
"credits": 10,
"tasks": [
{
"id": "2608101909450810293847",
"status": "succeeded",
"data": [{ "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "賽博龐克風格的雨夜街道,霓虹倒影" }]
}
]
}第四步:不想等?改成非同步
請求裡多加一個 async: true,介面立刻回傳,status 是 queued、data 還是空的——圖還沒出。記下 tasks[0].id。
bash
curl https://open.pikpikgo.com/v1/images/generations \
-H "Authorization: Bearer $PIKPIK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "賽博龐克風格的雨夜街道,霓虹倒影",
"size": "16:9",
"quality": "2k",
"n": 1,
"async": true
}'json
{
"id": "2608101909450810293847",
"object": "image.generation",
"created": 1786000185,
"model": "img-std-1",
"status": "queued",
"n": 1,
"credits": 10,
"tasks": [
{ "id": "2608101909450810293847", "status": "queued", "data": [] }
],
"data": []
}再拿這個 id 輪詢任務,status 變成 succeeded 時,data[0].url 就是圖片位址。出影片只有這一種用法。
bash
curl https://open.pikpikgo.com/v1/tasks/2608101909450810293847 \
-H "Authorization: Bearer $PIKPIK_API_KEY"json
{
"id": "2608101909450810293847",
"object": "image.generation",
"created": 1786000185,
"model": "img-std-1",
"status": "succeeded",
"prompt": "賽博龐克風格的雨夜街道,霓虹倒影",
"size": "16:9",
"quality": "2k",
"credits": 10,
"error": "",
"data": [
{ "url": "https://cdn.pikpikgo.com/ai/xxxx.png", "revised_prompt": "賽博龐克風格的雨夜街道,霓虹倒影" }
]
}完整範例
同步這條路 OpenAI 官方 SDK 可以直接用,只換 baseURL:
javascript
import OpenAI from 'openai'
const client = new OpenAI({
apiKey: process.env.PIKPIK_API_KEY,
baseURL: 'https://open.pikpikgo.com/v1',
timeout: 300 * 1000,
})
// 同步出圖:一次往返直接取得位址,逾時放寬到 300 秒
const res = await client.images.generate({
model: 'img-std-1',
prompt: '賽博龐克風格的雨夜街道,霓虹倒影',
size: '1792x1024',
n: 1,
})
console.log(res.data[0].url)非同步這條路要自己把送出與輪詢串起來,Node.js 版:
javascript
const BASE = 'https://open.pikpikgo.com/v1'
const KEY = process.env.PIKPIK_API_KEY
async function call(path, body) {
const res = await fetch(BASE + path, {
method: body ? 'POST' : 'GET',
headers: {
Authorization: `Bearer ${KEY}`,
'Content-Type': 'application/json',
},
body: body ? JSON.stringify(body) : undefined,
})
const json = await res.json()
if (json.error) throw new Error(json.error.message)
return json
}
// 送出出圖並等待完成:輪詢間隔 3 秒,最多等 10 分鐘
async function generateImage(prompt) {
const job = await call('/images/generations', { prompt, size: '16:9', async: true })
const id = job.tasks[0].id
for (let i = 0; i < 200; i++) {
const task = await call(`/tasks/${id}`)
if (task.status === 'succeeded') return task.data[0].url
if (task.status === 'failed') throw new Error(task.error || '生成失敗')
await new Promise((r) => setTimeout(r, 3000))
}
throw new Error('等待逾時')
}
generateImage('賽博龐克風格的雨夜街道,霓虹倒影').then(console.log)Python 版(這裡示範的是出影片,輪詢間隔放寬到 5 秒):
python
import os, time, requests
BASE = "https://open.pikpikgo.com/v1"
KEY = os.environ["PIKPIK_API_KEY"]
HEAD = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"}
def call(path, body=None):
if body is None:
r = requests.get(BASE + path, headers=HEAD, timeout=30)
else:
r = requests.post(BASE + path, headers=HEAD, json=body, timeout=60)
data = r.json()
if "error" in data:
raise RuntimeError(data["error"]["message"])
return data
def generate_video(prompt, seconds=5):
job = call("/video/generations", {"prompt": prompt, "duration": seconds})
# 出片通常 1~5 分鐘,輪詢間隔 5 秒即可,間隔過密只會白白消耗頻率額度
for _ in range(200):
task = call(f"/video/generations/{job['task_id']}")
if task["status"] == "succeeded":
return task["url"]
if task["status"] == "failed":
raise RuntimeError(task["error"] or "生成失敗")
time.sleep(5)
raise TimeoutError("等待逾時")
print(generate_video("鏡頭緩慢推進,少女回頭微笑"))
