4343from mcpgateway .plugins .framework .errors import PluginViolationError
4444from mcpgateway .plugins .framework .manager import PluginExecutor
4545from mcpgateway .plugins .framework .models import PluginMode
46- from plugins . rate_limiter .rate_limiter import RateLimiterPlugin
46+ from cpex_rate_limiter .rate_limiter import RateLimiterPlugin
4747
4848# API Endpoints
4949PROMPT_ENDPOINT = "/api/v1/prompts/"
@@ -55,7 +55,7 @@ def rate_limit_plugin_2_per_second():
5555 """Rate limiter plugin configured for 2 requests per second."""
5656 config = PluginConfig (
5757 name = "RateLimiter" ,
58- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
58+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
5959 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
6060 priority = 100 ,
6161 config = {"by_user" : "2/s" , "by_tenant" : None , "by_tool" : {}},
@@ -68,7 +68,7 @@ def rate_limit_plugin_multi_dimensional():
6868 """Rate limiter plugin with multi-dimensional limits."""
6969 config = PluginConfig (
7070 name = "RateLimiter" ,
71- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
71+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
7272 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
7373 priority = 100 ,
7474 config = {"by_user" : "10/s" , "by_tenant" : "5/s" , "by_tool" : {"restricted_tool" : "1/s" }},
@@ -243,7 +243,7 @@ async def test_user_rate_limit_enforced(self):
243243 # Configure with ONLY user limits (no tenant limit)
244244 config = PluginConfig (
245245 name = "RateLimiter" ,
246- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
246+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
247247 hooks = ["prompt_pre_fetch" ],
248248 priority = 100 ,
249249 config = {"by_user" : "10/s" , "by_tenant" : None , "by_tool" : {}}, # No tenant limit
@@ -318,7 +318,7 @@ async def test_most_restrictive_dimension_selected(self):
318318 # Configure with different limits
319319 config = PluginConfig (
320320 name = "RateLimiter" ,
321- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
321+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
322322 hooks = ["prompt_pre_fetch" ],
323323 priority = 100 ,
324324 config = {
@@ -424,7 +424,7 @@ class TestSlidingWindowIntegration:
424424 def plugin (self ):
425425 config = PluginConfig (
426426 name = "RateLimiter" ,
427- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
427+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
428428 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
429429 priority = 100 ,
430430 config = {"by_user" : "3/s" , "algorithm" : "sliding_window" },
@@ -513,7 +513,7 @@ class TestTokenBucketIntegration:
513513 def plugin (self ):
514514 config = PluginConfig (
515515 name = "RateLimiter" ,
516- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
516+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
517517 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
518518 priority = 100 ,
519519 config = {"by_user" : "3/s" , "algorithm" : "token_bucket" },
@@ -606,7 +606,7 @@ class TestCrossHookSharing:
606606 def plugin (self ):
607607 config = PluginConfig (
608608 name = "RateLimiter" ,
609- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
609+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
610610 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
611611 priority = 100 ,
612612 config = {"by_user" : "5/s" },
@@ -654,7 +654,7 @@ async def test_tenant_counter_shared_across_hooks_and_users(self, plugin):
654654 """Tenant bucket is shared across all users in the same tenant, regardless of hook."""
655655 config = PluginConfig (
656656 name = "RateLimiter" ,
657- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
657+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
658658 hooks = ["prompt_pre_fetch" , "tool_pre_invoke" ],
659659 priority = 100 ,
660660 config = {"by_user" : "10/s" , "by_tenant" : "4/s" },
@@ -687,7 +687,7 @@ class TestPermissiveMode:
687687 def _make_plugin_and_hook (self , limit : str ) -> tuple :
688688 config = PluginConfig (
689689 name = "RateLimiter" ,
690- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
690+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
691691 hooks = ["tool_pre_invoke" ],
692692 priority = 100 ,
693693 mode = PluginMode .PERMISSIVE ,
@@ -737,7 +737,7 @@ async def test_permissive_mode_contrast_with_enforce(self):
737737 """Enforce mode raises PluginViolationError; permissive mode does not."""
738738 enforce_config = PluginConfig (
739739 name = "RateLimiter" ,
740- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
740+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
741741 hooks = ["tool_pre_invoke" ],
742742 config = {"by_user" : "1/s" },
743743 mode = PluginMode .ENFORCE ,
@@ -764,7 +764,7 @@ class TestDisabledMode:
764764 def _make_plugin_and_refs (self ) -> tuple :
765765 config = PluginConfig (
766766 name = "RateLimiter" ,
767- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
767+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
768768 hooks = ["tool_pre_invoke" ],
769769 priority = 100 ,
770770 mode = PluginMode .DISABLED ,
@@ -819,7 +819,7 @@ class TestTenantIsolation:
819819 def plugin (self ):
820820 config = PluginConfig (
821821 name = "RateLimiter" ,
822- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
822+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
823823 hooks = ["tool_pre_invoke" ],
824824 priority = 100 ,
825825 config = {"by_user" : "3/s" , "by_tenant" : "5/s" },
@@ -907,7 +907,7 @@ async def test_none_tenant_id_skips_by_tenant_entirely(self):
907907 """
908908 config = PluginConfig (
909909 name = "RateLimiter" ,
910- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
910+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
911911 hooks = ["tool_pre_invoke" ],
912912 priority = 100 ,
913913 config = {"by_user" : "100/s" , "by_tenant" : "5/s" },
@@ -953,7 +953,7 @@ async def test_explicit_tenant_scopes_correctly_after_fix(self):
953953 """
954954 config = PluginConfig (
955955 name = "RateLimiter" ,
956- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
956+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
957957 hooks = ["tool_pre_invoke" ],
958958 priority = 100 ,
959959 config = {"by_user" : "100/s" , "by_tenant" : "5/s" },
@@ -982,7 +982,7 @@ async def test_no_limits_configured_allows_all_requests(self):
982982 """Plugin with all dimensions None must allow every request without tracking."""
983983 config = PluginConfig (
984984 name = "RateLimiter" ,
985- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
985+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
986986 hooks = ["tool_pre_invoke" ],
987987 config = {}, # no by_user, no by_tenant, no by_tool
988988 )
@@ -999,7 +999,7 @@ async def test_no_limits_configured_returns_no_headers(self):
999999 """Plugin with no configured limits must not set X-RateLimit-* headers."""
10001000 config = PluginConfig (
10011001 name = "RateLimiter" ,
1002- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1002+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
10031003 hooks = ["tool_pre_invoke" ],
10041004 config = {},
10051005 )
@@ -1015,7 +1015,7 @@ async def test_none_user_defaults_to_anonymous_bucket(self):
10151015 """user=None in GlobalContext must fall back to 'anonymous' as the rate limit key."""
10161016 config = PluginConfig (
10171017 name = "RateLimiter" ,
1018- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1018+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
10191019 hooks = ["tool_pre_invoke" ],
10201020 config = {"by_user" : "2/s" },
10211021 )
@@ -1038,7 +1038,7 @@ async def test_none_tenant_id_skips_by_tenant_check(self):
10381038 """tenant_id=None in GlobalContext must skip the by_tenant check entirely — no 'default' bucket."""
10391039 config = PluginConfig (
10401040 name = "RateLimiter" ,
1041- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1041+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
10421042 hooks = ["tool_pre_invoke" ],
10431043 config = {"by_tenant" : "2/s" },
10441044 )
@@ -1059,7 +1059,7 @@ async def test_both_user_and_tenant_none_still_enforces(self):
10591059 """With both user=None and tenant_id=None the plugin must still enforce limits."""
10601060 config = PluginConfig (
10611061 name = "RateLimiter" ,
1062- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1062+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
10631063 hooks = ["tool_pre_invoke" ],
10641064 config = {"by_user" : "2/s" , "by_tenant" : "10/s" },
10651065 )
@@ -1081,7 +1081,7 @@ def make_plugin():
10811081 return RateLimiterPlugin (
10821082 PluginConfig (
10831083 name = "RateLimiter" ,
1084- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1084+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
10851085 hooks = ["tool_pre_invoke" ],
10861086 config = {"by_user" : "2/s" },
10871087 )
@@ -1175,7 +1175,7 @@ def _make_redis_plugin(redis_url: str, algorithm: str = "fixed_window", limit: s
11751175 return RateLimiterPlugin (
11761176 PluginConfig (
11771177 name = "RateLimiter" ,
1178- kind = "plugins.rate_limiter .rate_limiter.RateLimiterPlugin" ,
1178+ kind = "cpex_rate_limiter .rate_limiter.RateLimiterPlugin" ,
11791179 hooks = ["tool_pre_invoke" ],
11801180 priority = 100 ,
11811181 config = {
0 commit comments