Productai

批量图像数据处理

当用户有大量图片需要进行非实时处理时,可以采用ProductAI提供的批量任务功能。使用该服务的优点是:

  • 无需客户端持续调用API,只需一次性通过Console/SDK/API上传所有数据。操作更便捷。
  • 后台使用批量优化技术,大大缩短处理时间。
  • 按需分配计算资源,环境保护人人有责。

注:同一服务ID、同一时刻仅支持一个任务,前一任务完成之后,才能提交新的任务。

获取支持服务列表

目前不是每一个ProductAI服务都能通过批量任务来计算。目前支持的服务:

用户可以通过使用SDK/API获取到支持服务列表

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_batch_api()
resp = api.get_services()
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');
$task = $product_ai->listBatchServices();
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 获取支持批处理的服务列表:
GetSupportServicesRequest request = new GetSupportServicesRequest();
GetSupportServicesResponse response = client.getResponse(request);
String[] serviceIds = response.getSupportServiceIds();
// String json=response.getResponseJsonString();
using MalongTech.ProductAI.Core;
using MalongTech.ProductAI.API.Entity;
using MalongTech.ProductAI.API.Entity.Batch;

IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new GetSupportServicesRequest();
var response = client.GetResponse(request);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/batch/_1000001/services

输入参数说明

N/a

返回结果说明

调用成功,返回200 HTTP状态码

{
"data": [
"_0000159",
...
],
"is_error": 0,
"request_id": "3c0a99a8-e634-11e7-9fe1-ee0ab1643ad8"
}
结果字段类型说明
data数组包含所有支持的服务ID
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

错误信息说明

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功

创建批量任务

通过上传csv文件,创建一个批量任务。

注:csv文件至少要包含两条不一样的图片url。

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)

# 创建批量任务API上下文
api = cli.get_batch_api()

# 提交一组数据创建新任务
urls = [
['https://xxx.jpg'],
['https://yyy.jpg']
]
resp = api.prepare(SERVICE_ID, urls)

# 或者提交一个csv文件,格式为每行一个url
with open('batch.csv') as f:
resp = api.prepare_by_file(SERVICE_ID, f)
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');

// 提交一组数据创建新任务
$task = $product_ai->prepareBatchTask(SERVICE_ID, [
'https://xxx.jpg',
'https://yyy.jpg',
]);

// 或者提交一个csv文件,格式为每行一个url
$task = $product_ai->prepareBatchTask(SERVICE_ID, $image_urls='batch.csv')
import java.io.File;
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 创建批处理任务:
CreateTaskByFileRequest request = new CreateTaskByFileRequest(SERVICE_ID, new File("batch.csv"));
CreateTaskByFileResponse response = client.getResponse(request);

// 获取任务id:
String taskId=response.getTaskInfo().getTaskId();
IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new CreateTaskByFileRequest
{
ServiceId=SERVICE_ID,
CsvFile=new System.IO.FileInfo(@".\batch.csv")
};

var response = client.GetResponse(request);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "service_id=SERVICE_ID" \
-F "urls=@batch.csv" \
https://api.productai.cn/batch/_1000001/task/prepare

输入参数说明

参数名称类型说明必选限制
service_id字符串批量任务所执行的服务IDN/a
urls数组批量数据要处理的数据url列表至少有两条不一样的urls

返回结果说明

执行成功,返回200 HTTP状态码

{
"data": {
"estimated_processing_time": 1,
"estimated_waiting_time": 0,
"state": "RECEIVED",
"task_id": "6b166b74-fd00-4079-b4ee-9fd54261713b",
"total": 2
},
"is_error": 0,
"request_id": "56320a68-e6f3-11e7-9fe1-ee0ab1643ad8"
}
结果字段类型说明
data字典包含详细错误信息,具体参见data字段详情
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

data字段详情

结果字段类型说明
estimated_processing_time整数预计处理时间
estimated_waiting_time整数预计等待时间
state字符串当前任务状态
task_id字符串任务唯一ID,后续所有操作都使用该ID完成
total整数任务中包含的待处理图片数量

任务状态

