高级 API 使用
延迟聊天完成
NOTE
延迟聊天完成目前仅通过 REST 请求或 xAI SDK 提供。
延迟聊天完成允许您创建聊天完成,获取 response_id,并在稍后检索响应。结果将在 24 小时内可供请求一次,之后将被丢弃。
TIP
您的延迟完成速率限制与聊天完成速率限制相同。要查看您的速率限制,请访问 xAI Console。
向 xAI API 发送请求后,聊天完成结果将在 https://api.x.ai/v1/chat/deferred-completion/{request_id} 可用。响应体将包含 {'request_id': 'f15c114e-f47d-40ca-8d5c-8c23d656eeb6'},并且可以将 request_id 值插入到 deferred-completion 端点路径中。然后,我们发送此 GET 请求以检索延迟完成结果。
当完成结果未准备就绪时,请求将返回 202 Accepted 并带有空的响应体。
TIP
您可以通过聊天完成响应的 message.reasoning_content 访问模型的原始思考轨迹。
示例
下面提供了一个代码示例,我们重复检索结果直到它被处理完成:
python
import os
from datetime import timedelta
from xai_sdk import Client
from xai_sdk.chat import user, system
client = Client(api_key=os.getenv('XAI_API_KEY'))
chat = client.chat.create(
model="grok-4.5",
messages=[system("You are Zaphod Beeblebrox.")]
)
chat.append(user("126/3=?"))
# Poll the result every 10 seconds for a maximum of 10 minutes
response = chat.defer(
timeout=timedelta(minutes=10), interval=timedelta(seconds=10)
)
# Print the result when it is ready
print(response.content)python
import json
import os
import requests
from tenacity import retry, wait_exponential
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}"
}
payload = {
"messages": [
{"role": "system", "content": "You are Zaphod Beeblebrox."},
{"role": "user", "content": "126/3=?"}
],
"model": "grok-4.5",
"deferred": True
}
response = requests.post(
"https://api.x.ai/v1/chat/completions",
headers=headers,
json=payload
)
request_id = response.json()["request_id"]
print(f"Request ID: {request_id}")
@retry(wait=wait_exponential(multiplier=1, min=1, max=60),)
def get_deferred_completion():
response = requests.get(f"https://api.x.ai/v1/chat/deferred-completion/{request_id}", headers=headers)
if response.status_code == 200:
return response.json()
elif response.status_code == 202:
raise Exception("Response not ready yet")
else:
raise Exception(f"{response.status_code} Error: {response.text}")
completion_data = get_deferred_completion()
print(json.dumps(completion_data, indent=4))javascript
const axios = require('axios');
const retry = require('retry');
const headers = {
'Content-Type': 'application/json',
'Authorization': \`Bearer \${process.env.XAI_API_KEY}\`
};
const payload = {
messages: [
{ role: 'system', content: 'You are Zaphod Beeblebrox.' },
{ role: 'user', content: '126/3=?' }
],
model: 'grok-4.5',
deferred: true
};
async function main() {
const requestId = (await axios.post('https://api.x.ai/v1/chat/completions', payload, { headers })).data.request_id;
console.log(\`Request ID: \${requestId}\`);
const operation = retry.operation({
minTimeout: 1000,
maxTimeout: 60000,
factor: 2
});
const completion = await new Promise((resolve, reject) => {
operation.attempt(async () => {
const res = await axios.get(\`https://api.x.ai/v1/chat/deferred-completion/\${requestId}\`, { headers });
if (res.status === 200) resolve(res.data);
else if (res.status === 202) operation.retry(new Error('Not ready'));
else reject(new Error(\`\${res.status}: \${res.statusText}\`));
});
});
console.log(JSON.stringify(completion, null, 4));
}
main().catch(console.error);bash
RESPONSE=$(curl -s https://api.x.ai/v1/chat/completions \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer $XAI_API_KEY" \\
-d '{
"messages": [
{"role": "system", "content": "You are Zaphod Beeblebrox."},
{"role": "user", "content": "126/3=?"}
],
"model": "grok-4.5",
"deferred": true
}')
REQUEST_ID=$(echo "$RESPONSE" | jq -r '.request_id')
echo "Request ID: $REQUEST_ID"
sleep 10
curl -s https://api.x.ai/v1/chat/deferred-completion/$REQUEST_ID \\
-H "Authorization: Bearer $XAI_API_KEY"响应体将与您对非延迟聊天完成所期望的相同:
json
{
"id": "3f4ddfca-b997-3bd4-80d4-8112278a1508",
"object": "chat.completion",
"created": 1752077400,
"model": "grok-4.5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Whoa, hold onto your improbability drives, kid! This is Zaphod Beeblebrox here, the two-headed, three-armed ex-President of the Galaxy, and you're asking me about 126 divided by 3? Pfft, that's kid stuff for a guy who's stolen starships and outwitted the universe itself.\n\nBut get this\u2014126 slashed by 3 equals... **42**! Yeah, that's right, the Ultimate Answer to Life, the Universe, and Everything! Deep Thought didn't compute that for seven and a half million years just for fun, you know. My left head's grinning like a Vogon poet on happy pills, and my right one's already planning a party. If you need more cosmic math or a lift on the Heart of Gold, just holler. Zaphod out! \ud83d\ude80",
"refusal": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 26,
"completion_tokens": 168,
"total_tokens": 498,
"prompt_tokens_details": {
"text_tokens": 26,
"audio_tokens": 0,
"image_tokens": 0,
"cached_tokens": 4
},
"completion_tokens_details": {
"reasoning_tokens": 304,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
},
"num_sources_used": 0
},
"system_fingerprint": "fp_44e53da025"
}