22
33from __future__ import annotations
44
5+ from typing import Any
6+
7+ from gradient ._compat import parse_obj
58from gradient .types .responses import (
69 ResponseOutputMessage ,
710 ResponseCreateResponse ,
811 ResponseOutputFunctionCall ,
912)
1013
1114# Minimal valid response payload (static, no network).
12- MINIMAL_RESPONSE = {
15+ MINIMAL_RESPONSE : dict [ str , Any ] = {
1316 "id" : "resp_123" ,
1417 "output" : [],
1518 "status" : "completed" ,
@@ -21,23 +24,23 @@ class TestResponseCreateResponseParse:
2124 """Test that ResponseCreateResponse parses minimal and extended JSON."""
2225
2326 def test_parse_minimal_response (self ) -> None :
24- parsed = ResponseCreateResponse . model_validate ( MINIMAL_RESPONSE )
27+ parsed = parse_obj ( ResponseCreateResponse , MINIMAL_RESPONSE )
2528 assert parsed .id == "resp_123"
2629 assert parsed .output == []
2730 assert parsed .status == "completed"
2831 assert parsed .model == "openai-gpt-5.2-pro"
2932 assert parsed .output_text == ""
3033
3134 def test_parse_response_with_usage (self ) -> None :
32- payload = {
35+ payload : dict [ str , Any ] = {
3336 ** MINIMAL_RESPONSE ,
3437 "usage" : {
3538 "prompt_tokens" : 10 ,
3639 "completion_tokens" : 5 ,
3740 "total_tokens" : 15 ,
3841 },
3942 }
40- parsed = ResponseCreateResponse . model_validate ( payload )
43+ parsed = parse_obj ( ResponseCreateResponse , payload )
4144 assert parsed .usage is not None
4245 assert parsed .usage .prompt_tokens == 10
4346 assert parsed .usage .completion_tokens == 5
@@ -48,18 +51,18 @@ class TestResponseCreateResponseOutputText:
4851 """Test that output_text aggregates text from message items in output."""
4952
5053 def test_output_text_aggregates_content (self ) -> None :
51- payload = {
54+ payload : dict [ str , Any ] = {
5255 ** MINIMAL_RESPONSE ,
5356 "output" : [
5457 {"type" : "message" , "role" : "assistant" , "content" : "Hello " },
5558 {"type" : "message" , "role" : "assistant" , "content" : "world." },
5659 ],
5760 }
58- parsed = ResponseCreateResponse . model_validate ( payload )
61+ parsed = parse_obj ( ResponseCreateResponse , payload )
5962 assert parsed .output_text == "Hello world."
6063
6164 def test_output_text_prefers_output_text_field (self ) -> None :
62- payload = {
65+ payload : dict [ str , Any ] = {
6366 ** MINIMAL_RESPONSE ,
6467 "output" : [
6568 {
@@ -70,11 +73,11 @@ def test_output_text_prefers_output_text_field(self) -> None:
7073 },
7174 ],
7275 }
73- parsed = ResponseCreateResponse . model_validate ( payload )
76+ parsed = parse_obj ( ResponseCreateResponse , payload )
7477 assert parsed .output_text == "aggregated"
7578
7679 def test_output_text_skips_function_call_items (self ) -> None :
77- payload = {
80+ payload : dict [ str , Any ] = {
7881 ** MINIMAL_RESPONSE ,
7982 "output" : [
8083 {"type" : "message" , "role" : "assistant" , "content" : "Here is " },
@@ -87,38 +90,39 @@ def test_output_text_skips_function_call_items(self) -> None:
8790 {"type" : "message" , "role" : "assistant" , "content" : "the result." },
8891 ],
8992 }
90- parsed = ResponseCreateResponse . model_validate ( payload )
93+ parsed = parse_obj ( ResponseCreateResponse , payload )
9194 assert parsed .output_text == "Here is the result."
9295
9396 def test_output_text_empty_message_content_treated_as_empty (self ) -> None :
94- payload = {
97+ payload : dict [ str , Any ] = {
9598 ** MINIMAL_RESPONSE ,
9699 "output" : [
97100 {"type" : "message" , "role" : "assistant" , "content" : None },
98101 {"type" : "message" , "role" : "assistant" , "output_text" : "only this" },
99102 ],
100103 }
101- parsed = ResponseCreateResponse . model_validate ( payload )
104+ parsed = parse_obj ( ResponseCreateResponse , payload )
102105 assert parsed .output_text == "only this"
103106
104107
105108class TestResponseOutputItemTypes :
106109 """Test that output item types parse correctly."""
107110
108111 def test_message_item_parses (self ) -> None :
109- msg = ResponseOutputMessage . model_validate ( {"type" : "message" , "role" : "assistant" , "content" : "Hi" })
112+ msg = parse_obj ( ResponseOutputMessage , {"type" : "message" , "role" : "assistant" , "content" : "Hi" })
110113 assert msg .type == "message"
111114 assert msg .role == "assistant"
112115 assert msg .content == "Hi"
113116
114117 def test_function_call_item_parses (self ) -> None :
115- fc = ResponseOutputFunctionCall .model_validate (
118+ fc = parse_obj (
119+ ResponseOutputFunctionCall ,
116120 {
117121 "type" : "function_call" ,
118122 "id" : "call_1" ,
119123 "name" : "foo" ,
120124 "arguments" : '{"x": 1}' ,
121- }
125+ },
122126 )
123127 assert fc .type == "function_call"
124128 assert fc .id == "call_1"
0 commit comments