Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-relay/src/lexigram/ai/relay/mappers/gemini.py: 78%
27 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1"""Google Gemini ``generateContent`` request and response mapper.
3Converts the Gemini wire DTOs (:class:`GeminiRequest` /
4:class:`GeminiResponse`) into the canonical relay IR and back. Stream
5conversion is handled by the shared stream lifecycle task and reports
6``unsupported_feature`` until then.
8Request conversion lives in :mod:`gemini_request`; response conversion
9in :mod:`gemini_response`; this module wires both into
10:class:`GeminiMapper`.
11"""
13from __future__ import annotations
15from typing import Any
17from lexigram.ai.relay.context import ConversionContext
18from lexigram.ai.relay.errors import unsupported_feature
19from lexigram.ai.relay.mappers.gemini_request import (
20 _TARGET,
21)
22from lexigram.ai.relay.mappers.gemini_request import (
23 ir_to_request as _ir_to_request,
24)
25from lexigram.ai.relay.mappers.gemini_request import (
26 request_to_ir as _request_to_ir,
27)
28from lexigram.ai.relay.mappers.gemini_response import (
29 ir_to_response as _ir_to_response,
30)
31from lexigram.ai.relay.mappers.gemini_response import (
32 response_to_ir as _response_to_ir,
33)
34from lexigram.contracts.ai.exceptions import RelayError
35from lexigram.contracts.ai.relay.ir import (
36 RelayRequest,
37 RelayResponse,
38 StreamDelta,
39 StreamState,
40)
41from lexigram.contracts.core.result import Err, Result
43__all__ = ["GeminiMapper"]
46class GeminiMapper:
47 """Bidirectional Google Gemini ``generateContent`` converter.
49 Attributes:
50 format: The wire format this mapper handles.
51 """
53 format = _TARGET
55 def request_to_ir(
56 self, payload: Any, *, context: ConversionContext
57 ) -> Result[RelayRequest, RelayError]:
58 """Convert a ``GeminiRequest`` into canonical ``RelayRequest``.
60 Args:
61 payload: A wire request DTO.
62 context: Per-conversion context with loss sink.
64 Returns:
65 Ok(request) on success, Err(relay_error) on malformed payload.
66 """
67 return _request_to_ir(payload, context=context)
69 def ir_to_request(
70 self, request: RelayRequest, *, context: ConversionContext
71 ) -> Result[Any, RelayError]:
72 """Convert canonical ``RelayRequest`` into a ``GeminiRequest``.
74 Args:
75 request: Canonical request IR.
76 context: Per-conversion context with loss sink.
78 Returns:
79 Ok(request) on success, Err(relay_error) on failure.
80 """
81 return _ir_to_request(request, context=context)
83 def response_to_ir(
84 self, payload: Any, *, context: ConversionContext
85 ) -> Result[RelayResponse, RelayError]:
86 """Convert a ``GeminiResponse`` into canonical ``RelayResponse``.
88 Args:
89 payload: A wire response DTO.
90 context: Per-conversion context with loss sink.
92 Returns:
93 Ok(response) on success, Err(relay_error) on malformed payload.
94 """
95 return _response_to_ir(payload, context=context)
97 def ir_to_response(
98 self, response: RelayResponse, *, context: ConversionContext
99 ) -> Result[Any, RelayError]:
100 """Convert canonical ``RelayResponse`` into a ``GeminiResponse``.
102 Args:
103 response: Canonical response IR.
104 context: Per-conversion context with loss sink.
106 Returns:
107 Ok(response) on success, Err(relay_error) on failure.
108 """
109 return _ir_to_response(response, context=context)
111 def stream_to_delta(
112 self, event: Any, *, state: StreamState
113 ) -> Result[tuple[StreamDelta, ...], RelayError]:
114 """Stream conversion is deferred to the shared stream lifecycle task."""
115 return Err(
116 unsupported_feature("gemini stream conversion is not implemented yet")
117 )
119 def delta_to_stream(
120 self, delta: StreamDelta, *, state: StreamState
121 ) -> Result[tuple[Any, ...], RelayError]:
122 """Stream conversion is deferred to the shared stream lifecycle task."""
123 return Err(
124 unsupported_feature("gemini stream conversion is not implemented yet")
125 )