Skip to content

Commit fa36433

Browse files
author
Paweł Kędzia
committed
Merge branch 'features/lb'
2 parents 2bb94b9 + 7c67558 commit fa36433

22 files changed

+160
-67
lines changed

.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.3.0
1+
0.3.1

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@
1313
| 0.2.2 | Update dockerfile and requirements. Fix routing with vLLM. |
1414
| 0.2.3 | New web configurator: Handling projects, configs for each user separately. First Available strategy is more powerful, a lot of improvements to efficiency. |
1515
| 0.2.4 | Anonymizer module, integration anonymization with any endpoint (using dynamic payload analysis and full payload anonymisation), dedicated `/api/anonymize_text` endpoint as memory only anonymization. Whole router may be run in `FORCE_ANONYMISATION` mode. |
16-
| 0.3.0 | Anonymization available with three strategies: `fast_masker`, `genai`, `prov_masker`. |
16+
| 0.3.0 | Anonymization available with three strategies: `fast_masker`, `genai`, `prov_masker`. |
17+
| 0.3.1 | Refactoring `lb.strategies` to be more flexible modular. |

llm_router_api/base/constants.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@
5757
f"{_DontChangeMe.MAIN_ENV_PREFIX}FORCE_ANONYMISATION"
5858
)
5959

60+
FORCE_ANONYMISATION_ALGORITHM = None
61+
FORCE_ANONYMISATION_MODEL = None
62+
6063
# Type of server, default is flask {flask, gunicorn, waitress}
6164
SERVER_TYPE = (
6265
os.environ.get(f"{_DontChangeMe.MAIN_ENV_PREFIX}SERVER_TYPE", "flask")
@@ -76,7 +79,7 @@
7679
).strip()
7780
)
7881

