下发回传接口用于记录已推荐结果,在以后的推荐返回中对已推荐结果去重。
以电商行业举例,推荐接口返回推荐商品id列表[1,2,3,4,5],客户服务端判断商品3刚刚售罄,根据运营规则需要在第二位强制插入商品10,最终将商品id列表[1,10,2,4,5]下发给客户端,那么客户侧需要同时将商品id列表[1,10,2,4,5,3] 通过本接口上报。注意:这里需要将被过滤的商品3以及强插商品10都返回,同时给不同的item附带相应的extra字段。 同一次下发的推荐结果必须一次性上报。
callback(self, request: CallbackRequest, *opts: CoreOption) -> CallbackResponse
参数 | 类型 | 说明 |
---|---|---|
request | CallbackRequest | 请求体,包含参数见下表,具体使用方式见用例示范 |
opts | list[Option] | 请求中可选参数,具体使用方式见用例示范 |
request请求体参数:
参数 | 类型 | 是否必传 | 描述 |
---|---|---|---|
uid | string | 是 | 用户id。 |
scene | string | 是 | callback对应的推荐场景,非特殊情况下均为default。 |
items | object list | 是 | 需要回调的物品列表。 |
predictRequestId | string | 否 | 强烈建议传输。当前callback请求对应的predict请求的Request-Id。例如:调用推荐接口时候的Request-Id为hr3sd12ui23478sd,那么对应的下发回传请求的此参数需填写为hr3sd12ui23478sd。如果此参数未填写,字节侧会尝试使用header里的Request-Id来匹配寻找对应的predict请求。 |
context | string | 是 | 上下文信息 |
使用自定义的CallbackResponse类作为响应类型,具体参数如下表所示。在获取到CommonRsp类型的返回值后可调用is_success_code(rsp.code)方法判断此次数据上传是否成功。
参数 | 类型 | 描述 |
---|---|---|
code | int32 | 0或200代表正常,不等同于http status,用于排查业务错误 |
message | string | 状态信息,默认"OK",遇到错误会返回错误信息 |
注意
一个推荐请求应该仅对应一个callback请求。如果同一个predictRequestId出现两次callback请求,容易引起预期外的结果。
import uuid from datetime import datetime from byteair import ClientBuilder, Client from byteair.protocol.volcengine_byteair_pb2 import * from core import Region, Option, NetException, BizException, metrics # 示例省略client初始化过程 def callback(): # 构造callback请求体 callback_request = CallbackRequest() # 对应的predict请求的request id callback_request.predict_request_id = "xxx" # 对应的predict请求的uid callback_request.uid = "uid1" # 对应的predict请求的scene callback_request.scene = "default" # 对应的predict请求的items列表 callback_item1 = callback_request.items.add() callback_item1.id = "item_id1" callback_item1.pos = "position1" callback_item1.extra = "{\"reason\":\"exposure\"}" callback_item2 = callback_request.items.add() callback_item2.id = "item_id2" callback_item2.pos = "position2" callback_item2.extra = "{\"reason\":\"filter\"}" # callback请求上下文 context = callback_request.context context.spm = "A$##$B$##$C" opts = ( Option.with_request_id(str(uuid.uuid1())), Option.with_timeout(timedelta(milliseconds=1000)), # 是否开启SPM路由.开启的话需要保证请求体里的SPM存在且绑定了栏位. # server会根据body里的SPM路由到选择的栏位. Option.with_headers({"Enable-Spm-Route": "true"}), ) try: rsp = client.callback(callback_request, *opts) except (NetException, BizException) as e: print("[callback] occur error, msg: %s" % e) return if not rsp.success: print("[callback] failure") return print("[callback] success")