Files
agent/src/app/modules/application.py
T
2026-03-27 15:51:10 +03:00

137 lines
7.5 KiB
Python

from pathlib import Path
from app.modules.agent.llm import AgentLlmService
from app.modules.agent.llm.prompt_loader import PromptLoader
from app.modules.agent.intent_router_v2 import IntentRouterV2
from app.modules.agent.runtime import DocsQAPipelineRunner
from app.modules.agent.runtime.steps.retrieval import RuntimeRepoContextFactory, RuntimeRetrievalAdapter
from app.modules.agent.task_runtime import ContextEnrichmentService, DocumentationTemplateRegistry, TaskRuntimeContextBuilder
from app.modules.agent.task_runtime.workflows import (
DocumentationGenerationWorkflow,
DocsQaWorkflow,
FallbackWorkflow,
OpenApiWorkflow,
)
from app.modules.agent.task_runtime.workflows.general_qa import GeneralQaWorkflow
from app.modules.agent_api import AgentApiModule
from app.modules.agent_api.application.request_service import RequestService
from app.modules.agent_api.application.session_service import SessionService
from app.modules.agent_api.application.stream_service import StreamService
from app.modules.agent_api.infrastructure.ids.request_id_factory import RequestIdFactory
from app.modules.agent_api.infrastructure.ids.session_id_factory import SessionIdFactory
from app.modules.agent_api.infrastructure.logging.request_trace_logger import RequestTraceLogger
from app.modules.agent_api.infrastructure.stores.in_memory_request_store import InMemoryRequestStore
from app.modules.agent_api.infrastructure.stores.in_memory_session_store import InMemorySessionStore
from app.modules.agent_api.infrastructure.streaming.sse_event_channel import SseEventChannel
from app.modules.orchestration import OrchestrationFacade
from app.modules.orchestration.adapters.intent_router_adapter import IntentRouterAdapter
from app.modules.orchestration.adapters.llm_chat_adapter import LlmChatAdapter
from app.modules.orchestration.messaging.client_message_publisher import ClientMessagePublisher
from app.modules.orchestration.processes.registry import ProcessRegistry
from app.modules.orchestration.processes.v1.process import V1Process
from app.modules.orchestration.processes.v1.steps.bootstrap_step import BootstrapStep
from app.modules.orchestration.processes.v1.steps.finalize_step import FinalizeStep
from app.modules.orchestration.processes.v1.steps.run_llm_step import RunLlmStep
from app.modules.orchestration.processes.v2.process import V2Process
from app.modules.orchestration.processes.v2.steps.execute_documentation_workflow_step import ExecuteDocumentationWorkflowStep
from app.modules.orchestration.processes.v2.steps.execute_fallback_workflow_step import ExecuteFallbackWorkflowStep
from app.modules.orchestration.processes.v2.steps.execute_general_qa_workflow_step import ExecuteGeneralQaWorkflowStep
from app.modules.orchestration.processes.v2.steps.execute_openapi_workflow_step import ExecuteOpenApiWorkflowStep
from app.modules.orchestration.processes.v2.steps.route_intent_step import RouteIntentStep
from app.modules.orchestration.runtime.process_runner import ProcessRunner
from app.modules.rag.persistence.repository import RagRepository
from app.modules.agent.runtime.story_context_repository import StoryContextRepository, StoryContextSchemaRepository
from app.modules.rag.module import RagModule, RagRepoModule
from app.modules.shared.bootstrap import bootstrap_database
from app.modules.shared.event_bus import EventBus
from app.modules.shared.retry_executor import RetryExecutor
class ModularApplication:
def __init__(self) -> None:
self.events = EventBus()
self.retry = RetryExecutor()
self.rag_repository = RagRepository()
self.story_context_schema_repository = StoryContextSchemaRepository()
self.story_context_repository = StoryContextRepository()
self.rag = RagModule(event_bus=self.events, retry=self.retry, repository=self.rag_repository)
self.rag_repo = RagRepoModule(
story_context_repository=self.story_context_repository,
rag_repository=self.rag_repository,
)
from app.modules.shared.gigachat.client import GigaChatClient
from app.modules.shared.gigachat.settings import GigaChatSettings
from app.modules.shared.gigachat.token_provider import GigaChatTokenProvider
_giga_settings = GigaChatSettings.from_env()
_giga_client = GigaChatClient(_giga_settings, GigaChatTokenProvider(_giga_settings))
_prompt_loader = PromptLoader()
self._agent_llm = AgentLlmService(client=_giga_client, prompts=_prompt_loader)
_router = IntentRouterV2()
_retrieval = RuntimeRetrievalAdapter(self.rag_repository)
_repo_context_factory = RuntimeRepoContextFactory()
_docs_runner = DocsQAPipelineRunner(
router=_router,
retrieval_adapter=_retrieval,
repo_context=_repo_context_factory.build(),
llm=self._agent_llm,
)
_task_context_builder = TaskRuntimeContextBuilder(_repo_context_factory)
_context_enrichment = ContextEnrichmentService()
_docs_workflow = DocsQaWorkflow(_docs_runner)
_openapi_workflow = OpenApiWorkflow(_docs_runner)
_general_qa_workflow = GeneralQaWorkflow(_docs_runner)
_fallback_workflow = FallbackWorkflow(self._agent_llm)
_docs_generation_workflow = DocumentationGenerationWorkflow(self._agent_llm, DocumentationTemplateRegistry())
self._docs_generation_workflow = _docs_generation_workflow
self.agent_sessions = InMemorySessionStore()
self.agent_requests = InMemoryRequestStore()
self.agent_events = SseEventChannel()
self.agent_trace_logger = RequestTraceLogger(Path("runtime_traces/agent_requests"))
_publisher = ClientMessagePublisher(self.agent_events, self.agent_trace_logger)
_process_registry = ProcessRegistry(
V1Process([BootstrapStep(), RunLlmStep(LlmChatAdapter(self._agent_llm)), FinalizeStep()]),
V2Process(
[
BootstrapStep(),
RouteIntentStep(IntentRouterAdapter(_router), _task_context_builder, _context_enrichment),
ExecuteDocumentationWorkflowStep(_docs_workflow, "workflow_documentation_explain"),
ExecuteOpenApiWorkflowStep(_openapi_workflow, "workflow_openapi_generation"),
ExecuteGeneralQaWorkflowStep(_general_qa_workflow, "workflow_general_qa"),
ExecuteFallbackWorkflowStep(_fallback_workflow, "workflow_fallback"),
FinalizeStep(),
]
),
)
_orchestration = OrchestrationFacade(
request_store=self.agent_requests,
process_registry=_process_registry,
process_runner=ProcessRunner(),
publisher=_publisher,
trace_logger=self.agent_trace_logger,
)
_session_service = SessionService(
store=self.agent_sessions,
ids=SessionIdFactory(),
rag_session_exists=lambda rag_session_id: self.rag.sessions.get(rag_session_id) is not None,
)
_request_service = RequestService(
request_store=self.agent_requests,
request_ids=RequestIdFactory(),
sessions=_session_service,
orchestration=_orchestration,
)
self.agent_api = AgentApiModule(
sessions=_session_service,
requests=_request_service,
streams=StreamService(self.agent_events, request_exists=lambda request_id: self.agent_requests.get(request_id) is not None),
)
def startup(self) -> None:
bootstrap_database(
self.rag_repository,
self.story_context_schema_repository,
)