@@ -936,6 +936,9 @@ func TestConvertToAnthropicRequest_InvalidToolChoice(t *testing.T) {
936936 if gatewayErr .Type != core .ErrorTypeInvalidRequest {
937937 t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
938938 }
939+ if gatewayErr .HTTPStatusCode () != http .StatusBadRequest {
940+ t .Fatalf ("HTTPStatusCode() = %d, want %d" , gatewayErr .HTTPStatusCode (), http .StatusBadRequest )
941+ }
939942}
940943
941944func TestConvertToAnthropicRequest_ToolMessageRequiresToolCallID (t * testing.T ) {
@@ -955,6 +958,59 @@ func TestConvertToAnthropicRequest_ToolMessageRequiresToolCallID(t *testing.T) {
955958 if gatewayErr .Type != core .ErrorTypeInvalidRequest {
956959 t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
957960 }
961+ if gatewayErr .HTTPStatusCode () != http .StatusBadRequest {
962+ t .Fatalf ("HTTPStatusCode() = %d, want %d" , gatewayErr .HTTPStatusCode (), http .StatusBadRequest )
963+ }
964+ }
965+
966+ func TestConvertToAnthropicRequest_ToolChoiceRequiresTools (t * testing.T ) {
967+ _ , err := convertToAnthropicRequest (& core.ChatRequest {
968+ Model : "claude-sonnet-4-5-20250929" ,
969+ Messages : []core.Message {
970+ {Role : "user" , Content : "Hello" },
971+ },
972+ ToolChoice : "auto" ,
973+ })
974+ if err == nil {
975+ t .Fatal ("expected invalid request error, got nil" )
976+ }
977+ var gatewayErr * core.GatewayError
978+ if ! errors .As (err , & gatewayErr ) {
979+ t .Fatalf ("error = %T, want *core.GatewayError" , err )
980+ }
981+ if gatewayErr .Type != core .ErrorTypeInvalidRequest {
982+ t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
983+ }
984+ if gatewayErr .HTTPStatusCode () != http .StatusBadRequest {
985+ t .Fatalf ("HTTPStatusCode() = %d, want %d" , gatewayErr .HTTPStatusCode (), http .StatusBadRequest )
986+ }
987+ }
988+
989+ func TestConvertToAnthropicRequest_ToolArgumentsMustBeJSONObject (t * testing.T ) {
990+ _ , err := convertToAnthropicRequest (& core.ChatRequest {
991+ Model : "claude-sonnet-4-5-20250929" ,
992+ Messages : []core.Message {
993+ {
994+ Role : "assistant" ,
995+ ToolCalls : []core.ToolCall {
996+ {
997+ ID : "call_123" ,
998+ Type : "function" ,
999+ Function : core.FunctionCall {
1000+ Name : "lookup_weather" ,
1001+ Arguments : `["Warsaw"]` ,
1002+ },
1003+ },
1004+ },
1005+ },
1006+ },
1007+ })
1008+ if err == nil {
1009+ t .Fatal ("expected invalid request error, got nil" )
1010+ }
1011+ if ! strings .Contains (err .Error (), "tool arguments must be a JSON object" ) {
1012+ t .Fatalf ("error = %v, want JSON object validation" , err )
1013+ }
9581014}
9591015
9601016func TestConvertFromAnthropicResponse (t * testing.T ) {
@@ -2102,6 +2158,60 @@ func TestConvertResponsesRequestToAnthropic_InvalidToolArguments(t *testing.T) {
21022158 if gatewayErr .Type != core .ErrorTypeInvalidRequest {
21032159 t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
21042160 }
2161+ if gatewayErr .HTTPStatusCode () != http .StatusBadRequest {
2162+ t .Fatalf ("HTTPStatusCode() = %d, want %d" , gatewayErr .HTTPStatusCode (), http .StatusBadRequest )
2163+ }
2164+ }
2165+
2166+ func TestConvertResponsesRequestToAnthropic_ToolChoiceRequiresTools (t * testing.T ) {
2167+ _ , err := convertResponsesRequestToAnthropic (& core.ResponsesRequest {
2168+ Model : "claude-sonnet-4-5-20250929" ,
2169+ Input : "Hello" ,
2170+ ToolChoice : "auto" ,
2171+ })
2172+ if err == nil {
2173+ t .Fatal ("expected invalid request error, got nil" )
2174+ }
2175+ var gatewayErr * core.GatewayError
2176+ if ! errors .As (err , & gatewayErr ) {
2177+ t .Fatalf ("error = %T, want *core.GatewayError" , err )
2178+ }
2179+ if gatewayErr .Type != core .ErrorTypeInvalidRequest {
2180+ t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
2181+ }
2182+ if gatewayErr .HTTPStatusCode () != http .StatusBadRequest {
2183+ t .Fatalf ("HTTPStatusCode() = %d, want %d" , gatewayErr .HTTPStatusCode (), http .StatusBadRequest )
2184+ }
2185+ }
2186+
2187+ func TestBuildAnthropicBatchCreateRequest_PreservesGatewayErrorDetails (t * testing.T ) {
2188+ req := & core.BatchRequest {
2189+ Requests : []core.BatchRequestItem {
2190+ {
2191+ URL : "/v1/chat/completions" ,
2192+ Body : json .RawMessage (`{
2193+ "model":"claude-sonnet-4-5-20250929",
2194+ "messages":[{"role":"user","content":"Hello"}],
2195+ "tool_choice":"auto"
2196+ }` ),
2197+ },
2198+ },
2199+ }
2200+
2201+ _ , _ , err := buildAnthropicBatchCreateRequest (req )
2202+ if err == nil {
2203+ t .Fatal ("expected invalid request error, got nil" )
2204+ }
2205+ var gatewayErr * core.GatewayError
2206+ if ! errors .As (err , & gatewayErr ) {
2207+ t .Fatalf ("error = %T, want *core.GatewayError" , err )
2208+ }
2209+ if gatewayErr .Type != core .ErrorTypeInvalidRequest {
2210+ t .Fatalf ("error type = %q, want invalid_request_error" , gatewayErr .Type )
2211+ }
2212+ if gatewayErr .Message != "batch item 0: tool_choice requires at least one tool" {
2213+ t .Fatalf ("error message = %q" , gatewayErr .Message )
2214+ }
21052215}
21062216
21072217func TestConvertAnthropicResponseToResponses (t * testing.T ) {
0 commit comments