新增 Twitter 和 Viber 两个渠道扩展。 Twitter 渠道扩展功能模块: - auth: OAuth 认证管理 - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - webhook: Webhook 事件处理 - outbound: 外发消息管理 - streaming: 流式消息处理 - pairing: 用户配对与绑定 - security: 安全校验 - dedupe: 消息去重 - monitor: 渠道状态监控 - status: 会话状态管理 - session: 会话管理 - tweets: 推文管理 - social: 社交互动 - reactions: 表情反应 - media: 媒体资源处理 Viber 渠道扩展功能模块: - config: 渠道配置管理 - gateway: SSE/WebSocket 网关接入 - webhook: Webhook 事件处理 - outbound: 外发消息管理 - streaming: 流式消息处理 - pairing: 用户配对与绑定 - security: 安全校验 - dedupe: 消息去重 - monitor: 渠道状态监控 - status: 会话状态管理 - rate_limiter: 速率限制 - media: 媒体资源处理
60 lines
2.8 KiB
Python
60 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import replace
|
|
|
|
from yuxi.channel.streaming.models import (
|
|
BlockReplyChunking,
|
|
BlockReplyCoalescing,
|
|
StreamingConfig,
|
|
)
|
|
|
|
|
|
class ViberStreaming:
|
|
streaming_mode = "block"
|
|
preview_stream_throttle_ms = StreamingConfig.defaults()["preview_stream_throttle_ms"]
|
|
preview_min_initial_chars = StreamingConfig.defaults()["preview_min_initial_chars"]
|
|
|
|
block_streaming_enabled = True
|
|
block_streaming_break = StreamingConfig.defaults()["block_streaming_break"]
|
|
block_streaming_chunk_min_chars = StreamingConfig.defaults()["block_streaming_chunk_min_chars"]
|
|
block_streaming_chunk_max_chars = StreamingConfig.defaults()["block_streaming_chunk_max_chars"]
|
|
block_streaming_chunk_break_preference = StreamingConfig.defaults()["block_streaming_chunk_break_preference"]
|
|
|
|
block_streaming_flush_on_paragraph = False
|
|
block_streaming_coalesce_min_chars = 400
|
|
block_streaming_coalesce_max_chars = 800
|
|
block_streaming_coalesce_idle_ms = StreamingConfig.defaults()["block_streaming_coalesce_idle_ms"]
|
|
|
|
def build_streaming_config(self) -> StreamingConfig:
|
|
return replace(
|
|
StreamingConfig.empty(),
|
|
preview_stream_throttle_ms=self.preview_stream_throttle_ms,
|
|
preview_min_initial_chars=self.preview_min_initial_chars,
|
|
block_streaming_enabled=self.block_streaming_enabled,
|
|
block_streaming_break=self.block_streaming_break,
|
|
block_streaming_chunk_min_chars=self.block_streaming_chunk_min_chars,
|
|
block_streaming_chunk_max_chars=self.block_streaming_chunk_max_chars,
|
|
block_streaming_chunk_break_preference=self.block_streaming_chunk_break_preference,
|
|
block_streaming_flush_on_paragraph=self.block_streaming_flush_on_paragraph,
|
|
block_streaming_coalesce_min_chars=self.block_streaming_coalesce_min_chars,
|
|
block_streaming_coalesce_max_chars=self.block_streaming_coalesce_max_chars,
|
|
block_streaming_coalesce_idle_ms=self.block_streaming_coalesce_idle_ms,
|
|
)
|
|
|
|
def build_chunking_config(self) -> BlockReplyChunking:
|
|
return BlockReplyChunking(
|
|
min_chars=self.block_streaming_chunk_min_chars,
|
|
max_chars=self.block_streaming_chunk_max_chars,
|
|
break_preference=self.block_streaming_chunk_break_preference,
|
|
flush_on_paragraph=self.block_streaming_flush_on_paragraph,
|
|
)
|
|
|
|
def build_coalesce_config(self) -> BlockReplyCoalescing:
|
|
return BlockReplyCoalescing(
|
|
min_chars=self.block_streaming_coalesce_min_chars,
|
|
max_chars=self.block_streaming_coalesce_max_chars,
|
|
idle_ms=self.block_streaming_coalesce_idle_ms,
|
|
joiner="",
|
|
flush_on_enqueue=False,
|
|
)
|