Фиксация изменений

This commit is contained in:
2026-03-05 11:03:17 +03:00
parent 1ef0b4d68c
commit 417b8b6f72
261 changed files with 8215 additions and 332 deletions

View File

@@ -1,13 +1,16 @@
from __future__ import annotations
import os
from typing import TYPE_CHECKING
from fastapi import APIRouter, Header
from fastapi.responses import StreamingResponse
from app.core.exceptions import AppError
from app.modules.chat.direct_service import CodeExplainChatService
from app.modules.chat.dialog_store import DialogSessionStore
from app.modules.chat.repository import ChatRepository
from app.modules.chat.service import ChatOrchestrator
from app.modules.chat.task_store import TaskStore
from app.modules.contracts import AgentRunner
from app.modules.rag_session.session_store import RagSessionStore
from app.modules.shared.event_bus import EventBus
from app.modules.shared.idempotency_store import IdempotencyStore
from app.modules.shared.retry_executor import RetryExecutor
@@ -20,6 +23,11 @@ from app.schemas.chat import (
)
from app.schemas.common import ModuleName
if TYPE_CHECKING:
from app.modules.chat.repository import ChatRepository
from app.modules.contracts import AgentRunner
from app.modules.rag_session.session_store import RagSessionStore
class ChatModule:
def __init__(
@@ -29,12 +37,16 @@ class ChatModule:
retry: RetryExecutor,
rag_sessions: RagSessionStore,
repository: ChatRepository,
direct_chat: CodeExplainChatService | None = None,
task_store: TaskStore | None = None,
) -> None:
self._rag_sessions = rag_sessions
self.tasks = TaskStore()
self._simple_code_explain_only = os.getenv("SIMPLE_CODE_EXPLAIN_ONLY", "true").lower() in {"1", "true", "yes"}
self.tasks = task_store or TaskStore()
self.dialogs = DialogSessionStore(repository)
self.idempotency = IdempotencyStore()
self.events = event_bus
self.direct_chat = direct_chat
self.chat = ChatOrchestrator(
task_store=self.tasks,
dialogs=self.dialogs,
@@ -59,11 +71,13 @@ class ChatModule:
rag_session_id=dialog.rag_session_id,
)
@router.post("/api/chat/messages", response_model=TaskQueuedResponse)
@router.post("/api/chat/messages", response_model=TaskQueuedResponse | TaskResultResponse)
async def send_message(
request: ChatMessageRequest,
idempotency_key: str | None = Header(default=None, alias="Idempotency-Key"),
) -> TaskQueuedResponse:
) -> TaskQueuedResponse | TaskResultResponse:
if self._simple_code_explain_only and self.direct_chat is not None:
return await self.direct_chat.handle_message(request)
task = await self.chat.enqueue_message(request, idempotency_key)
return TaskQueuedResponse(task_id=task.task_id, status=task.status.value)