模型能力
临时令牌
临时令牌为客户端应用程序提供安全、短期的认证。当从浏览器或移动应用连接到 语音到语音 API 时,使用它们可以避免暴露您的 API 密钥。
工作原理
- 您的服务器使用 API 密钥向 xAI 请求临时令牌
- 您的服务器将临时令牌传递给客户端
- 客户端使用临时令牌认证 WebSocket 连接
- 令牌在配置的持续时间后自动过期
WARNING
切勿在客户端代码中暴露您的 API 密钥。 始终为浏览器和移动应用程序使用临时令牌。
创建临时令牌
您需要设置一个服务器端点,从 xAI 获取临时令牌。临时令牌授予持有者对资源的范围访问权限。
端点: POST https://api.x.ai/v1/realtime/client_secrets
bash
curl --url https://api.x.ai/v1/realtime/client_secrets \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $XAI_API_KEY" \
--data '{
"expires_after": {
"seconds": 300
}
}'
# Note: Does not support "session" or "expires_after.anchor" fieldspython
# Example ephemeral token endpoint with FastAPI
import os
import httpx
from fastapi import FastAPI
app = FastAPI()
SESSION_REQUEST_URL = "https://api.x.ai/v1/realtime/client_secrets"
XAI_API_KEY = os.getenv("XAI_API_KEY")
@app.post("/session")
async def get_ephemeral_token():
# Send request to xAI endpoint to retrieve the ephemeral token
async with httpx.AsyncClient() as client:
response = await client.post(
url=SESSION_REQUEST_URL,
headers={
"Authorization": f"Bearer {XAI_API_KEY}",
"Content-Type": "application/json",
},
json={"expires_after": {"seconds": 300}},
)
# Return the response body from xAI with ephemeral token
return response.json()javascript
// Example ephemeral token endpoint with Express
import express from 'express';
const app = express();
const SESSION_REQUEST_URL = "https://api.x.ai/v1/realtime/client_secrets";
app.use(express.json());
app.post("/session", async (req, res) => {
const r = await fetch(SESSION_REQUEST_URL, {
method: "POST",
headers: {
Authorization: \`Bearer \${process.env.XAI_API_KEY}\`,
"Content-Type": "application/json",
},
body: JSON.stringify({
expires_after: { seconds: 300 }
}),
});
const data = await r.json();
res.json(data);
});
app.listen(8081);使用临时令牌
临时令牌可以与 API 密钥以相同方式使用:
python
import os
import websockets
base_url = "wss://api.x.ai/v1/realtime?model=grok-voice-latest"
# Connect with API key in Authorization header
async with websockets.connect(
uri=base_url,
ssl=True,
additional_headers={"Authorization": f"Bearer {OBTAINED_EPHEMERAL_TOKEN}"}
) as websocket:
# WebSocket connection is now authenticated
passjavascript
import WebSocket from "ws";
const baseUrl = "wss://api.x.ai/v1/realtime?model=grok-voice-latest";
// Connect with API key in Authorization header
const ws = new WebSocket(baseUrl, {
headers: {
Authorization: "Bearer " + OBTAINED_EPHEMERAL_TOKEN,
"Content-Type": "application/json",
},
});
ws.on("open", () => {
console.log("Connected with ephemeral token authentication");
});浏览器 WebSocket 认证
如果需要从浏览器发送临时令牌,您可以在 sec-websocket-protocol 头部添加带有前缀 xai-client-secret. 的临时令牌:
javascript
new WebSocket("wss://api.x.ai/v1/realtime", [\`xai-client-secret.\${OBTAINED_EPHEMERAL_TOKEN}\`]);