@@ -792,6 +792,173 @@ func compareChatResponses(r1, r2 openai.ChatCompletionStreamResponse) bool {
792
792
return true
793
793
}
794
794
795
+ func TestCreateChatCompletionStreamWithReasoningModel (t * testing.T ) {
796
+ client , server , teardown := setupOpenAITestServer ()
797
+ defer teardown ()
798
+ server .RegisterHandler ("/v1/chat/completions" , func (w http.ResponseWriter , _ * http.Request ) {
799
+ w .Header ().Set ("Content-Type" , "text/event-stream" )
800
+
801
+ dataBytes := []byte {}
802
+
803
+ //nolint:lll
804
+ dataBytes = append (dataBytes , []byte (`data: {"id":"1","object":"chat.completion.chunk","created":1729585728,"model":"o3-mini-2025-01-31","system_fingerprint":"fp_mini","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}` )... )
805
+ dataBytes = append (dataBytes , []byte ("\n \n " )... )
806
+
807
+ //nolint:lll
808
+ dataBytes = append (dataBytes , []byte (`data: {"id":"2","object":"chat.completion.chunk","created":1729585728,"model":"o3-mini-2025-01-31","system_fingerprint":"fp_mini","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}` )... )
809
+ dataBytes = append (dataBytes , []byte ("\n \n " )... )
810
+
811
+ //nolint:lll
812
+ dataBytes = append (dataBytes , []byte (`data: {"id":"3","object":"chat.completion.chunk","created":1729585728,"model":"o3-mini-2025-01-31","system_fingerprint":"fp_mini","choices":[{"index":0,"delta":{"content":" from"},"finish_reason":null}]}` )... )
813
+ dataBytes = append (dataBytes , []byte ("\n \n " )... )
814
+
815
+ //nolint:lll
816
+ dataBytes = append (dataBytes , []byte (`data: {"id":"4","object":"chat.completion.chunk","created":1729585728,"model":"o3-mini-2025-01-31","system_fingerprint":"fp_mini","choices":[{"index":0,"delta":{"content":" O3Mini"},"finish_reason":null}]}` )... )
817
+ dataBytes = append (dataBytes , []byte ("\n \n " )... )
818
+
819
+ //nolint:lll
820
+ dataBytes = append (dataBytes , []byte (`data: {"id":"5","object":"chat.completion.chunk","created":1729585728,"model":"o3-mini-2025-01-31","system_fingerprint":"fp_mini","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}` )... )
821
+ dataBytes = append (dataBytes , []byte ("\n \n " )... )
822
+
823
+ dataBytes = append (dataBytes , []byte ("data: [DONE]\n \n " )... )
824
+
825
+ _ , err := w .Write (dataBytes )
826
+ checks .NoError (t , err , "Write error" )
827
+ })
828
+
829
+ stream , err := client .CreateChatCompletionStream (context .Background (), openai.ChatCompletionRequest {
830
+ MaxCompletionTokens : 2000 ,
831
+ Model : openai .O3Mini20250131 ,
832
+ Messages : []openai.ChatCompletionMessage {
833
+ {
834
+ Role : openai .ChatMessageRoleUser ,
835
+ Content : "Hello!" ,
836
+ },
837
+ },
838
+ Stream : true ,
839
+ })
840
+ checks .NoError (t , err , "CreateCompletionStream returned error" )
841
+ defer stream .Close ()
842
+
843
+ expectedResponses := []openai.ChatCompletionStreamResponse {
844
+ {
845
+ ID : "1" ,
846
+ Object : "chat.completion.chunk" ,
847
+ Created : 1729585728 ,
848
+ Model : openai .O3Mini20250131 ,
849
+ SystemFingerprint : "fp_mini" ,
850
+ Choices : []openai.ChatCompletionStreamChoice {
851
+ {
852
+ Index : 0 ,
853
+ Delta : openai.ChatCompletionStreamChoiceDelta {
854
+ Role : "assistant" ,
855
+ },
856
+ },
857
+ },
858
+ },
859
+ {
860
+ ID : "2" ,
861
+ Object : "chat.completion.chunk" ,
862
+ Created : 1729585728 ,
863
+ Model : openai .O3Mini20250131 ,
864
+ SystemFingerprint : "fp_mini" ,
865
+ Choices : []openai.ChatCompletionStreamChoice {
866
+ {
867
+ Index : 0 ,
868
+ Delta : openai.ChatCompletionStreamChoiceDelta {
869
+ Content : "Hello" ,
870
+ },
871
+ },
872
+ },
873
+ },
874
+ {
875
+ ID : "3" ,
876
+ Object : "chat.completion.chunk" ,
877
+ Created : 1729585728 ,
878
+ Model : openai .O3Mini20250131 ,
879
+ SystemFingerprint : "fp_mini" ,
880
+ Choices : []openai.ChatCompletionStreamChoice {
881
+ {
882
+ Index : 0 ,
883
+ Delta : openai.ChatCompletionStreamChoiceDelta {
884
+ Content : " from" ,
885
+ },
886
+ },
887
+ },
888
+ },
889
+ {
890
+ ID : "4" ,
891
+ Object : "chat.completion.chunk" ,
892
+ Created : 1729585728 ,
893
+ Model : openai .O3Mini20250131 ,
894
+ SystemFingerprint : "fp_mini" ,
895
+ Choices : []openai.ChatCompletionStreamChoice {
896
+ {
897
+ Index : 0 ,
898
+ Delta : openai.ChatCompletionStreamChoiceDelta {
899
+ Content : " O3Mini" ,
900
+ },
901
+ },
902
+ },
903
+ },
904
+ {
905
+ ID : "5" ,
906
+ Object : "chat.completion.chunk" ,
907
+ Created : 1729585728 ,
908
+ Model : openai .O3Mini20250131 ,
909
+ SystemFingerprint : "fp_mini" ,
910
+ Choices : []openai.ChatCompletionStreamChoice {
911
+ {
912
+ Index : 0 ,
913
+ Delta : openai.ChatCompletionStreamChoiceDelta {},
914
+ FinishReason : "stop" ,
915
+ },
916
+ },
917
+ },
918
+ }
919
+
920
+ for ix , expectedResponse := range expectedResponses {
921
+ b , _ := json .Marshal (expectedResponse )
922
+ t .Logf ("%d: %s" , ix , string (b ))
923
+
924
+ receivedResponse , streamErr := stream .Recv ()
925
+ checks .NoError (t , streamErr , "stream.Recv() failed" )
926
+ if ! compareChatResponses (expectedResponse , receivedResponse ) {
927
+ t .Errorf ("Stream response %v is %v, expected %v" , ix , receivedResponse , expectedResponse )
928
+ }
929
+ }
930
+
931
+ _ , streamErr := stream .Recv ()
932
+ if ! errors .Is (streamErr , io .EOF ) {
933
+ t .Errorf ("stream.Recv() did not return EOF in the end: %v" , streamErr )
934
+ }
935
+ }
936
+
937
+ func TestCreateChatCompletionStreamReasoningValidatorFails (t * testing.T ) {
938
+ client , _ , _ := setupOpenAITestServer ()
939
+
940
+ stream , err := client .CreateChatCompletionStream (context .Background (), openai.ChatCompletionRequest {
941
+ MaxTokens : 100 , // This will trigger the validator to fail
942
+ Model : openai .O3Mini ,
943
+ Messages : []openai.ChatCompletionMessage {
944
+ {
945
+ Role : openai .ChatMessageRoleUser ,
946
+ Content : "Hello!" ,
947
+ },
948
+ },
949
+ Stream : true ,
950
+ })
951
+
952
+ if stream != nil {
953
+ t .Error ("Expected nil stream when validation fails" )
954
+ stream .Close ()
955
+ }
956
+
957
+ if ! errors .Is (err , openai .ErrReasoningModelMaxTokensDeprecated ) {
958
+ t .Errorf ("Expected ErrReasoningModelMaxTokensDeprecated, got: %v" , err )
959
+ }
960
+ }
961
+
795
962
func compareChatStreamResponseChoices (c1 , c2 openai.ChatCompletionStreamChoice ) bool {
796
963
if c1 .Index != c2 .Index {
797
964
return false
0 commit comments