language-learning-app/api/app/tasks/adventure.py
wilson fecb5839ea
Some checks failed
/ test (push) Has been cancelled
feats: use Procrastinate for persistant jobs; try using Gemini for text
generation
2026-05-27 18:45:52 +01:00

75 lines
2.7 KiB
Python

import logging
import uuid
from ..config import settings
from ..domain.services.adventure_service import AdventureService
from ..outbound.anthropic.anthropic_client import AnthropicClient
from ..outbound.deepl.deepl_client import DeepLClient
from ..outbound.gemini.gemini_client import GeminiClient
from ..outbound.postgres.database import AsyncSessionLocal
from ..outbound.postgres.repositories.adventure_repository import (
PostgresAdventureEntryAudioRepository,
PostgresAdventureEntryChoiceRepository,
PostgresAdventureEntryDecisionRepository,
PostgresAdventureEntryRepository,
PostgresAdventureEntryTranslationRepository,
PostgresAdventureRepository,
)
from ..outbound.spacy.spacy_client import SpacyClient
from ..outbound.stubs import (
StubAnthropicClient,
StubDeepLClient,
StubGeminiClient,
StubSpacyClient,
)
from .app import procrastinate_app
logger = logging.getLogger(__name__)
def _make_adventure_service(db) -> AdventureService:
if settings.stub_generation:
anthropic = StubAnthropicClient() # type: ignore[assignment]
gemini = StubAnthropicClient() # type: ignore[assignment]
deepl = StubDeepLClient() # type: ignore[assignment]
gemini = StubGeminiClient() # type: ignore[assignment]
spacy = StubSpacyClient() # type: ignore[assignment]
else:
anthropic = AnthropicClient.new(settings.anthropic_api_key)
gemini = GeminiClient.new(settings.gemini_api_key)
deepl = DeepLClient(settings.deepl_api_key)
gemini = GeminiClient(settings.gemini_api_key)
spacy = SpacyClient()
gen_ai_client = gemini
if settings.story_generation_api_provider == "anthropic":
gen_ai_client = anthropic
return AdventureService(
adventure_repo=PostgresAdventureRepository(db),
entry_repo=PostgresAdventureEntryRepository(db),
choice_repo=PostgresAdventureEntryChoiceRepository(db),
decision_repo=PostgresAdventureEntryDecisionRepository(db),
translation_repo=PostgresAdventureEntryTranslationRepository(db),
audio_repo=PostgresAdventureEntryAudioRepository(db),
gen_ai_client=gen_ai_client,
deepl_client=deepl,
gemini_client=gemini,
spacy_client=spacy,
)
@procrastinate_app.task(queue="adventure_pipeline")
async def generate_adventure_entry(
adventure_id: str, entry_id: str, user_id: str
) -> None:
print(
f"Starting task for adventure_id={adventure_id}, entry_id={entry_id}, user_id={user_id}"
)
async with AsyncSessionLocal() as db:
service = _make_adventure_service(db)
await service.run_entry_pipeline(
uuid.UUID(adventure_id),
uuid.UUID(entry_id),
uuid.UUID(user_id),
)