django-cfg 1.1.82__py3-none-any.whl → 1.2.0__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 +444 -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 +79 -17
- 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.0.dist-info}/METADATA +83 -86
- django_cfg-1.2.0.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.0.dist-info}/WHEEL +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.1.82.dist-info → django_cfg-1.2.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,236 @@
|
|
1
|
+
"""
|
2
|
+
Custom managers for agent execution models.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from django.db import models
|
6
|
+
from django.utils import timezone
|
7
|
+
from typing import Optional, Dict, Any
|
8
|
+
|
9
|
+
|
10
|
+
class AgentExecutionQuerySet(models.QuerySet):
|
11
|
+
"""Custom queryset for AgentExecution."""
|
12
|
+
|
13
|
+
def for_user(self, user):
|
14
|
+
"""Filter executions for specific user."""
|
15
|
+
return self.filter(user=user)
|
16
|
+
|
17
|
+
def by_status(self, status: str):
|
18
|
+
"""Filter by execution status."""
|
19
|
+
return self.filter(status=status)
|
20
|
+
|
21
|
+
def successful(self):
|
22
|
+
"""Get successful executions."""
|
23
|
+
return self.filter(status='completed')
|
24
|
+
|
25
|
+
def failed(self):
|
26
|
+
"""Get failed executions."""
|
27
|
+
return self.filter(status='failed')
|
28
|
+
|
29
|
+
def recent(self, days: int = 7):
|
30
|
+
"""Get recent executions."""
|
31
|
+
from datetime import timedelta
|
32
|
+
cutoff = timezone.now() - timedelta(days=days)
|
33
|
+
return self.filter(created_at__gte=cutoff)
|
34
|
+
|
35
|
+
def by_agent(self, agent_name: str):
|
36
|
+
"""Filter by agent name."""
|
37
|
+
return self.filter(agent_name=agent_name)
|
38
|
+
|
39
|
+
def with_metrics(self):
|
40
|
+
"""Include execution metrics in query."""
|
41
|
+
return self.select_related('user', 'workflow_execution', 'agent_definition')
|
42
|
+
|
43
|
+
def expensive(self, min_cost: float = 0.01):
|
44
|
+
"""Get expensive executions."""
|
45
|
+
return self.filter(cost__gte=min_cost)
|
46
|
+
|
47
|
+
|
48
|
+
class AgentExecutionManager(models.Manager):
|
49
|
+
"""Custom manager for AgentExecution."""
|
50
|
+
|
51
|
+
def get_queryset(self):
|
52
|
+
return AgentExecutionQuerySet(self.model, using=self._db)
|
53
|
+
|
54
|
+
def for_user(self, user):
|
55
|
+
"""Get executions for specific user."""
|
56
|
+
return self.get_queryset().for_user(user)
|
57
|
+
|
58
|
+
def by_status(self, status: str):
|
59
|
+
"""Get executions by status."""
|
60
|
+
return self.get_queryset().by_status(status)
|
61
|
+
|
62
|
+
def successful(self):
|
63
|
+
"""Get successful executions."""
|
64
|
+
return self.get_queryset().successful()
|
65
|
+
|
66
|
+
def failed(self):
|
67
|
+
"""Get failed executions."""
|
68
|
+
return self.get_queryset().failed()
|
69
|
+
|
70
|
+
def recent(self, days: int = 7):
|
71
|
+
"""Get recent executions."""
|
72
|
+
return self.get_queryset().recent(days)
|
73
|
+
|
74
|
+
def by_agent(self, agent_name: str):
|
75
|
+
"""Get executions by agent name."""
|
76
|
+
return self.get_queryset().by_agent(agent_name)
|
77
|
+
|
78
|
+
def with_metrics(self):
|
79
|
+
"""Get executions with metrics."""
|
80
|
+
return self.get_queryset().with_metrics()
|
81
|
+
|
82
|
+
def expensive(self, min_cost: float = 0.01):
|
83
|
+
"""Get expensive executions."""
|
84
|
+
return self.get_queryset().expensive(min_cost)
|
85
|
+
|
86
|
+
def create_execution(
|
87
|
+
self,
|
88
|
+
agent_name: str,
|
89
|
+
user,
|
90
|
+
input_prompt: str,
|
91
|
+
agent_definition=None,
|
92
|
+
workflow_execution=None,
|
93
|
+
**kwargs
|
94
|
+
):
|
95
|
+
"""Create a new agent execution."""
|
96
|
+
return self.create(
|
97
|
+
agent_name=agent_name,
|
98
|
+
user=user,
|
99
|
+
input_prompt=input_prompt,
|
100
|
+
agent_definition=agent_definition,
|
101
|
+
workflow_execution=workflow_execution,
|
102
|
+
**kwargs
|
103
|
+
)
|
104
|
+
|
105
|
+
def get_stats_for_user(self, user) -> Dict[str, Any]:
|
106
|
+
"""Get execution statistics for user."""
|
107
|
+
executions = self.for_user(user)
|
108
|
+
|
109
|
+
return {
|
110
|
+
'total': executions.count(),
|
111
|
+
'successful': executions.successful().count(),
|
112
|
+
'failed': executions.failed().count(),
|
113
|
+
'recent': executions.recent().count(),
|
114
|
+
'total_cost': float(executions.aggregate(
|
115
|
+
total=models.Sum('cost')
|
116
|
+
)['total'] or 0),
|
117
|
+
'avg_execution_time': executions.aggregate(
|
118
|
+
avg=models.Avg('execution_time')
|
119
|
+
)['avg'],
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
class WorkflowExecutionQuerySet(models.QuerySet):
|
124
|
+
"""Custom queryset for WorkflowExecution."""
|
125
|
+
|
126
|
+
def for_user(self, user):
|
127
|
+
"""Filter workflows for specific user."""
|
128
|
+
return self.filter(user=user)
|
129
|
+
|
130
|
+
def by_status(self, status: str):
|
131
|
+
"""Filter by workflow status."""
|
132
|
+
return self.filter(status=status)
|
133
|
+
|
134
|
+
def by_pattern(self, pattern: str):
|
135
|
+
"""Filter by workflow pattern."""
|
136
|
+
return self.filter(pattern=pattern)
|
137
|
+
|
138
|
+
def successful(self):
|
139
|
+
"""Get successful workflows."""
|
140
|
+
return self.filter(status='completed')
|
141
|
+
|
142
|
+
def failed(self):
|
143
|
+
"""Get failed workflows."""
|
144
|
+
return self.filter(status='failed')
|
145
|
+
|
146
|
+
def running(self):
|
147
|
+
"""Get currently running workflows."""
|
148
|
+
return self.filter(status='running')
|
149
|
+
|
150
|
+
def recent(self, days: int = 7):
|
151
|
+
"""Get recent workflows."""
|
152
|
+
from datetime import timedelta
|
153
|
+
cutoff = timezone.now() - timedelta(days=days)
|
154
|
+
return self.filter(created_at__gte=cutoff)
|
155
|
+
|
156
|
+
def with_executions(self):
|
157
|
+
"""Include related agent executions."""
|
158
|
+
return self.prefetch_related('agent_executions')
|
159
|
+
|
160
|
+
|
161
|
+
class WorkflowExecutionManager(models.Manager):
|
162
|
+
"""Custom manager for WorkflowExecution."""
|
163
|
+
|
164
|
+
def get_queryset(self):
|
165
|
+
return WorkflowExecutionQuerySet(self.model, using=self._db)
|
166
|
+
|
167
|
+
def for_user(self, user):
|
168
|
+
"""Get workflows for specific user."""
|
169
|
+
return self.get_queryset().for_user(user)
|
170
|
+
|
171
|
+
def by_status(self, status: str):
|
172
|
+
"""Get workflows by status."""
|
173
|
+
return self.get_queryset().by_status(status)
|
174
|
+
|
175
|
+
def by_pattern(self, pattern: str):
|
176
|
+
"""Get workflows by pattern."""
|
177
|
+
return self.get_queryset().by_pattern(pattern)
|
178
|
+
|
179
|
+
def successful(self):
|
180
|
+
"""Get successful workflows."""
|
181
|
+
return self.get_queryset().successful()
|
182
|
+
|
183
|
+
def failed(self):
|
184
|
+
"""Get failed workflows."""
|
185
|
+
return self.get_queryset().failed()
|
186
|
+
|
187
|
+
def running(self):
|
188
|
+
"""Get running workflows."""
|
189
|
+
return self.get_queryset().running()
|
190
|
+
|
191
|
+
def recent(self, days: int = 7):
|
192
|
+
"""Get recent workflows."""
|
193
|
+
return self.get_queryset().recent(days)
|
194
|
+
|
195
|
+
def with_executions(self):
|
196
|
+
"""Get workflows with executions."""
|
197
|
+
return self.get_queryset().with_executions()
|
198
|
+
|
199
|
+
def create_workflow(
|
200
|
+
self,
|
201
|
+
name: str,
|
202
|
+
user,
|
203
|
+
pattern: str,
|
204
|
+
agent_names: list,
|
205
|
+
input_prompt: str,
|
206
|
+
config: Optional[Dict] = None,
|
207
|
+
**kwargs
|
208
|
+
):
|
209
|
+
"""Create a new workflow execution."""
|
210
|
+
return self.create(
|
211
|
+
name=name,
|
212
|
+
user=user,
|
213
|
+
pattern=pattern,
|
214
|
+
agent_names=agent_names,
|
215
|
+
input_prompt=input_prompt,
|
216
|
+
config=config or {},
|
217
|
+
**kwargs
|
218
|
+
)
|
219
|
+
|
220
|
+
def get_stats_for_user(self, user) -> Dict[str, Any]:
|
221
|
+
"""Get workflow statistics for user."""
|
222
|
+
workflows = self.for_user(user)
|
223
|
+
|
224
|
+
return {
|
225
|
+
'total': workflows.count(),
|
226
|
+
'successful': workflows.successful().count(),
|
227
|
+
'failed': workflows.failed().count(),
|
228
|
+
'running': workflows.running().count(),
|
229
|
+
'recent': workflows.recent().count(),
|
230
|
+
'total_cost': float(workflows.aggregate(
|
231
|
+
total=models.Sum('total_cost')
|
232
|
+
)['total'] or 0),
|
233
|
+
'avg_execution_time': workflows.aggregate(
|
234
|
+
avg=models.Avg('total_execution_time')
|
235
|
+
)['avg'],
|
236
|
+
}
|
@@ -0,0 +1,254 @@
|
|
1
|
+
"""
|
2
|
+
Custom managers for agent registry models.
|
3
|
+
"""
|
4
|
+
|
5
|
+
from django.db import models
|
6
|
+
from django.utils import timezone
|
7
|
+
from typing import Optional, Dict, Any, List
|
8
|
+
|
9
|
+
|
10
|
+
class AgentDefinitionQuerySet(models.QuerySet):
|
11
|
+
"""Custom queryset for AgentDefinition."""
|
12
|
+
|
13
|
+
def active(self):
|
14
|
+
"""Get active agent definitions."""
|
15
|
+
return self.filter(is_active=True)
|
16
|
+
|
17
|
+
def public(self):
|
18
|
+
"""Get public agent definitions."""
|
19
|
+
return self.filter(is_public=True)
|
20
|
+
|
21
|
+
def for_user(self, user):
|
22
|
+
"""Get agent definitions available for specific user."""
|
23
|
+
return self.filter(
|
24
|
+
models.Q(is_public=True) |
|
25
|
+
models.Q(created_by=user) |
|
26
|
+
models.Q(allowed_users=user) |
|
27
|
+
models.Q(allowed_groups__in=user.groups.all())
|
28
|
+
).distinct()
|
29
|
+
|
30
|
+
def by_category(self, category: str):
|
31
|
+
"""Filter by category."""
|
32
|
+
return self.filter(category=category)
|
33
|
+
|
34
|
+
def by_creator(self, user):
|
35
|
+
"""Get agents created by specific user."""
|
36
|
+
return self.filter(created_by=user)
|
37
|
+
|
38
|
+
def popular(self, min_usage: int = 10):
|
39
|
+
"""Get popular agents."""
|
40
|
+
return self.filter(usage_count__gte=min_usage)
|
41
|
+
|
42
|
+
def recent(self, days: int = 7):
|
43
|
+
"""Get recently created agents."""
|
44
|
+
from datetime import timedelta
|
45
|
+
cutoff = timezone.now() - timedelta(days=days)
|
46
|
+
return self.filter(created_at__gte=cutoff)
|
47
|
+
|
48
|
+
def with_executions(self):
|
49
|
+
"""Include execution statistics."""
|
50
|
+
return self.prefetch_related('executions')
|
51
|
+
|
52
|
+
def search(self, query: str):
|
53
|
+
"""Search agents by name, description, or instructions."""
|
54
|
+
return self.filter(
|
55
|
+
models.Q(name__icontains=query) |
|
56
|
+
models.Q(display_name__icontains=query) |
|
57
|
+
models.Q(description__icontains=query) |
|
58
|
+
models.Q(instructions__icontains=query)
|
59
|
+
)
|
60
|
+
|
61
|
+
|
62
|
+
class AgentDefinitionManager(models.Manager):
|
63
|
+
"""Custom manager for AgentDefinition."""
|
64
|
+
|
65
|
+
def get_queryset(self):
|
66
|
+
return AgentDefinitionQuerySet(self.model, using=self._db)
|
67
|
+
|
68
|
+
def active(self):
|
69
|
+
"""Get active agents."""
|
70
|
+
return self.get_queryset().active()
|
71
|
+
|
72
|
+
def public(self):
|
73
|
+
"""Get public agents."""
|
74
|
+
return self.get_queryset().public()
|
75
|
+
|
76
|
+
def for_user(self, user):
|
77
|
+
"""Get agents available for user."""
|
78
|
+
return self.get_queryset().for_user(user)
|
79
|
+
|
80
|
+
def by_category(self, category: str):
|
81
|
+
"""Get agents by category."""
|
82
|
+
return self.get_queryset().by_category(category)
|
83
|
+
|
84
|
+
def by_creator(self, user):
|
85
|
+
"""Get agents by creator."""
|
86
|
+
return self.get_queryset().by_creator(user)
|
87
|
+
|
88
|
+
def popular(self, min_usage: int = 10):
|
89
|
+
"""Get popular agents."""
|
90
|
+
return self.get_queryset().popular(min_usage)
|
91
|
+
|
92
|
+
def recent(self, days: int = 7):
|
93
|
+
"""Get recent agents."""
|
94
|
+
return self.get_queryset().recent(days)
|
95
|
+
|
96
|
+
def with_executions(self):
|
97
|
+
"""Get agents with executions."""
|
98
|
+
return self.get_queryset().with_executions()
|
99
|
+
|
100
|
+
def search(self, query: str):
|
101
|
+
"""Search agents."""
|
102
|
+
return self.get_queryset().search(query)
|
103
|
+
|
104
|
+
def create_agent(
|
105
|
+
self,
|
106
|
+
name: str,
|
107
|
+
display_name: str,
|
108
|
+
instructions: str,
|
109
|
+
created_by,
|
110
|
+
description: str = "",
|
111
|
+
category: str = "",
|
112
|
+
is_public: bool = False,
|
113
|
+
**kwargs
|
114
|
+
):
|
115
|
+
"""Create a new agent definition."""
|
116
|
+
return self.create(
|
117
|
+
name=name,
|
118
|
+
display_name=display_name,
|
119
|
+
instructions=instructions,
|
120
|
+
description=description,
|
121
|
+
category=category,
|
122
|
+
is_public=is_public,
|
123
|
+
created_by=created_by,
|
124
|
+
**kwargs
|
125
|
+
)
|
126
|
+
|
127
|
+
def get_categories(self) -> List[str]:
|
128
|
+
"""Get all unique categories."""
|
129
|
+
return list(
|
130
|
+
self.active()
|
131
|
+
.values_list('category', flat=True)
|
132
|
+
.distinct()
|
133
|
+
.exclude(category='')
|
134
|
+
.order_by('category')
|
135
|
+
)
|
136
|
+
|
137
|
+
def get_stats(self) -> Dict[str, Any]:
|
138
|
+
"""Get overall agent statistics."""
|
139
|
+
queryset = self.get_queryset()
|
140
|
+
|
141
|
+
return {
|
142
|
+
'total': queryset.count(),
|
143
|
+
'active': queryset.active().count(),
|
144
|
+
'public': queryset.public().count(),
|
145
|
+
'categories': len(self.get_categories()),
|
146
|
+
'total_usage': queryset.aggregate(
|
147
|
+
total=models.Sum('usage_count')
|
148
|
+
)['total'] or 0,
|
149
|
+
'avg_usage': queryset.aggregate(
|
150
|
+
avg=models.Avg('usage_count')
|
151
|
+
)['avg'] or 0,
|
152
|
+
}
|
153
|
+
|
154
|
+
|
155
|
+
class AgentTemplateQuerySet(models.QuerySet):
|
156
|
+
"""Custom queryset for AgentTemplate."""
|
157
|
+
|
158
|
+
def active(self):
|
159
|
+
"""Get active templates."""
|
160
|
+
return self.filter(is_active=True)
|
161
|
+
|
162
|
+
def by_category(self, category: str):
|
163
|
+
"""Filter by category."""
|
164
|
+
return self.filter(category=category)
|
165
|
+
|
166
|
+
def by_creator(self, user):
|
167
|
+
"""Get templates created by specific user."""
|
168
|
+
return self.filter(created_by=user)
|
169
|
+
|
170
|
+
def recent(self, days: int = 7):
|
171
|
+
"""Get recently created templates."""
|
172
|
+
from datetime import timedelta
|
173
|
+
cutoff = timezone.now() - timedelta(days=days)
|
174
|
+
return self.filter(created_at__gte=cutoff)
|
175
|
+
|
176
|
+
def search(self, query: str):
|
177
|
+
"""Search templates by name or description."""
|
178
|
+
return self.filter(
|
179
|
+
models.Q(name__icontains=query) |
|
180
|
+
models.Q(description__icontains=query)
|
181
|
+
)
|
182
|
+
|
183
|
+
|
184
|
+
class AgentTemplateManager(models.Manager):
|
185
|
+
"""Custom manager for AgentTemplate."""
|
186
|
+
|
187
|
+
def get_queryset(self):
|
188
|
+
return AgentTemplateQuerySet(self.model, using=self._db)
|
189
|
+
|
190
|
+
def active(self):
|
191
|
+
"""Get active templates."""
|
192
|
+
return self.get_queryset().active()
|
193
|
+
|
194
|
+
def by_category(self, category: str):
|
195
|
+
"""Get templates by category."""
|
196
|
+
return self.get_queryset().by_category(category)
|
197
|
+
|
198
|
+
def by_creator(self, user):
|
199
|
+
"""Get templates by creator."""
|
200
|
+
return self.get_queryset().by_creator(user)
|
201
|
+
|
202
|
+
def recent(self, days: int = 7):
|
203
|
+
"""Get recent templates."""
|
204
|
+
return self.get_queryset().recent(days)
|
205
|
+
|
206
|
+
def search(self, query: str):
|
207
|
+
"""Search templates."""
|
208
|
+
return self.get_queryset().search(query)
|
209
|
+
|
210
|
+
def create_template(
|
211
|
+
self,
|
212
|
+
name: str,
|
213
|
+
description: str,
|
214
|
+
category: str,
|
215
|
+
template_config: Dict,
|
216
|
+
created_by,
|
217
|
+
default_instructions: str = "",
|
218
|
+
recommended_model: str = "",
|
219
|
+
use_cases: Optional[List] = None,
|
220
|
+
**kwargs
|
221
|
+
):
|
222
|
+
"""Create a new agent template."""
|
223
|
+
return self.create(
|
224
|
+
name=name,
|
225
|
+
description=description,
|
226
|
+
category=category,
|
227
|
+
template_config=template_config,
|
228
|
+
default_instructions=default_instructions,
|
229
|
+
recommended_model=recommended_model,
|
230
|
+
use_cases=use_cases or [],
|
231
|
+
created_by=created_by,
|
232
|
+
**kwargs
|
233
|
+
)
|
234
|
+
|
235
|
+
def get_categories(self) -> List[str]:
|
236
|
+
"""Get all unique categories."""
|
237
|
+
return list(
|
238
|
+
self.active()
|
239
|
+
.values_list('category', flat=True)
|
240
|
+
.distinct()
|
241
|
+
.exclude(category='')
|
242
|
+
.order_by('category')
|
243
|
+
)
|
244
|
+
|
245
|
+
def get_stats(self) -> Dict[str, Any]:
|
246
|
+
"""Get template statistics."""
|
247
|
+
queryset = self.get_queryset()
|
248
|
+
|
249
|
+
return {
|
250
|
+
'total': queryset.count(),
|
251
|
+
'active': queryset.active().count(),
|
252
|
+
'categories': len(self.get_categories()),
|
253
|
+
'recent': queryset.recent().count(),
|
254
|
+
}
|