diff --git a/apps/backend/chatballs/ai/invocation.py b/apps/backend/chatballs/ai/invocation.py index f1e443c..cb9fa37 100644 --- a/apps/backend/chatballs/ai/invocation.py +++ b/apps/backend/chatballs/ai/invocation.py @@ -31,6 +31,7 @@ from chatballs.ai.provider.base import ( from chatballs.ai.provider.factory import get_provider from chatballs.ai.provider.resilience import CircuitBreaker, call_with_resilience + # Предохранитель считает сбои по ключу «организация + интеграция»: провайдер у # каждой организации свой, и отозванный ключ одной не имеет отношения к AI # остальных. Общий на процесс предохранитель гасил AI у всех сразу. diff --git a/apps/backend/chatballs/ai/provider/openai_http.py b/apps/backend/chatballs/ai/provider/openai_http.py index 77d4a4a..a318bc6 100644 --- a/apps/backend/chatballs/ai/provider/openai_http.py +++ b/apps/backend/chatballs/ai/provider/openai_http.py @@ -38,17 +38,11 @@ import urllib.error import urllib.request from chatballs.ai.provider.base import ( - ChatMessage, - ChatResult, - EmbeddingResult, - ProviderError, - ProviderRejected, - ) from chatballs.i18n import t from chatballs.integrations.proxy import build_opener diff --git a/apps/backend/chatballs/conversations/apps.py b/apps/backend/chatballs/conversations/apps.py index a6d0b6f..fe136b3 100644 --- a/apps/backend/chatballs/conversations/apps.py +++ b/apps/backend/chatballs/conversations/apps.py @@ -9,5 +9,7 @@ class ConversationsConfig(AppConfig): def ready(self) -> None: # Свежесть диалога поддерживает сигнал: сообщения создаются в семи местах. - from chatballs.conversations import signals # noqa: F401 - from chatballs.conversations import event_handlers # noqa: F401 (register outbox handlers) + from chatballs.conversations import ( + event_handlers, # noqa: F401 (register outbox handlers) + signals, # noqa: F401 + ) diff --git a/apps/backend/chatballs/conversations/test_email_transport.py b/apps/backend/chatballs/conversations/test_email_transport.py index f7368ee..5da6b95 100644 --- a/apps/backend/chatballs/conversations/test_email_transport.py +++ b/apps/backend/chatballs/conversations/test_email_transport.py @@ -19,7 +19,6 @@ from chatballs.conversations.transports.errors import PollFailed from chatballs.identity.bootstrap import bootstrap_owner from chatballs.identity.models import Organization from chatballs.integrations.models import Integration, IntegrationKind, IntegrationProvider - from chatballs.testing import ai_answer, run_pending_ai_turns EMAIL_CONFIG = { diff --git a/apps/backend/chatballs/conversations/test_lifecycle.py b/apps/backend/chatballs/conversations/test_lifecycle.py index d6db42f..1399b89 100644 --- a/apps/backend/chatballs/conversations/test_lifecycle.py +++ b/apps/backend/chatballs/conversations/test_lifecycle.py @@ -22,7 +22,8 @@ from chatballs.integrations.models import ( IntegrationKind, IntegrationProvider, ) -from chatballs.testing import TenantAPIClient as APIClient, run_pending_ai_turns +from chatballs.testing import TenantAPIClient as APIClient +from chatballs.testing import run_pending_ai_turns def _connection(channel: Channel) -> Integration: diff --git a/apps/backend/chatballs/conversations/test_voice_ai_and_features.py b/apps/backend/chatballs/conversations/test_voice_ai_and_features.py index 8fd3119..4d4811d 100644 --- a/apps/backend/chatballs/conversations/test_voice_ai_and_features.py +++ b/apps/backend/chatballs/conversations/test_voice_ai_and_features.py @@ -9,6 +9,7 @@ from django.test import TestCase from chatballs.ai.models import AIAgent, AIAgentStatus from chatballs.ai.provider.base import ProviderError from chatballs.channels.models import Channel +from chatballs.conversations import ai_turn from chatballs.conversations.ingest import ingest_inbound from chatballs.conversations.models import ControlMode, MessageAuthor, MessageKind, TranscriptStatus from chatballs.conversations.transports.base import InboundMessage @@ -16,8 +17,8 @@ from chatballs.identity.bootstrap import bootstrap_owner from chatballs.identity.models import Organization from chatballs.integrations.models import Integration, IntegrationKind, IntegrationProvider from chatballs.tenancy.database import tenant_atomic -from chatballs.conversations import ai_turn -from chatballs.testing import TenantAPIClient as APIClient, ai_answer, run_pending_ai_turns +from chatballs.testing import TenantAPIClient as APIClient +from chatballs.testing import ai_answer, run_pending_ai_turns class VoiceAiReplyTests(TestCase): diff --git a/apps/backend/chatballs/conversations/tests.py b/apps/backend/chatballs/conversations/tests.py index d888f97..dfc339d 100644 --- a/apps/backend/chatballs/conversations/tests.py +++ b/apps/backend/chatballs/conversations/tests.py @@ -27,8 +27,8 @@ from chatballs.identity.models import ( ) from chatballs.integrations.models import Integration, IntegrationKind, IntegrationProvider from chatballs.notifications.models import Notification, NotificationAudience, NotificationType -from chatballs.testing import ai_answer, ai_failure, run_pending_ai_turns from chatballs.testing import TenantAPIClient as APIClient +from chatballs.testing import ai_answer, ai_failure, run_pending_ai_turns def _messenger_connection(channel): diff --git a/apps/backend/chatballs/events/services.py b/apps/backend/chatballs/events/services.py index c643801..9b1f025 100644 --- a/apps/backend/chatballs/events/services.py +++ b/apps/backend/chatballs/events/services.py @@ -12,7 +12,6 @@ from chatballs.identity.models import OrganizationMembership from chatballs.tenancy.context import TenantActorKind, TenantContext from chatballs.tenancy.lookup import load_organization - # Где живёт outbox. Захват идёт по всем организациям сразу, поэтому читает и # отмечает события роль platform, а не app (chatballs.tenancy.routing). OUTBOX_DB = "platform" diff --git a/apps/backend/chatballs/integrations/checking.py b/apps/backend/chatballs/integrations/checking.py index d94acf0..d97dbc1 100644 --- a/apps/backend/chatballs/integrations/checking.py +++ b/apps/backend/chatballs/integrations/checking.py @@ -7,7 +7,6 @@ from chatballs.integrations.models import Integration, IntegrationProvider, Inte from chatballs.integrations.runtime import advance_revision_after_successful_check from chatballs.tenancy.context import TenantContext - _CHECKS = { IntegrationProvider.OPENROUTER: checks.check_openrouter, IntegrationProvider.CUSTOM: checks.check_custom,