@@ -155,10 +155,10 @@ wire = payload.model_dump(serialize_as_any=True)
155155## Basic Pattern: Subclassing Response Types
156156
157157``` python
158- from adcp import CreateMediaBuySuccess
158+ from adcp import CreateMediaBuySuccessResponse
159159from pydantic import ConfigDict, Field
160160
161- class CreateMediaBuySuccessExtended (CreateMediaBuySuccess ):
161+ class CreateMediaBuySuccessExtended (CreateMediaBuySuccessResponse ):
162162 """ Extended with internal tracking fields."""
163163 workflow_step_id: str | None = Field(None , description = " Internal workflow step ID" )
164164 created_at: str | None = Field(None , description = " Internal timestamp" )
@@ -179,7 +179,7 @@ internal_response = CreateMediaBuySuccessExtended(
179179)
180180
181181# Serialize to ADCP spec before sending over wire
182- adcp_response = CreateMediaBuySuccess .model_validate(
182+ adcp_response = CreateMediaBuySuccessResponse .model_validate(
183183 internal_response.model_dump(exclude = {' workflow_step_id' , ' created_at' , ' internal_notes' })
184184)
185185```
@@ -205,10 +205,10 @@ class InternalResponseWrapper(BaseModel, Generic[T]):
205205 model_config = ConfigDict(extra = ' allow' )
206206
207207# Usage
208- from adcp import CreateMediaBuySuccess
208+ from adcp import CreateMediaBuySuccessResponse
209209
210- wrapper = InternalResponseWrapper[CreateMediaBuySuccess ](
211- response = CreateMediaBuySuccess (
210+ wrapper = InternalResponseWrapper[CreateMediaBuySuccessResponse ](
211+ response = CreateMediaBuySuccessResponse (
212212 media_buy_id = " mb_123" ,
213213 buyer_ref = " ref_456" ,
214214 packages = []
@@ -218,7 +218,7 @@ wrapper = InternalResponseWrapper[CreateMediaBuySuccess](
218218)
219219
220220# Access ADCP response
221- adcp_response = wrapper.response # Type: CreateMediaBuySuccess
221+ adcp_response = wrapper.response # Type: CreateMediaBuySuccessResponse
222222
223223# Access internal fields
224224workflow_id = wrapper.workflow_step_id
@@ -230,7 +230,7 @@ When storing responses in a database with internal metadata:
230230
231231``` python
232232from datetime import datetime
233- from adcp import CreateMediaBuySuccess
233+ from adcp import CreateMediaBuySuccessResponse
234234
235235class MediaBuyRecord (BaseModel ):
236236 """ Database record combining ADCP response with internal metadata."""
@@ -242,12 +242,12 @@ class MediaBuyRecord(BaseModel):
242242 workflow_step_id: str
243243
244244 # ADCP response (stored as JSON)
245- response_data: CreateMediaBuySuccess
245+ response_data: CreateMediaBuySuccessResponse
246246
247247 @ classmethod
248248 def from_response (
249249 cls ,
250- response : CreateMediaBuySuccess ,
250+ response : CreateMediaBuySuccessResponse ,
251251 user_id : str ,
252252 workflow_step_id : str
253253 ) -> " MediaBuyRecord" :
@@ -261,13 +261,13 @@ class MediaBuyRecord(BaseModel):
261261 response_data = response
262262 )
263263
264- def to_adcp_response (self ) -> CreateMediaBuySuccess :
264+ def to_adcp_response (self ) -> CreateMediaBuySuccessResponse :
265265 """ Extract ADCP response for wire protocol."""
266266 return self .response_data
267267
268268# Usage
269269response = await client.create_media_buy(request)
270- if isinstance (response, CreateMediaBuySuccess ):
270+ if isinstance (response, CreateMediaBuySuccessResponse ):
271271 record = MediaBuyRecord.from_response(
272272 response,
273273 user_id = " user_123" ,
@@ -284,10 +284,10 @@ adcp_response = record.to_adcp_response()
284284When processing webhook payloads with internal routing metadata:
285285
286286``` python
287- from adcp import WebhookPayload
287+ from adcp import McpMcpWebhookPayload
288288from pydantic import ConfigDict
289289
290- class InternalWebhookPayload (WebhookPayload ):
290+ class InternalWebhookPayload (McpWebhookPayload ):
291291 """ Extended webhook payload with internal routing."""
292292 internal_destination: str | None = None
293293 retry_count: int = 0
@@ -298,7 +298,7 @@ class InternalWebhookPayload(WebhookPayload):
298298async def process_webhook (payload : dict ) -> None :
299299 """ Process webhook with internal tracking."""
300300 # Parse with extensions
301- internal_payload = InternalWebhookPayload .model_validate(payload)
301+ internal_payload = InternalMcpWebhookPayload .model_validate(payload)
302302
303303 # Add internal routing
304304 internal_payload.internal_destination = determine_destination(internal_payload)
@@ -308,7 +308,7 @@ async def process_webhook(payload: dict) -> None:
308308 await route_to_handler(internal_payload)
309309
310310 # When forwarding to another service, use base type
311- external_payload = WebhookPayload .model_validate(
311+ external_payload = McpWebhookPayload .model_validate(
312312 internal_payload.model_dump(exclude = {' internal_destination' , ' retry_count' , ' routing_key' })
313313 )
314314```
@@ -389,8 +389,8 @@ adcp_response = extended.model_dump() # internal_id is absent — no extra plum
389389Make it clear which fields are internal:
390390
391391``` python
392- class Extended (CreateMediaBuySuccess ):
393- """ Extended CreateMediaBuySuccess with internal tracking.
392+ class Extended (CreateMediaBuySuccessResponse ):
393+ """ Extended CreateMediaBuySuccessResponse with internal tracking.
394394
395395 Internal fields (not part of ADCP spec):
396396 workflow_step_id: Internal workflow tracking
@@ -414,7 +414,7 @@ def test_internal_fields_excluded():
414414 )
415415
416416 # Convert to wire protocol
417- adcp_response = CreateMediaBuySuccess .model_validate(
417+ adcp_response = CreateMediaBuySuccessResponse .model_validate(
418418 extended.model_dump(exclude = {' workflow_step_id' })
419419 )
420420
@@ -430,7 +430,7 @@ def test_internal_fields_excluded():
430430from typing import TypeGuard
431431
432432def is_extended_response (
433- response : CreateMediaBuySuccess
433+ response : CreateMediaBuySuccessResponse
434434) -> TypeGuard[CreateMediaBuySuccessExtended]:
435435 """ Check if response has extended internal fields."""
436436 return isinstance (response, CreateMediaBuySuccessExtended)
@@ -448,16 +448,16 @@ Define reusable field sets for exclusion:
448448``` python
449449from typing import ClassVar
450450
451- class CreateMediaBuySuccessExtended (CreateMediaBuySuccess ):
451+ class CreateMediaBuySuccessExtended (CreateMediaBuySuccessResponse ):
452452 workflow_step_id: str | None = None
453453 created_at: str | None = None
454454
455455 # Define internal fields as class variable
456456 INTERNAL_FIELDS : ClassVar[set[str ]] = {' workflow_step_id' , ' created_at' }
457457
458- def to_adcp_response (self ) -> CreateMediaBuySuccess :
458+ def to_adcp_response (self ) -> CreateMediaBuySuccessResponse :
459459 """ Convert to wire protocol, excluding internal fields."""
460- return CreateMediaBuySuccess .model_validate(
460+ return CreateMediaBuySuccessResponse .model_validate(
461461 self .model_dump(exclude = self .INTERNAL_FIELDS )
462462 )
463463```
@@ -503,7 +503,7 @@ def test_roundtrip():
503503 )
504504
505505 # Convert to base type
506- base = CreateMediaBuySuccess .model_validate(
506+ base = CreateMediaBuySuccessResponse .model_validate(
507507 extended.model_dump(exclude = {' workflow_step_id' })
508508 )
509509
@@ -513,7 +513,7 @@ def test_roundtrip():
513513
514514 # Verify can parse from wire format
515515 wire_format = base.model_dump_json()
516- parsed = CreateMediaBuySuccess .model_validate_json(wire_format)
516+ parsed = CreateMediaBuySuccessResponse .model_validate_json(wire_format)
517517 assert parsed.media_buy_id == " mb_123"
518518```
519519
0 commit comments