1"""Relay gateway module for dependency injection."""
2
3from __future__ import annotations
4
5from typing import TYPE_CHECKING
6
7from lexigram.contracts.ai.relay import RelayGatewayProtocol
8from lexigram.di.module import DynamicModule, Module, module
9
10if TYPE_CHECKING:
11 from lexigram.ai.relay.gateway.config import RelayGatewayConfig
12
13__all__ = ["RelayGatewayModule"]
14
15
16@module
17class RelayGatewayModule(Module):
18 """Protocol-facing relay gateway module for Lexigram applications.
19
20 Provides the relay gateway behind the :class:`RelayGatewayProtocol`
21 contract: channel selection, orchestration, upstream I/O, and SSE
22 handling. The :class:`RelayGatewayProvider` composes the gateway
23 from caller-owned config, conversion engine, and HTTP client.
24
25 Usage::
26
27 from lexigram.ai.relay.gateway import RelayGatewayModule
28
29 @module(
30 imports=[RelayGatewayModule.configure()]
31 )
32 class AppModule(Module):
33 pass
34 """
35
36 @classmethod
37 def configure(cls, config: RelayGatewayConfig | None = None) -> DynamicModule:
38 """Create a RelayGatewayModule with the built-in gateway routes.
39
40 Args:
41 config: Static gateway configuration (channel table, model
42 suffixes, auto-test flags, job TTL). Defaults to an empty
43 configuration when omitted.
44
45 Returns:
46 A :class:`~lexigram.di.module.DynamicModule` descriptor.
47 """
48 from lexigram.ai.relay.gateway.di.provider import RelayGatewayProvider
49 from lexigram.ai.relay.gateway.operations.controls import RelayControlsService
50 from lexigram.ai.relay.gateway.operations.health import RelayHealthService
51 from lexigram.ai.relay.gateway.operations.metrics import RelayMetricsService
52
53 return DynamicModule(
54 module=cls,
55 providers=[RelayGatewayProvider(config=config)],
56 exports=[
57 RelayGatewayProtocol,
58 RelayHealthService,
59 RelayMetricsService,
60 RelayControlsService,
61 ],
62 )