django-cfg 1.1.82__py3-none-any.whl → 1.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_cfg/__init__.py +20 -448
- django_cfg/apps/accounts/README.md +3 -3
- django_cfg/apps/accounts/admin/__init__.py +0 -2
- django_cfg/apps/accounts/admin/activity.py +2 -9
- django_cfg/apps/accounts/admin/filters.py +0 -42
- django_cfg/apps/accounts/admin/inlines.py +8 -8
- django_cfg/apps/accounts/admin/otp.py +5 -5
- django_cfg/apps/accounts/admin/registration_source.py +1 -8
- django_cfg/apps/accounts/admin/user.py +12 -20
- django_cfg/apps/accounts/managers/user_manager.py +2 -129
- django_cfg/apps/accounts/migrations/0006_remove_twilioresponse_otp_secret_and_more.py +46 -0
- django_cfg/apps/accounts/models.py +3 -123
- django_cfg/apps/accounts/serializers/otp.py +40 -44
- django_cfg/apps/accounts/serializers/profile.py +0 -2
- django_cfg/apps/accounts/services/otp_service.py +98 -186
- django_cfg/apps/accounts/signals.py +25 -15
- django_cfg/apps/accounts/utils/auth_email_service.py +84 -0
- django_cfg/apps/accounts/views/otp.py +35 -36
- django_cfg/apps/agents/README.md +129 -0
- django_cfg/apps/agents/__init__.py +68 -0
- django_cfg/apps/agents/admin/__init__.py +17 -0
- django_cfg/apps/agents/admin/execution_admin.py +460 -0
- django_cfg/apps/agents/admin/registry_admin.py +360 -0
- django_cfg/apps/agents/admin/toolsets_admin.py +482 -0
- django_cfg/apps/agents/apps.py +29 -0
- django_cfg/apps/agents/core/__init__.py +20 -0
- django_cfg/apps/agents/core/agent.py +281 -0
- django_cfg/apps/agents/core/dependencies.py +154 -0
- django_cfg/apps/agents/core/exceptions.py +66 -0
- django_cfg/apps/agents/core/models.py +106 -0
- django_cfg/apps/agents/core/orchestrator.py +391 -0
- django_cfg/apps/agents/examples/__init__.py +3 -0
- django_cfg/apps/agents/examples/simple_example.py +161 -0
- django_cfg/apps/agents/integration/__init__.py +14 -0
- django_cfg/apps/agents/integration/middleware.py +80 -0
- django_cfg/apps/agents/integration/registry.py +345 -0
- django_cfg/apps/agents/integration/signals.py +50 -0
- django_cfg/apps/agents/management/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/__init__.py +3 -0
- django_cfg/apps/agents/management/commands/create_agent.py +365 -0
- django_cfg/apps/agents/management/commands/orchestrator_status.py +191 -0
- django_cfg/apps/agents/managers/__init__.py +23 -0
- django_cfg/apps/agents/managers/execution.py +236 -0
- django_cfg/apps/agents/managers/registry.py +254 -0
- django_cfg/apps/agents/managers/toolsets.py +496 -0
- django_cfg/apps/agents/migrations/0001_initial.py +286 -0
- django_cfg/apps/agents/migrations/__init__.py +5 -0
- django_cfg/apps/agents/models/__init__.py +15 -0
- django_cfg/apps/agents/models/execution.py +215 -0
- django_cfg/apps/agents/models/registry.py +220 -0
- django_cfg/apps/agents/models/toolsets.py +305 -0
- django_cfg/apps/agents/patterns/__init__.py +24 -0
- django_cfg/apps/agents/patterns/content_agents.py +234 -0
- django_cfg/apps/agents/toolsets/__init__.py +15 -0
- django_cfg/apps/agents/toolsets/cache_toolset.py +285 -0
- django_cfg/apps/agents/toolsets/django_toolset.py +220 -0
- django_cfg/apps/agents/toolsets/file_toolset.py +324 -0
- django_cfg/apps/agents/toolsets/orm_toolset.py +319 -0
- django_cfg/apps/agents/urls.py +46 -0
- django_cfg/apps/knowbase/README.md +150 -0
- django_cfg/apps/knowbase/__init__.py +27 -0
- django_cfg/apps/knowbase/admin/__init__.py +23 -0
- django_cfg/apps/knowbase/admin/archive_admin.py +857 -0
- django_cfg/apps/knowbase/admin/chat_admin.py +386 -0
- django_cfg/apps/knowbase/admin/document_admin.py +650 -0
- django_cfg/apps/knowbase/admin/external_data_admin.py +685 -0
- django_cfg/apps/knowbase/apps.py +81 -0
- django_cfg/apps/knowbase/config/README.md +176 -0
- django_cfg/apps/knowbase/config/__init__.py +51 -0
- django_cfg/apps/knowbase/config/constance_fields.py +186 -0
- django_cfg/apps/knowbase/config/constance_settings.py +200 -0
- django_cfg/apps/knowbase/config/settings.py +450 -0
- django_cfg/apps/knowbase/examples/__init__.py +3 -0
- django_cfg/apps/knowbase/examples/external_data_usage.py +191 -0
- django_cfg/apps/knowbase/management/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/__init__.py +0 -0
- django_cfg/apps/knowbase/management/commands/knowbase_stats.py +158 -0
- django_cfg/apps/knowbase/management/commands/setup_knowbase.py +59 -0
- django_cfg/apps/knowbase/managers/__init__.py +22 -0
- django_cfg/apps/knowbase/managers/archive.py +426 -0
- django_cfg/apps/knowbase/managers/base.py +32 -0
- django_cfg/apps/knowbase/managers/chat.py +141 -0
- django_cfg/apps/knowbase/managers/document.py +203 -0
- django_cfg/apps/knowbase/managers/external_data.py +471 -0
- django_cfg/apps/knowbase/migrations/0001_initial.py +427 -0
- django_cfg/apps/knowbase/migrations/0002_archiveitem_archiveitemchunk_documentarchive_and_more.py +434 -0
- django_cfg/apps/knowbase/migrations/__init__.py +5 -0
- django_cfg/apps/knowbase/mixins/__init__.py +15 -0
- django_cfg/apps/knowbase/mixins/config.py +108 -0
- django_cfg/apps/knowbase/mixins/creator.py +81 -0
- django_cfg/apps/knowbase/mixins/examples/vehicle_model_example.py +199 -0
- django_cfg/apps/knowbase/mixins/external_data_mixin.py +813 -0
- django_cfg/apps/knowbase/mixins/service.py +362 -0
- django_cfg/apps/knowbase/models/__init__.py +41 -0
- django_cfg/apps/knowbase/models/archive.py +599 -0
- django_cfg/apps/knowbase/models/base.py +58 -0
- django_cfg/apps/knowbase/models/chat.py +157 -0
- django_cfg/apps/knowbase/models/document.py +267 -0
- django_cfg/apps/knowbase/models/external_data.py +376 -0
- django_cfg/apps/knowbase/serializers/__init__.py +68 -0
- django_cfg/apps/knowbase/serializers/archive_serializers.py +386 -0
- django_cfg/apps/knowbase/serializers/chat_serializers.py +137 -0
- django_cfg/apps/knowbase/serializers/document_serializers.py +94 -0
- django_cfg/apps/knowbase/serializers/external_data_serializers.py +256 -0
- django_cfg/apps/knowbase/serializers/public_serializers.py +74 -0
- django_cfg/apps/knowbase/services/__init__.py +40 -0
- django_cfg/apps/knowbase/services/archive/__init__.py +42 -0
- django_cfg/apps/knowbase/services/archive/archive_service.py +541 -0
- django_cfg/apps/knowbase/services/archive/chunking_service.py +791 -0
- django_cfg/apps/knowbase/services/archive/exceptions.py +52 -0
- django_cfg/apps/knowbase/services/archive/extraction_service.py +508 -0
- django_cfg/apps/knowbase/services/archive/vectorization_service.py +362 -0
- django_cfg/apps/knowbase/services/base.py +53 -0
- django_cfg/apps/knowbase/services/chat_service.py +239 -0
- django_cfg/apps/knowbase/services/document_service.py +144 -0
- django_cfg/apps/knowbase/services/embedding/__init__.py +43 -0
- django_cfg/apps/knowbase/services/embedding/async_processor.py +244 -0
- django_cfg/apps/knowbase/services/embedding/batch_processor.py +250 -0
- django_cfg/apps/knowbase/services/embedding/batch_result.py +61 -0
- django_cfg/apps/knowbase/services/embedding/models.py +229 -0
- django_cfg/apps/knowbase/services/embedding/processors.py +148 -0
- django_cfg/apps/knowbase/services/embedding/utils.py +176 -0
- django_cfg/apps/knowbase/services/prompt_builder.py +191 -0
- django_cfg/apps/knowbase/services/search_service.py +293 -0
- django_cfg/apps/knowbase/signals/__init__.py +21 -0
- django_cfg/apps/knowbase/signals/archive_signals.py +211 -0
- django_cfg/apps/knowbase/signals/chat_signals.py +37 -0
- django_cfg/apps/knowbase/signals/document_signals.py +143 -0
- django_cfg/apps/knowbase/signals/external_data_signals.py +157 -0
- django_cfg/apps/knowbase/tasks/__init__.py +39 -0
- django_cfg/apps/knowbase/tasks/archive_tasks.py +316 -0
- django_cfg/apps/knowbase/tasks/document_processing.py +341 -0
- django_cfg/apps/knowbase/tasks/external_data_tasks.py +341 -0
- django_cfg/apps/knowbase/tasks/maintenance.py +195 -0
- django_cfg/apps/knowbase/urls.py +43 -0
- django_cfg/apps/knowbase/utils/__init__.py +12 -0
- django_cfg/apps/knowbase/utils/chunk_settings.py +261 -0
- django_cfg/apps/knowbase/utils/text_processing.py +375 -0
- django_cfg/apps/knowbase/utils/validation.py +99 -0
- django_cfg/apps/knowbase/views/__init__.py +28 -0
- django_cfg/apps/knowbase/views/archive_views.py +469 -0
- django_cfg/apps/knowbase/views/base.py +49 -0
- django_cfg/apps/knowbase/views/chat_views.py +181 -0
- django_cfg/apps/knowbase/views/document_views.py +183 -0
- django_cfg/apps/knowbase/views/public_views.py +129 -0
- django_cfg/apps/leads/admin.py +70 -0
- django_cfg/apps/newsletter/admin.py +234 -0
- django_cfg/apps/newsletter/admin_filters.py +124 -0
- django_cfg/apps/support/admin.py +196 -0
- django_cfg/apps/support/admin_filters.py +71 -0
- django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
- django_cfg/apps/urls.py +5 -4
- django_cfg/cli/README.md +1 -1
- django_cfg/cli/commands/create_project.py +2 -2
- django_cfg/cli/commands/info.py +1 -1
- django_cfg/config.py +44 -0
- django_cfg/core/config.py +29 -82
- django_cfg/core/environment.py +1 -1
- django_cfg/core/generation.py +19 -107
- django_cfg/{integration.py → core/integration.py} +18 -16
- django_cfg/core/validation.py +1 -1
- django_cfg/management/__init__.py +1 -1
- django_cfg/management/commands/__init__.py +1 -1
- django_cfg/management/commands/auto_generate.py +482 -0
- django_cfg/management/commands/migrator.py +19 -101
- django_cfg/management/commands/test_email.py +1 -1
- django_cfg/middleware/README.md +0 -158
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/middleware/user_activity.py +3 -3
- django_cfg/models/api.py +145 -0
- django_cfg/models/base.py +287 -0
- django_cfg/models/cache.py +4 -4
- django_cfg/models/constance.py +25 -88
- django_cfg/models/database.py +9 -9
- django_cfg/models/drf.py +3 -36
- django_cfg/models/email.py +163 -0
- django_cfg/models/environment.py +276 -0
- django_cfg/models/limits.py +1 -1
- django_cfg/models/logging.py +366 -0
- django_cfg/models/revolution.py +41 -2
- django_cfg/models/security.py +125 -0
- django_cfg/models/services.py +1 -1
- django_cfg/modules/__init__.py +2 -56
- django_cfg/modules/base.py +78 -52
- django_cfg/modules/django_currency/service.py +2 -2
- django_cfg/modules/django_email.py +2 -2
- django_cfg/modules/django_health.py +267 -0
- django_cfg/modules/django_llm/llm/client.py +91 -19
- django_cfg/modules/django_llm/translator/translator.py +2 -2
- django_cfg/modules/django_logger.py +2 -2
- django_cfg/modules/django_ngrok.py +2 -2
- django_cfg/modules/django_tasks.py +68 -3
- django_cfg/modules/django_telegram.py +3 -3
- django_cfg/modules/django_twilio/sendgrid_service.py +2 -2
- django_cfg/modules/django_twilio/service.py +2 -2
- django_cfg/modules/django_twilio/simple_service.py +2 -2
- django_cfg/modules/django_twilio/twilio_service.py +2 -2
- django_cfg/modules/django_unfold/__init__.py +69 -0
- django_cfg/modules/{unfold → django_unfold}/callbacks.py +23 -22
- django_cfg/modules/django_unfold/dashboard.py +278 -0
- django_cfg/modules/django_unfold/icons/README.md +145 -0
- django_cfg/modules/django_unfold/icons/__init__.py +12 -0
- django_cfg/modules/django_unfold/icons/constants.py +2851 -0
- django_cfg/modules/django_unfold/icons/generate_icons.py +486 -0
- django_cfg/modules/django_unfold/models/__init__.py +42 -0
- django_cfg/modules/django_unfold/models/config.py +601 -0
- django_cfg/modules/django_unfold/models/dashboard.py +206 -0
- django_cfg/modules/django_unfold/models/dropdown.py +40 -0
- django_cfg/modules/django_unfold/models/navigation.py +73 -0
- django_cfg/modules/django_unfold/models/tabs.py +25 -0
- django_cfg/modules/{unfold → django_unfold}/system_monitor.py +2 -2
- django_cfg/modules/django_unfold/utils.py +140 -0
- django_cfg/registry/__init__.py +23 -0
- django_cfg/registry/core.py +61 -0
- django_cfg/registry/exceptions.py +11 -0
- django_cfg/registry/modules.py +12 -0
- django_cfg/registry/services.py +26 -0
- django_cfg/registry/third_party.py +52 -0
- django_cfg/routing/__init__.py +19 -0
- django_cfg/routing/callbacks.py +198 -0
- django_cfg/routing/routers.py +48 -0
- django_cfg/templates/admin/layouts/dashboard_with_tabs.html +8 -9
- django_cfg/templatetags/__init__.py +0 -0
- django_cfg/templatetags/django_cfg.py +33 -0
- django_cfg/urls.py +33 -0
- django_cfg/utils/path_resolution.py +1 -1
- django_cfg/utils/smart_defaults.py +7 -61
- django_cfg/utils/toolkit.py +663 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/METADATA +83 -86
- django_cfg-1.2.1.dist-info/RECORD +441 -0
- django_cfg/archive/django_sample.zip +0 -0
- django_cfg/models/unfold.py +0 -271
- django_cfg/modules/unfold/__init__.py +0 -29
- django_cfg/modules/unfold/dashboard.py +0 -318
- django_cfg/pyproject.toml +0 -370
- django_cfg/routers.py +0 -83
- django_cfg-1.1.82.dist-info/RECORD +0 -278
- /django_cfg/{exceptions.py → core/exceptions.py} +0 -0
- /django_cfg/modules/{unfold → django_unfold}/models.py +0 -0
- /django_cfg/modules/{unfold → django_unfold}/tailwind.py +0 -0
- /django_cfg/{version_check.py → utils/version_check.py} +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/WHEEL +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,256 @@
|
|
1
|
+
"""
|
2
|
+
External Data serializers for API request/response validation.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from typing import List, Dict, Any, Optional
|
6
|
+
from pydantic import BaseModel, Field, validator
|
7
|
+
from datetime import datetime
|
8
|
+
|
9
|
+
from ..models.external_data import ExternalDataType, ExternalDataStatus
|
10
|
+
|
11
|
+
|
12
|
+
class ExternalDataCreateRequest(BaseModel):
|
13
|
+
"""Request model for creating external data."""
|
14
|
+
|
15
|
+
title: str = Field(description="Human-readable title")
|
16
|
+
description: str = Field(default="", description="Description of the data source")
|
17
|
+
source_type: ExternalDataType = Field(description="Type of external data source")
|
18
|
+
source_identifier: str = Field(description="Unique identifier for the source")
|
19
|
+
content: str = Field(description="Text content to vectorize")
|
20
|
+
source_config: Dict[str, Any] = Field(default_factory=dict, description="Source configuration")
|
21
|
+
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
22
|
+
chunk_size: int = Field(default=1000, ge=100, le=2000, description="Chunk size for vectorization")
|
23
|
+
overlap_size: int = Field(default=200, ge=0, le=500, description="Overlap between chunks")
|
24
|
+
embedding_model: str = Field(default="text-embedding-ada-002", description="Embedding model")
|
25
|
+
is_active: bool = Field(default=True, description="Whether the source is active")
|
26
|
+
is_public: bool = Field(default=False, description="Whether the source is public")
|
27
|
+
tags: List[str] = Field(default_factory=list, description="Tags for categorization")
|
28
|
+
|
29
|
+
@validator('overlap_size')
|
30
|
+
def validate_overlap_size(cls, v, values):
|
31
|
+
"""Ensure overlap size is less than chunk size."""
|
32
|
+
chunk_size = values.get('chunk_size', 1000)
|
33
|
+
if v >= chunk_size:
|
34
|
+
raise ValueError("Overlap size must be less than chunk size")
|
35
|
+
return v
|
36
|
+
|
37
|
+
|
38
|
+
class ExternalDataResponse(BaseModel):
|
39
|
+
"""Response model for external data."""
|
40
|
+
|
41
|
+
id: str = Field(description="External data ID")
|
42
|
+
title: str = Field(description="Title")
|
43
|
+
description: str = Field(description="Description")
|
44
|
+
source_type: str = Field(description="Source type")
|
45
|
+
source_identifier: str = Field(description="Source identifier")
|
46
|
+
status: str = Field(description="Processing status")
|
47
|
+
is_active: bool = Field(description="Whether active")
|
48
|
+
is_public: bool = Field(description="Whether public")
|
49
|
+
chunk_size: int = Field(description="Chunk size")
|
50
|
+
overlap_size: int = Field(description="Overlap size")
|
51
|
+
embedding_model: str = Field(description="Embedding model")
|
52
|
+
total_chunks: int = Field(description="Total number of chunks")
|
53
|
+
total_tokens: int = Field(description="Total tokens processed")
|
54
|
+
processing_cost: float = Field(description="Processing cost in USD")
|
55
|
+
processed_at: Optional[str] = Field(description="When processed")
|
56
|
+
created_at: str = Field(description="When created")
|
57
|
+
updated_at: str = Field(description="When last updated")
|
58
|
+
tags: List[str] = Field(description="Tags")
|
59
|
+
|
60
|
+
class Config:
|
61
|
+
from_attributes = True
|
62
|
+
|
63
|
+
|
64
|
+
class ExternalDataListResponse(BaseModel):
|
65
|
+
"""Response model for external data list."""
|
66
|
+
|
67
|
+
id: str = Field(description="External data ID")
|
68
|
+
title: str = Field(description="Title")
|
69
|
+
source_type: str = Field(description="Source type")
|
70
|
+
source_identifier: str = Field(description="Source identifier")
|
71
|
+
status: str = Field(description="Processing status")
|
72
|
+
is_active: bool = Field(description="Whether active")
|
73
|
+
total_chunks: int = Field(description="Total chunks")
|
74
|
+
processing_cost: float = Field(description="Processing cost")
|
75
|
+
processed_at: Optional[str] = Field(description="When processed")
|
76
|
+
created_at: str = Field(description="When created")
|
77
|
+
|
78
|
+
class Config:
|
79
|
+
from_attributes = True
|
80
|
+
|
81
|
+
|
82
|
+
class ExternalDataChunkResponse(BaseModel):
|
83
|
+
"""Response model for external data chunk."""
|
84
|
+
|
85
|
+
id: str = Field(description="Chunk ID")
|
86
|
+
external_data_id: str = Field(description="External data ID")
|
87
|
+
chunk_index: int = Field(description="Chunk index")
|
88
|
+
content: str = Field(description="Chunk content")
|
89
|
+
token_count: int = Field(description="Token count")
|
90
|
+
character_count: int = Field(description="Character count")
|
91
|
+
embedding_model: str = Field(description="Embedding model")
|
92
|
+
embedding_cost: float = Field(description="Embedding cost")
|
93
|
+
created_at: str = Field(description="When created")
|
94
|
+
|
95
|
+
class Config:
|
96
|
+
from_attributes = True
|
97
|
+
|
98
|
+
|
99
|
+
class ExternalDataSearchRequest(BaseModel):
|
100
|
+
"""Request model for external data search."""
|
101
|
+
|
102
|
+
query: str = Field(description="Search query")
|
103
|
+
limit: int = Field(default=5, ge=1, le=50, description="Maximum results")
|
104
|
+
threshold: float = Field(default=0.7, ge=0.0, le=1.0, description="Similarity threshold")
|
105
|
+
source_types: Optional[List[str]] = Field(default=None, description="Filter by source types")
|
106
|
+
source_identifiers: Optional[List[str]] = Field(default=None, description="Filter by source identifiers")
|
107
|
+
include_inactive: bool = Field(default=False, description="Include inactive sources")
|
108
|
+
|
109
|
+
|
110
|
+
class ExternalDataSearchResult(BaseModel):
|
111
|
+
"""Single search result."""
|
112
|
+
|
113
|
+
type: str = Field(description="Result type")
|
114
|
+
similarity: float = Field(description="Similarity score")
|
115
|
+
source_title: str = Field(description="Source title")
|
116
|
+
content: str = Field(description="Chunk content")
|
117
|
+
metadata: Dict[str, Any] = Field(description="Additional metadata")
|
118
|
+
|
119
|
+
chunk_id: str = Field(description="Chunk ID")
|
120
|
+
chunk_index: int = Field(description="Chunk index")
|
121
|
+
external_data_id: str = Field(description="External data ID")
|
122
|
+
source_type: str = Field(description="Source type")
|
123
|
+
source_identifier: str = Field(description="Source identifier")
|
124
|
+
|
125
|
+
|
126
|
+
class ExternalDataSearchResponse(BaseModel):
|
127
|
+
"""Response model for external data search."""
|
128
|
+
|
129
|
+
query: str = Field(description="Original query")
|
130
|
+
results: List[ExternalDataSearchResult] = Field(description="Search results")
|
131
|
+
total_results: int = Field(description="Total number of results")
|
132
|
+
search_time_ms: float = Field(description="Search time in milliseconds")
|
133
|
+
|
134
|
+
|
135
|
+
class ExternalDataVectorizeRequest(BaseModel):
|
136
|
+
"""Request model for vectorizing external data."""
|
137
|
+
|
138
|
+
external_data_ids: List[str] = Field(description="List of external data IDs to vectorize")
|
139
|
+
force_revectorize: bool = Field(default=False, description="Force re-vectorization")
|
140
|
+
|
141
|
+
|
142
|
+
class ExternalDataVectorizeResponse(BaseModel):
|
143
|
+
"""Response model for vectorization."""
|
144
|
+
|
145
|
+
total_requested: int = Field(description="Total requested for vectorization")
|
146
|
+
processed: int = Field(description="Successfully processed")
|
147
|
+
failed: int = Field(description="Failed to process")
|
148
|
+
skipped: int = Field(description="Skipped (already processed)")
|
149
|
+
total_cost: float = Field(description="Total processing cost")
|
150
|
+
processing_time_ms: float = Field(description="Total processing time")
|
151
|
+
|
152
|
+
|
153
|
+
class ExternalDataStatsResponse(BaseModel):
|
154
|
+
"""Response model for external data statistics."""
|
155
|
+
|
156
|
+
total_sources: int = Field(description="Total number of sources")
|
157
|
+
active_sources: int = Field(description="Active sources")
|
158
|
+
processed_sources: int = Field(description="Successfully processed sources")
|
159
|
+
failed_sources: int = Field(description="Failed sources")
|
160
|
+
pending_sources: int = Field(description="Pending sources")
|
161
|
+
|
162
|
+
total_chunks: int = Field(description="Total chunks")
|
163
|
+
total_tokens: int = Field(description="Total tokens")
|
164
|
+
total_cost: float = Field(description="Total cost")
|
165
|
+
average_cost_per_source: float = Field(description="Average cost per source")
|
166
|
+
|
167
|
+
source_type_breakdown: Dict[str, int] = Field(description="Breakdown by source type")
|
168
|
+
status_breakdown: Dict[str, int] = Field(description="Breakdown by status")
|
169
|
+
|
170
|
+
last_processed_at: Optional[str] = Field(description="Last processing time")
|
171
|
+
|
172
|
+
|
173
|
+
class ExternalDataHealthResponse(BaseModel):
|
174
|
+
"""Response model for health check."""
|
175
|
+
|
176
|
+
status: str = Field(description="Overall status")
|
177
|
+
healthy: bool = Field(description="Whether system is healthy")
|
178
|
+
|
179
|
+
database_healthy: bool = Field(description="Database health")
|
180
|
+
embedding_service_healthy: bool = Field(description="Embedding service health")
|
181
|
+
processing_healthy: bool = Field(description="Processing health")
|
182
|
+
|
183
|
+
response_time_ms: float = Field(description="Response time")
|
184
|
+
active_sources: int = Field(description="Active sources")
|
185
|
+
pending_processing: int = Field(description="Pending processing")
|
186
|
+
failed_processing: int = Field(description="Failed processing")
|
187
|
+
|
188
|
+
issues: List[str] = Field(description="Current issues")
|
189
|
+
warnings: List[str] = Field(description="Warnings")
|
190
|
+
checked_at: str = Field(description="Check timestamp")
|
191
|
+
|
192
|
+
|
193
|
+
class ExternalDataUpdateRequest(BaseModel):
|
194
|
+
"""Request model for updating external data."""
|
195
|
+
|
196
|
+
title: Optional[str] = Field(default=None, description="New title")
|
197
|
+
description: Optional[str] = Field(default=None, description="New description")
|
198
|
+
content: Optional[str] = Field(default=None, description="New content")
|
199
|
+
is_active: Optional[bool] = Field(default=None, description="Active status")
|
200
|
+
is_public: Optional[bool] = Field(default=None, description="Public status")
|
201
|
+
tags: Optional[List[str]] = Field(default=None, description="Tags")
|
202
|
+
source_config: Optional[Dict[str, Any]] = Field(default=None, description="Source configuration")
|
203
|
+
metadata: Optional[Dict[str, Any]] = Field(default=None, description="Metadata")
|
204
|
+
auto_revectorize: bool = Field(default=True, description="Auto re-vectorize if content changed")
|
205
|
+
|
206
|
+
|
207
|
+
class ExternalDataBulkActionRequest(BaseModel):
|
208
|
+
"""Request model for bulk actions."""
|
209
|
+
|
210
|
+
external_data_ids: List[str] = Field(description="List of external data IDs")
|
211
|
+
action: str = Field(description="Action to perform")
|
212
|
+
parameters: Dict[str, Any] = Field(default_factory=dict, description="Action parameters")
|
213
|
+
|
214
|
+
|
215
|
+
class ExternalDataBulkActionResponse(BaseModel):
|
216
|
+
"""Response model for bulk actions."""
|
217
|
+
|
218
|
+
action: str = Field(description="Action performed")
|
219
|
+
total_requested: int = Field(description="Total items requested")
|
220
|
+
successful: int = Field(description="Successfully processed")
|
221
|
+
failed: int = Field(description="Failed to process")
|
222
|
+
errors: List[str] = Field(description="Error messages")
|
223
|
+
|
224
|
+
|
225
|
+
class ExternalDataQuickAddRequest(BaseModel):
|
226
|
+
"""Request model for quickly adding external data."""
|
227
|
+
|
228
|
+
title: str = Field(description="Title")
|
229
|
+
content: str = Field(description="Content to vectorize")
|
230
|
+
source_type: ExternalDataType = Field(default=ExternalDataType.CUSTOM, description="Source type")
|
231
|
+
description: str = Field(default="", description="Description")
|
232
|
+
tags: List[str] = Field(default_factory=list, description="Tags")
|
233
|
+
auto_vectorize: bool = Field(default=True, description="Auto vectorize")
|
234
|
+
|
235
|
+
|
236
|
+
class ExternalDataImportRequest(BaseModel):
|
237
|
+
"""Request model for importing external data from various sources."""
|
238
|
+
|
239
|
+
source_type: ExternalDataType = Field(description="Type of source to import")
|
240
|
+
source_config: Dict[str, Any] = Field(description="Configuration for import")
|
241
|
+
title: str = Field(description="Title for imported data")
|
242
|
+
description: str = Field(default="", description="Description")
|
243
|
+
auto_vectorize: bool = Field(default=True, description="Auto vectorize after import")
|
244
|
+
chunk_size: int = Field(default=1000, description="Chunk size")
|
245
|
+
overlap_size: int = Field(default=200, description="Overlap size")
|
246
|
+
|
247
|
+
|
248
|
+
class ExternalDataImportResponse(BaseModel):
|
249
|
+
"""Response model for import operation."""
|
250
|
+
|
251
|
+
external_data_id: str = Field(description="Created external data ID")
|
252
|
+
title: str = Field(description="Title")
|
253
|
+
source_type: str = Field(description="Source type")
|
254
|
+
content_length: int = Field(description="Length of imported content")
|
255
|
+
vectorization_started: bool = Field(description="Whether vectorization was started")
|
256
|
+
import_time_ms: float = Field(description="Import time in milliseconds")
|
@@ -0,0 +1,74 @@
|
|
1
|
+
"""
|
2
|
+
Public serializers for client access without sensitive data.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from rest_framework import serializers
|
6
|
+
from drf_spectacular.utils import extend_schema_field
|
7
|
+
from ..models import Document, DocumentCategory
|
8
|
+
|
9
|
+
|
10
|
+
class PublicCategorySerializer(serializers.ModelSerializer):
|
11
|
+
"""Public category serializer."""
|
12
|
+
|
13
|
+
id = serializers.UUIDField(read_only=True)
|
14
|
+
|
15
|
+
class Meta:
|
16
|
+
model = DocumentCategory
|
17
|
+
fields = ['id', 'name', 'description']
|
18
|
+
|
19
|
+
|
20
|
+
class PublicDocumentListSerializer(serializers.ModelSerializer):
|
21
|
+
"""Public document list serializer - minimal fields for listing."""
|
22
|
+
|
23
|
+
id = serializers.UUIDField(read_only=True)
|
24
|
+
created_at = serializers.DateTimeField(read_only=True)
|
25
|
+
updated_at = serializers.DateTimeField(read_only=True)
|
26
|
+
category = serializers.SerializerMethodField()
|
27
|
+
|
28
|
+
class Meta:
|
29
|
+
model = Document
|
30
|
+
fields = [
|
31
|
+
'id', 'title', 'category', 'created_at', 'updated_at'
|
32
|
+
]
|
33
|
+
|
34
|
+
@extend_schema_field(PublicCategorySerializer)
|
35
|
+
def get_category(self, obj):
|
36
|
+
"""Get first public category or create a default one."""
|
37
|
+
public_categories = obj.categories.filter(is_public=True)
|
38
|
+
if public_categories.exists():
|
39
|
+
return PublicCategorySerializer(public_categories.first()).data
|
40
|
+
# Return default category if no public categories
|
41
|
+
return {
|
42
|
+
'id': None,
|
43
|
+
'name': 'General',
|
44
|
+
'description': 'General documentation'
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
class PublicDocumentSerializer(serializers.ModelSerializer):
|
49
|
+
"""Public document detail serializer - only essential data for clients."""
|
50
|
+
|
51
|
+
id = serializers.UUIDField(read_only=True)
|
52
|
+
created_at = serializers.DateTimeField(read_only=True)
|
53
|
+
updated_at = serializers.DateTimeField(read_only=True)
|
54
|
+
category = serializers.SerializerMethodField()
|
55
|
+
|
56
|
+
class Meta:
|
57
|
+
model = Document
|
58
|
+
fields = [
|
59
|
+
'id', 'title', 'content', 'category', 'created_at', 'updated_at'
|
60
|
+
]
|
61
|
+
# Only essential fields for clients - no technical metadata
|
62
|
+
|
63
|
+
@extend_schema_field(PublicCategorySerializer)
|
64
|
+
def get_category(self, obj):
|
65
|
+
"""Get first public category or create a default one."""
|
66
|
+
public_categories = obj.categories.filter(is_public=True)
|
67
|
+
if public_categories.exists():
|
68
|
+
return PublicCategorySerializer(public_categories.first()).data
|
69
|
+
# Return default category if no public categories
|
70
|
+
return {
|
71
|
+
'id': None,
|
72
|
+
'name': 'General',
|
73
|
+
'description': 'General documentation'
|
74
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
"""
|
2
|
+
Knowledge Base Services
|
3
|
+
|
4
|
+
Business logic layer for knowledge management system.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .base import *
|
8
|
+
from .document_service import *
|
9
|
+
from .chat_service import *
|
10
|
+
from .search_service import *
|
11
|
+
from .archive import *
|
12
|
+
|
13
|
+
__all__ = [
|
14
|
+
# Base services
|
15
|
+
'BaseService',
|
16
|
+
'LLMServiceProtocol',
|
17
|
+
'CacheServiceProtocol',
|
18
|
+
|
19
|
+
# Document services
|
20
|
+
'DocumentService',
|
21
|
+
|
22
|
+
# Chat services
|
23
|
+
'ChatService',
|
24
|
+
|
25
|
+
# Search services
|
26
|
+
'SearchService',
|
27
|
+
|
28
|
+
# Archive services
|
29
|
+
'DocumentArchiveService',
|
30
|
+
'ArchiveExtractionService',
|
31
|
+
'ContextualChunkingService',
|
32
|
+
'ArchiveVectorizationService',
|
33
|
+
|
34
|
+
# Archive exceptions
|
35
|
+
'ArchiveProcessingError',
|
36
|
+
'ArchiveValidationError',
|
37
|
+
'ExtractionError',
|
38
|
+
'ChunkingError',
|
39
|
+
'VectorizationError',
|
40
|
+
]
|
@@ -0,0 +1,42 @@
|
|
1
|
+
"""
|
2
|
+
Archive processing services.
|
3
|
+
|
4
|
+
Decomposed services for document archive processing with proper separation of concerns.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from .exceptions import *
|
8
|
+
from .archive_service import *
|
9
|
+
from .extraction_service import *
|
10
|
+
from .chunking_service import *
|
11
|
+
from .vectorization_service import *
|
12
|
+
|
13
|
+
__all__ = [
|
14
|
+
# Main archive service
|
15
|
+
'DocumentArchiveService',
|
16
|
+
'ArchiveUploadRequest',
|
17
|
+
'ArchiveProcessingResult',
|
18
|
+
|
19
|
+
# Extraction services
|
20
|
+
'ArchiveExtractionService',
|
21
|
+
'ContentExtractionService',
|
22
|
+
'ExtractedItemData',
|
23
|
+
|
24
|
+
# Chunking services
|
25
|
+
'ContextualChunkingService',
|
26
|
+
'ChunkContextBuilder',
|
27
|
+
'ChunkData',
|
28
|
+
'ChunkContextMetadata',
|
29
|
+
|
30
|
+
# Vectorization services
|
31
|
+
'ArchiveVectorizationService',
|
32
|
+
'VectorizationResult',
|
33
|
+
|
34
|
+
# Exceptions
|
35
|
+
'ArchiveProcessingError',
|
36
|
+
'ArchiveValidationError',
|
37
|
+
'ExtractionError',
|
38
|
+
'ChunkingError',
|
39
|
+
'VectorizationError',
|
40
|
+
'ContentTypeDetectionError',
|
41
|
+
'ProcessingTimeoutError',
|
42
|
+
]
|