ForcePilot/backend/package/yuxi/channels/adapters/zalo_user/backoff.py
Kris 9285da5c55 feat(zalo-user): 实现完整的Zalo用户频道适配器
新增了Zalo用户频道的完整适配器实现,包括:
- 基础的适配器初始化与导出结构
- 群组同步与成员获取功能
- 请求限流与退避重试机制
- 健康检查与状态探针
- 消息反应/表情处理工具
- 贴纸缓存与消息去重功能
- 消息ID格式化与追踪
- TTS语音合成支持
- 消息发送权限校验
- 长文本分块发送
- 操作审批流程
- 常量配置与国际化支持
- 图像视觉分析功能
- 贴纸消息处理
- 登录与配置向导
- 群组上下文缓存
- 网关连接管理
- 配置Schema校验
- 状态问题与安全审计
- 内联按钮与交互组件
- 交互式回调分发
- 联系人与群组目录管理
- 富媒体卡片消息支持
2026-05-12 00:53:13 +08:00

44 lines
1.1 KiB
Python

from __future__ import annotations
import asyncio
import random
import time
class BackoffManager:
def __init__(
self,
base_delay: float = 1.0,
max_delay: float = 60.0,
multiplier: float = 2.0,
jitter: float = 0.1,
):
self._base_delay = base_delay
self._max_delay = max_delay
self._multiplier = multiplier
self._jitter = jitter
self._attempt = 0
self._last_attempt_at: float = 0
def reset(self) -> None:
self._attempt = 0
@property
def attempts(self) -> int:
return self._attempt
def should_reconnect(self, max_attempts: int = 10) -> bool:
return self._attempt < max_attempts
async def wait(self) -> bool:
self._attempt += 1
delay = min(
self._base_delay * (self._multiplier ** (self._attempt - 1)),
self._max_delay,
)
jitter_amount = delay * self._jitter * random.random()
actual_delay = delay + jitter_amount
self._last_attempt_at = time.monotonic()
await asyncio.sleep(actual_delay)
return True