django-cfg 1.3.5__py3-none-any.whl → 1.3.9__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 +1 -1
- django_cfg/apps/accounts/admin/__init__.py +24 -8
- django_cfg/apps/accounts/admin/activity_admin.py +146 -0
- django_cfg/apps/accounts/admin/filters.py +98 -22
- django_cfg/apps/accounts/admin/group_admin.py +86 -0
- django_cfg/apps/accounts/admin/inlines.py +42 -13
- django_cfg/apps/accounts/admin/otp_admin.py +115 -0
- django_cfg/apps/accounts/admin/registration_admin.py +173 -0
- django_cfg/apps/accounts/admin/resources.py +123 -19
- django_cfg/apps/accounts/admin/twilio_admin.py +327 -0
- django_cfg/apps/accounts/admin/user_admin.py +362 -0
- django_cfg/apps/agents/admin/__init__.py +17 -4
- django_cfg/apps/agents/admin/execution_admin.py +204 -183
- django_cfg/apps/agents/admin/registry_admin.py +230 -255
- django_cfg/apps/agents/admin/toolsets_admin.py +274 -321
- django_cfg/apps/agents/core/__init__.py +1 -1
- django_cfg/apps/agents/core/django_agent.py +221 -0
- django_cfg/apps/agents/core/exceptions.py +14 -0
- django_cfg/apps/agents/core/orchestrator.py +18 -3
- django_cfg/apps/knowbase/admin/__init__.py +1 -1
- django_cfg/apps/knowbase/admin/archive_admin.py +352 -640
- django_cfg/apps/knowbase/admin/chat_admin.py +258 -192
- django_cfg/apps/knowbase/admin/document_admin.py +269 -262
- django_cfg/apps/knowbase/admin/external_data_admin.py +271 -489
- django_cfg/apps/knowbase/config/settings.py +21 -4
- django_cfg/apps/knowbase/views/chat_views.py +3 -0
- django_cfg/apps/leads/admin/__init__.py +3 -1
- django_cfg/apps/leads/admin/leads_admin.py +235 -35
- django_cfg/apps/maintenance/admin/__init__.py +2 -2
- django_cfg/apps/maintenance/admin/api_key_admin.py +125 -63
- django_cfg/apps/maintenance/admin/log_admin.py +143 -61
- django_cfg/apps/maintenance/admin/scheduled_admin.py +212 -301
- django_cfg/apps/maintenance/admin/site_admin.py +213 -352
- django_cfg/apps/newsletter/admin/__init__.py +29 -2
- django_cfg/apps/newsletter/admin/newsletter_admin.py +531 -193
- django_cfg/apps/payments/admin/__init__.py +18 -27
- django_cfg/apps/payments/admin/api_keys_admin.py +179 -546
- django_cfg/apps/payments/admin/balance_admin.py +166 -632
- django_cfg/apps/payments/admin/currencies_admin.py +235 -607
- django_cfg/apps/payments/admin/endpoint_groups_admin.py +127 -0
- django_cfg/apps/payments/admin/filters.py +83 -3
- django_cfg/apps/payments/admin/networks_admin.py +258 -0
- django_cfg/apps/payments/admin/payments_admin.py +171 -461
- django_cfg/apps/payments/admin/subscriptions_admin.py +119 -636
- django_cfg/apps/payments/admin/tariffs_admin.py +248 -0
- django_cfg/apps/payments/admin_interface/serializers/payment_serializers.py +105 -34
- django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +12 -16
- django_cfg/apps/payments/admin_interface/views/__init__.py +2 -0
- django_cfg/apps/payments/admin_interface/views/api/webhook_admin.py +13 -18
- django_cfg/apps/payments/management/commands/manage_currencies.py +236 -274
- django_cfg/apps/payments/management/commands/manage_providers.py +4 -1
- django_cfg/apps/payments/middleware/api_access.py +32 -6
- django_cfg/apps/payments/migrations/0002_currency_usd_rate_currency_usd_rate_updated_at.py +26 -0
- django_cfg/apps/payments/migrations/0003_remove_provider_currency_fields.py +28 -0
- django_cfg/apps/payments/migrations/0004_add_reserved_usd_field.py +30 -0
- django_cfg/apps/payments/models/balance.py +12 -0
- django_cfg/apps/payments/models/currencies.py +106 -32
- django_cfg/apps/payments/models/managers/currency_managers.py +65 -0
- django_cfg/apps/payments/services/core/currency_service.py +35 -28
- django_cfg/apps/payments/services/core/payment_service.py +1 -1
- django_cfg/apps/payments/services/providers/__init__.py +3 -0
- django_cfg/apps/payments/services/providers/base.py +95 -39
- django_cfg/apps/payments/services/providers/models/__init__.py +40 -0
- django_cfg/apps/payments/services/providers/models/base.py +122 -0
- django_cfg/apps/payments/services/providers/models/providers.py +87 -0
- django_cfg/apps/payments/services/providers/models/universal.py +48 -0
- django_cfg/apps/payments/services/providers/nowpayments/__init__.py +31 -0
- django_cfg/apps/payments/services/providers/nowpayments/config.py +70 -0
- django_cfg/apps/payments/services/providers/nowpayments/models.py +150 -0
- django_cfg/apps/payments/services/providers/nowpayments/parsers.py +879 -0
- django_cfg/apps/payments/services/providers/{nowpayments.py → nowpayments/provider.py} +240 -209
- django_cfg/apps/payments/services/providers/nowpayments/sync.py +196 -0
- django_cfg/apps/payments/services/providers/registry.py +4 -32
- django_cfg/apps/payments/services/providers/sync_service.py +277 -0
- django_cfg/apps/payments/static/payments/js/api-client.js +23 -5
- django_cfg/apps/payments/static/payments/js/payment-form.js +65 -8
- django_cfg/apps/payments/tasks/__init__.py +39 -0
- django_cfg/apps/payments/tasks/types.py +73 -0
- django_cfg/apps/payments/tasks/usage_tracking.py +308 -0
- django_cfg/apps/payments/templates/admin/payments/_components/dashboard_header.html +23 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_card.html +25 -0
- django_cfg/apps/payments/templates/admin/payments/_components/stats_grid.html +16 -0
- django_cfg/apps/payments/templates/admin/payments/apikey/change_list.html +39 -0
- django_cfg/apps/payments/templates/admin/payments/balance/change_list.html +50 -0
- django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +40 -0
- django_cfg/apps/payments/templates/admin/payments/payment/change_list.html +48 -0
- django_cfg/apps/payments/templates/admin/payments/subscription/change_list.html +48 -0
- django_cfg/apps/payments/urls_admin.py +1 -1
- django_cfg/apps/payments/views/api/currencies.py +5 -5
- django_cfg/apps/payments/views/overview/services.py +2 -2
- django_cfg/apps/payments/views/serializers/currencies.py +4 -3
- django_cfg/apps/support/admin/__init__.py +10 -1
- django_cfg/apps/support/admin/support_admin.py +338 -141
- django_cfg/apps/tasks/admin/__init__.py +11 -0
- django_cfg/apps/tasks/admin/tasks_admin.py +430 -0
- django_cfg/apps/urls.py +1 -2
- django_cfg/config.py +1 -1
- django_cfg/core/config.py +10 -5
- django_cfg/core/generation.py +1 -1
- django_cfg/management/commands/__init__.py +13 -1
- django_cfg/management/commands/app_agent_diagnose.py +470 -0
- django_cfg/management/commands/app_agent_generate.py +342 -0
- django_cfg/management/commands/app_agent_info.py +308 -0
- django_cfg/management/commands/migrate_all.py +9 -3
- django_cfg/management/commands/migrator.py +11 -6
- django_cfg/management/commands/rundramatiq.py +3 -2
- django_cfg/middleware/__init__.py +0 -2
- django_cfg/models/api_keys.py +115 -0
- django_cfg/modules/django_admin/__init__.py +64 -0
- django_cfg/modules/django_admin/decorators/__init__.py +13 -0
- django_cfg/modules/django_admin/decorators/actions.py +106 -0
- django_cfg/modules/django_admin/decorators/display.py +106 -0
- django_cfg/modules/django_admin/mixins/__init__.py +14 -0
- django_cfg/modules/django_admin/mixins/display_mixin.py +81 -0
- django_cfg/modules/django_admin/mixins/optimization_mixin.py +41 -0
- django_cfg/modules/django_admin/mixins/standalone_actions_mixin.py +202 -0
- django_cfg/modules/django_admin/models/__init__.py +20 -0
- django_cfg/modules/django_admin/models/action_models.py +33 -0
- django_cfg/modules/django_admin/models/badge_models.py +20 -0
- django_cfg/modules/django_admin/models/base.py +26 -0
- django_cfg/modules/django_admin/models/display_models.py +31 -0
- django_cfg/modules/django_admin/utils/badges.py +159 -0
- django_cfg/modules/django_admin/utils/displays.py +247 -0
- django_cfg/modules/django_app_agent/__init__.py +87 -0
- django_cfg/modules/django_app_agent/agents/__init__.py +40 -0
- django_cfg/modules/django_app_agent/agents/base/__init__.py +24 -0
- django_cfg/modules/django_app_agent/agents/base/agent.py +354 -0
- django_cfg/modules/django_app_agent/agents/base/context.py +236 -0
- django_cfg/modules/django_app_agent/agents/base/executor.py +430 -0
- django_cfg/modules/django_app_agent/agents/generation/__init__.py +12 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/__init__.py +15 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/config_validator.py +147 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/main.py +99 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/models.py +32 -0
- django_cfg/modules/django_app_agent/agents/generation/app_generator/prompt_manager.py +290 -0
- django_cfg/modules/django_app_agent/agents/interfaces.py +376 -0
- django_cfg/modules/django_app_agent/core/__init__.py +33 -0
- django_cfg/modules/django_app_agent/core/config.py +300 -0
- django_cfg/modules/django_app_agent/core/exceptions.py +359 -0
- django_cfg/modules/django_app_agent/models/__init__.py +71 -0
- django_cfg/modules/django_app_agent/models/base.py +283 -0
- django_cfg/modules/django_app_agent/models/context.py +496 -0
- django_cfg/modules/django_app_agent/models/enums.py +481 -0
- django_cfg/modules/django_app_agent/models/requests.py +500 -0
- django_cfg/modules/django_app_agent/models/responses.py +585 -0
- django_cfg/modules/django_app_agent/pytest.ini +6 -0
- django_cfg/modules/django_app_agent/services/__init__.py +42 -0
- django_cfg/modules/django_app_agent/services/app_generator/__init__.py +30 -0
- django_cfg/modules/django_app_agent/services/app_generator/ai_integration.py +133 -0
- django_cfg/modules/django_app_agent/services/app_generator/context.py +40 -0
- django_cfg/modules/django_app_agent/services/app_generator/main.py +202 -0
- django_cfg/modules/django_app_agent/services/app_generator/structure.py +316 -0
- django_cfg/modules/django_app_agent/services/app_generator/validation.py +125 -0
- django_cfg/modules/django_app_agent/services/base.py +437 -0
- django_cfg/modules/django_app_agent/services/context_builder/__init__.py +34 -0
- django_cfg/modules/django_app_agent/services/context_builder/code_extractor.py +141 -0
- django_cfg/modules/django_app_agent/services/context_builder/context_generator.py +276 -0
- django_cfg/modules/django_app_agent/services/context_builder/main.py +272 -0
- django_cfg/modules/django_app_agent/services/context_builder/models.py +40 -0
- django_cfg/modules/django_app_agent/services/context_builder/pattern_analyzer.py +85 -0
- django_cfg/modules/django_app_agent/services/project_scanner/__init__.py +31 -0
- django_cfg/modules/django_app_agent/services/project_scanner/app_discovery.py +311 -0
- django_cfg/modules/django_app_agent/services/project_scanner/main.py +221 -0
- django_cfg/modules/django_app_agent/services/project_scanner/models.py +59 -0
- django_cfg/modules/django_app_agent/services/project_scanner/pattern_detection.py +94 -0
- django_cfg/modules/django_app_agent/services/questioning_service/__init__.py +28 -0
- django_cfg/modules/django_app_agent/services/questioning_service/main.py +273 -0
- django_cfg/modules/django_app_agent/services/questioning_service/models.py +111 -0
- django_cfg/modules/django_app_agent/services/questioning_service/question_generator.py +251 -0
- django_cfg/modules/django_app_agent/services/questioning_service/response_processor.py +347 -0
- django_cfg/modules/django_app_agent/services/questioning_service/session_manager.py +356 -0
- django_cfg/modules/django_app_agent/services/report_service.py +332 -0
- django_cfg/modules/django_app_agent/services/template_manager/__init__.py +18 -0
- django_cfg/modules/django_app_agent/services/template_manager/jinja_engine.py +236 -0
- django_cfg/modules/django_app_agent/services/template_manager/main.py +159 -0
- django_cfg/modules/django_app_agent/services/template_manager/models.py +36 -0
- django_cfg/modules/django_app_agent/services/template_manager/template_loader.py +100 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/admin.py.j2 +105 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/apps.py.j2 +31 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_config.py.j2 +44 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/cfg_module.py.j2 +81 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/forms.py.j2 +107 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/models.py.j2 +139 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/serializers.py.j2 +91 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/tests.py.j2 +195 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/urls.py.j2 +35 -0
- django_cfg/modules/django_app_agent/services/template_manager/templates/views.py.j2 +211 -0
- django_cfg/modules/django_app_agent/services/template_manager/variable_processor.py +200 -0
- django_cfg/modules/django_app_agent/services/validation_service/__init__.py +25 -0
- django_cfg/modules/django_app_agent/services/validation_service/django_validator.py +333 -0
- django_cfg/modules/django_app_agent/services/validation_service/main.py +242 -0
- django_cfg/modules/django_app_agent/services/validation_service/models.py +66 -0
- django_cfg/modules/django_app_agent/services/validation_service/quality_validator.py +352 -0
- django_cfg/modules/django_app_agent/services/validation_service/security_validator.py +272 -0
- django_cfg/modules/django_app_agent/services/validation_service/syntax_validator.py +203 -0
- django_cfg/modules/django_app_agent/ui/__init__.py +25 -0
- django_cfg/modules/django_app_agent/ui/cli.py +419 -0
- django_cfg/modules/django_app_agent/ui/rich_components.py +622 -0
- django_cfg/modules/django_app_agent/utils/__init__.py +38 -0
- django_cfg/modules/django_app_agent/utils/logging.py +360 -0
- django_cfg/modules/django_app_agent/utils/validation.py +417 -0
- django_cfg/modules/django_currency/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/__init__.py +2 -2
- django_cfg/modules/django_currency/clients/hybrid_client.py +587 -0
- django_cfg/modules/django_currency/core/converter.py +12 -12
- django_cfg/modules/django_currency/database/__init__.py +2 -2
- django_cfg/modules/django_currency/database/database_loader.py +93 -42
- django_cfg/modules/django_llm/llm/client.py +10 -2
- django_cfg/modules/django_unfold/callbacks/actions.py +1 -1
- django_cfg/modules/django_unfold/callbacks/statistics.py +1 -1
- django_cfg/modules/django_unfold/dashboard.py +14 -13
- django_cfg/modules/django_unfold/models/config.py +1 -1
- django_cfg/registry/core.py +3 -0
- django_cfg/registry/third_party.py +2 -2
- django_cfg/template_archive/django_sample.zip +0 -0
- {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/METADATA +2 -1
- {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/RECORD +224 -118
- django_cfg/apps/accounts/admin/activity.py +0 -96
- django_cfg/apps/accounts/admin/group.py +0 -17
- django_cfg/apps/accounts/admin/otp.py +0 -59
- django_cfg/apps/accounts/admin/registration_source.py +0 -97
- django_cfg/apps/accounts/admin/twilio_response.py +0 -227
- django_cfg/apps/accounts/admin/user.py +0 -300
- django_cfg/apps/agents/core/agent.py +0 -281
- django_cfg/apps/payments/admin_interface/old/payments/base.html +0 -175
- django_cfg/apps/payments/admin_interface/old/payments/components/dev_tool_card.html +0 -125
- django_cfg/apps/payments/admin_interface/old/payments/components/loading_spinner.html +0 -16
- django_cfg/apps/payments/admin_interface/old/payments/components/ngrok_status_card.html +0 -113
- django_cfg/apps/payments/admin_interface/old/payments/components/notification.html +0 -27
- django_cfg/apps/payments/admin_interface/old/payments/components/provider_card.html +0 -86
- django_cfg/apps/payments/admin_interface/old/payments/components/status_card.html +0 -35
- django_cfg/apps/payments/admin_interface/old/payments/currency_converter.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_dashboard.html +0 -309
- django_cfg/apps/payments/admin_interface/old/payments/payment_form.html +0 -303
- django_cfg/apps/payments/admin_interface/old/payments/payment_list.html +0 -382
- django_cfg/apps/payments/admin_interface/old/payments/payment_status.html +0 -500
- django_cfg/apps/payments/admin_interface/old/payments/webhook_dashboard.html +0 -518
- django_cfg/apps/payments/admin_interface/old/static/payments/css/components.css +0 -619
- django_cfg/apps/payments/admin_interface/old/static/payments/css/dashboard.css +0 -188
- django_cfg/apps/payments/admin_interface/old/static/payments/js/components.js +0 -545
- django_cfg/apps/payments/admin_interface/old/static/payments/js/ngrok-status.js +0 -163
- django_cfg/apps/payments/admin_interface/old/static/payments/js/utils.js +0 -412
- django_cfg/apps/tasks/admin.py +0 -320
- django_cfg/middleware/static_nocache.py +0 -55
- django_cfg/modules/django_currency/clients/yahoo_client.py +0 -157
- /django_cfg/modules/{django_unfold → django_admin}/icons/README.md +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/__init__.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/constants.py +0 -0
- /django_cfg/modules/{django_unfold → django_admin}/icons/generate_icons.py +0 -0
- {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/WHEEL +0 -0
- {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/entry_points.txt +0 -0
- {django_cfg-1.3.5.dist-info → django_cfg-1.3.9.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,376 @@
|
|
1
|
+
"""
|
2
|
+
Agent Interfaces for Django App Agent Module.
|
3
|
+
|
4
|
+
This module defines abstract interfaces for all AI agents, designed for
|
5
|
+
easy extraction into separate web services while maintaining clean
|
6
|
+
separation of concerns between services and agents.
|
7
|
+
"""
|
8
|
+
|
9
|
+
from typing import Dict, Any, List, Optional, Protocol, runtime_checkable
|
10
|
+
from abc import ABC, abstractmethod
|
11
|
+
from pathlib import Path
|
12
|
+
|
13
|
+
from pydantic import BaseModel, Field, ConfigDict
|
14
|
+
|
15
|
+
from ..models.context import ProjectContext
|
16
|
+
from ..models.requests import AppGenerationRequest
|
17
|
+
|
18
|
+
|
19
|
+
class AgentRequest(BaseModel):
|
20
|
+
"""Base request for all agent operations."""
|
21
|
+
|
22
|
+
model_config = ConfigDict(extra='forbid', validate_assignment=True)
|
23
|
+
|
24
|
+
operation_id: str = Field(description="Unique operation identifier")
|
25
|
+
correlation_id: str = Field(description="Correlation ID for tracing")
|
26
|
+
agent_name: str = Field(description="Name of the target agent")
|
27
|
+
operation_type: str = Field(description="Type of operation to perform")
|
28
|
+
context: Dict[str, Any] = Field(default_factory=dict, description="Operation context")
|
29
|
+
parameters: Dict[str, Any] = Field(default_factory=dict, description="Operation parameters")
|
30
|
+
|
31
|
+
|
32
|
+
class AgentResponse(BaseModel):
|
33
|
+
"""Base response from all agent operations."""
|
34
|
+
|
35
|
+
model_config = ConfigDict(extra='forbid', validate_assignment=True)
|
36
|
+
|
37
|
+
operation_id: str = Field(description="Operation identifier")
|
38
|
+
agent_name: str = Field(description="Name of the responding agent")
|
39
|
+
success: bool = Field(description="Whether operation was successful")
|
40
|
+
result: Dict[str, Any] = Field(default_factory=dict, description="Operation result")
|
41
|
+
error: Optional[str] = Field(default=None, description="Error message if failed")
|
42
|
+
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
43
|
+
execution_time_ms: int = Field(default=0, description="Execution time in milliseconds")
|
44
|
+
|
45
|
+
|
46
|
+
# Specific request/response types for different agent operations
|
47
|
+
|
48
|
+
class QuestionGenerationRequest(AgentRequest):
|
49
|
+
"""Request for question generation agents."""
|
50
|
+
|
51
|
+
user_intent: str = Field(description="User's stated intent")
|
52
|
+
project_context: ProjectContext = Field(description="Project analysis context")
|
53
|
+
max_questions: int = Field(default=5, description="Maximum questions to generate")
|
54
|
+
focus_areas: List[str] = Field(default_factory=list, description="Areas to focus on")
|
55
|
+
|
56
|
+
|
57
|
+
class QuestionGenerationResponse(AgentResponse):
|
58
|
+
"""Response from question generation agents."""
|
59
|
+
|
60
|
+
questions: List[Dict[str, Any]] = Field(default_factory=list, description="Generated questions")
|
61
|
+
insights: Dict[str, Any] = Field(default_factory=dict, description="Agent insights")
|
62
|
+
confidence_score: float = Field(default=0.0, description="Confidence in questions")
|
63
|
+
|
64
|
+
|
65
|
+
class CodeGenerationRequest(AgentRequest):
|
66
|
+
"""Request for code generation agents."""
|
67
|
+
|
68
|
+
generation_request: AppGenerationRequest = Field(description="App generation request")
|
69
|
+
project_context: ProjectContext = Field(description="Project context")
|
70
|
+
development_context: Dict[str, Any] = Field(description="Development context from questioning")
|
71
|
+
template_variables: Dict[str, Any] = Field(default_factory=dict, description="Template variables")
|
72
|
+
|
73
|
+
|
74
|
+
class CodeGenerationResponse(AgentResponse):
|
75
|
+
"""Response from code generation agents."""
|
76
|
+
|
77
|
+
generated_files: List[Dict[str, Any]] = Field(default_factory=list, description="Generated files")
|
78
|
+
quality_metrics: Dict[str, Any] = Field(default_factory=dict, description="Quality metrics")
|
79
|
+
recommendations: List[str] = Field(default_factory=list, description="Recommendations")
|
80
|
+
|
81
|
+
|
82
|
+
class ValidationRequest(AgentRequest):
|
83
|
+
"""Request for validation agents."""
|
84
|
+
|
85
|
+
files_to_validate: List[Dict[str, Any]] = Field(description="Files to validate")
|
86
|
+
validation_rules: List[str] = Field(description="Validation rules to apply")
|
87
|
+
project_context: ProjectContext = Field(description="Project context")
|
88
|
+
|
89
|
+
|
90
|
+
class ValidationResponse(AgentResponse):
|
91
|
+
"""Response from validation agents."""
|
92
|
+
|
93
|
+
validation_issues: List[Dict[str, Any]] = Field(default_factory=list, description="Found issues")
|
94
|
+
quality_score: float = Field(default=0.0, description="Overall quality score")
|
95
|
+
suggestions: List[str] = Field(default_factory=list, description="Improvement suggestions")
|
96
|
+
|
97
|
+
|
98
|
+
# Abstract interfaces for different agent types
|
99
|
+
|
100
|
+
@runtime_checkable
|
101
|
+
class AgentInterface(Protocol):
|
102
|
+
"""Protocol for all AI agents."""
|
103
|
+
|
104
|
+
async def execute(self, request: AgentRequest) -> AgentResponse:
|
105
|
+
"""Execute agent operation."""
|
106
|
+
...
|
107
|
+
|
108
|
+
def get_capabilities(self) -> List[str]:
|
109
|
+
"""Get list of agent capabilities."""
|
110
|
+
...
|
111
|
+
|
112
|
+
def get_status(self) -> Dict[str, Any]:
|
113
|
+
"""Get agent status information."""
|
114
|
+
...
|
115
|
+
|
116
|
+
|
117
|
+
class BaseAgentInterface(ABC):
|
118
|
+
"""Abstract base class for all agent interfaces."""
|
119
|
+
|
120
|
+
def __init__(self, agent_name: str):
|
121
|
+
"""Initialize agent interface."""
|
122
|
+
self.agent_name = agent_name
|
123
|
+
|
124
|
+
@abstractmethod
|
125
|
+
async def execute(self, request: AgentRequest) -> AgentResponse:
|
126
|
+
"""Execute agent operation."""
|
127
|
+
pass
|
128
|
+
|
129
|
+
@abstractmethod
|
130
|
+
def get_capabilities(self) -> List[str]:
|
131
|
+
"""Get list of agent capabilities."""
|
132
|
+
pass
|
133
|
+
|
134
|
+
def get_status(self) -> Dict[str, Any]:
|
135
|
+
"""Get agent status information."""
|
136
|
+
return {
|
137
|
+
"agent_name": self.agent_name,
|
138
|
+
"status": "active",
|
139
|
+
"capabilities": self.get_capabilities()
|
140
|
+
}
|
141
|
+
|
142
|
+
|
143
|
+
class QuestioningAgentInterface(BaseAgentInterface):
|
144
|
+
"""Interface for questioning/dialogue agents."""
|
145
|
+
|
146
|
+
@abstractmethod
|
147
|
+
async def generate_questions(self, request: QuestionGenerationRequest) -> QuestionGenerationResponse:
|
148
|
+
"""Generate contextual questions."""
|
149
|
+
pass
|
150
|
+
|
151
|
+
async def execute(self, request: AgentRequest) -> AgentResponse:
|
152
|
+
"""Execute questioning operation."""
|
153
|
+
if request.operation_type == "generate_questions":
|
154
|
+
# Convert generic request to specific request
|
155
|
+
question_request = QuestionGenerationRequest(**request.model_dump())
|
156
|
+
return await self.generate_questions(question_request)
|
157
|
+
else:
|
158
|
+
return AgentResponse(
|
159
|
+
operation_id=request.operation_id,
|
160
|
+
agent_name=self.agent_name,
|
161
|
+
success=False,
|
162
|
+
error=f"Unsupported operation: {request.operation_type}"
|
163
|
+
)
|
164
|
+
|
165
|
+
|
166
|
+
class CodeGenerationAgentInterface(BaseAgentInterface):
|
167
|
+
"""Interface for code generation agents."""
|
168
|
+
|
169
|
+
@abstractmethod
|
170
|
+
async def generate_code(self, request: CodeGenerationRequest) -> CodeGenerationResponse:
|
171
|
+
"""Generate application code."""
|
172
|
+
pass
|
173
|
+
|
174
|
+
async def execute(self, request: AgentRequest) -> AgentResponse:
|
175
|
+
"""Execute code generation operation."""
|
176
|
+
if request.operation_type == "generate_code":
|
177
|
+
code_request = CodeGenerationRequest(**request.model_dump())
|
178
|
+
return await self.generate_code(code_request)
|
179
|
+
else:
|
180
|
+
return AgentResponse(
|
181
|
+
operation_id=request.operation_id,
|
182
|
+
agent_name=self.agent_name,
|
183
|
+
success=False,
|
184
|
+
error=f"Unsupported operation: {request.operation_type}"
|
185
|
+
)
|
186
|
+
|
187
|
+
|
188
|
+
class ValidationAgentInterface(BaseAgentInterface):
|
189
|
+
"""Interface for validation agents."""
|
190
|
+
|
191
|
+
@abstractmethod
|
192
|
+
async def validate_code(self, request: ValidationRequest) -> ValidationResponse:
|
193
|
+
"""Validate generated code."""
|
194
|
+
pass
|
195
|
+
|
196
|
+
async def execute(self, request: AgentRequest) -> AgentResponse:
|
197
|
+
"""Execute validation operation."""
|
198
|
+
if request.operation_type == "validate_code":
|
199
|
+
validation_request = ValidationRequest(**request.model_dump())
|
200
|
+
return await self.validate_code(validation_request)
|
201
|
+
else:
|
202
|
+
return AgentResponse(
|
203
|
+
operation_id=request.operation_id,
|
204
|
+
agent_name=self.agent_name,
|
205
|
+
success=False,
|
206
|
+
error=f"Unsupported operation: {request.operation_type}"
|
207
|
+
)
|
208
|
+
|
209
|
+
|
210
|
+
# Agent registry for managing agent instances
|
211
|
+
|
212
|
+
class AgentRegistry:
|
213
|
+
"""Registry for managing agent instances and routing requests."""
|
214
|
+
|
215
|
+
def __init__(self):
|
216
|
+
"""Initialize agent registry."""
|
217
|
+
self._agents: Dict[str, AgentInterface] = {}
|
218
|
+
self._agent_types: Dict[str, str] = {}
|
219
|
+
|
220
|
+
def register_agent(self, agent_name: str, agent: AgentInterface, agent_type: str):
|
221
|
+
"""Register an agent instance."""
|
222
|
+
self._agents[agent_name] = agent
|
223
|
+
self._agent_types[agent_name] = agent_type
|
224
|
+
|
225
|
+
def unregister_agent(self, agent_name: str):
|
226
|
+
"""Unregister an agent instance."""
|
227
|
+
self._agents.pop(agent_name, None)
|
228
|
+
self._agent_types.pop(agent_name, None)
|
229
|
+
|
230
|
+
def get_agent(self, agent_name: str) -> Optional[AgentInterface]:
|
231
|
+
"""Get agent instance by name."""
|
232
|
+
return self._agents.get(agent_name)
|
233
|
+
|
234
|
+
def list_agents(self) -> Dict[str, Dict[str, Any]]:
|
235
|
+
"""List all registered agents."""
|
236
|
+
return {
|
237
|
+
name: {
|
238
|
+
"type": self._agent_types.get(name, "unknown"),
|
239
|
+
"capabilities": agent.get_capabilities(),
|
240
|
+
"status": agent.get_status()
|
241
|
+
}
|
242
|
+
for name, agent in self._agents.items()
|
243
|
+
}
|
244
|
+
|
245
|
+
def get_agents_by_type(self, agent_type: str) -> List[str]:
|
246
|
+
"""Get agent names by type."""
|
247
|
+
return [
|
248
|
+
name for name, atype in self._agent_types.items()
|
249
|
+
if atype == agent_type
|
250
|
+
]
|
251
|
+
|
252
|
+
async def execute_agent_request(self, request: AgentRequest) -> AgentResponse:
|
253
|
+
"""Execute request on specified agent."""
|
254
|
+
agent = self.get_agent(request.agent_name)
|
255
|
+
|
256
|
+
if not agent:
|
257
|
+
return AgentResponse(
|
258
|
+
operation_id=request.operation_id,
|
259
|
+
agent_name=request.agent_name,
|
260
|
+
success=False,
|
261
|
+
error=f"Agent '{request.agent_name}' not found"
|
262
|
+
)
|
263
|
+
|
264
|
+
try:
|
265
|
+
return await agent.execute(request)
|
266
|
+
except Exception as e:
|
267
|
+
return AgentResponse(
|
268
|
+
operation_id=request.operation_id,
|
269
|
+
agent_name=request.agent_name,
|
270
|
+
success=False,
|
271
|
+
error=f"Agent execution failed: {e}"
|
272
|
+
)
|
273
|
+
|
274
|
+
|
275
|
+
# Web service adapter for future extraction
|
276
|
+
|
277
|
+
class WebServiceAgentAdapter:
|
278
|
+
"""Adapter for communicating with agents via web service."""
|
279
|
+
|
280
|
+
def __init__(self, base_url: str, api_key: Optional[str] = None):
|
281
|
+
"""Initialize web service adapter."""
|
282
|
+
self.base_url = base_url.rstrip('/')
|
283
|
+
self.api_key = api_key
|
284
|
+
|
285
|
+
async def execute_agent_request(self, request: AgentRequest) -> AgentResponse:
|
286
|
+
"""Execute agent request via web service."""
|
287
|
+
# This would implement HTTP client logic for web service communication
|
288
|
+
# For now, it's a placeholder that shows the interface
|
289
|
+
|
290
|
+
# In real implementation:
|
291
|
+
# 1. Serialize request to JSON
|
292
|
+
# 2. Send HTTP POST to {base_url}/agents/{agent_name}/execute
|
293
|
+
# 3. Handle authentication with API key
|
294
|
+
# 4. Deserialize response to AgentResponse
|
295
|
+
# 5. Handle errors and retries
|
296
|
+
|
297
|
+
return AgentResponse(
|
298
|
+
operation_id=request.operation_id,
|
299
|
+
agent_name=request.agent_name,
|
300
|
+
success=False,
|
301
|
+
error="Web service adapter not implemented yet"
|
302
|
+
)
|
303
|
+
|
304
|
+
async def list_agents(self) -> Dict[str, Dict[str, Any]]:
|
305
|
+
"""List agents available via web service."""
|
306
|
+
# Would implement HTTP GET to {base_url}/agents
|
307
|
+
return {}
|
308
|
+
|
309
|
+
async def get_agent_status(self, agent_name: str) -> Dict[str, Any]:
|
310
|
+
"""Get agent status via web service."""
|
311
|
+
# Would implement HTTP GET to {base_url}/agents/{agent_name}/status
|
312
|
+
return {}
|
313
|
+
|
314
|
+
|
315
|
+
# Factory for creating agent clients (local or remote)
|
316
|
+
|
317
|
+
class AgentClientFactory:
|
318
|
+
"""Factory for creating agent clients (local or web service)."""
|
319
|
+
|
320
|
+
@staticmethod
|
321
|
+
def create_local_client(registry: AgentRegistry) -> 'LocalAgentClient':
|
322
|
+
"""Create client for local agent execution."""
|
323
|
+
return LocalAgentClient(registry)
|
324
|
+
|
325
|
+
@staticmethod
|
326
|
+
def create_web_service_client(base_url: str, api_key: Optional[str] = None) -> 'WebServiceAgentClient':
|
327
|
+
"""Create client for web service agent execution."""
|
328
|
+
return WebServiceAgentClient(base_url, api_key)
|
329
|
+
|
330
|
+
|
331
|
+
class LocalAgentClient:
|
332
|
+
"""Client for executing agents locally."""
|
333
|
+
|
334
|
+
def __init__(self, registry: AgentRegistry):
|
335
|
+
"""Initialize local agent client."""
|
336
|
+
self.registry = registry
|
337
|
+
|
338
|
+
async def execute_request(self, request: AgentRequest) -> AgentResponse:
|
339
|
+
"""Execute agent request locally."""
|
340
|
+
return await self.registry.execute_agent_request(request)
|
341
|
+
|
342
|
+
async def list_agents(self) -> Dict[str, Dict[str, Any]]:
|
343
|
+
"""List available agents."""
|
344
|
+
return self.registry.list_agents()
|
345
|
+
|
346
|
+
|
347
|
+
class WebServiceAgentClient:
|
348
|
+
"""Client for executing agents via web service."""
|
349
|
+
|
350
|
+
def __init__(self, base_url: str, api_key: Optional[str] = None):
|
351
|
+
"""Initialize web service client."""
|
352
|
+
self.adapter = WebServiceAgentAdapter(base_url, api_key)
|
353
|
+
|
354
|
+
async def execute_request(self, request: AgentRequest) -> AgentResponse:
|
355
|
+
"""Execute agent request via web service."""
|
356
|
+
return await self.adapter.execute_agent_request(request)
|
357
|
+
|
358
|
+
async def list_agents(self) -> Dict[str, Dict[str, Any]]:
|
359
|
+
"""List available agents."""
|
360
|
+
return await self.adapter.list_agents()
|
361
|
+
|
362
|
+
|
363
|
+
# Global registry instance (can be replaced with web service client)
|
364
|
+
_global_registry = AgentRegistry()
|
365
|
+
|
366
|
+
|
367
|
+
def get_agent_client() -> LocalAgentClient:
|
368
|
+
"""Get the global agent client (local by default)."""
|
369
|
+
return LocalAgentClient(_global_registry)
|
370
|
+
|
371
|
+
|
372
|
+
def set_web_service_client(base_url: str, api_key: Optional[str] = None):
|
373
|
+
"""Switch to web service client globally."""
|
374
|
+
# This would replace the global client with web service client
|
375
|
+
# Implementation depends on how we want to handle the global state
|
376
|
+
pass
|
@@ -0,0 +1,33 @@
|
|
1
|
+
"""
|
2
|
+
Core module for Django App Agent.
|
3
|
+
|
4
|
+
This module contains the foundational components including:
|
5
|
+
- Exception hierarchy
|
6
|
+
- Configuration management
|
7
|
+
- Base classes and interfaces
|
8
|
+
- Logging infrastructure
|
9
|
+
"""
|
10
|
+
|
11
|
+
from .exceptions import (
|
12
|
+
DjangoAppAgentError,
|
13
|
+
ConfigurationError,
|
14
|
+
GenerationError,
|
15
|
+
ValidationError,
|
16
|
+
QualityValidationError,
|
17
|
+
AgentExecutionError,
|
18
|
+
AuthenticationError,
|
19
|
+
RateLimitError,
|
20
|
+
TimeoutError as AgentTimeoutError,
|
21
|
+
)
|
22
|
+
|
23
|
+
__all__ = [
|
24
|
+
"DjangoAppAgentError",
|
25
|
+
"ConfigurationError",
|
26
|
+
"GenerationError",
|
27
|
+
"ValidationError",
|
28
|
+
"QualityValidationError",
|
29
|
+
"AgentExecutionError",
|
30
|
+
"AuthenticationError",
|
31
|
+
"RateLimitError",
|
32
|
+
"AgentTimeoutError",
|
33
|
+
]
|