状态说明
RECEIVED任务被接受
PENDING任务等待中
STARTED任务启动
SUCCESS任务执行成功
REVOKED任务被取消
FAILURE任务执行失败

执行失败,返回非200 HTTP状态码

{
"data": {
"error_code": 400005,
"message": "1 URLs are duplicated or verification failed.",
"urls_duplicated": {},
"urls_verify_failed": {
"0": "h"
}
},
"is_error": 1,
"request_id": "d60031a6-e6ef-11e7-8326-9e19da6007e9"
}
结果字段类型说明
data字典包含详细信息,具体参见data字段详情
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

data字段详情

结果字段类型说明
error_code整数详细错误代码
message字符串错误信息
urls_duplicated数组返回所有重复的数据
urls_verify_failed数组不合法的url列表

错误信息说明

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功
400400001没有提供service_id参数
400400002没有提供urls参数
400400003urls参数不是utf-8编码
400400004urls数组为空
400400005urls数组中有不合法或者重复的url
400400007service_id对应的服务不存在
400400008service_id对应的服务,暂时不被批量任务支持
400400009每个帐号每日可运行的批量任务总数是有限制的,如果超过限制则返回该错误
400400010已经存在一个正在运行的,使用service_id对应服务的批量任务

启动批量任务

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)

# 创建批量任务API上下文
api = cli.get_batch_api()

# 使用prepare方法返回的任务ID启动任务
api.apply(task_id)
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');
$task = $product_ai->applyBatchTask(task_id);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 启动批处理任务:
StartTaskRequest request = new StartTaskRequest(task_id);
StartTaskResponse response = client.getResponse(request);
// String json=response.getResponseJsonString();
TaskDetailInfo taskInfo = response.getTaskInfo();
IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new StartTaskRequest
{
TaskId=task_id
};

var response = client.GetResponse(request);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "task_id=TASK_ID" \
https://api.productai.cn/batch/_1000001/task/apply

输入参数说明

参数名称类型说明必选限制
task_id字符串批量任务的IDN/a

返回结果说明

创建批量任务

错误信息说明

API和SDK使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功
400400009每个帐号每日可运行的批量任务总数是有限制的,如果超过限制则返回该错误
400400010已经存在一个正在运行的,使用service_id对应服务的批量任务
400400011task_id对应的任务不存在

查询批量任务进度

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)

# 创建批量任务API上下文
api = cli.get_batch_api()

# 使用prepare方法返回的任务ID启动任务
api.get_task_info(task_id)
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');
$task = $product_ai->getBatchTaskInfo(task_id);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 查询批处理任务状态:
PollTaskStatusRequest request = new PollTaskStatusRequest(task_id);
PollTaskStatusResponse response = client.getResponse(request);
//String json=response.getResponseJsonString();
TaskDetailInfo taskInfo = response.getTaskInfo();
IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new PollTaskStatusRequest
{
TaskId=task_id
};

var response = client.GetResponse(request);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/batch/_1000001/task/info/TASK_ID

输入参数说明

参数名称类型说明必选限制
task_id字符串批量任务的IDN/a

返回结果说明

{
"data": {
"csv": 'http://xxx.csv',
"download_urls": [
"http://kkk.zip"
],
"received_time": "2017-12-22T08:37:26Z",
"service_id": "_0000159",
"state": "SUCCESS",
"success": 2,
"task_id": "6b166b74-fd00-4079-b4ee-9fd54261713b",
"total": 2
},
"is_error": 0,
"request_id": "772c5f32-e88a-11e7-8326-9e19da6007e9"
}
结果字段类型说明
data字典具体参见data字段详情
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

data字段详情

  • 无论状态字段state为何值,总是返回的字段有
结果字段类型说明
csv字符串批量任务输入数据文件链接
received_time字符串任务接受时间
service_id字符串批量任务调用的服务ID
state字符串批量任务状态,参见任务状态
task_id字符串任务ID
total整数批量任务的数据量
  • 当状态字段state为SUCCESS时,会返回的字段有
结果字段类型说明
download_urls数组批量任务完成的结果文件列表
success整数批量任务成功处理完毕的数据量
  • 当状态字段state为PENDING时(任务还在排队中),会返回的字段有
