讯飞星火API调用流程:密钥配置与Python请求示例
讯飞星火API的调用门槛主要在鉴权环节:它不是简单填一个API Key就能用,而是需要APPID、APIKey、APISecret三件套,并且要生成带签名的WebSocket连接地址。
下面按实际接入顺序,从控制台创建应用到Python跑通请求讲清楚。
先在控制台拿到三件套
打开讯飞开放平台(console.xfyun.cn),登录后进入控制台,找到星火认知大模型的服务页面。
首次使用需要先创建应用,应用创建完成后在应用详情里能看到以下三个值:
APPID:应用唯一标识APIKey:接口密钥APISecret:用于签名计算的密钥
这三个值不要直接写死在代码里,建议放到环境变量或配置文件中。
另外确认所创建应用的模型版本,不同版本对应的接口地址和参数可能不同,以控制台展示的接口文档为准。
理解鉴权地址的生成方式
星火API的WebSocket接口地址不是固定的,需要根据APISecret动态生成签名。
核心逻辑是:用当前时间戳和APIKey构造签名原文,经HMAC-SHA256计算后再Base64编码,拼接到wss://地址上。
关键参数说明:
host:接口域名,如spark-api.xf-yun.comdate:RFC1123格式的GMT时间authorization_origin:固定格式的签名原文signature:HMAC-SHA256计算结果
签名一旦算错,服务端会直接返回401或握手失败。
时间戳与服务器时间偏差过大也会导致鉴权不通过,这是新手最容易忽略的一点。
Python请求示例
下面是一个最小可运行的调用示例,使用websocket-client库。
先安装依赖:
pip install websocket-client
然后编写调用脚本:
import hmac
import hashlib
import base64
import datetime
import json
import websocket
APPID = "你的APPID"
API_KEY = "你的APIKey"
API_SECRET = "你的APISecret"
def create_url():
host = "spark-api.xf-yun.com"
path = "/v3.5/chat" # 以控制台文档为准
date = datetime.datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')
origin = f"host: {host}\ndate: {date}\nGET {path} HTTP/1.1"
signature = base64.b64encode(
hmac.new(API_SECRET.encode(), origin.encode(), hashlib.sha256).digest()
).decode()
auth_origin = (
f'api_key="{API_KEY}", algorithm="hmac-sha256", '
f'headers="host date request-line", signature="{signature}"'
)
authorization = base64.b64encode(auth_origin.encode()).decode()
return f"wss://{host}{path}?authorization={authorization}&date={date}&host={host}"
def on_message(ws, message):
data = json.loads(message)
if data["header"]["code"] != 0:
print("错误:", data["header"])
ws.close()
return
for choice in data["payload"]["choices"]["text"]:
print(choice["content"], end="")
if data["header"]["status"] == 2:
ws.close()
def on_open(ws):
ws.send(json.dumps({
"header": {"app_id": APPID},
"parameter": {"chat": {"domain": "generalv3.5", "max_tokens": 1024}},
"payload": {"message": {"text": [{"role": "user", "content": "你好"}]}}
}))
ws = websocket.WebSocketApp(create_url(), on_message=on_message, on_open=on_open)
ws.run_forever()
注意domain字段必须与控制台开通的模型版本一致,写错会返回参数错误。
报错时先查这几处
握手返回401:优先检查签名原文格式是否完全一致,包括换行符和空格;
再确认系统时间是否准确,可用date -u查看UTC时间。
返回403:通常是APIKey与APISecret不匹配,或者应用未开通对应模型服务,回到控制台确认服务状态。
连接超时:检查服务器出站网络是否放行wss的443端口,部分云服务器安全组默认限制出站规则。
返回内容为空:确认payload.message.text中的role和content字段完整,且max_tokens没有设置过小。
验证调用是否成功
脚本运行后如果控制台持续打印模型回复文本,且最后状态码为2,说明完整链路已经通了。
此时可以进一步把返回的usage字段打印出来,确认token消耗是否符合预期。
建议先在测试环境用短问题验证,再接入业务代码。
如果后续要换成HTTP接口,签名逻辑一致,只是请求方式和参数位置不同,以控制台当前接口文档为准。
整个流程中最需要耐心的是签名生成和模型版本对应关系,把这两步核对清楚,后续调用基本不会卡住。