|
17 | 17 | import json |
18 | 18 | import asyncio |
19 | 19 | import aiohttp |
| 20 | +import logging |
20 | 21 | # Redis: Optional for MVP. PT uses file-based state (.state/agents.json) by default. |
21 | 22 | # Redis enables distributed coordination for multi-instance deployments (v1.1+). |
22 | 23 | # Soft import — app starts cleanly even if the redis package is not installed. |
|
29 | 30 | from fastapi.middleware.trustedhost import TrustedHostMiddleware |
30 | 31 | # fix(orchestrator): migrate from deprecated Pydantic V1 @validator to V2 @field_validator |
31 | 32 | from pydantic import BaseModel, Field, field_validator |
32 | | -from loguru import logger |
33 | | -from dotenv import load_dotenv |
34 | | -from slowapi import Limiter, _rate_limit_exceeded_handler |
35 | | -from slowapi.util import get_remote_address |
36 | | -from slowapi.errors import RateLimitExceeded |
| 33 | +try: |
| 34 | + from loguru import logger |
| 35 | +except ImportError: |
| 36 | + logger = logging.getLogger("perplexity_tools.orchestrator") |
| 37 | +try: |
| 38 | + from dotenv import load_dotenv |
| 39 | +except ImportError: |
| 40 | + def load_dotenv(*_args, **_kwargs): |
| 41 | + return False |
| 42 | +try: |
| 43 | + from slowapi import Limiter, _rate_limit_exceeded_handler |
| 44 | + from slowapi.util import get_remote_address |
| 45 | + from slowapi.errors import RateLimitExceeded |
| 46 | +except ImportError: |
| 47 | + class RateLimitExceeded(Exception): |
| 48 | + pass |
| 49 | + |
| 50 | + def _rate_limit_exceeded_handler(*_args, **_kwargs): |
| 51 | + raise RateLimitExceeded("slowapi is not installed") |
| 52 | + |
| 53 | + def get_remote_address(_request): |
| 54 | + return "local" |
| 55 | + |
| 56 | + class Limiter: |
| 57 | + def __init__(self, *args, **kwargs): |
| 58 | + pass |
| 59 | + |
| 60 | + def limit(self, _rule): |
| 61 | + def decorator(fn): |
| 62 | + return fn |
| 63 | + return decorator |
37 | 64 |
|
38 | 65 | load_dotenv() |
39 | 66 |
|
|
0 commit comments