This is an automated email from the ASF dual-hosted git repository. nic443 pushed a commit to branch feat/native-anthropic-messages-api in repository https://gitbox.apache.org/repos/asf/apisix.git
commit 6476ecd1fd6a3e04ada55531301099cf7d8d96dd Author: Nic <[email protected]> AuthorDate: Wed Apr 8 17:36:43 2026 +0800 fix: use /anything/v1/messages in tests to avoid /v1/ control API conflict The APISIX test framework maps 'location /v1/' to http_control(), which intercepts all requests starting with /v1/ before they reach the APISIX router. This caused 404 for test requests to /v1/messages. Changed test URIs to /anything/v1/messages which avoids the conflict while still matching the Anthropic protocol detection (URI suffix check). --- t/plugin/ai-proxy-protocol-conversion.t | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/t/plugin/ai-proxy-protocol-conversion.t b/t/plugin/ai-proxy-protocol-conversion.t index a6ee0f2e2..99b95d08f 100644 --- a/t/plugin/ai-proxy-protocol-conversion.t +++ b/t/plugin/ai-proxy-protocol-conversion.t @@ -164,7 +164,7 @@ __DATA__ local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -194,7 +194,7 @@ passed === TEST 2: Send Anthropic request to /v1/messages and verify protocol conversion --- request -POST /v1/messages +POST /anything/v1/messages { "model": "claude-3-5-sonnet-20241022", "messages": [ { "role": "user","content": "hello" } ] } --- more_headers Authorization: Bearer token @@ -206,7 +206,7 @@ qr/"text":"1 \+ 1 = 2\."/ === TEST 3: Missing messages field returns 400 --- request -POST /v1/messages +POST /anything/v1/messages { "model": "claude-3-5-sonnet-20241022" } --- more_headers Authorization: Bearer token @@ -218,7 +218,7 @@ Authorization: Bearer token === TEST 4: Malformed JSON body returns 400 --- request -POST /v1/messages +POST /anything/v1/messages this is not valid json --- more_headers Authorization: Bearer token @@ -229,7 +229,7 @@ Content-Type: application/json === TEST 5: messages field is wrong type (non-array) --- request -POST /v1/messages +POST /anything/v1/messages { "model": "claude-3-5-sonnet-20241022", "messages": "hello" } --- more_headers Authorization: Bearer token @@ -241,7 +241,7 @@ Authorization: Bearer token === TEST 6: messages is an empty array --- request -POST /v1/messages +POST /anything/v1/messages { "model": "claude-3-5-sonnet-20241022", "messages": [] } --- more_headers Authorization: Bearer token @@ -259,7 +259,7 @@ Authorization: Bearer token local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -356,7 +356,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "claude-3-5-sonnet-20241022", @@ -389,7 +389,7 @@ qr/event: message_start\ndata:.*?"type":"message_start".*?event: content_block_s local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -487,7 +487,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "claude-3-5-sonnet-20241022", @@ -515,7 +515,7 @@ qr/"text":"system prompt ok"/ local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -545,7 +545,7 @@ passed === TEST 12: Tool calling request/response conversion (Anthropic <-> OpenAI) --- request -POST /v1/messages +POST /anything/v1/messages {"model":"claude-3-5-sonnet-20241022","messages":[{"role":"user","content":"What is the weather in Paris?"}],"tools":[{"name":"get_weather","description":"Get weather","input_schema":{"type":"object","properties":{"location":{"type":"string"}},"required":["location"]}}]} --- more_headers Authorization: Bearer token @@ -564,7 +564,7 @@ qr/(?=.*"stop_reason":"tool_use")(?=.*"type":"tool_use")(?=.*"name":"get_weather local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -638,7 +638,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "gpt-4o", @@ -691,7 +691,7 @@ OK: message_stop appeared exactly once local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -769,7 +769,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "gpt-4o", @@ -836,7 +836,7 @@ OK: two finish_reason chunks handled correctly local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -914,7 +914,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "deepseek-chat", @@ -968,7 +968,7 @@ OK: DeepSeek usage:null chunks handled correctly local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -1042,7 +1042,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "gpt-4o", @@ -1156,7 +1156,7 @@ OK: sse.encode output ends with \n\n local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "gpt-4o", @@ -1246,7 +1246,7 @@ OK: sse.encode edge cases passed local code, body = t('/apisix/admin/routes/1', ngx.HTTP_PUT, [[{ - "uri": "/v1/messages", + "uri": "/anything/v1/messages", "plugins": { "ai-proxy": { "provider": "openai", @@ -1320,7 +1320,7 @@ passed local res, err = httpc:request({ method = "POST", - path = "/v1/messages", + path = "/anything/v1/messages", headers = { ["Content-Type"] = "application/json", ["Connection"] = "close" }, body = [[{ "model": "gpt-4o",
