137 lines
7.5 KiB
Python
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,
|
|
)
|