ForcePilot/backend/package/yuxi/channel/application/pipeline/builder.py

63 lines
2.7 KiB
Python
Raw Normal View History

from __future__ import annotations
from yuxi.channel.application.pipeline.middlewares.access_policy_middleware import AccessPolicyMiddleware
from yuxi.channel.application.pipeline.middlewares.auth_middleware import AuthMiddleware
from yuxi.channel.application.pipeline.middlewares.dedup_middleware import DedupMiddleware
from yuxi.channel.application.pipeline.middlewares.enqueue_mq_middleware import EnqueueMQMiddleware
from yuxi.channel.application.pipeline.middlewares.keyword_filter_middleware import KeywordFilterMiddleware
from yuxi.channel.application.pipeline.middlewares.mention_gate_middleware import MentionGateMiddleware
from yuxi.channel.application.pipeline.middlewares.rate_limit_middleware import RateLimitMiddleware
from yuxi.channel.application.pipeline.middlewares.validation_middleware import ValidationMiddleware
from yuxi.channel.application.service.auth_service import AuthService
from yuxi.channel.domain.port.keyword_matcher_port import KeywordMatcherPort
from yuxi.channel.domain.port.metrics_port import MetricsPort
from yuxi.channel.domain.port.queue_port import QueuePort
from yuxi.channel.domain.port.rate_limit_port import RateLimitPort
from yuxi.channel.domain.port.signature_verify_port import SignatureVerifyPort
from yuxi.channel.domain.port.cache_port import CachePort
from yuxi.channel.domain.service.pipeline import Pipeline
from yuxi.channel.domain.service.pipeline_builder import PipelineBuilder
def build_inbound_pipeline(
auth_service: AuthService,
cache_port: CachePort,
rate_limit_port: RateLimitPort,
queue_port: QueuePort,
*,
keyword_matcher: KeywordMatcherPort | None = None,
signature_verifier: SignatureVerifyPort | None = None,
metrics: MetricsPort | None = None,
channel_config: dict | None = None,
bot_id: str | None = None,
) -> Pipeline:
config = channel_config or {}
mention_gate = MentionGateMiddleware()
if bot_id:
mention_gate.set_bot_id(bot_id)
if keyword_matcher is None:
from yuxi.channel.infrastructure.matching.aho_corasick_matcher import AhoCorasickMatcher
keyword_matcher = AhoCorasickMatcher(set(config.get("keyword_blocklist") or []))
return (
PipelineBuilder()
.add(AuthMiddleware(auth_service))
.add(
ValidationMiddleware(
signature_verifier=signature_verifier,
allow_from=config.get("allow_from", {}),
)
)
.add(KeywordFilterMiddleware(keyword_matcher))
.add(DedupMiddleware(cache_port))
.add(RateLimitMiddleware(rate_limit_port))
.add(AccessPolicyMiddleware(policies=config.get("access_policies", {})))
.add(mention_gate)
.add(EnqueueMQMiddleware(queue_port))
.metrics(metrics)
.build()
)