-
Notifications
You must be signed in to change notification settings - Fork 16
Add new BID_VALUATION intent and additional payload for intermediate transformation #16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,6 +1,6 @@ | ||
| edition = "2023"; | ||
|
|
||
| package com.iabtechlab.bidstream.mutation.v1; | ||
| package com.iabtechlab.bidstream.mutation.v2; | ||
|
|
||
| // Import OpenRTB definitions for BidRequest and BidResponse | ||
| import "com/iabtechlab/openrtb/v2.6/openrtb.proto"; | ||
|
|
@@ -31,6 +31,12 @@ message RTBRequest { | |
| // List of intents the server is eligibible to send back | ||
| repeated Intent applicable_intents = 7; | ||
|
|
||
| // Object IDs for intent BID_VALUATION | ||
| oneof value { | ||
| // List of object Identifiers | ||
| IDsPayload object_ids = 100; | ||
| } | ||
|
|
||
| // Extension fields | ||
| Ext ext = 99; | ||
|
|
||
|
|
@@ -101,6 +107,9 @@ message Mutation { | |
|
|
||
| // Content data | ||
| DataPayload content_data = 104; | ||
|
|
||
| // Payload for bid valuation intent | ||
| AdjustBidValuationPayload adjust_bid_valuation = 105; | ||
| } | ||
|
|
||
| // Reserved for experimental/test payloads | ||
|
|
@@ -143,6 +152,9 @@ enum Intent { | |
| // Add extended content IDs | ||
| ADD_CIDS = 8; | ||
|
|
||
| // Adjust bid valuation with factors | ||
| ADJUST_BID_VALUATION = 9; | ||
|
|
||
| // More intents can be added in the future | ||
|
|
||
| // Reserved for experimental/test intents | ||
|
|
@@ -202,3 +214,10 @@ message DataPayload { | |
| // List of data to add | ||
| repeated com.iabtechlab.openrtb.v2.BidRequest.Data data = 1; | ||
| } | ||
|
|
||
| message AdjustBidValuationPayload { | ||
| // full set or subset of IDs from the RTBRequest payload that the specified bid adjustment value factors apply to | ||
| repeated string id = 1; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. To prevent mismatches at population time (because serialization will work regardless), I am thinking this should be a repeated object instead, that additionally has an id_type e.g. {deal, segment, ...} and value_type {multiplier, score} so that the machine gets to know about the semantic, rather than being implicit.
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Indeed it would be more elegant and I'm not against a new repeated object that ensures alignment, which was my original idea as well. My angle has been that ARTF is already slow to work with (our infra at TTD currently handles 20M+ qps) vs an optimized custom interface, and parallel running arrays are less error prone when encapsulated in a payload object, so this may be acceptable from a clarity point of view. If you feel strongly about it, I'm happy to add a new object. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That makes sense. Just curious, what would you do if ever there is a mismatch in elements? Ignore that part of the response completely? Also, what about the point of qualifying the type for the id at score at response time?
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Element mismatch indicates message corruption in this setup, so we should drop the requested mutation altogether and update logs/metrics. The ID type in the mutation response must correspond to that of the IDs in the request, so I wouldn't repeat this information in the mutation. |
||
| // Adjusted bid valuation factors, running in parallel with the contents of the id field | ||
| repeated float value_factor = 2; | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With this we can one can take the deals or segments from the RTB section and interpret the host wants those scored.
For discussion:
What should the semantic be if the caller/host passes imp[].pmp.deals[] or user.data[].segment[] as empty lists? Invalid request, or would the expectation be for it to still return something? Because for example, if the container receives an embedding it could issue ACTIVATE_DEAL and ACTIVATE_SEGMENT and at the same time a ADJUST_BID_VALUATION for those. While applicable_intents could be a signal of the type of types of IDs expected back in this scenario, I wonder if intents should support inputs other than what one may shoehorn as an extension, for example, in this empty list scenario where the container is supposed to give it its best shot, a topK input could be useful. And yes, this could also just be default configuration of the container or come through an extension.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These IDs are representations of an advertiser's entities on the buyer side, and the purpose of this
BID_VALUATIONaddition is to allow third parties to contribute to the advertiser asset (say, campaign or ad group) valuation decision made by the DSP against the incoming bid request. As such, these do not correlate to individual deals or contextual segments or any other field in the bid request.IMO if we want to add functionality to attribute relative value/worth to deals or segments, that should be covered by another intent separate from this PR, and the discussion point you raised would be germane to that.
On a closely related note, I think the standard could be improved in terms of either explicitly associating intents and payloads more unequivocally, or at least clarifying expectations. For example, a container responding with mutations using the
ACTIVATE_SEGMENTSintent could well supplyIDsPayloadas sets of flat segment IDs, orDataPayloadinstances that have segments plus and additional name and ID or even content IDs, and I'm not sure what the expectation from an orchestrator is in this case.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I got ahead of myself by thinking of these object IDs as references to objects in a partial OpenRTB payload. From there, I moved toward semantics that could be implemented today using deal IDs and segment IDs as examples. More generally, though, I was exploring whether this could be generalized regardless of ID type—particularly the semantics of an empty list, where the orchestrator could treat the container as a recommender. But you may be right that recommendation or candidate discovery belongs in a separate intent specification altogether.
Setting that discussion aside, do you envision distinct ID-type-specific valuation containers, where each container can score only one type of ID? If so, would there be an implicit, out-of-band agreement about what the opaque IDs represent for that intent?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The current 1.0 version of this standard doesn't specify such ID types even though
IDsPayloadis already used in different contexts, that's why I didn't add ID types here. When someone works with us to implement a container that supportsADJUST_BID_VALUATION, they will know what to expect based on out-of-band conventions (not part of this spec).Indeed we probably should add an ID type field, or create different variants of the
IDsPayloadmessage to ensure these payload IDs align with the expected type and that the container can actually work with them. Unfortunately, both would be a breaking change.