文本对话
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] 收尾,请在读流时一并判断这种帧。

