Chat Completions
OpenAI 兼容的对话补全接口。把消息列表交给模型,得到一条或多条助手回复,可选流式返回。
协议边界
这是 OpenAI 请求/响应格式。部分 Anthropic 上游分组也可以经网关转换后使用这个入口,但如果你依赖 Anthropic 原生语义,优先使用 /v1/messages。
Endpoint
POST https://api.sakrylle.com/v1/chat/completions请求头
| 名称 | 必填 | 说明 |
|---|---|---|
Authorization | 是 | Bearer sk-xxxxxxxxxxxxxxxx |
Content-Type | 是 | application/json |
Accept | 否 | 流式可写 text/event-stream |
请求体参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型 ID,例如 gpt-5.6-sol |
messages | array | 是 | 完整对话历史,每项含 role(system/user/assistant/tool)与 content |
stream | boolean | 否 | 默认 false;为 true 时返回 SSE |
temperature | number | 否 | 0–2,默认随上游 |
top_p | number | 否 | 核采样概率 |
max_tokens | integer | 否 | 上限输出 token 数(部分新模型用 max_completion_tokens) |
n | integer | 否 | 生成候选数,默认 1 |
stop | string | array | 否 | 停止序列 |
presence_penalty | number | 否 | -2.0–2.0 |
frequency_penalty | number | 否 | -2.0–2.0 |
tools | array | 否 | 工具定义 |
tool_choice | string | object | 否 | auto / none / 指定工具 |
response_format | object | 否 | 例如 {"type":"json_object"} |
user | string | 否 | 终端用户标识 |
网关只校验
model必填,其余字段透传给上游 OpenAI 兼容接口。
请求体示例
json
{
"model": "gpt-5.6-sol",
"messages": [
{ "role": "system", "content": "你是一个乐于助人的助手。" },
{ "role": "user", "content": "自我介绍一下。" }
],
"temperature": 0.7
}响应示例
json
{
"id": "chatcmpl-xxxxxxxxxxxxxxxx",
"object": "chat.completion",
"created": 1716350400,
"model": "gpt-5.6-sol",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "我是 gpt-5.6-sol,有什么可以帮您?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 28,
"completion_tokens": 14,
"total_tokens": 42
}
}流式响应示例
设置 stream: true 后,返回 Content-Type: text/event-stream,每一帧为 data: <json> 行,最后以 data: [DONE] 结束。
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk","created":1716350400,"model":"gpt-5.6-sol","choices":[{"index":0,"delta":{"role":"assistant"},"finish_reason":null}]}
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk","created":1716350400,"model":"gpt-5.6-sol","choices":[{"index":0,"delta":{"content":"Sakrylle"},"finish_reason":null}]}
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk","created":1716350400,"model":"gpt-5.6-sol","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]错误
400 invalid_request_error— 缺model或请求体非 JSON401 authentication_error— API Key 无效403 billing_error— 余额或订阅限额不足429 rate_limit_error— 触发并发或速率限制502 upstream_error— 上游连续失败,请稍后重试
更多错误码与字段含义见 错误处理。
代码示例
bash
curl https://api.sakrylle.com/v1/chat/completions \
-H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-5.6-sol",
"messages": [
{"role": "user", "content": "Hello!"}
]
}'python
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxxxxxxxxxx",
base_url="https://api.sakrylle.com/v1",
)
resp = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[{"role": "user", "content": "Hello!"}],
)
print(resp.choices[0].message.content)javascript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-xxxxxxxxxxxxxxxx",
baseURL: "https://api.sakrylle.com/v1",
});
const resp = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(resp.choices[0].message.content);go
package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("sk-xxxxxxxxxxxxxxxx"),
option.WithBaseURL("https://api.sakrylle.com/v1/"),
)
resp, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: openai.F("gpt-5.6-sol"),
Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
openai.UserMessage("Hello!"),
}),
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}rust
use reqwest::Client;
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let client = Client::new();
let resp: serde_json::Value = client
.post("https://api.sakrylle.com/v1/chat/completions")
.bearer_auth("sk-xxxxxxxxxxxxxxxx")
.json(&json!({
"model": "gpt-5.6-sol",
"messages": [{"role": "user", "content": "Hello!"}]
}))
.send()
.await?
.json()
.await?;
println!("{resp:#}");
Ok(())
}java
import java.net.URI;
import java.net.http.*;
public class ChatCompletions {
public static void main(String[] args) throws Exception {
String body = """
{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"Hello!"}]}
""";
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.sakrylle.com/v1/chat/completions"))
.header("Authorization", "Bearer sk-xxxxxxxxxxxxxxxx")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> resp = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.body());
}
}csharp
using System.Net.Http.Headers;
using System.Text;
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "sk-xxxxxxxxxxxxxxxx");
var payload = """
{"model":"gpt-5.6-sol","messages":[{"role":"user","content":"Hello!"}]}
""";
var resp = await http.PostAsync(
"https://api.sakrylle.com/v1/chat/completions",
new StringContent(payload, Encoding.UTF8, "application/json"));
Console.WriteLine(await resp.Content.ReadAsStringAsync());