feat: 自适应 RPM 未学习时不限制,改为碰壁学习策略

- 移除自适应模式的默认初始限制(RPMDefaults.INITIAL_LIMIT)
- 未学习到边界前不限制 RPM,让系统自由运行直到遇到 429
- 前端自适应 Key 显示学习到的值或"探测中"状态
- 批量余额查询改为并行执行,提升性能
This commit is contained in:
fawney19
2026-01-17 23:44:53 +08:00
parent f002f8de03
commit b98fc8497f
8 changed files with 38 additions and 25 deletions

View File

@@ -315,7 +315,7 @@ class CacheAwareScheduler:
获取有效的 RPM 限制
新逻辑:
- rpm_limit=NULL: 启用自适应,使用 learned_rpm_limit如无学习记录则使用默认初始值
- rpm_limit=NULL: 启用自适应,使用 learned_rpm_limit如无学习记录则不限制,等待碰壁学习
- rpm_limit=数字: 固定限制,直接使用该值
Args:
@@ -330,10 +330,8 @@ class CacheAwareScheduler:
if learned is not None:
return int(learned)
# 未学习到值时,使用默认初始限制,避免无限制打爆上游
from src.config.constants import RPMDefaults
return int(RPMDefaults.INITIAL_LIMIT)
# 未学习到值时,不限制,让其碰壁后再学习真实边界
return None
else:
# 固定限制模式
return int(key.rpm_limit)

View File

@@ -599,7 +599,7 @@ class ProviderOpsService:
self, provider_ids: Optional[List[str]] = None
) -> Dict[str, ActionResult]:
"""
批量查询余额
批量查询余额(优先返回缓存,后台异步刷新)
Args:
provider_ids: Provider ID 列表None 表示查询所有已配置的
@@ -616,9 +616,24 @@ class ProviderOpsService:
if p.config and p.config.get("provider_ops")
]
# 并行查询,使用缓存优先策略
tasks = [
self.query_balance_with_cache(provider_id, trigger_refresh=True)
for provider_id in provider_ids
]
results_list = await asyncio.gather(*tasks, return_exceptions=True)
results = {}
for provider_id in provider_ids:
results[provider_id] = await self.query_balance(provider_id)
for provider_id, result in zip(provider_ids, results_list):
if isinstance(result, Exception):
logger.warning(f"查询余额失败: provider_id={provider_id}, error={result}")
results[provider_id] = ActionResult(
status=ActionStatus.UNKNOWN_ERROR,
action_type=ProviderActionType.QUERY_BALANCE,
message=str(result),
)
else:
results[provider_id] = result
return results

View File

@@ -211,7 +211,11 @@ class AdaptiveRPMManager:
if not is_adaptive:
return None
current_limit = int(key.learned_rpm_limit or self.DEFAULT_INITIAL_LIMIT)
# 未碰壁学习前,不主动设置限制,让系统自由运行直到遇到 429
if key.learned_rpm_limit is None:
return None
current_limit = int(key.learned_rpm_limit)
# 获取已知边界(上次触发 429 时的 RPM
known_boundary = key.last_rpm_peak

View File

@@ -102,10 +102,8 @@ class RequestExecutor:
# 获取有效的 RPM 限制(自适应或固定)
if key.rpm_limit is None:
# 自适应模式:优先使用学习值,否则使用默认初始限制,避免无限制打爆上游
from src.config.constants import RPMDefaults
effective_key_limit = int(key.learned_rpm_limit or RPMDefaults.INITIAL_LIMIT)
# 自适应模式:使用学习值,未学习时为 None不限制等待碰壁学习
effective_key_limit = int(key.learned_rpm_limit) if key.learned_rpm_limit is not None else None
else:
effective_key_limit = int(key.rpm_limit)