@@ -788,10 +788,71 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
788
788
)
789
789
790
790
assert response .retries_taken == failures_before_success
791
- if failures_before_success == 0 :
792
- assert "x-stainless-retry-count" not in response .http_request .headers
793
- else :
794
- assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
791
+ assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
792
+
793
+ @pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
794
+ @mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
795
+ @pytest .mark .respx (base_url = base_url )
796
+ def test_omit_retry_count_header (
797
+ self , client : OpenAI , failures_before_success : int , respx_mock : MockRouter
798
+ ) -> None :
799
+ client = client .with_options (max_retries = 4 )
800
+
801
+ nb_retries = 0
802
+
803
+ def retry_handler (_request : httpx .Request ) -> httpx .Response :
804
+ nonlocal nb_retries
805
+ if nb_retries < failures_before_success :
806
+ nb_retries += 1
807
+ return httpx .Response (500 )
808
+ return httpx .Response (200 )
809
+
810
+ respx_mock .post ("/chat/completions" ).mock (side_effect = retry_handler )
811
+
812
+ response = client .chat .completions .with_raw_response .create (
813
+ messages = [
814
+ {
815
+ "content" : "string" ,
816
+ "role" : "system" ,
817
+ }
818
+ ],
819
+ model = "gpt-4o" ,
820
+ extra_headers = {"x-stainless-retry-count" : Omit ()},
821
+ )
822
+
823
+ assert len (response .http_request .headers .get_list ("x-stainless-retry-count" )) == 0
824
+
825
+ @pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
826
+ @mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
827
+ @pytest .mark .respx (base_url = base_url )
828
+ def test_overwrite_retry_count_header (
829
+ self , client : OpenAI , failures_before_success : int , respx_mock : MockRouter
830
+ ) -> None :
831
+ client = client .with_options (max_retries = 4 )
832
+
833
+ nb_retries = 0
834
+
835
+ def retry_handler (_request : httpx .Request ) -> httpx .Response :
836
+ nonlocal nb_retries
837
+ if nb_retries < failures_before_success :
838
+ nb_retries += 1
839
+ return httpx .Response (500 )
840
+ return httpx .Response (200 )
841
+
842
+ respx_mock .post ("/chat/completions" ).mock (side_effect = retry_handler )
843
+
844
+ response = client .chat .completions .with_raw_response .create (
845
+ messages = [
846
+ {
847
+ "content" : "string" ,
848
+ "role" : "system" ,
849
+ }
850
+ ],
851
+ model = "gpt-4o" ,
852
+ extra_headers = {"x-stainless-retry-count" : "42" },
853
+ )
854
+
855
+ assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
795
856
796
857
@pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
797
858
@mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
@@ -822,10 +883,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
822
883
model = "gpt-4o" ,
823
884
) as response :
824
885
assert response .retries_taken == failures_before_success
825
- if failures_before_success == 0 :
826
- assert "x-stainless-retry-count" not in response .http_request .headers
827
- else :
828
- assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
886
+ assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
829
887
830
888
831
889
class TestAsyncOpenAI :
@@ -1590,10 +1648,73 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
1590
1648
)
1591
1649
1592
1650
assert response .retries_taken == failures_before_success
1593
- if failures_before_success == 0 :
1594
- assert "x-stainless-retry-count" not in response .http_request .headers
1595
- else :
1596
- assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
1651
+ assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
1652
+
1653
+ @pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
1654
+ @mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
1655
+ @pytest .mark .respx (base_url = base_url )
1656
+ @pytest .mark .asyncio
1657
+ async def test_omit_retry_count_header (
1658
+ self , async_client : AsyncOpenAI , failures_before_success : int , respx_mock : MockRouter
1659
+ ) -> None :
1660
+ client = async_client .with_options (max_retries = 4 )
1661
+
1662
+ nb_retries = 0
1663
+
1664
+ def retry_handler (_request : httpx .Request ) -> httpx .Response :
1665
+ nonlocal nb_retries
1666
+ if nb_retries < failures_before_success :
1667
+ nb_retries += 1
1668
+ return httpx .Response (500 )
1669
+ return httpx .Response (200 )
1670
+
1671
+ respx_mock .post ("/chat/completions" ).mock (side_effect = retry_handler )
1672
+
1673
+ response = await client .chat .completions .with_raw_response .create (
1674
+ messages = [
1675
+ {
1676
+ "content" : "string" ,
1677
+ "role" : "system" ,
1678
+ }
1679
+ ],
1680
+ model = "gpt-4o" ,
1681
+ extra_headers = {"x-stainless-retry-count" : Omit ()},
1682
+ )
1683
+
1684
+ assert len (response .http_request .headers .get_list ("x-stainless-retry-count" )) == 0
1685
+
1686
+ @pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
1687
+ @mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
1688
+ @pytest .mark .respx (base_url = base_url )
1689
+ @pytest .mark .asyncio
1690
+ async def test_overwrite_retry_count_header (
1691
+ self , async_client : AsyncOpenAI , failures_before_success : int , respx_mock : MockRouter
1692
+ ) -> None :
1693
+ client = async_client .with_options (max_retries = 4 )
1694
+
1695
+ nb_retries = 0
1696
+
1697
+ def retry_handler (_request : httpx .Request ) -> httpx .Response :
1698
+ nonlocal nb_retries
1699
+ if nb_retries < failures_before_success :
1700
+ nb_retries += 1
1701
+ return httpx .Response (500 )
1702
+ return httpx .Response (200 )
1703
+
1704
+ respx_mock .post ("/chat/completions" ).mock (side_effect = retry_handler )
1705
+
1706
+ response = await client .chat .completions .with_raw_response .create (
1707
+ messages = [
1708
+ {
1709
+ "content" : "string" ,
1710
+ "role" : "system" ,
1711
+ }
1712
+ ],
1713
+ model = "gpt-4o" ,
1714
+ extra_headers = {"x-stainless-retry-count" : "42" },
1715
+ )
1716
+
1717
+ assert response .http_request .headers .get ("x-stainless-retry-count" ) == "42"
1597
1718
1598
1719
@pytest .mark .parametrize ("failures_before_success" , [0 , 2 , 4 ])
1599
1720
@mock .patch ("openai._base_client.BaseClient._calculate_retry_timeout" , _low_retry_timeout )
@@ -1625,7 +1746,4 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
1625
1746
model = "gpt-4o" ,
1626
1747
) as response :
1627
1748
assert response .retries_taken == failures_before_success
1628
- if failures_before_success == 0 :
1629
- assert "x-stainless-retry-count" not in response .http_request .headers
1630
- else :
1631
- assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
1749
+ assert int (response .http_request .headers .get ("x-stainless-retry-count" )) == failures_before_success
0 commit comments