API 文件

文字對話

POST /v1/chat/completions

呼叫平台的文字大模型。與生圖/生影片不同,這個介面是同步的:一次往返就拿到結果,不需要輪詢任務。請求與回應形狀對齊 OpenAI 的 chat/completions,包括 stream 串流;任何 OpenAI SDK 只改 baseURL 即可直接呼叫。

請求參數

參數型別說明
modelstring必填。模型 id,取自 /v1/models 裡 type=text 的項目
messagesobject[]必填。每項 {role, content};role 取 system | user | assistant。單次最多 64 則
streamboolean選填。true 走 SSE 增量回傳,預設 false 一次性回傳
temperaturenumber選填。原樣透傳給上游模型
top_pnumber選填。原樣透傳
max_tokensinteger選填。原樣透傳
stopstring|string[]選填。原樣透傳
presence_penalty / frequency_penaltynumber選填。原樣透傳
model 必填,沒有預設值——不同文字模型的語氣、長度與價格差得遠,替你默默挑一個等於替你做了你不知道的決定。

請求範例

bash
curl https://open.pikpikgo.com/v1/chat/completions \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-fast-1",
    "messages": [
      { "role": "system", "content": "你是一位擅長短劇的編劇。" },
      { "role": "user", "content": "給我一個都市懸疑短劇的開場,三句話以內。" }
    ]
  }'

回傳範例

json
{
  "id": "chatcmpl-2608102214300000123456",
  "object": "chat.completion",
  "created": 1786372470,
  "model": "text-fast-1",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "深夜的電梯停在 13 樓,可這棟樓只有 12 層。" },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 38, "completion_tokens": 126, "total_tokens": 164 },
  "credits": 4
}
欄位說明
choices[0].message.content模型回覆正文
choices[0].finish_reasonstop 正常結束 | length 觸達 max_tokens
usagetoken 用量。文字按 token 計費,這就是計費依據
credits本次實際扣除的算力(非 OpenAI 標準欄位)
文字按 token 計費,不按次:算力 = 輸入 token × 輸入單價 + 輸出 token × 輸出單價,向上取整、每次至少 1 點。單價按百萬 token 標註,在「模型定價」頁可查。

串流回傳

傳 stream: true,回應變成 text/event-stream,逐影格下發 chat.completion.chunk:首影格只宣告 role,正文一影格一段,隨後一影格帶 finish_reason,最後一影格 choices 為空陣列、帶 usage 與 credits,然後以 data: [DONE] 收尾。

bash
curl -N https://open.pikpikgo.com/v1/chat/completions \
  -H "Authorization: Bearer $PIKPIK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "text-fast-1",
    "messages": [
      { "role": "user", "content": "給我一個都市懸疑短劇的開場,三句話以內。" }
    ],
    "stream": true
  }'
text
data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{"content":"深夜的電梯停"},"finish_reason":null}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: {"id":"chatcmpl-2608102214300000123456","object":"chat.completion.chunk","created":1786372470,"model":"text-fast-1","choices":[],"usage":{"prompt_tokens":38,"completion_tokens":126,"total_tokens":164},"credits":4}

data: [DONE]

用 OpenAI 官方 SDK 就不必自己解析 SSE:

javascript
import OpenAI from 'openai'

const client = new OpenAI({
  apiKey: process.env.PIKPIK_API_KEY,
  baseURL: 'https://open.pikpikgo.com/v1',
})

// 串流:逐影格取增量,末影格帶 usage 與本次扣費
const stream = await client.chat.completions.create({
  model: 'text-fast-1',
  messages: [{ role: 'user', content: '給我一個都市懸疑短劇的開場,三句話以內。' }],
  stream: true,
})

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || '')
}
串流的計費依據是上游在末影格回的 usage。上游若不回 usage,本次按最低 1 點收。另外串流一旦開始下發(HTTP 已經是 200),中途出錯不會再變成 4xx/5xx——錯誤會作為串流內的一影格 {"error": {...}} 送出,隨後照樣以 [DONE] 收尾,請在讀取時一併判斷這種影格。