文字對話
POST /v1/chat/completions
呼叫平台的文字大模型。與生圖/生影片不同,這個介面是同步的:一次往返就拿到結果,不需要輪詢任務。請求與回應形狀對齊 OpenAI 的 chat/completions,包括 stream 串流;任何 OpenAI SDK 只改 baseURL 即可直接呼叫。
請求參數
| 參數 | 型別 | 說明 |
|---|---|---|
| model | string | 必填。模型 id,取自 /v1/models 裡 type=text 的項目 |
| messages | object[] | 必填。每項 {role, content};role 取 system | user | assistant。單次最多 64 則 |
| stream | boolean | 選填。true 走 SSE 增量回傳,預設 false 一次性回傳 |
| temperature | number | 選填。原樣透傳給上游模型 |
| top_p | number | 選填。原樣透傳 |
| max_tokens | integer | 選填。原樣透傳 |
| stop | string|string[] | 選填。原樣透傳 |
| presence_penalty / frequency_penalty | number | 選填。原樣透傳 |
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_reason | stop 正常結束 | length 觸達 max_tokens |
| usage | token 用量。文字按 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] 收尾,請在讀取時一併判斷這種影格。

