From 38c9c838ed2ac981bfbfa5d09f2cdbf37796513a Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Fri, 25 Jul 2025 13:07:06 +0300 Subject: [PATCH] [+] let payloads app reuse summarizer 1. add rest_client to transform app; 2. wrap summarizer client inside payloads with domain and protocol configured via settings; 3. update view to request summary generation per each input list inside POST:/payloads --- .../payloads/settings.py | 4 +++ .../payloads/summarizer.py | 18 ++++++++++ .../test_task_2025_07_17_v2/payloads/views.py | 16 +++++++-- .../transform/rest_client.py | 36 +++++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/summarizer.py create mode 100644 deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/transform/rest_client.py diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/settings.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/settings.py index d672a70..c80fe90 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/settings.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/settings.py @@ -4,6 +4,7 @@ import pydantic_settings from typing import ( ClassVar, Optional, + Literal, ) @@ -12,6 +13,9 @@ class Settings(pydantic_settings.BaseSettings): _singleton: ClassVar[Optional['Settings']] = None + summarizer_domain: str + summarizer_protocol: Literal['http', 'https'] + @classmethod def singleton(cls) -> 'Settings': if cls._singleton is None: diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/summarizer.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/summarizer.py new file mode 100644 index 0000000..9321e4c --- /dev/null +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/summarizer.py @@ -0,0 +1,18 @@ +from ..transform import rest_client as summarizer_rest_client +from ..transform.rest_client import SummaryRequest +from .settings import Settings as ModelSettings + +from typing import (ClassVar, Optional,) + +class SummarizerClient: + _summarizer_client : ClassVar[Optional[summarizer_rest_client.SummarizerClient]] = None + + @classmethod + def singleton(cls) -> summarizer_rest_client.SummarizerClient: + if cls._summarizer_client is None: + cls._summarizer_client = summarizer_rest_client.SummarizerClient( + domain=ModelSettings.singleton().summarizer_domain, + protocol=ModelSettings.singleton().summarizer_protocol, + ) + + return cls._summarizer_client diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py index 5af68a6..2bce61d 100644 --- a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py @@ -2,10 +2,11 @@ import fastapi from typing import (Annotated, Any,) from . import schema +from .summarizer import SummarizerClient, SummaryRequest router = fastapi.APIRouter() -@router.post('payload') +@router.post('/payload') async def payload_create( list_1: Annotated[ list[str], @@ -16,9 +17,20 @@ async def payload_create( fastapi.Body(), ], ) -> schema.Payload: + data_1 = await SummarizerClient.singleton().summarize_post( + request=SummaryRequest( + data=list_1 + ) + ) + data_2 = await SummarizerClient.singleton().summarize_post( + request=SummaryRequest( + data=list_2 + ) + ) + raise NotImplementedError -@router.get('payload/{paylaod_id}') +@router.get('/payload/{paylaod_id}') async def payload_read( payload_id: int, ) -> schema.Payload: diff --git a/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/transform/rest_client.py b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/transform/rest_client.py new file mode 100644 index 0000000..13a52fa --- /dev/null +++ b/deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/transform/rest_client.py @@ -0,0 +1,36 @@ +import asyncio +import json +import aiohttp +import logging + +from .schema import Summary, SummaryRequest + +from typing import (Literal,) + + +logger = logging.getLogger(__name__) + +class SummarizerClient: + def __init__( + self, + domain: str, + protocol: Literal['http', 'https'] = 'http', + ) -> None: + self.domain = domain + self.protocol = protocol + + async def summarize_post( + self, + request: SummaryRequest, + ) -> Summary: + async with aiohttp.ClientSession() as session: + async with session.post( + '{}://{}/summarize'.format(self.protocol, self.domain), + json=json.loads(request.json()), + ) as response: + data_json = await response.text() + data = Summary.model_validate_json( + data_json, + ) + + return data