事件訂閱接入指南
事件訂閱用于自有系統接入,實現自定義的生圖生命周期的管控增強和相關拓展功能
生圖流程
生圖主要包括三個階段:
頁面渲染
任務提交
任務執行 & 結果展示
事件及回調流程
sdImgGenControlConfig: 可用于展示自定義文案, 根據回調請求的token獲取自有系統用戶信息, 展示自由系統信息,比如用戶額度。
apiAccessPreInvoke:可用于自有系統的用戶額度的實時扣減。
apiAccessCommit:可用于自有系統的用戶額度扣減狀態維護。
apiAccessRollback:可用于自由系統的用戶額度扣減的回滾。
sdTaskFinished:可用于自由系統的用戶生圖結果存儲。
回調協議
回調請求通過HTTP協議發起,使用POST請求, 默認超時時間為5s, 請保證5s內響應。
回調類型
同步回調: 會阻塞平臺下一步流程, 不會進行重試
異步回調: 不會阻塞平臺下一步流程, 如響應狀態碼為4xx或者5xx系列, 會觸發重試
接收回調
回調請求包括兩部分
請求上下文:請求發起人、請求目標接口、事件類型等,在url參數中。
請求詳情:用戶發送到平臺的業務參數內容,在請求體中,請求體可能為空
請求上下文參數
名稱 | 類型 | 描述 |
apiId | string | 用戶請求目標api |
bizType | string | 回調事件類型 |
invokeId | string | 請求id,可用于自有系統前后請求串聯 |
apiToken | string | 請求使用的Token(加密后) |
sign | string | 簽名, 用于接收方驗證http請求的合法性 |
nonce | string | 隨機值,用于接收方驗證http請求的合法性 |
timestamp | string | 時間戳,用于接收方驗證http請求的合法性 |
響應回調
狀態碼
2xx:表示請求已成功接收處理, 回調完成。
4xx/5xx: 表示請求未成功接收處理,回調失敗,平臺會發起重試。重試間隔為10s/30s/1分鐘/2分鐘/3分鐘/4分鐘/5分鐘/6分鐘/7分鐘/8分鐘/9分鐘/10分鐘/20分鐘/30分鐘/1小時/2小時。
事件請求參數、響應格式
apiAccessPreInvoke
用戶發起請求后, 發起預校驗, 判斷當前用戶是否有足夠的權益
請求時機: 用戶請求實際執行前
數據內容: 用戶提交的請求
請求類型: 同步
請求格式: 用戶實際請求內容, 無統一格式
響應體格式
名稱 | 類型 | 描述 |
success | bool | 是否具有權限,有權限:true |
errMessage | string | 錯誤詳情,預校驗失敗時給客戶彈窗展示內容 |
sdPreInvoke
SD生圖請求預校驗, 判斷當前用戶是否具有足夠的權益
請求時機: 用戶發起生圖請求前
請求內容: 用戶生圖原始請求
請求類型: 同步
請求詳情
名稱 | 類型 | 描述 | ||
checkpoint | object | 底模 | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
vae | object | vae | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
loras | object | lora | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
param | object | 用戶實際生圖請求 |
SD WebUI中,用戶生成一張圖,內部可能對應多次文生圖/圖生圖請求。sdPreInvoke和apiAccessPreInvoke都是在請求前發起。apiAccessPreInvoke對應了每次后端接收到的子請求,入參為接口實際請求;sdPreInvoke對應SD WebUI用戶發起的原始請求。
響應體
名稱 | 類型 | 描述 | ||
success | bool | 請求是否成功,成功:true | ||
errMessage | string | 錯誤信息 | ||
data | object | |||
info | message | string | 錯誤信息 | |
disabled | bool | 權益校驗是否通過, 通過:false |
sdTaskFinished
生圖子任務執行完成后, 通知生圖結果
請求時機: 生圖子任務完成后
請求內容: 用戶生圖結果
請求類型: 異步
請求詳情
名稱 | 類型 | 描述 | |
success | bool | 生圖是否成功,生圖成功:true | |
data | object | 生圖內容 | |
generatedImageId | string | 圖片id | |
url | string | 圖片地址,有效期只有5h, 請注意轉存 | |
type | string | 圖片格式,如png | |
modelId | string | 主模型id | |
sdCheckpointVersionId | object | 主模型版本id | |
sdCheckpointName | string | 主模型名稱 | |
sdVae | string | 生圖vae | |
sdLoras | string | 使用lora | |
infotexts | string | 生圖參數 | |
width | string | 圖片寬度 | |
height | object | 圖片高度 |
響應體
無,成功返回HTTP狀態碼200。如果返回500,系統會進行重試調用
sdJobFinished
生圖任務執行完成后, 通知生圖結果
請求時機: 生圖任務完成后
請求內容: 用戶生圖結果
請求類型: 異步
請求詳情
名稱 | 類型 | 描述 | |
success | bool | 生圖是否成功,生圖成功:true | |
data | object | 生圖內容 | |
generatedImageId | string | 圖片id | |
url | string | 圖片地址,有效期只有5h,請注意轉存 | |
type | string | 圖片格式,如png | |
modelId | string | 主模型id | |
sdCheckpointVersionId | object | 主模型版本id | |
sdCheckpointName | string | 主模型名稱 | |
sdVae | string | 生圖vae | |
sdLoras | string | 使用lora | |
infotexts | string | 生圖參數 | |
width | string | 圖片寬度 | |
height | object | 圖片高度 |
SD WebUI中,用戶生成一張圖,內部可能對應多次文生圖/圖生圖請求。sdTaskFinished和sdJobFinished都是在請求完成后發起。sdTaskFinished表示單個子任務的結束;sdJobFinished表示用戶視角的任務結束,結果可以是由插件對多個生圖結果進行后置處理后產生的,是用戶實際看到的圖片。
響應體
無,成功返回HTTP狀態碼200。如果返回500,系統會進行重試調用
sdImgGenControlConfig
生圖提交區塊控制
請求時機: 用戶打開生圖頁時
請求內容: 當前請求上下文
請求類型: 同步
請求詳情
名稱 | 類型 | 描述 | ||
checkpoint | object | 底模 | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
vae | object | vae | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
loras | object | lora | ||
modelId | string | 模型id | ||
modelVersionId | string | 模型版本id | ||
aliasName | string | 別名 | ||
modelFileId | string | 模型文件id | ||
modelFileName | string | 模型文件名 | ||
param | object | 用戶實際生圖請求 |
響應體
名稱 | 類型 | 描述 | ||
success | bool | 請求是否成功,成功:true | ||
errMessage | string | 錯誤信息 | ||
data | object | |||
info | message | string | 按鈕下方展示的內容 | |
buttonText | string | 按鈕展示的內容 | ||
disabled | bool | 生圖按鈕是否禁用,禁用:true |
apiAccessRollback
生圖提交失敗回調
請求時機: 用于生圖請求提交失敗時
數據內容: 當前請求上下文
請求類型: 同步
響應體格式
名稱 | 類型 | 描述 |
success | bool | 請求是否成功,成功:true |
errMessage | string | 失敗原因 |
解密 Token、驗證簽名(以Python接入為例)
安裝依賴
pip install pycryptodome
樣例
import hmac
import hashlib
import base64
from Crypto.Hash import SHA256
from Crypto.Cipher import AES
def decrypt_api_token(
encrypted_api_token: str,
sk: str
):
"""
解密 api token,返回解密結果
:param encrypted_api_token:
:param sk:
:return:
"""
sha256 = SHA256.new()
sha256.update(sk.encode('utf-8'))
key = sha256.digest()[:16]
encrypted = base64.b64decode(encrypted_api_token)
iv = encrypted[:16]
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(encrypted[16:])
pad_size = decrypted[-1]
decrypted = decrypted[:-pad_size]
return decrypted.decode('utf-8')
def check_sign_equal(
sign: str,
ak: str,
sk: str,
nonce: str,
timestamp: str,
body: str = None,
biz_type: str = None,
api_token: str = None,
api_id: str = None,
invoke_id: str = None,
):
"""
檢查 signature 是否一致
:param sign:
:param ak:
:param sk:
:param nonce:
:param timestamp:
:param body:
:param biz_type:
:param api_token: 解密之后
:param api_id:
:param invoke_id:
:return
"""
params = [ak, nonce, body, timestamp]
if biz_type and len(biz_type.strip()) > 0:
params.append(api_token)
params.append(biz_type)
params.append(api_id)
params.append(invoke_id)
sign_str = "".join(param for param in params if params is not None)
h = hmac.new(bytes(sk, 'utf-8'), bytes(sign_str, 'utf-8'), hashlib.sha256)
expect_sign = base64.b64encode(h.digest()).decode('utf-8')
return sign == expect_sign