diff --git a/openhands/server/listen.py b/openhands/server/listen.py index 2a089ee41476..3e6be135dba2 100644 --- a/openhands/server/listen.py +++ b/openhands/server/listen.py @@ -11,9 +11,6 @@ import requests from pathspec import PathSpec from pathspec.patterns import GitWildMatchPattern -from slowapi import Limiter, _rate_limit_exceeded_handler -from slowapi.errors import RateLimitExceeded -from slowapi.util import get_remote_address from openhands.security.options import SecurityAnalyzers from openhands.server.data_models.feedback import FeedbackDataModel, store_feedback @@ -97,36 +94,6 @@ async def lifespan(app: FastAPI): security_scheme = HTTPBearer() -# Initialize rate limiter -limiter = Limiter( - key_func=get_remote_address, - default_limits=['5 per second'], - strategy='moving-window', # Use a sliding window for more accurate rate limiting -) -app.state.limiter = limiter -app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) - - -# Apply stricter limits to auth endpoints -def get_path_limits(request: Request): - path = request.url.path - if path == '/ws' or path in ['/api/github/callback', '/api/authenticate']: - return ['1 per second'] - return ['5 per second'] - - -@app.middleware('http') -async def rate_limit_middleware(request: Request, call_next): - limits = get_path_limits(request) - try: - await limiter.check_request_limit(request, limits=limits) - except RateLimitExceeded: - return JSONResponse( - status_code=status.HTTP_429_TOO_MANY_REQUESTS, - content={'error': 'Too many requests'}, - ) - return await call_next(request) - def load_file_upload_config() -> tuple[int, bool, list[str]]: """Load file upload configuration from the config object. @@ -293,13 +260,6 @@ async def attach_session(request: Request, call_next): @app.websocket('/ws') async def websocket_endpoint(websocket: WebSocket): - try: - # Create a mock request object for rate limiting - mock_request = Request(scope={'type': 'http', 'client': websocket.client}) - await limiter.check_request_limit(mock_request, limits=['1 per second']) - except RateLimitExceeded: - await websocket.close(code=status.WS_1008_POLICY_VIOLATION) - return """WebSocket endpoint for receiving events from the client (i.e., the browser). Once connected, the client can send various actions: - Initialize the agent: diff --git a/poetry.lock b/poetry.lock index 60be51e9cae6..b32d2c7753db 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3932,35 +3932,6 @@ tiktoken = "*" transformers = "*" types-tqdm = "*" -[[package]] -name = "limits" -version = "3.13.0" -description = "Rate limiting utilities" -optional = false -python-versions = ">=3.8" -files = [ - {file = "limits-3.13.0-py3-none-any.whl", hash = "sha256:9767f7233da4255e9904b79908a728e8ec0984c0b086058b4cbbd309aea553f6"}, - {file = "limits-3.13.0.tar.gz", hash = "sha256:6571b0c567bfa175a35fed9f8a954c0c92f1c3200804282f1b8f1de4ad98a953"}, -] - -[package.dependencies] -deprecated = ">=1.2" -importlib-resources = ">=1.3" -packaging = ">=21,<25" -typing-extensions = "*" - -[package.extras] -all = ["aetcd", "coredis (>=3.4.0,<5)", "emcache (>=0.6.1)", "emcache (>=1)", "etcd3", "motor (>=3,<4)", "pymemcache (>3,<5.0.0)", "pymongo (>4.1,<5)", "redis (>3,!=4.5.2,!=4.5.3,<6.0.0)", "redis (>=4.2.0,!=4.5.2,!=4.5.3)"] -async-etcd = ["aetcd"] -async-memcached = ["emcache (>=0.6.1)", "emcache (>=1)"] -async-mongodb = ["motor (>=3,<4)"] -async-redis = ["coredis (>=3.4.0,<5)"] -etcd = ["etcd3"] -memcached = ["pymemcache (>3,<5.0.0)"] -mongodb = ["pymongo (>4.1,<5)"] -redis = ["redis (>3,!=4.5.2,!=4.5.3,<6.0.0)"] -rediscluster = ["redis (>=4.2.0,!=4.5.2,!=4.5.3)"] - [[package]] name = "litellm" version = "1.52.3" @@ -8329,23 +8300,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "slowapi" -version = "0.1.9" -description = "A rate limiting extension for Starlette and Fastapi" -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "slowapi-0.1.9-py3-none-any.whl", hash = "sha256:cfad116cfb84ad9d763ee155c1e5c5cbf00b0d47399a769b227865f5df576e36"}, - {file = "slowapi-0.1.9.tar.gz", hash = "sha256:639192d0f1ca01b1c6d95bf6c71d794c3a9ee189855337b4821f7f457dddad77"}, -] - -[package.dependencies] -limits = ">=2.3" - -[package.extras] -redis = ["redis (>=3.4.1,<4.0.0)"] - [[package]] name = "smmap" version = "5.0.1" @@ -10224,4 +10178,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "2c52184376e4637e8033f27d6c8be006deb7b041f3aacf921a2205e00ec9464a" +content-hash = "245fd4cd56a3c95b2dd4f3a06251f7de82ad0300de7349f0710aac1f92a151b7" diff --git a/pyproject.toml b/pyproject.toml index b1182771f5a3..6430f70d720d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,6 @@ opentelemetry-api = "1.25.0" opentelemetry-exporter-otlp-proto-grpc = "1.25.0" modal = "^0.64.145" runloop-api-client = "0.7.0" -slowapi = "^0.1.9" pygithub = "^2.5.0" [tool.poetry.group.llama-index.dependencies]