Aitools 开放接口文档
接口调用签名
本文档介绍如何使用 AppKey 与 AppSecret 对 API 调用进行签名,以确保请求的合法性、防止参数篡改和重放攻击。
添加公共参数
| 参数名 | 必填 | 说明 |
|---|---|---|
app_key |
是 | 应用标识 |
timestamp |
是 | 当前 Unix 时间戳(秒) |
nonce |
是 | 随机字符串,防止重放攻击 |
sign |
是 | 最终生成的签名 |
将所有请求参数(不含 sign)按键名排序拼接
将所有请求参数(不含 sign)按键名排序, 同时剔除空数据
例如请求参数:
{
"app_key": "abc123",
"timestamp": "1736882000",
"nonce": "f91a2",
"user_id": "1001",
"limit": "10",
"sign": "签名结果"
}
按ASCII升序排序后, 通过url query的方式进行拼接:
app_key=abc123&limit=10&nonce=f91a2×tamp=1736882000&user_id=1001
使用hmac-sha256进行签名
使用app_secret作为签名的key, 对上面的生成的签名字符串进行HMAC-SHA256计算签名
sign = HMAC-SHA256(key='<App Secret>', message='sign string')
对输出的sign进行hex编码
把生成的sign加入请求参数中提交
{
"app_key": "abc123",
"timestamp": "1736882000",
"nonce": "f91a2",
"user_id": "1001",
"limit": "10",
"sign": "8e5b77d9d2b0d87f9cf53bb8..."
}
下面是一个Go语言生成Sign的示例
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"fmt"
"sort"
"strings"
)
func BuildHmacSha256Sign(params map[string]string, appSecret string) string {
// 1. 排序(不包含 sign)
keys := make([]string, 0, len(params))
for k := range params {
if k != "sign" {
keys = append(keys, k)
}
}
sort.Strings(keys)
// 2. 拼接成 "k=v&k=v" 格式
var buf []string
for _, k := range keys {
buf = append(buf, fmt.Sprintf("%s=%s", k, params[k]))
}
signingString := strings.Join(buf, "&")
// 3. HMAC-SHA256
mac := hmac.New(sha256.New, []byte(appSecret))
mac.Write([]byte(signingString))
sig := mac.Sum(nil)
return hex.EncodeToString(sig)
}
func main() {
params := map[string]string{
"app_key": "abc123",
"timestamp": "1736882000",
"nonce": "f91a2",
"user_id": "1001",
"limit": "10",
}
sign := BuildHmacSha256Sign(params, "YourAppSecret")
fmt.Println("Sign:", sign)
}
抠图
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| model | Json Body | String | 否 | Matting | 选择的模型 |
| image | Json Body | String | 是 | https://pic.com/tmp/target.png | 待抠图片地址 |
| mask_only | Json Body | Boolean | 否 | false | 是否只返回遮罩 |
| format | Json Body | string | 否 | WEBP | 输出图片格式, HEIC, WEBP, 默认使用webp |
| max_side | Json Body | int | 否 | 2048 | 输出图片的最大边的尺寸, 图片尺寸过大, 会影响导出速度 |
模型列表
| 模型 | 说明 |
|---|---|
| General | 1024x1024 |
| Matting | 默认 |
| Lite | 1024x1024 |
| 512x512 | 512x512 |
| Portrait | 1024x1024, 适用于人像抠图 |
Response
{
"code": 0,
"success": true,
"data": {
"image": "https://oss.hlsgl.top/tmp/443419a417fa45829455a3a9f9fb470c.png", // 抠图结果
"mask": "" // 当mask_only=true时, 返回抠图遮罩
}
}
擦除
POST: /v1/inpaint
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| model | Json Body | String | 否 | LaMa | 模型选择, 默认模型 |
| image | Json Body | String | 是 | https://pic.com/tmp/target.png | inpaint 目标图像 |
| mask | Json Body | String | 是 | https://pic.com/tmp/mask.png | inpaint 遮罩 |
模型列表
| 模型 | 说明 |
|---|---|
| LaMa | 推荐 |
| MAT | |
| MIGAN | |
| ZITS | 默认模型, 效果好, 但很慢 |
Response
{
"code": 0,
"success": true,
"data": {
"image": "https://pic.com/310/tmp/1c72fcaa088c462ba3839a53329920b5.webp"
}
}
图像超分
POST: /v1/upscale
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| model | Json Body | String | 否 | RealESRGAN | 模型选择, 默认使用RealESRGAN模型 |
| image | Json Body | String | 是 | tmp/target.png | 目标图像 |
| scale | Json Body | Int | 是 | 2 | 放大倍数, 如果原图很大, 显存不足会导致接口调用失败, 放大倍数应该与模型选择一致 |
模型列表
| 模型 | 说明 |
|---|---|
| RealESRGAN/General | 默认, Scale = 4 |
| RealESRGAN/RealESRGAN_x2 | Scale = 2 |
| RealESRGAN/RealESRGAN_x4 | Scale = 4 |
| RealESRGAN/RealESRNET_x4 | Scale = 4 |
Response
{
"code": 0,
"success": true,
"data": {
"image": "https://oss.hlsgl.top/poster/310/tmp/816feccc7bd047e4a1f9405e7f274a78.webp",
"scale": 2, // 缩放倍数
"filesize": 189383, // 输出文件大小, 单位字节
"input_size": "512x512", // 输入图片分辨率
"output_size": "1024x1024" // 输出图片分辨率
}
}
图像修复
POST: /v1/restore
Content-Type: application/json
POST: /v1/restore
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| model | Json Body | String | 否 | FaceRestore | 模型选择, 当前可选值: FaceRestore, General |
| image | Json Body | String | 是 | https://pic.com/tmp/target.png | 目标图像 |
模型列表
| 模型 | 说明 |
|---|---|
| General | 通用处理, Pipeline(denoise, deblur, upscale) |
| FaceRestore | 在处理人脸修复时有较好的效果, Pipeline(gfpgan, upscale) |
图像上色
POST: /v1/colorize
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| model | Json Body | String | 否 | ModelScope | 模型选择 |
| image | Json Body | String | 是 | https://pic.com/tmp/target.png | 目标图像 |
模型列表
| 模型 | 说明 |
|---|---|
| ModelScope | 默认模型 |
| Artistic | 其它 |
Response
{
"code": 0,
"success": true,
"data": {
"image": "https://oss.hlsgl.top/poster/310/tmp/816feccc7bd047e4a1f9405e7f274a78.webp"
}
}
图像压缩
POST: /v1/compress
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| image | Json Body | string | 是 | poster/310/tmp/test.png | 待压缩图片 |
| speed | Json Body | int | 否 | 3 | [1-11] 数值越大压缩速度越快, 但压缩质量越低, 默认取值4 |
| quality | Json Body | int | 否 | 75 | 图像质量 |
Response
{
"code": 0,
"success": true,
"data": {
"input": " "poster/310/tmp/pexels-photo-29611225.webp",
"image": "https://oss.hlsgl.top/poster/310/tmp/1-67dd2ef3-1561c282-13f5e701c3c0.webp",
"filesize": 696640, # 导出图片大小, 单位字节
"ori_filesize": 804258, # 原始图片大小, 单位字节
"compressibility": 87 # 压缩率, 导出图片大小/原始图片大小*100
}
}
图像格式转换
POST: /v1/convert
Content-Type: application/json
Request
注意: 公共请求参数请查看调用签名
| 字段 | 位置 | 字段类型 | 必传 | 示例 | 说明 |
|---|---|---|---|---|---|
| image | Json Body | string | 是 | poster/310/tmp/test.png | 目标图片 |
| format | Json Body | string | 是 | PNG | 输出图像格式, 支持PNG, JPG, WEBP, AVIF, HEIC, PSD, PDF, JXL, BMP |
| alpha | Json Body | string | 否 | on | 是否保留图像透明度 |
输出格式列表
| 格式 |
|---|
| PNG |
| JPG |
| WEBP |
| AVIF |
| HEIC |
| PSD |
| JXL |
| BMP |
Response
{
"code": 0,
"success": true,
"data": {
"image": "https://oss.hlsgl.top/poster/310/tmp/1-67dd2ef3-1561c282-13f5e701c3c0.webp",
"format": "avif",
"filesize": 696640 # 导出图片大小, 单位字节
}
}