结果字段类型说明
estimated_processing_time整数预计处理时间
estimated_waiting_time整数预计等待时间
  • 当状态字段state为STARTED时(任务开始运行中),会返回的字段有
结果字段类型说明
estimated_processing_time整数预计处理时间

错误信息说明

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功
400400011task_id对应的任务不存在

取消批量任务

只有任务在队列中(状态字段state为PENDING)时,任务可以被取消。一旦任务开始运行,则不可被取消。

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)

# 创建批量任务API上下文
api = cli.get_batch_api()

# 使用prepare方法返回的任务ID启动任务
api.revoke(task_id)
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');
$task = $product_ai->revokeBatchTask($task_id=task_id);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 取消批处理任务:
CancelTaskRequest request = new CancelTaskRequest(task_id);
CancelTaskResponse response = client.getResponse(request);
TaskDetailInfo taskInfo = response.getTaskInfo();
IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new CancelTaskRequest
{
TaskId=task_id
};

var response = client.GetResponse(request);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/batch/_1000001/task/revoke/TASK_ID

输入参数说明

参数名称类型说明必选限制
task_id字符串批量任务的IDN/a

返回结果说明

{
"data": {
"code": 200001,
"args": ['6b166b74-fd00-4079-b4ee-9fd54261713b', ]
},
"is_error": 0,
"request_id": "772c5f32-e88a-11e7-8326-9e19da6007e9"
}
结果字段类型说明
data字典具体参见data字段详情
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

data字段详情

结果字段类型说明
code整数取消成功后,总是返回200001
args数组目前总是返回任务ID

错误信息说明

API和SDK使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功
400400011task_id对应的任务不存在
400400012task_id对应的任务状态不为PENDING

获取批量任务列表

Python

PHP

Java

C#

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)

# 创建批量任务API上下文
api = cli.get_batch_api()

# 返回[start, end)之间启动的任务
from datetime import datetime, timedelta
api.get_tasks(start=datetime.utcnow() - timedelta(days=7), end=datetime.utcnow())
use ProductAI;

$product_ai = new ProductAI\API(ACCESS_KEY_ID, SECRET_KEY, 'zh-Hans');
$task = $product_ai->listBatchTasks($start=START, $end=END);
import java.util.HashMap;
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.api.pai.entity.batch.*;

// 设置API调用初始化参数
IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setSecretKey(SECRET_KEY);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);
IWebClient client = new DefaultProductAIClient(profile);

// 查询批处理任务:
SearchTaskRequest request = new SearchTaskRequest("2018-01-01", "2018-01-10");
SearchTaskResponse response = client.getResponse(request);
HashMap<String, TaskDetailInfo> taskList = response.getTasks()
IProfile profile = new DefaultProfile
{
Version="1",
AccessKeyId=ACCESS_KEY_ID,
SecretKey=SECRET_KEY
};
var client = new DefaultProductAIClient(profile);

var request = new SearchTaskRequest
{
StartDate=null,
EndDate=DateTime.Now.AddDays(1).Date
};

var response = client.GetResponse(request);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/batch/_1000001/tasks?start=2017-12-01&end=2017-12-31

输入参数说明

参数名称类型说明必选限制
start时间使用任务接受时间进行查询(即prepare方法发生的时间),查询起始时间。不填写该值,则默认从第一笔记录开始返回时间格式需要符合%Y-%m-%dT%H:%M:%SZ
end时间使用任务接受时间进行查询(即prepare方法发生的时间),查询结束时间。不填写该值,则默认返回到最后一笔记录时间格式需要符合%Y-%m-%dT%H:%M:%SZ

返回结果说明

{
"data": {
"5b6569dc-fe8c-40b3-b96b-7ae7e851fdca": {
...
},
"6b166b74-fd00-4079-b4ee-9fd54261713b": {
...
}
},
"is_error": 0,
"request_id": "693509c0-e88e-11e7-a6de-ee6487ba2bab"
}
结果字段类型说明
data字典包含所有查询出的任务列表。key为任务ID,value为任务详情,格式同查询批量任务进度data字段详情
is_error整数0为没有错误,1为出现错误
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

错误信息说明

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码error_code说明
200N/a获取信息成功