@@ -1482,26 +1482,69 @@ def test_structured_output_response_format_kwarg():
14821482
14831483def test_structured_output_beta_completions_parse ():
14841484 from typing import List
1485+ from packaging .version import Version
14851486
14861487 class CalendarEvent (BaseModel ):
14871488 name : str
14881489 date : str
14891490 participants : List [str ]
14901491
1491- openai .beta .chat .completions .parse (
1492- model = "gpt-4o-2024-08-06" ,
1493- messages = [
1492+ generation_name = create_uuid ()
1493+ api = get_api ()
1494+
1495+ params = {
1496+ "model" : "gpt-4o-2024-08-06" ,
1497+ "messages" : [
14941498 {"role" : "system" , "content" : "Extract the event information." },
14951499 {
14961500 "role" : "user" ,
14971501 "content" : "Alice and Bob are going to a science fair on Friday." ,
14981502 },
14991503 ],
1500- response_format = CalendarEvent ,
1501- )
1504+ "response_format" : CalendarEvent ,
1505+ "name" : generation_name ,
1506+ }
1507+
1508+ # The beta API is only wrapped for this version range. prior to that, implicitly another wrapped method was called
1509+ if Version (openai .__version__ ) < Version ("1.50.0" ):
1510+ params .pop ("name" )
1511+
1512+ openai .beta .chat .completions .parse (** params )
15021513
15031514 openai .flush_langfuse ()
15041515
1516+ if Version (openai .__version__ ) >= Version ("1.50.0" ):
1517+ # Check the trace and observation properties
1518+ generation = api .observations .get_many (name = generation_name , type = "GENERATION" )
1519+
1520+ assert len (generation .data ) == 1
1521+ assert generation .data [0 ].name == generation_name
1522+ assert generation .data [0 ].type == "GENERATION"
1523+ assert generation .data [0 ].model == "gpt-4o-2024-08-06"
1524+ assert generation .data [0 ].start_time is not None
1525+ assert generation .data [0 ].end_time is not None
1526+ assert generation .data [0 ].start_time < generation .data [0 ].end_time
1527+
1528+ # Check input and output
1529+ assert len (generation .data [0 ].input ) == 2
1530+ assert generation .data [0 ].input [0 ]["role" ] == "system"
1531+ assert generation .data [0 ].input [1 ]["role" ] == "user"
1532+ assert isinstance (generation .data [0 ].output , dict )
1533+ assert "name" in generation .data [0 ].output ["content" ]
1534+ assert "date" in generation .data [0 ].output ["content" ]
1535+ assert "participants" in generation .data [0 ].output ["content" ]
1536+
1537+ # Check usage
1538+ assert generation .data [0 ].usage .input is not None
1539+ assert generation .data [0 ].usage .output is not None
1540+ assert generation .data [0 ].usage .total is not None
1541+
1542+ # Check trace
1543+ trace = api .trace .get (generation .data [0 ].trace_id )
1544+
1545+ assert trace .input is not None
1546+ assert trace .output is not None
1547+
15051548
15061549@pytest .mark .asyncio
15071550async def test_close_async_stream ():
0 commit comments