保利威AI答疑助手API介面文件
更新時間:2025-05-23 11:42:35
目錄
介面概覽
| 介面名稱 | 介面位址 | 請求方式 | 說明 |
|---|---|---|---|
| 取得Token | https://api.polyv.net/live/v3/common/token/get-ai-token |
POST | 取得AI答疑助手的存取令牌 |
| AI聊天問答 | https://api.polyv.net/ai/v1/chat/question |
GET | 向AI助手發送問題並串流取得回答 |
呼叫流程
取得Token
- 使用應用資訊(appId、secretKey)呼叫取得Token介面
- 產生簽名並提交請求
- 取得回傳的token
使用Token進行AI聊天
- 使用上一步取得的token呼叫AI聊天介面
- 處理串流回傳的資料
- 拼接回傳內容獲得完整回答
介面詳情
取得Token介面
基本資訊
- 介面位址:
https://api.polyv.net/live/v3/common/token/get-ai-token - 請求方式:POST
- 資料格式:form-data
請求參數
| 參數名 | 類型 | 必填 | 描述 |
|---|---|---|---|
| appId | String | 是 | 客戶在保利威的應用ID |
| timestamp | Long | 是 | 目前時間戳記(毫秒) |
| viewerId | String | 是 | 觀看者/使用者唯一識別碼 |
| sign | String | 是 | 請求簽名 |
回傳參數
| 參數名 | 類型 | 描述 |
|---|---|---|
| code | Integer | 狀態碼,200表示成功 |
| message | String | 回應訊息 |
| status | String | 回應狀態 |
| data.token | String | AI答疑助手的存取令牌 |
| data.userId | String | 使用者ID |
| data.validTime | Integer | 令牌有效時間(秒) |
回傳範例
{
"code": 200,
"message": "success",
"status": "success",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": "viewer123456",
"validTime": 3600
}
}
AI聊天問答介面
基本資訊
- 介面位址:
https://api.polyv.net/ai/v1/chat/question - 請求方式:GET
- 回傳格式:EventStream(串流回傳)
請求參數
| 參數名 | 類型 | 必填 | 描述 |
|---|---|---|---|
| question | String | 是 | 使用者的問題內容 |
| aiId | String | 是 | AI助手的ID |
| token | String | 是 | 透過取得Token介面獲得的存取令牌 |
回傳格式
介面使用EventStream(Server-Sent Events)格式回傳資料,需要客戶端支援處理此格式:
event: message
data: {"content":"我可以回答您关于", "done":false}
回傳資料說明
| 事件類型 | 資料格式 | 描述 |
|---|---|---|
| message | JSON | AI產生的部分回答內容 |
| done | JSON | 表示回答已經結束 |
資料欄位說明
| 欄位名 | 類型 | 描述 |
|---|---|---|
| content | String | AI產生的回答內容 |
| done | Boolean | AI產生的回答內容是否完成 |
簽名產生規則
產生sign參數的步驟:
- 將除sign以外的全部參數按照參數名ASCII碼從小到大排序
- 將排序後的參數以key=value形式拼接,並用&連接
- 在拼接後的字串首尾加上金鑰(secretKey)
- 對拼接後的字串進行MD5加密並轉為大寫
簽名公式:
MD5(secretKey + 排序并拼接后的参数字符串 + secretKey).toUpperCase()
程式碼範例
Python完整呼叫流程
import time
import hashlib
import json
import requests
import sseclient # 需要安装: pip install sseclient-py
POLYV_CONFIG = {
"app_id": '保利威平台appId',
"app_secret": '保利威平台appSecret'
}
# 第一步:获取Token
def get_ai_token(viewer_id):
"""获取聊天Token的接口"""
# 构建请求参数
if viewerId is None:
print("viewerId is None")
viewerId = f"polyvWebscriptViewerId-{uuid.uuid4()}"
print("最后的viewerId", viewerId)
form_data = {
"appId": POLYV_CONFIG["app_id"],
"timestamp": int(time.time() * 1000),
"viewerId": viewerId
}
# 添加签名
form_data["sign"] = create_api_sign(POLYV_CONFIG["app_secret"], form_data)
# 发送请求到保利威API
response = requests.post(
"https://api.polyv.net/live/v3/common/token/get-ai-token",
data=form_data
)
print(response.json())
token = response.json().get('data')
return token
# 第二步:使用token调用AI聊天接口
def chat_with_ai(token, ai_id, question):
"""向AI助手发送问题并获取回答"""
# 构建请求URL
url = f"https://api.polyv.net/ai/v1/chat/question?question={question}&aiId={ai_id}&token={token}"
# 发送请求
headers = {
"Accept": "text/event-stream",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
print(response)
client = sseclient.SSEClient(response)
# 处理EventStream响应
answer = ""
try:
for event in client.events():
data = json.loads(event.data)
print(data)
content = data.get("content", "")
done = data.get("done")
if not done:
print(f'过程数据:===>{content}')
answer += content
# 处理回答片段
else:
answer += content
print("回答完成")
break
return answer
except Exception as e:
print(f"处理响应出错: {e}")
raise
# 使用示例
if __name__ == "__main__":
# 配置参数
APP_ID = "你的appId"
SECRET_KEY = "你的secretKey"
VIEWER_ID = "用户唯一标识"
AI_ID = "1159"
QUESTION = "你好,请介绍一下自己"
try:
# 注意:实际应用中token获取应在后端进行
token = get_ai_token(APP_ID, SECRET_KEY, VIEWER_ID)
print(f"获取token成功: {token}")
# 使用token进行聊天
answer = chat_with_ai(token, AI_ID, QUESTION)
print(f"完整回答: {answer}")
except Exception as e:
print(f"错误: {e}")
常見問題
Token安全問題
- 取得Token的介面必須在伺服器端呼叫,避免將secretKey暴露在前端
- 可以在自己的後端服務中封裝一個取得Token的介面供前端呼叫
Token有效期
- Token有效期通常為3600秒(1小時)
- 建議在Token過期前自動更新,可以設定定時任務在過期前5-10分鐘更新Token
EventStream處理
- 不同前端框架處理EventStream的方式可能不同
- 需要正確拼接所有message事件中的content欄位以取得完整回答
- 當收到type為"done"的事件時,表示本次回答已經結束
錯誤處理
- 建議加入逾時處理機制,避免網路問題導致請求一直掛起
- 加入錯誤重試機制,在網路波動時能夠自動重新連線
請求限制
- 介面呼叫頻率限制:單一appId每秒最多500次請求
- 確保合理控制請求頻率,避免觸發限流
