@@ -704,3 +704,177 @@ def test_get_api_base(self, api_base, vertex_location, expected):
704
704
vertex_base .get_api_base (api_base = api_base , vertex_location = vertex_location )
705
705
== expected
706
706
), f"Expected { expected } with api_base { api_base } and vertex_location { vertex_location } "
707
+
708
+ @pytest .mark .parametrize (
709
+ "api_base, custom_llm_provider, gemini_api_key, endpoint, stream, auth_header, url, model, expected_auth_header, expected_url" ,
710
+ [
711
+ # Test case 1: Gemini with custom API base
712
+ (
713
+ "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
714
+ "gemini" ,
715
+ "test-api-key" ,
716
+ "generateContent" ,
717
+ False ,
718
+ None ,
719
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
720
+ "gemini-2.5-flash-lite" ,
721
+ "test-api-key" ,
722
+ "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent"
723
+ ),
724
+ # Test case 2: Gemini with custom API base and streaming
725
+ (
726
+ "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
727
+ "gemini" ,
728
+ "test-api-key" ,
729
+ "generateContent" ,
730
+ True ,
731
+ None ,
732
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
733
+ "gemini-2.5-flash-lite" ,
734
+ "test-api-key" ,
735
+ "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent?alt=sse"
736
+ ),
737
+ # Test case 3: Non-Gemini provider with custom API base
738
+ (
739
+ "https://custom-vertex-api.com" ,
740
+ "vertex_ai" ,
741
+ None ,
742
+ "generateContent" ,
743
+ False ,
744
+ "Bearer token123" ,
745
+ "https://aiplatform.googleapis.com/v1/projects/test-project/locations/us-central1/publishers/google/models/gemini-pro:generateContent" ,
746
+ "gemini-pro" ,
747
+ "Bearer token123" ,
748
+ "https://custom-vertex-api.com:generateContent"
749
+ ),
750
+ # Test case 4: No API base provided (should return original values)
751
+ (
752
+ None ,
753
+ "gemini" ,
754
+ "test-api-key" ,
755
+ "generateContent" ,
756
+ False ,
757
+ "Bearer token123" ,
758
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
759
+ "gemini-2.5-flash-lite" ,
760
+ "Bearer token123" ,
761
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent"
762
+ ),
763
+ # Test case 5: Gemini without API key (should raise ValueError)
764
+ (
765
+ "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
766
+ "gemini" ,
767
+ None ,
768
+ "generateContent" ,
769
+ False ,
770
+ None ,
771
+ "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
772
+ "gemini-2.5-flash-lite" ,
773
+ None , # This should raise an exception
774
+ None
775
+ ),
776
+ ],
777
+ )
778
+ def test_check_custom_proxy (
779
+ self ,
780
+ api_base ,
781
+ custom_llm_provider ,
782
+ gemini_api_key ,
783
+ endpoint ,
784
+ stream ,
785
+ auth_header ,
786
+ url ,
787
+ model ,
788
+ expected_auth_header ,
789
+ expected_url
790
+ ):
791
+ """Test the _check_custom_proxy method for handling custom API base URLs"""
792
+ vertex_base = VertexBase ()
793
+
794
+ if custom_llm_provider == "gemini" and api_base and gemini_api_key is None :
795
+ # Test case 5: Should raise ValueError for Gemini without API key
796
+ with pytest .raises (ValueError , match = "Missing gemini_api_key" ):
797
+ vertex_base ._check_custom_proxy (
798
+ api_base = api_base ,
799
+ custom_llm_provider = custom_llm_provider ,
800
+ gemini_api_key = gemini_api_key ,
801
+ endpoint = endpoint ,
802
+ stream = stream ,
803
+ auth_header = auth_header ,
804
+ url = url ,
805
+ model = model ,
806
+ )
807
+ else :
808
+ # Test cases 1-4: Should work correctly
809
+ result_auth_header , result_url = vertex_base ._check_custom_proxy (
810
+ api_base = api_base ,
811
+ custom_llm_provider = custom_llm_provider ,
812
+ gemini_api_key = gemini_api_key ,
813
+ endpoint = endpoint ,
814
+ stream = stream ,
815
+ auth_header = auth_header ,
816
+ url = url ,
817
+ model = model ,
818
+ )
819
+
820
+ assert result_auth_header == expected_auth_header , f"Expected auth_header { expected_auth_header } , got { result_auth_header } "
821
+ assert result_url == expected_url , f"Expected URL { expected_url } , got { result_url } "
822
+
823
+ def test_check_custom_proxy_gemini_url_construction (self ):
824
+ """Test that Gemini URLs are constructed correctly with custom API base"""
825
+ vertex_base = VertexBase ()
826
+
827
+ # Test various Gemini models with custom API base
828
+ test_cases = [
829
+ ("gemini-2.5-flash-lite" , "generateContent" , "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ),
830
+ ("gemini-2.5-pro" , "generateContent" , "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-pro:generateContent" ),
831
+ ("gemini-1.5-flash" , "streamGenerateContent" , "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:streamGenerateContent" ),
832
+ ]
833
+
834
+ for model , endpoint , expected_url in test_cases :
835
+ _ , result_url = vertex_base ._check_custom_proxy (
836
+ api_base = "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
837
+ custom_llm_provider = "gemini" ,
838
+ gemini_api_key = "test-api-key" ,
839
+ endpoint = endpoint ,
840
+ stream = False ,
841
+ auth_header = None ,
842
+ url = f"https://generativelanguage.googleapis.com/v1beta/models/{ model } :{ endpoint } " ,
843
+ model = model ,
844
+ )
845
+
846
+ assert result_url == expected_url , f"Expected { expected_url } , got { result_url } for model { model } "
847
+
848
+ def test_check_custom_proxy_streaming_parameter (self ):
849
+ """Test that streaming parameter correctly adds ?alt=sse to URLs"""
850
+ vertex_base = VertexBase ()
851
+
852
+ # Test with streaming enabled
853
+ _ , result_url_streaming = vertex_base ._check_custom_proxy (
854
+ api_base = "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
855
+ custom_llm_provider = "gemini" ,
856
+ gemini_api_key = "test-api-key" ,
857
+ endpoint = "generateContent" ,
858
+ stream = True ,
859
+ auth_header = None ,
860
+ url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
861
+ model = "gemini-2.5-flash-lite" ,
862
+ )
863
+
864
+ expected_streaming_url = "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent?alt=sse"
865
+ assert result_url_streaming == expected_streaming_url , f"Expected { expected_streaming_url } , got { result_url_streaming } "
866
+
867
+ # Test with streaming disabled
868
+ _ , result_url_no_streaming = vertex_base ._check_custom_proxy (
869
+ api_base = "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta" ,
870
+ custom_llm_provider = "gemini" ,
871
+ gemini_api_key = "test-api-key" ,
872
+ endpoint = "generateContent" ,
873
+ stream = False ,
874
+ auth_header = None ,
875
+ url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent" ,
876
+ model = "gemini-2.5-flash-lite" ,
877
+ )
878
+
879
+ expected_no_streaming_url = "https://proxy.zapier.com/generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent"
880
+ assert result_url_no_streaming == expected_no_streaming_url , f"Expected { expected_no_streaming_url } , got { result_url_no_streaming } "
0 commit comments