[+] add caching of generated payloads

1. fix session persistence
    with using Generator as Depends method;
  2. implement payload_get_or_create method;
This commit is contained in:
Siarhei Siniak 2025-07-28 10:39:08 +03:00
parent 4491b1b05a
commit a5b19cfe2a
4 changed files with 85 additions and 9 deletions

@ -1,12 +1,25 @@
import fastapi
from ..payloads.settings import Settings as ModelsSettings
import sqlalchemy.ext.asyncio
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
from typing import (Annotated, Generator,)
def create_engine() -> 'async_sessionmaker[AsyncSession]':
def create_engine() -> Generator[
'async_sessionmaker[AsyncSession]',
None,
None,
]:
engine = sqlalchemy.ext.asyncio.create_async_engine(ModelsSettings.singleton().db_url)
async_session = sqlalchemy.ext.asyncio.async_sessionmaker(engine)
return async_session
yield async_session
AsyncSessionDep = Annotated[
'async_sessionmaker[AsyncSession]',
fastapi.Depends(create_engine)
]

@ -9,7 +9,7 @@ import uvicorn.config
import sys
from .settings import Settings as APISettings
from .db import create_engine
# from .db import create_engine, async_session
from ..payloads.views import router as payloads_router
# from .websocket_api import WebsocketAPI
@ -46,13 +46,17 @@ logger = logging.getLogger(__name__)
def create_app() -> fastapi.FastAPI:
async_session = create_engine()
# async_session = create_engine()
# websocket_api = WebsocketAPI(
# session=async_session,
# )
app = fastapi.FastAPI()
app = fastapi.FastAPI(
# dependencies=[
# fastapi.Depends(async_session),
# ]
)
logger.info(dict(msg='started loading apps'))
for app_config in APISettings.singleton().apps:

@ -1,4 +1,6 @@
import datetime
import hashlib
import json
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
@ -8,6 +10,30 @@ from sqlalchemy.future import select
from .models import Payload
from .utils import get_or_create
from typing import (Optional, Any,)
async def payload_get_or_create(
session: AsyncSession,
output: list[str],
list_1: list[str],
list_2: list[str],
input_hash: Optional[str] = None,
):
if input_hash is None:
input_hash = hashlib.sha256(json.dumps(dict(
list_1=list_1,
list_2=list_2,
)).encode('utf-8')).digest().hex()
return await get_or_create(
session,
Payload,
output=output,
list_1=list_1,
list_2=list_2,
input_hash=input_hash,
)
# async def markets_get_by_symbol(
# session: 'async_sessionmaker[AsyncSession]',
# symbols: set[str],

@ -1,8 +1,13 @@
import fastapi
import itertools
from typing import (Annotated, Any,)
from typing import (Annotated, Any, cast, Optional,)
from . import schema
from .summarizer import SummarizerClient, SummaryRequest
from ..async_api.db import AsyncSessionDep
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker
from . import logic
router = fastapi.APIRouter()
@ -16,16 +21,44 @@ async def payload_create(
list[str],
fastapi.Body(),
],
session: AsyncSessionDep
) -> schema.Payload:
data_1 = await SummarizerClient.singleton().summarize_post(
data_1 = (await SummarizerClient.singleton().summarize_post(
request=SummaryRequest(
data=list_1
)
)
data_2 = await SummarizerClient.singleton().summarize_post(
)).data
data_2 = (await SummarizerClient.singleton().summarize_post(
request=SummaryRequest(
data=list_2
)
)).data
output_len = max(len(data_1), len(data_2))
def filter_none(o: Any) -> bool:
return o is not None
output = list(
filter(
filter_none,
sum(
list(
itertools.zip_longest(data_1, data_2),
),
cast(tuple[str], tuple()),
)
)
)
async with session() as active_session:
async with active_session.begin() as transaction:
payload, is_created = await logic.payload_get_or_create(
active_session,
list_1=list_1,
list_2=list_2,
output=output,
)
raise NotImplementedError