79-
# Number of threads (if server supports multithreading), default: 8
82+
# Number of threads (if the server supports multithreading), default: 8
8083
SERVER_THREADS_COUNT = int(
8184
os.environ.get(
8285
f"{_DontChangeMe.MAIN_ENV_PREFIX}SERVER_THREADS_COUNT", "8"

llm_router_api/base/constants_base.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,7 @@ class BalanceStrategies:
2626
BalanceStrategies.FIRST_AVAILABLE,
2727
BalanceStrategies.FIRST_AVAILABLE_OPTIM,
2828
]
29+
30+
#
31+
# DEFAULT_ANONYMIZE_STRATEGY = "fast_masker"
32+
# POSSIBLE_ANONYMIZE_STRATEGIES = ["fast_masker", "genai"]

llm_router_api/base/lb/chooser.py renamed to llm_router_api/base/lb/provider_strategy_facase.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,28 @@
2525
from llm_router_api.base.constants import REST_API_LOG_LEVEL
2626
from llm_router_api.base.constants_base import BalanceStrategies
2727

28-
from llm_router_api.base.lb.strategy import ChooseProviderStrategyI
29-
from llm_router_api.base.lb.first_available import FirstAvailableStrategy
30-
from llm_router_api.base.lb.first_available_optim import (
31-
FirstAvailableOptimStrategy,
28+
from llm_router_api.base.lb.strategy_interface import ChooseProviderStrategyI
29+
from llm_router_api.base.lb.strategies.first_available import RedisBasedStrategy
30+
from llm_router_api.base.lb.strategies.first_available_optim import (
31+
RedisBasedOptimStrategy,
3232
)
3333

34-
from llm_router_api.base.lb.balanced import LoadBalancedStrategy
35-
from llm_router_api.base.lb.weighted import WeightedStrategy, DynamicWeightedStrategy
34+
from llm_router_api.base.lb.strategies.balanced import LoadBalancedStrategy
35+
from llm_router_api.base.lb.strategies.weighted import (
36+
WeightedStrategy,
37+
DynamicWeightedStrategy,
38+
)
3639

3740
STRATEGIES = {
3841
BalanceStrategies.BALANCED: LoadBalancedStrategy,
3942
BalanceStrategies.WEIGHTED: WeightedStrategy,
4043
BalanceStrategies.DYNAMIC_WEIGHTED: DynamicWeightedStrategy,
41-
BalanceStrategies.FIRST_AVAILABLE: FirstAvailableStrategy,
42-
BalanceStrategies.FIRST_AVAILABLE_OPTIM: FirstAvailableOptimStrategy,
44+
BalanceStrategies.FIRST_AVAILABLE: RedisBasedStrategy,
45+
BalanceStrategies.FIRST_AVAILABLE_OPTIM: RedisBasedOptimStrategy,
4346
}
4447

4548

46-
class ProviderChooser:
49+
class ProviderStrategyFacade:
4750
"""
4851
Facade for selecting a provider using a configurable load‑balancing strategy.
4952

llm_router_api/base/lb/first_available_i.py renamed to llm_router_api/base/lb/redis_based_interface.py

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import random
2-
import time
32
import logging
3+
44
from abc import ABC
5+
from typing import List, Dict, Optional, Any, Tuple
56

67
try:
78
import redis
@@ -10,14 +11,16 @@
1011
except ImportError:
1112
REDIS_IS_AVAILABLE = False
1213

13-
from typing import List, Dict, Optional, Any, Tuple
14-
1514
from llm_router_api.base.constants import REDIS_PORT, REDIS_HOST
16-
from llm_router_api.base.lb.strategy import ChooseProviderStrategyI
17-
from llm_router_api.base.lb.provider_monitor import RedisProviderMonitor
15+
from llm_router_api.base.lb.strategy_interface import ChooseProviderStrategyI
16+
from llm_router_api.base.monitor.redis_health_interface import (
17+
RedisBasedHealthCheckInterface,
18+
)
1819

1920

20-
class FirstAvailableStrategyI(ChooseProviderStrategyI, ABC):
21+
class RedisBasedStrategyInterface(
22+
ChooseProviderStrategyI, RedisBasedHealthCheckInterface, ABC
23+
):
2124
"""
2225
Strategy that selects the first free provider for a model using Redis.
2326
@@ -39,6 +42,7 @@ def __init__(
3942
redis_db: int = 0,
4043
timeout: int = 60,
4144
check_interval: float = 0.1,
45+
monitor_check_interval: float = 30,
4246
clear_buffers: bool = True,
4347
logger: Optional[logging.Logger] = None,
4448
strategy_prefix: Optional[str] = "",
@@ -62,20 +66,29 @@ def __init__(
6266
check_interval : float, optional
6367
Time to sleep between checks for available providers (in seconds).
6468
Default is ``0.1``.
69+
monitor_check_interval : float, optional
70+
Time to sleep [in monitor module] between checks
71+
for available providers (in seconds).
72+
Default is ``0.1``.
6573
clear_buffers:
6674
Whether to clear all buffers when starting. Default is ``True``.
6775
"""
68-
if not REDIS_IS_AVAILABLE:
69-
raise RuntimeError("Redis is not available. Please install it first.")
70-
71-
super().__init__(models_config_path=models_config_path, logger=logger)
76+
ChooseProviderStrategyI.__init__(
77+
self=self, models_config_path=models_config_path, logger=logger
78+
)
7279

73-
self.redis_client = redis.Redis(
74-
host=redis_host, port=redis_port, db=redis_db, decode_responses=True
80+
RedisBasedHealthCheckInterface.__init__(
81+
self=self,
82+
redis_host=redis_host,
83+
redis_port=redis_port,
84+
redis_db=redis_db,
85+
clear_buffers=clear_buffers,
86+
logger=logger,
87+
check_interval=monitor_check_interval,
7588
)
89+
7690
self.timeout = timeout
7791
self.check_interval = check_interval
78-
7992
self.strategy_prefix = strategy_prefix
8093

8194
# Atomic acquire script – treat missing field as “available”
@@ -108,14 +121,6 @@ def __init__(
108121
if clear_buffers:
109122
self._clear_buffers()
110123

111-
# Start providers monitor
112-
self._monitor = RedisProviderMonitor(
113-
redis_client=self.redis_client,
114-
check_interval=30,
115-
clear_buffers=clear_buffers,
116-
logger=self.logger,
117-
)
118-
119124
def init_provider(
120125
self,
121126
model_name: str,

llm_router_api/base/lb/strategies/__init__.py

Whitespace-only changes.

llm_router_api/base/lb/balanced.py renamed to llm_router_api/base/lb/strategies/balanced.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from collections import defaultdict
44
from typing import List, Dict, Optional, Any
55

6-
from llm_router_api.base.lb.strategy import ChooseProviderStrategyI
6+
from llm_router_api.base.lb.strategy_interface import ChooseProviderStrategyI
77

88

99
class LoadBalancedStrategy(ChooseProviderStrategyI):

llm_router_api/base/lb/strategies/beta/__init__.py

Whitespace-only changes.

llm_router_api/base/lb/adaptive.py renamed to llm_router_api/base/lb/strategies/beta/adaptive.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import List, Dict
22

3-
from llm_router_api.base.lb.weighted import DynamicWeightedStrategy
3+
from llm_router_api.base.lb.strategies.weighted import DynamicWeightedStrategy
44

55

66
class AdaptiveStrategy(DynamicWeightedStrategy):

0 commit comments

Comments
 (0)