Update database paths and fix foreign key references across coordinator API
- Change SQLite database path from `/home/oib/windsurf/aitbc/data/` to `/opt/data/` - Fix foreign key references to use correct table names (users, wallets, gpu_registry) - Replace governance router with new governance and community routers - Add multi-modal RL router to main application - Simplify DEPLOYMENT_READINESS_REPORT.md to focus on production deployment status - Update governance router with decentralized DAO voting
This commit is contained in:
481
apps/coordinator-api/src/app/domain/agent_performance.py
Normal file
481
apps/coordinator-api/src/app/domain/agent_performance.py
Normal file
@@ -0,0 +1,481 @@
|
||||
"""
|
||||
Advanced Agent Performance Domain Models
|
||||
Implements SQLModel definitions for meta-learning, resource management, and performance optimization
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class LearningStrategy(str, Enum):
|
||||
"""Learning strategy enumeration"""
|
||||
META_LEARNING = "meta_learning"
|
||||
TRANSFER_LEARNING = "transfer_learning"
|
||||
REINFORCEMENT_LEARNING = "reinforcement_learning"
|
||||
SUPERVISED_LEARNING = "supervised_learning"
|
||||
UNSUPERVISED_LEARNING = "unsupervised_learning"
|
||||
FEDERATED_LEARNING = "federated_learning"
|
||||
|
||||
|
||||
class PerformanceMetric(str, Enum):
|
||||
"""Performance metric enumeration"""
|
||||
ACCURACY = "accuracy"
|
||||
PRECISION = "precision"
|
||||
RECALL = "recall"
|
||||
F1_SCORE = "f1_score"
|
||||
LATENCY = "latency"
|
||||
THROUGHPUT = "throughput"
|
||||
RESOURCE_EFFICIENCY = "resource_efficiency"
|
||||
COST_EFFICIENCY = "cost_efficiency"
|
||||
ADAPTATION_SPEED = "adaptation_speed"
|
||||
GENERALIZATION = "generalization"
|
||||
|
||||
|
||||
class ResourceType(str, Enum):
|
||||
"""Resource type enumeration"""
|
||||
CPU = "cpu"
|
||||
GPU = "gpu"
|
||||
MEMORY = "memory"
|
||||
STORAGE = "storage"
|
||||
NETWORK = "network"
|
||||
CACHE = "cache"
|
||||
|
||||
|
||||
class OptimizationTarget(str, Enum):
|
||||
"""Optimization target enumeration"""
|
||||
SPEED = "speed"
|
||||
ACCURACY = "accuracy"
|
||||
EFFICIENCY = "efficiency"
|
||||
COST = "cost"
|
||||
SCALABILITY = "scalability"
|
||||
RELIABILITY = "reliability"
|
||||
|
||||
|
||||
class AgentPerformanceProfile(SQLModel, table=True):
|
||||
"""Agent performance profiles and metrics"""
|
||||
|
||||
__tablename__ = "agent_performance_profiles"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"perf_{uuid4().hex[:8]}", primary_key=True)
|
||||
profile_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Agent identification
|
||||
agent_id: str = Field(index=True)
|
||||
agent_type: str = Field(default="openclaw")
|
||||
agent_version: str = Field(default="1.0.0")
|
||||
|
||||
# Performance metrics
|
||||
overall_score: float = Field(default=0.0, ge=0, le=100)
|
||||
performance_metrics: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Learning capabilities
|
||||
learning_strategies: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
adaptation_rate: float = Field(default=0.0, ge=0, le=1.0)
|
||||
generalization_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Resource utilization
|
||||
resource_efficiency: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
cost_per_task: float = Field(default=0.0)
|
||||
throughput: float = Field(default=0.0)
|
||||
average_latency: float = Field(default=0.0)
|
||||
|
||||
# Specialization areas
|
||||
specialization_areas: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
expertise_levels: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Performance history
|
||||
performance_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
improvement_trends: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Benchmarking
|
||||
benchmark_scores: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
ranking_position: Optional[int] = None
|
||||
percentile_rank: Optional[float] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_assessed: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
performance_notes: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class MetaLearningModel(SQLModel, table=True):
|
||||
"""Meta-learning models and configurations"""
|
||||
|
||||
__tablename__ = "meta_learning_models"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"meta_{uuid4().hex[:8]}", primary_key=True)
|
||||
model_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Model identification
|
||||
model_name: str = Field(max_length=100)
|
||||
model_type: str = Field(default="meta_learning")
|
||||
model_version: str = Field(default="1.0.0")
|
||||
|
||||
# Learning configuration
|
||||
base_algorithms: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
meta_strategy: LearningStrategy
|
||||
adaptation_targets: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Training data
|
||||
training_tasks: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
task_distributions: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
meta_features: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Model performance
|
||||
meta_accuracy: float = Field(default=0.0, ge=0, le=1.0)
|
||||
adaptation_speed: float = Field(default=0.0, ge=0, le=1.0)
|
||||
generalization_ability: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Resource requirements
|
||||
training_time: Optional[float] = None # hours
|
||||
computational_cost: Optional[float] = None # cost units
|
||||
memory_requirement: Optional[float] = None # GB
|
||||
gpu_requirement: Optional[bool] = Field(default=False)
|
||||
|
||||
# Deployment status
|
||||
status: str = Field(default="training") # training, ready, deployed, deprecated
|
||||
deployment_count: int = Field(default=0)
|
||||
success_rate: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
trained_at: Optional[datetime] = None
|
||||
deployed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
model_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class ResourceAllocation(SQLModel, table=True):
|
||||
"""Resource allocation and optimization records"""
|
||||
|
||||
__tablename__ = "resource_allocations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"alloc_{uuid4().hex[:8]}", primary_key=True)
|
||||
allocation_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Allocation details
|
||||
agent_id: str = Field(index=True)
|
||||
task_id: Optional[str] = None
|
||||
session_id: Optional[str] = None
|
||||
|
||||
# Resource requirements
|
||||
cpu_cores: float = Field(default=1.0)
|
||||
memory_gb: float = Field(default=2.0)
|
||||
gpu_count: float = Field(default=0.0)
|
||||
gpu_memory_gb: float = Field(default=0.0)
|
||||
storage_gb: float = Field(default=10.0)
|
||||
network_bandwidth: float = Field(default=100.0) # Mbps
|
||||
|
||||
# Optimization targets
|
||||
optimization_target: OptimizationTarget
|
||||
priority_level: str = Field(default="normal") # low, normal, high, critical
|
||||
|
||||
# Performance metrics
|
||||
actual_performance: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
efficiency_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
cost_efficiency: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Allocation status
|
||||
status: str = Field(default="pending") # pending, allocated, active, completed, failed
|
||||
allocated_at: Optional[datetime] = None
|
||||
started_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
# Optimization results
|
||||
optimization_applied: bool = Field(default=False)
|
||||
optimization_savings: float = Field(default=0.0)
|
||||
performance_improvement: float = Field(default=0.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow())
|
||||
|
||||
# Additional data
|
||||
allocation_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
resource_utilization: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class PerformanceOptimization(SQLModel, table=True):
|
||||
"""Performance optimization records and results"""
|
||||
|
||||
__tablename__ = "performance_optimizations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"opt_{uuid4().hex[:8]}", primary_key=True)
|
||||
optimization_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Optimization details
|
||||
agent_id: str = Field(index=True)
|
||||
optimization_type: str = Field(max_length=50) # resource, algorithm, hyperparameter, architecture
|
||||
target_metric: PerformanceMetric
|
||||
|
||||
# Before optimization
|
||||
baseline_performance: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
baseline_resources: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
baseline_cost: float = Field(default=0.0)
|
||||
|
||||
# Optimization configuration
|
||||
optimization_parameters: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
optimization_algorithm: str = Field(default="auto")
|
||||
search_space: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# After optimization
|
||||
optimized_performance: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
optimized_resources: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
optimized_cost: float = Field(default=0.0)
|
||||
|
||||
# Improvement metrics
|
||||
performance_improvement: float = Field(default=0.0)
|
||||
resource_savings: float = Field(default=0.0)
|
||||
cost_savings: float = Field(default=0.0)
|
||||
overall_efficiency_gain: float = Field(default=0.0)
|
||||
|
||||
# Optimization process
|
||||
optimization_duration: Optional[float] = None # seconds
|
||||
iterations_required: int = Field(default=0)
|
||||
convergence_achieved: bool = Field(default=False)
|
||||
|
||||
# Status and deployment
|
||||
status: str = Field(default="pending") # pending, running, completed, failed, deployed
|
||||
applied_at: Optional[datetime] = None
|
||||
rollback_available: bool = Field(default=True)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
optimization_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
performance_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AgentCapability(SQLModel, table=True):
|
||||
"""Agent capabilities and skill assessments"""
|
||||
|
||||
__tablename__ = "agent_capabilities"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"cap_{uuid4().hex[:8]}", primary_key=True)
|
||||
capability_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Capability details
|
||||
agent_id: str = Field(index=True)
|
||||
capability_name: str = Field(max_length=100)
|
||||
capability_type: str = Field(max_length=50) # cognitive, creative, analytical, technical
|
||||
domain_area: str = Field(max_length=50)
|
||||
|
||||
# Skill level assessment
|
||||
skill_level: float = Field(default=0.0, ge=0, le=10.0)
|
||||
proficiency_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
experience_years: float = Field(default=0.0)
|
||||
|
||||
# Capability metrics
|
||||
performance_metrics: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
success_rate: float = Field(default=0.0, ge=0, le=1.0)
|
||||
average_quality: float = Field(default=0.0, ge=0, le=5.0)
|
||||
|
||||
# Learning and adaptation
|
||||
learning_rate: float = Field(default=0.0, ge=0, le=1.0)
|
||||
adaptation_speed: float = Field(default=0.0, ge=0, le=1.0)
|
||||
knowledge_retention: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Specialization
|
||||
specializations: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
sub_capabilities: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
tool_proficiency: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Development history
|
||||
acquired_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_improved: Optional[datetime] = None
|
||||
improvement_count: int = Field(default=0)
|
||||
|
||||
# Certification and validation
|
||||
certified: bool = Field(default=False)
|
||||
certification_level: Optional[str] = None
|
||||
last_validated: Optional[datetime] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional data
|
||||
capability_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
training_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class FusionModel(SQLModel, table=True):
|
||||
"""Multi-modal agent fusion models"""
|
||||
|
||||
__tablename__ = "fusion_models"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"fusion_{uuid4().hex[:8]}", primary_key=True)
|
||||
fusion_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Model identification
|
||||
model_name: str = Field(max_length=100)
|
||||
fusion_type: str = Field(max_length=50) # ensemble, hybrid, multi_modal, cross_domain
|
||||
model_version: str = Field(default="1.0.0")
|
||||
|
||||
# Component models
|
||||
base_models: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
model_weights: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
fusion_strategy: str = Field(default="weighted_average")
|
||||
|
||||
# Input modalities
|
||||
input_modalities: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
modality_weights: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Performance metrics
|
||||
fusion_performance: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
synergy_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
robustness_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Resource requirements
|
||||
computational_complexity: str = Field(default="medium") # low, medium, high, very_high
|
||||
memory_requirement: float = Field(default=0.0) # GB
|
||||
inference_time: float = Field(default=0.0) # seconds
|
||||
|
||||
# Training data
|
||||
training_datasets: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
data_requirements: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Deployment status
|
||||
status: str = Field(default="training") # training, ready, deployed, deprecated
|
||||
deployment_count: int = Field(default=0)
|
||||
performance_stability: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
trained_at: Optional[datetime] = None
|
||||
deployed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
fusion_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class ReinforcementLearningConfig(SQLModel, table=True):
|
||||
"""Reinforcement learning configurations and policies"""
|
||||
|
||||
__tablename__ = "rl_configurations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"rl_{uuid4().hex[:8]}", primary_key=True)
|
||||
config_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Configuration details
|
||||
agent_id: str = Field(index=True)
|
||||
environment_type: str = Field(max_length=50)
|
||||
algorithm: str = Field(default="ppo") # ppo, a2c, dqn, sac, td3
|
||||
|
||||
# Learning parameters
|
||||
learning_rate: float = Field(default=0.001)
|
||||
discount_factor: float = Field(default=0.99)
|
||||
exploration_rate: float = Field(default=0.1)
|
||||
batch_size: int = Field(default=64)
|
||||
|
||||
# Network architecture
|
||||
network_layers: List[int] = Field(default=[256, 256, 128], sa_column=Column(JSON))
|
||||
activation_functions: List[str] = Field(default=["relu", "relu", "tanh"], sa_column=Column(JSON))
|
||||
|
||||
# Training configuration
|
||||
max_episodes: int = Field(default=1000)
|
||||
max_steps_per_episode: int = Field(default=1000)
|
||||
save_frequency: int = Field(default=100)
|
||||
|
||||
# Performance metrics
|
||||
reward_history: List[float] = Field(default=[], sa_column=Column(JSON))
|
||||
success_rate_history: List[float] = Field(default=[], sa_column=Column(JSON))
|
||||
convergence_episode: Optional[int] = None
|
||||
|
||||
# Policy details
|
||||
policy_type: str = Field(default="stochastic") # stochastic, deterministic
|
||||
action_space: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
state_space: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Status and deployment
|
||||
status: str = Field(default="training") # training, ready, deployed, deprecated
|
||||
training_progress: float = Field(default=0.0, ge=0, le=1.0)
|
||||
deployment_performance: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
trained_at: Optional[datetime] = None
|
||||
deployed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
rl_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class CreativeCapability(SQLModel, table=True):
|
||||
"""Creative and specialized AI capabilities"""
|
||||
|
||||
__tablename__ = "creative_capabilities"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"creative_{uuid4().hex[:8]}", primary_key=True)
|
||||
capability_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Capability details
|
||||
agent_id: str = Field(index=True)
|
||||
creative_domain: str = Field(max_length=50) # art, music, writing, design, innovation
|
||||
capability_type: str = Field(max_length=50) # generative, compositional, analytical, innovative
|
||||
|
||||
# Creative metrics
|
||||
originality_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
novelty_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
aesthetic_quality: float = Field(default=0.0, ge=0, le=5.0)
|
||||
coherence_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Generation capabilities
|
||||
generation_models: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
style_variety: int = Field(default=1)
|
||||
output_quality: float = Field(default=0.0, ge=0, le=5.0)
|
||||
|
||||
# Learning and adaptation
|
||||
creative_learning_rate: float = Field(default=0.0, ge=0, le=1.0)
|
||||
style_adaptation: float = Field(default=0.0, ge=0, le=1.0)
|
||||
cross_domain_transfer: float = Field(default=0.0, ge=0, le=1.0)
|
||||
|
||||
# Specialization
|
||||
creative_specializations: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
tool_proficiency: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
domain_knowledge: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Performance tracking
|
||||
creations_generated: int = Field(default=0)
|
||||
user_ratings: List[float] = Field(default=[], sa_column=Column(JSON))
|
||||
expert_evaluations: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Status and certification
|
||||
status: str = Field(default="developing") # developing, ready, certified, deprecated
|
||||
certification_level: Optional[str] = None
|
||||
last_evaluation: Optional[datetime] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional data
|
||||
creative_profile_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
portfolio_samples: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
440
apps/coordinator-api/src/app/domain/analytics.py
Normal file
440
apps/coordinator-api/src/app/domain/analytics.py
Normal file
@@ -0,0 +1,440 @@
|
||||
"""
|
||||
Marketplace Analytics Domain Models
|
||||
Implements SQLModel definitions for analytics, insights, and reporting
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class AnalyticsPeriod(str, Enum):
|
||||
"""Analytics period enumeration"""
|
||||
REALTIME = "realtime"
|
||||
HOURLY = "hourly"
|
||||
DAILY = "daily"
|
||||
WEEKLY = "weekly"
|
||||
MONTHLY = "monthly"
|
||||
QUARTERLY = "quarterly"
|
||||
YEARLY = "yearly"
|
||||
|
||||
|
||||
class MetricType(str, Enum):
|
||||
"""Metric type enumeration"""
|
||||
VOLUME = "volume"
|
||||
COUNT = "count"
|
||||
AVERAGE = "average"
|
||||
PERCENTAGE = "percentage"
|
||||
RATIO = "ratio"
|
||||
RATE = "rate"
|
||||
VALUE = "value"
|
||||
|
||||
|
||||
class InsightType(str, Enum):
|
||||
"""Insight type enumeration"""
|
||||
TREND = "trend"
|
||||
ANOMALY = "anomaly"
|
||||
OPPORTUNITY = "opportunity"
|
||||
WARNING = "warning"
|
||||
PREDICTION = "prediction"
|
||||
RECOMMENDATION = "recommendation"
|
||||
|
||||
|
||||
class ReportType(str, Enum):
|
||||
"""Report type enumeration"""
|
||||
MARKET_OVERVIEW = "market_overview"
|
||||
AGENT_PERFORMANCE = "agent_performance"
|
||||
ECONOMIC_ANALYSIS = "economic_analysis"
|
||||
GEOGRAPHIC_ANALYSIS = "geographic_analysis"
|
||||
COMPETITIVE_ANALYSIS = "competitive_analysis"
|
||||
RISK_ASSESSMENT = "risk_assessment"
|
||||
|
||||
|
||||
class MarketMetric(SQLModel, table=True):
|
||||
"""Market metrics and KPIs"""
|
||||
|
||||
__tablename__ = "market_metrics"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"metric_{uuid4().hex[:8]}", primary_key=True)
|
||||
metric_name: str = Field(index=True)
|
||||
metric_type: MetricType
|
||||
period_type: AnalyticsPeriod
|
||||
|
||||
# Metric values
|
||||
value: float = Field(default=0.0)
|
||||
previous_value: Optional[float] = None
|
||||
change_percentage: Optional[float] = None
|
||||
|
||||
# Contextual data
|
||||
unit: str = Field(default="")
|
||||
category: str = Field(default="general")
|
||||
subcategory: str = Field(default="")
|
||||
|
||||
# Geographic and temporal context
|
||||
geographic_region: Optional[str] = None
|
||||
agent_tier: Optional[str] = None
|
||||
trade_type: Optional[str] = None
|
||||
|
||||
# Metadata
|
||||
metric_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
recorded_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
|
||||
# Additional data
|
||||
breakdown: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
comparisons: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class MarketInsight(SQLModel, table=True):
|
||||
"""Market insights and analysis"""
|
||||
|
||||
__tablename__ = "market_insights"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"insight_{uuid4().hex[:8]}", primary_key=True)
|
||||
insight_type: InsightType
|
||||
title: str = Field(max_length=200)
|
||||
description: str = Field(default="", max_length=1000)
|
||||
|
||||
# Insight data
|
||||
confidence_score: float = Field(default=0.0, ge=0, le=1.0)
|
||||
impact_level: str = Field(default="medium") # low, medium, high, critical
|
||||
urgency_level: str = Field(default="normal") # low, normal, high, urgent
|
||||
|
||||
# Related metrics and context
|
||||
related_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
affected_entities: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
time_horizon: str = Field(default="short_term") # immediate, short_term, medium_term, long_term
|
||||
|
||||
# Analysis details
|
||||
analysis_method: str = Field(default="statistical")
|
||||
data_sources: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
assumptions: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Recommendations and actions
|
||||
recommendations: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
suggested_actions: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Status and tracking
|
||||
status: str = Field(default="active") # active, resolved, expired
|
||||
acknowledged_by: Optional[str] = None
|
||||
acknowledged_at: Optional[datetime] = None
|
||||
resolved_by: Optional[str] = None
|
||||
resolved_at: Optional[datetime] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
insight_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
visualization_config: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AnalyticsReport(SQLModel, table=True):
|
||||
"""Generated analytics reports"""
|
||||
|
||||
__tablename__ = "analytics_reports"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"report_{uuid4().hex[:8]}", primary_key=True)
|
||||
report_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Report details
|
||||
report_type: ReportType
|
||||
title: str = Field(max_length=200)
|
||||
description: str = Field(default="", max_length=1000)
|
||||
|
||||
# Report parameters
|
||||
period_type: AnalyticsPeriod
|
||||
start_date: datetime
|
||||
end_date: datetime
|
||||
filters: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Report content
|
||||
summary: str = Field(default="", max_length=2000)
|
||||
key_findings: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
recommendations: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Report data
|
||||
data_sections: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
charts: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
tables: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Generation details
|
||||
generated_by: str = Field(default="system") # system, user, scheduled
|
||||
generation_time: float = Field(default=0.0) # seconds
|
||||
data_points_analyzed: int = Field(default=0)
|
||||
|
||||
# Status and delivery
|
||||
status: str = Field(default="generated") # generating, generated, failed, delivered
|
||||
delivery_method: str = Field(default="api") # api, email, dashboard
|
||||
recipients: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
generated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
delivered_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
report_metric_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
template_used: Optional[str] = None
|
||||
|
||||
|
||||
class DashboardConfig(SQLModel, table=True):
|
||||
"""Analytics dashboard configurations"""
|
||||
|
||||
__tablename__ = "dashboard_configs"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"dashboard_{uuid4().hex[:8]}", primary_key=True)
|
||||
dashboard_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Dashboard details
|
||||
name: str = Field(max_length=100)
|
||||
description: str = Field(default="", max_length=500)
|
||||
dashboard_type: str = Field(default="custom") # default, custom, executive, operational
|
||||
|
||||
# Layout and configuration
|
||||
layout: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
widgets: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
filters: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Data sources and refresh
|
||||
data_sources: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
refresh_interval: int = Field(default=300) # seconds
|
||||
auto_refresh: bool = Field(default=True)
|
||||
|
||||
# Access and permissions
|
||||
owner_id: str = Field(index=True)
|
||||
viewers: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
editors: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
is_public: bool = Field(default=False)
|
||||
|
||||
# Status and versioning
|
||||
status: str = Field(default="active") # active, inactive, archived
|
||||
version: int = Field(default=1)
|
||||
last_modified_by: Optional[str] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_viewed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
dashboard_settings: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
theme_config: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class DataCollectionJob(SQLModel, table=True):
|
||||
"""Data collection and processing jobs"""
|
||||
|
||||
__tablename__ = "data_collection_jobs"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"job_{uuid4().hex[:8]}", primary_key=True)
|
||||
job_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Job details
|
||||
job_type: str = Field(max_length=50) # metrics_collection, insight_generation, report_generation
|
||||
job_name: str = Field(max_length=100)
|
||||
description: str = Field(default="", max_length=500)
|
||||
|
||||
# Job parameters
|
||||
parameters: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
data_sources: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
target_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Schedule and execution
|
||||
schedule_type: str = Field(default="manual") # manual, scheduled, triggered
|
||||
cron_expression: Optional[str] = None
|
||||
next_run: Optional[datetime] = None
|
||||
|
||||
# Execution details
|
||||
status: str = Field(default="pending") # pending, running, completed, failed, cancelled
|
||||
progress: float = Field(default=0.0, ge=0, le=100.0)
|
||||
started_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
# Results and output
|
||||
records_processed: int = Field(default=0)
|
||||
records_generated: int = Field(default=0)
|
||||
errors: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
output_files: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Performance metrics
|
||||
execution_time: float = Field(default=0.0) # seconds
|
||||
memory_usage: float = Field(default=0.0) # MB
|
||||
cpu_usage: float = Field(default=0.0) # percentage
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional data
|
||||
job_metric_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
execution_log: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AlertRule(SQLModel, table=True):
|
||||
"""Analytics alert rules and notifications"""
|
||||
|
||||
__tablename__ = "alert_rules"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"alert_{uuid4().hex[:8]}", primary_key=True)
|
||||
rule_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Rule details
|
||||
name: str = Field(max_length=100)
|
||||
description: str = Field(default="", max_length=500)
|
||||
rule_type: str = Field(default="threshold") # threshold, anomaly, trend, pattern
|
||||
|
||||
# Conditions and triggers
|
||||
conditions: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
threshold_value: Optional[float] = None
|
||||
comparison_operator: str = Field(default="greater_than") # greater_than, less_than, equals, contains
|
||||
|
||||
# Target metrics and entities
|
||||
target_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
target_entities: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
geographic_scope: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Alert configuration
|
||||
severity: str = Field(default="medium") # low, medium, high, critical
|
||||
cooldown_period: int = Field(default=300) # seconds
|
||||
auto_resolve: bool = Field(default=False)
|
||||
resolve_conditions: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Notification settings
|
||||
notification_channels: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
notification_recipients: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
message_template: str = Field(default="", max_length=1000)
|
||||
|
||||
# Status and scheduling
|
||||
status: str = Field(default="active") # active, inactive, disabled
|
||||
created_by: str = Field(index=True)
|
||||
last_triggered: Optional[datetime] = None
|
||||
trigger_count: int = Field(default=0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional data
|
||||
rule_metric_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
test_results: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AnalyticsAlert(SQLModel, table=True):
|
||||
"""Generated analytics alerts"""
|
||||
|
||||
__tablename__ = "analytics_alerts"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"alert_{uuid4().hex[:8]}", primary_key=True)
|
||||
alert_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Alert details
|
||||
rule_id: str = Field(index=True)
|
||||
alert_type: str = Field(max_length=50)
|
||||
title: str = Field(max_length=200)
|
||||
message: str = Field(default="", max_length=1000)
|
||||
|
||||
# Alert data
|
||||
severity: str = Field(default="medium")
|
||||
confidence: float = Field(default=0.0, ge=0, le=1.0)
|
||||
impact_assessment: str = Field(default="", max_length=500)
|
||||
|
||||
# Trigger data
|
||||
trigger_value: Optional[float] = None
|
||||
threshold_value: Optional[float] = None
|
||||
deviation_percentage: Optional[float] = None
|
||||
affected_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Context and entities
|
||||
geographic_regions: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
affected_agents: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
time_period: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Status and resolution
|
||||
status: str = Field(default="active") # active, acknowledged, resolved, false_positive
|
||||
acknowledged_by: Optional[str] = None
|
||||
acknowledged_at: Optional[datetime] = None
|
||||
resolved_by: Optional[str] = None
|
||||
resolved_at: Optional[datetime] = None
|
||||
resolution_notes: str = Field(default="", max_length=1000)
|
||||
|
||||
# Notifications
|
||||
notifications_sent: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
delivery_status: Dict[str, str] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
alert_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
related_insights: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class UserPreference(SQLModel, table=True):
|
||||
"""User analytics preferences and settings"""
|
||||
|
||||
__tablename__ = "user_preferences"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"pref_{uuid4().hex[:8]}", primary_key=True)
|
||||
user_id: str = Field(index=True)
|
||||
|
||||
# Notification preferences
|
||||
email_notifications: bool = Field(default=True)
|
||||
alert_notifications: bool = Field(default=True)
|
||||
report_notifications: bool = Field(default=False)
|
||||
notification_frequency: str = Field(default="daily") # immediate, daily, weekly, monthly
|
||||
|
||||
# Dashboard preferences
|
||||
default_dashboard: Optional[str] = None
|
||||
preferred_timezone: str = Field(default="UTC")
|
||||
date_format: str = Field(default="YYYY-MM-DD")
|
||||
time_format: str = Field(default="24h")
|
||||
|
||||
# Metric preferences
|
||||
favorite_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
metric_units: Dict[str, str] = Field(default={}, sa_column=Column(JSON))
|
||||
default_period: AnalyticsPeriod = Field(default=AnalyticsPeriod.DAILY)
|
||||
|
||||
# Alert preferences
|
||||
alert_severity_threshold: str = Field(default="medium") # low, medium, high, critical
|
||||
quiet_hours: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
alert_channels: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Report preferences
|
||||
auto_subscribe_reports: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
report_format: str = Field(default="json") # json, csv, pdf, html
|
||||
include_charts: bool = Field(default=True)
|
||||
|
||||
# Privacy and security
|
||||
data_retention_days: int = Field(default=90)
|
||||
share_analytics: bool = Field(default=False)
|
||||
anonymous_usage: bool = Field(default=False)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_login: Optional[datetime] = None
|
||||
|
||||
# Additional preferences
|
||||
custom_settings: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
ui_preferences: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
453
apps/coordinator-api/src/app/domain/certification.py
Normal file
453
apps/coordinator-api/src/app/domain/certification.py
Normal file
@@ -0,0 +1,453 @@
|
||||
"""
|
||||
Agent Certification and Partnership Domain Models
|
||||
Implements SQLModel definitions for certification, verification, and partnership programs
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class CertificationLevel(str, Enum):
|
||||
"""Certification level enumeration"""
|
||||
BASIC = "basic"
|
||||
INTERMEDIATE = "intermediate"
|
||||
ADVANCED = "advanced"
|
||||
ENTERPRISE = "enterprise"
|
||||
PREMIUM = "premium"
|
||||
|
||||
|
||||
class CertificationStatus(str, Enum):
|
||||
"""Certification status enumeration"""
|
||||
PENDING = "pending"
|
||||
ACTIVE = "active"
|
||||
EXPIRED = "expired"
|
||||
REVOKED = "revoked"
|
||||
SUSPENDED = "suspended"
|
||||
|
||||
|
||||
class VerificationType(str, Enum):
|
||||
"""Verification type enumeration"""
|
||||
IDENTITY = "identity"
|
||||
PERFORMANCE = "performance"
|
||||
RELIABILITY = "reliability"
|
||||
SECURITY = "security"
|
||||
COMPLIANCE = "compliance"
|
||||
CAPABILITY = "capability"
|
||||
|
||||
|
||||
class PartnershipType(str, Enum):
|
||||
"""Partnership type enumeration"""
|
||||
TECHNOLOGY = "technology"
|
||||
SERVICE = "service"
|
||||
RESELLER = "reseller"
|
||||
INTEGRATION = "integration"
|
||||
STRATEGIC = "strategic"
|
||||
AFFILIATE = "affiliate"
|
||||
|
||||
|
||||
class BadgeType(str, Enum):
|
||||
"""Badge type enumeration"""
|
||||
ACHIEVEMENT = "achievement"
|
||||
MILESTONE = "milestone"
|
||||
RECOGNITION = "recognition"
|
||||
SPECIALIZATION = "specialization"
|
||||
EXCELLENCE = "excellence"
|
||||
CONTRIBUTION = "contribution"
|
||||
|
||||
|
||||
class AgentCertification(SQLModel, table=True):
|
||||
"""Agent certification records"""
|
||||
|
||||
__tablename__ = "agent_certifications"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"cert_{uuid4().hex[:8]}", primary_key=True)
|
||||
certification_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Certification details
|
||||
agent_id: str = Field(index=True)
|
||||
certification_level: CertificationLevel
|
||||
certification_type: str = Field(default="standard") # standard, specialized, enterprise
|
||||
|
||||
# Issuance information
|
||||
issued_by: str = Field(index=True) # Who issued the certification
|
||||
issued_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
verification_hash: str = Field(max_length=64) # Blockchain verification hash
|
||||
|
||||
# Status and metadata
|
||||
status: CertificationStatus = Field(default=CertificationStatus.ACTIVE)
|
||||
renewal_count: int = Field(default=0)
|
||||
last_renewed_at: Optional[datetime] = None
|
||||
|
||||
# Requirements and verification
|
||||
requirements_met: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
verification_results: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
supporting_documents: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Benefits and privileges
|
||||
granted_privileges: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
access_levels: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
special_capabilities: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Audit trail
|
||||
audit_log: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
last_verified_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
notes: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class CertificationRequirement(SQLModel, table=True):
|
||||
"""Certification requirements and criteria"""
|
||||
|
||||
__tablename__ = "certification_requirements"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"req_{uuid4().hex[:8]}", primary_key=True)
|
||||
|
||||
# Requirement details
|
||||
certification_level: CertificationLevel
|
||||
requirement_type: VerificationType
|
||||
requirement_name: str = Field(max_length=100)
|
||||
description: str = Field(default="", max_length=500)
|
||||
|
||||
# Criteria and thresholds
|
||||
criteria: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
minimum_threshold: Optional[float] = None
|
||||
maximum_threshold: Optional[float] = None
|
||||
required_values: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Verification method
|
||||
verification_method: str = Field(default="automated") # automated, manual, hybrid
|
||||
verification_frequency: str = Field(default="once") # once, monthly, quarterly, annually
|
||||
|
||||
# Dependencies and prerequisites
|
||||
prerequisites: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
depends_on: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Status and configuration
|
||||
is_active: bool = Field(default=True)
|
||||
is_mandatory: bool = Field(default=True)
|
||||
weight: float = Field(default=1.0) # Importance weight
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
effective_date: datetime = Field(default_factory=datetime.utcnow)
|
||||
expiry_date: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class VerificationRecord(SQLModel, table=True):
|
||||
"""Agent verification records and results"""
|
||||
|
||||
__tablename__ = "verification_records"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"verify_{uuid4().hex[:8]}", primary_key=True)
|
||||
verification_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Verification details
|
||||
agent_id: str = Field(index=True)
|
||||
verification_type: VerificationType
|
||||
verification_method: str = Field(default="automated")
|
||||
|
||||
# Request information
|
||||
requested_by: str = Field(index=True)
|
||||
requested_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
priority: str = Field(default="normal") # low, normal, high, urgent
|
||||
|
||||
# Verification process
|
||||
started_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
processing_time: Optional[float] = None # seconds
|
||||
|
||||
# Results and outcomes
|
||||
status: str = Field(default="pending") # pending, in_progress, passed, failed, cancelled
|
||||
result_score: Optional[float] = None
|
||||
result_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
failure_reasons: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Verification data
|
||||
input_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
output_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
evidence: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Review and approval
|
||||
reviewed_by: Optional[str] = None
|
||||
reviewed_at: Optional[datetime] = None
|
||||
approved_by: Optional[str] = None
|
||||
approved_at: Optional[datetime] = None
|
||||
|
||||
# Audit and compliance
|
||||
compliance_score: Optional[float] = None
|
||||
risk_assessment: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
audit_trail: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Additional data
|
||||
cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
notes: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class PartnershipProgram(SQLModel, table=True):
|
||||
"""Partnership programs and alliances"""
|
||||
|
||||
__tablename__ = "partnership_programs"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"partner_{uuid4().hex[:8]}", primary_key=True)
|
||||
program_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Program details
|
||||
program_name: str = Field(max_length=200)
|
||||
program_type: PartnershipType
|
||||
description: str = Field(default="", max_length=1000)
|
||||
|
||||
# Program configuration
|
||||
tier_levels: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
benefits_by_tier: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
requirements_by_tier: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Eligibility criteria
|
||||
eligibility_requirements: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
minimum_criteria: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
exclusion_criteria: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Program benefits
|
||||
financial_benefits: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
non_financial_benefits: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
exclusive_access: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Partnership terms
|
||||
agreement_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
commission_structure: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
performance_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Status and management
|
||||
status: str = Field(default="active") # active, inactive, suspended, terminated
|
||||
max_participants: Optional[int] = None
|
||||
current_participants: int = Field(default=0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
launched_at: Optional[datetime] = None
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
program_cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
contact_info: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AgentPartnership(SQLModel, table=True):
|
||||
"""Agent participation in partnership programs"""
|
||||
|
||||
__tablename__ = "agent_partnerships"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"agent_partner_{uuid4().hex[:8]}", primary_key=True)
|
||||
partnership_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Partnership details
|
||||
agent_id: str = Field(index=True)
|
||||
program_id: str = Field(index=True)
|
||||
partnership_type: PartnershipType
|
||||
current_tier: str = Field(default="basic")
|
||||
|
||||
# Application and approval
|
||||
applied_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
approved_by: Optional[str] = None
|
||||
approved_at: Optional[datetime] = None
|
||||
rejection_reasons: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Performance and metrics
|
||||
performance_score: float = Field(default=0.0)
|
||||
performance_metrics: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
contribution_value: float = Field(default=0.0)
|
||||
|
||||
# Benefits and compensation
|
||||
earned_benefits: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
total_earnings: float = Field(default=0.0)
|
||||
pending_payments: float = Field(default=0.0)
|
||||
|
||||
# Status and lifecycle
|
||||
status: str = Field(default="active") # active, inactive, suspended, terminated
|
||||
tier_progress: float = Field(default=0.0, ge=0, le=100.0)
|
||||
next_tier_eligible: bool = Field(default=False)
|
||||
|
||||
# Agreement details
|
||||
agreement_signed: bool = Field(default=False)
|
||||
agreement_signed_at: Optional[datetime] = None
|
||||
agreement_expires_at: Optional[datetime] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_activity: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
partnership_cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
notes: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class AchievementBadge(SQLModel, table=True):
|
||||
"""Achievement and recognition badges"""
|
||||
|
||||
__tablename__ = "achievement_badges"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"badge_{uuid4().hex[:8]}", primary_key=True)
|
||||
badge_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Badge details
|
||||
badge_name: str = Field(max_length=100)
|
||||
badge_type: BadgeType
|
||||
description: str = Field(default="", max_length=500)
|
||||
badge_icon: str = Field(default="", max_length=200) # Icon identifier or URL
|
||||
|
||||
# Badge criteria
|
||||
achievement_criteria: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
required_metrics: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
threshold_values: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Badge properties
|
||||
rarity: str = Field(default="common") # common, uncommon, rare, epic, legendary
|
||||
point_value: int = Field(default=0)
|
||||
category: str = Field(default="general") # performance, contribution, specialization, excellence
|
||||
|
||||
# Visual design
|
||||
color_scheme: Dict[str, str] = Field(default={}, sa_column=Column(JSON))
|
||||
display_properties: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Status and availability
|
||||
is_active: bool = Field(default=True)
|
||||
is_limited: bool = Field(default=False)
|
||||
max_awards: Optional[int] = None
|
||||
current_awards: int = Field(default=0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
available_from: datetime = Field(default_factory=datetime.utcnow)
|
||||
available_until: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
badge_cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
requirements_text: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class AgentBadge(SQLModel, table=True):
|
||||
"""Agent earned badges and achievements"""
|
||||
|
||||
__tablename__ = "agent_badges"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"agent_badge_{uuid4().hex[:8]}", primary_key=True)
|
||||
|
||||
# Badge relationship
|
||||
agent_id: str = Field(index=True)
|
||||
badge_id: str = Field(index=True)
|
||||
|
||||
# Award details
|
||||
awarded_by: str = Field(index=True) # System or user who awarded the badge
|
||||
awarded_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
award_reason: str = Field(default="", max_length=500)
|
||||
|
||||
# Achievement context
|
||||
achievement_context: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
metrics_at_award: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
supporting_evidence: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Badge status
|
||||
is_displayed: bool = Field(default=True)
|
||||
is_featured: bool = Field(default=False)
|
||||
display_order: int = Field(default=0)
|
||||
|
||||
# Progress tracking (for progressive badges)
|
||||
current_progress: float = Field(default=0.0, ge=0, le=100.0)
|
||||
next_milestone: Optional[str] = None
|
||||
|
||||
# Expiration and renewal
|
||||
expires_at: Optional[datetime] = None
|
||||
is_permanent: bool = Field(default=True)
|
||||
renewal_criteria: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Social features
|
||||
share_count: int = Field(default=0)
|
||||
view_count: int = Field(default=0)
|
||||
congratulation_count: int = Field(default=0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_viewed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
badge_cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
notes: str = Field(default="", max_length=1000)
|
||||
|
||||
|
||||
class CertificationAudit(SQLModel, table=True):
|
||||
"""Certification audit and compliance records"""
|
||||
|
||||
__tablename__ = "certification_audits"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"audit_{uuid4().hex[:8]}", primary_key=True)
|
||||
audit_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Audit details
|
||||
audit_type: str = Field(max_length=50) # routine, investigation, compliance, security
|
||||
audit_scope: str = Field(max_length=100) # individual, program, system
|
||||
target_entity_id: str = Field(index=True) # agent_id, certification_id, etc.
|
||||
|
||||
# Audit scheduling
|
||||
scheduled_by: str = Field(index=True)
|
||||
scheduled_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
started_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
# Audit execution
|
||||
auditor_id: str = Field(index=True)
|
||||
audit_methodology: str = Field(default="", max_length=500)
|
||||
checklists: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Findings and results
|
||||
overall_score: Optional[float] = None
|
||||
compliance_score: Optional[float] = None
|
||||
risk_score: Optional[float] = None
|
||||
|
||||
findings: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
violations: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
recommendations: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Actions and resolutions
|
||||
corrective_actions: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
follow_up_required: bool = Field(default=False)
|
||||
follow_up_date: Optional[datetime] = None
|
||||
|
||||
# Status and outcome
|
||||
status: str = Field(default="scheduled") # scheduled, in_progress, completed, failed, cancelled
|
||||
outcome: str = Field(default="pending") # pass, fail, conditional, pending_review
|
||||
|
||||
# Reporting and documentation
|
||||
report_generated: bool = Field(default=False)
|
||||
report_url: Optional[str] = None
|
||||
evidence_documents: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional data
|
||||
audit_cert_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
notes: str = Field(default="", max_length=2000)
|
||||
153
apps/coordinator-api/src/app/domain/community.py
Normal file
153
apps/coordinator-api/src/app/domain/community.py
Normal file
@@ -0,0 +1,153 @@
|
||||
"""
|
||||
Community and Developer Ecosystem Models
|
||||
Database models for OpenClaw agent community, third-party solutions, and innovation labs
|
||||
"""
|
||||
|
||||
from typing import Optional, List, Dict, Any
|
||||
from sqlmodel import Field, SQLModel, Column, JSON, Relationship
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
import uuid
|
||||
|
||||
class DeveloperTier(str, Enum):
|
||||
NOVICE = "novice"
|
||||
BUILDER = "builder"
|
||||
EXPERT = "expert"
|
||||
MASTER = "master"
|
||||
PARTNER = "partner"
|
||||
|
||||
class SolutionStatus(str, Enum):
|
||||
DRAFT = "draft"
|
||||
REVIEW = "review"
|
||||
PUBLISHED = "published"
|
||||
DEPRECATED = "deprecated"
|
||||
REJECTED = "rejected"
|
||||
|
||||
class LabStatus(str, Enum):
|
||||
PROPOSED = "proposed"
|
||||
FUNDING = "funding"
|
||||
ACTIVE = "active"
|
||||
COMPLETED = "completed"
|
||||
ARCHIVED = "archived"
|
||||
|
||||
class HackathonStatus(str, Enum):
|
||||
ANNOUNCED = "announced"
|
||||
REGISTRATION = "registration"
|
||||
ONGOING = "ongoing"
|
||||
JUDGING = "judging"
|
||||
COMPLETED = "completed"
|
||||
|
||||
class DeveloperProfile(SQLModel, table=True):
|
||||
"""Profile for a developer in the OpenClaw community"""
|
||||
__tablename__ = "developer_profiles"
|
||||
|
||||
developer_id: str = Field(primary_key=True, default_factory=lambda: f"dev_{uuid.uuid4().hex[:8]}")
|
||||
user_id: str = Field(index=True)
|
||||
username: str = Field(unique=True)
|
||||
bio: Optional[str] = None
|
||||
|
||||
tier: DeveloperTier = Field(default=DeveloperTier.NOVICE)
|
||||
reputation_score: float = Field(default=0.0)
|
||||
total_earnings: float = Field(default=0.0)
|
||||
|
||||
skills: List[str] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
github_handle: Optional[str] = None
|
||||
website: Optional[str] = None
|
||||
|
||||
joined_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_active: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class AgentSolution(SQLModel, table=True):
|
||||
"""A third-party agent solution available in the developer marketplace"""
|
||||
__tablename__ = "agent_solutions"
|
||||
|
||||
solution_id: str = Field(primary_key=True, default_factory=lambda: f"sol_{uuid.uuid4().hex[:8]}")
|
||||
developer_id: str = Field(foreign_key="developer_profiles.developer_id")
|
||||
|
||||
title: str
|
||||
description: str
|
||||
version: str = Field(default="1.0.0")
|
||||
|
||||
capabilities: List[str] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
frameworks: List[str] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
|
||||
price_model: str = Field(default="free") # free, one_time, subscription, usage_based
|
||||
price_amount: float = Field(default=0.0)
|
||||
currency: str = Field(default="AITBC")
|
||||
|
||||
status: SolutionStatus = Field(default=SolutionStatus.DRAFT)
|
||||
downloads: int = Field(default=0)
|
||||
average_rating: float = Field(default=0.0)
|
||||
review_count: int = Field(default=0)
|
||||
|
||||
solution_metadata: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
|
||||
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
published_at: Optional[datetime] = None
|
||||
|
||||
class InnovationLab(SQLModel, table=True):
|
||||
"""Research program or innovation lab for agent development"""
|
||||
__tablename__ = "innovation_labs"
|
||||
|
||||
lab_id: str = Field(primary_key=True, default_factory=lambda: f"lab_{uuid.uuid4().hex[:8]}")
|
||||
title: str
|
||||
description: str
|
||||
research_area: str
|
||||
|
||||
lead_researcher_id: str = Field(foreign_key="developer_profiles.developer_id")
|
||||
members: List[str] = Field(default_factory=list, sa_column=Column(JSON)) # List of developer_ids
|
||||
|
||||
status: LabStatus = Field(default=LabStatus.PROPOSED)
|
||||
funding_goal: float = Field(default=0.0)
|
||||
current_funding: float = Field(default=0.0)
|
||||
|
||||
milestones: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
publications: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
target_completion: Optional[datetime] = None
|
||||
|
||||
class CommunityPost(SQLModel, table=True):
|
||||
"""A post in the community support/collaboration platform"""
|
||||
__tablename__ = "community_posts"
|
||||
|
||||
post_id: str = Field(primary_key=True, default_factory=lambda: f"post_{uuid.uuid4().hex[:8]}")
|
||||
author_id: str = Field(foreign_key="developer_profiles.developer_id")
|
||||
|
||||
title: str
|
||||
content: str
|
||||
category: str = Field(default="discussion") # discussion, question, showcase, tutorial
|
||||
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
|
||||
upvotes: int = Field(default=0)
|
||||
views: int = Field(default=0)
|
||||
is_resolved: bool = Field(default=False)
|
||||
|
||||
parent_post_id: Optional[str] = Field(default=None, foreign_key="community_posts.post_id")
|
||||
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class Hackathon(SQLModel, table=True):
|
||||
"""Innovation challenge or hackathon"""
|
||||
__tablename__ = "hackathons"
|
||||
|
||||
hackathon_id: str = Field(primary_key=True, default_factory=lambda: f"hack_{uuid.uuid4().hex[:8]}")
|
||||
title: str
|
||||
description: str
|
||||
theme: str
|
||||
|
||||
sponsor: str = Field(default="AITBC Foundation")
|
||||
prize_pool: float = Field(default=0.0)
|
||||
prize_currency: str = Field(default="AITBC")
|
||||
|
||||
status: HackathonStatus = Field(default=HackathonStatus.ANNOUNCED)
|
||||
participants: List[str] = Field(default_factory=list, sa_column=Column(JSON)) # List of developer_ids
|
||||
submissions: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
|
||||
|
||||
registration_start: datetime
|
||||
registration_end: datetime
|
||||
event_start: datetime
|
||||
event_end: datetime
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
127
apps/coordinator-api/src/app/domain/governance.py
Normal file
127
apps/coordinator-api/src/app/domain/governance.py
Normal file
@@ -0,0 +1,127 @@
|
||||
"""
|
||||
Decentralized Governance Models
|
||||
Database models for OpenClaw DAO, voting, proposals, and governance analytics
|
||||
"""
|
||||
|
||||
from typing import Optional, List, Dict, Any
|
||||
from sqlmodel import Field, SQLModel, Column, JSON, Relationship
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
import uuid
|
||||
|
||||
class ProposalStatus(str, Enum):
|
||||
DRAFT = "draft"
|
||||
ACTIVE = "active"
|
||||
SUCCEEDED = "succeeded"
|
||||
DEFEATED = "defeated"
|
||||
EXECUTED = "executed"
|
||||
CANCELLED = "cancelled"
|
||||
|
||||
class VoteType(str, Enum):
|
||||
FOR = "for"
|
||||
AGAINST = "against"
|
||||
ABSTAIN = "abstain"
|
||||
|
||||
class GovernanceRole(str, Enum):
|
||||
MEMBER = "member"
|
||||
DELEGATE = "delegate"
|
||||
COUNCIL = "council"
|
||||
ADMIN = "admin"
|
||||
|
||||
class GovernanceProfile(SQLModel, table=True):
|
||||
"""Profile for a participant in the AITBC DAO"""
|
||||
__tablename__ = "governance_profiles"
|
||||
|
||||
profile_id: str = Field(primary_key=True, default_factory=lambda: f"gov_{uuid.uuid4().hex[:8]}")
|
||||
user_id: str = Field(unique=True, index=True)
|
||||
|
||||
role: GovernanceRole = Field(default=GovernanceRole.MEMBER)
|
||||
voting_power: float = Field(default=0.0) # Calculated based on staked AITBC and reputation
|
||||
delegated_power: float = Field(default=0.0) # Power delegated to them by others
|
||||
|
||||
total_votes_cast: int = Field(default=0)
|
||||
proposals_created: int = Field(default=0)
|
||||
proposals_passed: int = Field(default=0)
|
||||
|
||||
delegate_to: Optional[str] = Field(default=None) # Profile ID they delegate their vote to
|
||||
|
||||
joined_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_voted_at: Optional[datetime] = None
|
||||
|
||||
class Proposal(SQLModel, table=True):
|
||||
"""A governance proposal submitted to the DAO"""
|
||||
__tablename__ = "proposals"
|
||||
|
||||
proposal_id: str = Field(primary_key=True, default_factory=lambda: f"prop_{uuid.uuid4().hex[:8]}")
|
||||
proposer_id: str = Field(foreign_key="governance_profiles.profile_id")
|
||||
|
||||
title: str
|
||||
description: str
|
||||
category: str = Field(default="general") # parameters, funding, protocol, marketplace
|
||||
|
||||
execution_payload: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
|
||||
|
||||
status: ProposalStatus = Field(default=ProposalStatus.DRAFT)
|
||||
|
||||
votes_for: float = Field(default=0.0)
|
||||
votes_against: float = Field(default=0.0)
|
||||
votes_abstain: float = Field(default=0.0)
|
||||
|
||||
quorum_required: float = Field(default=0.0)
|
||||
passing_threshold: float = Field(default=0.5) # Usually 50%
|
||||
|
||||
snapshot_block: Optional[int] = Field(default=None)
|
||||
snapshot_timestamp: Optional[datetime] = Field(default=None)
|
||||
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
voting_starts: datetime
|
||||
voting_ends: datetime
|
||||
executed_at: Optional[datetime] = None
|
||||
|
||||
class Vote(SQLModel, table=True):
|
||||
"""A vote cast on a specific proposal"""
|
||||
__tablename__ = "votes"
|
||||
|
||||
vote_id: str = Field(primary_key=True, default_factory=lambda: f"vote_{uuid.uuid4().hex[:8]}")
|
||||
proposal_id: str = Field(foreign_key="proposals.proposal_id", index=True)
|
||||
voter_id: str = Field(foreign_key="governance_profiles.profile_id")
|
||||
|
||||
vote_type: VoteType
|
||||
voting_power_used: float
|
||||
reason: Optional[str] = None
|
||||
power_at_snapshot: float = Field(default=0.0)
|
||||
delegated_power_at_snapshot: float = Field(default=0.0)
|
||||
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class DaoTreasury(SQLModel, table=True):
|
||||
"""Record of the DAO's treasury funds and allocations"""
|
||||
__tablename__ = "dao_treasury"
|
||||
|
||||
treasury_id: str = Field(primary_key=True, default="main_treasury")
|
||||
|
||||
total_balance: float = Field(default=0.0)
|
||||
allocated_funds: float = Field(default=0.0)
|
||||
|
||||
asset_breakdown: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
|
||||
|
||||
last_updated: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
class TransparencyReport(SQLModel, table=True):
|
||||
"""Automated transparency and analytics report for the governance system"""
|
||||
__tablename__ = "transparency_reports"
|
||||
|
||||
report_id: str = Field(primary_key=True, default_factory=lambda: f"rep_{uuid.uuid4().hex[:8]}")
|
||||
period: str # e.g., "2026-Q1", "2026-02"
|
||||
|
||||
total_proposals: int
|
||||
passed_proposals: int
|
||||
active_voters: int
|
||||
total_voting_power_participated: float
|
||||
|
||||
treasury_inflow: float
|
||||
treasury_outflow: float
|
||||
|
||||
metrics: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
|
||||
|
||||
generated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
@@ -93,7 +93,7 @@ class EdgeGPUMetrics(SQLModel, table=True):
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"egm_{uuid4().hex[:8]}", primary_key=True)
|
||||
gpu_id: str = Field(foreign_key="gpuregistry.id")
|
||||
gpu_id: str = Field(foreign_key="gpu_registry.id")
|
||||
|
||||
# Latency metrics
|
||||
network_latency_ms: float = Field()
|
||||
|
||||
255
apps/coordinator-api/src/app/domain/reputation.py
Normal file
255
apps/coordinator-api/src/app/domain/reputation.py
Normal file
@@ -0,0 +1,255 @@
|
||||
"""
|
||||
Agent Reputation and Trust System Domain Models
|
||||
Implements SQLModel definitions for agent reputation, trust scores, and economic metrics
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class ReputationLevel(str, Enum):
|
||||
"""Agent reputation level enumeration"""
|
||||
BEGINNER = "beginner"
|
||||
INTERMEDIATE = "intermediate"
|
||||
ADVANCED = "advanced"
|
||||
EXPERT = "expert"
|
||||
MASTER = "master"
|
||||
|
||||
|
||||
class TrustScoreCategory(str, Enum):
|
||||
"""Trust score calculation categories"""
|
||||
PERFORMANCE = "performance"
|
||||
RELIABILITY = "reliability"
|
||||
COMMUNITY = "community"
|
||||
SECURITY = "security"
|
||||
ECONOMIC = "economic"
|
||||
|
||||
|
||||
class AgentReputation(SQLModel, table=True):
|
||||
"""Agent reputation profile and metrics"""
|
||||
|
||||
__tablename__ = "agent_reputation"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"rep_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="ai_agent_workflows.id")
|
||||
|
||||
# Core reputation metrics
|
||||
trust_score: float = Field(default=500.0, ge=0, le=1000) # 0-1000 scale
|
||||
reputation_level: ReputationLevel = Field(default=ReputationLevel.BEGINNER)
|
||||
performance_rating: float = Field(default=3.0, ge=1.0, le=5.0) # 1-5 stars
|
||||
reliability_score: float = Field(default=50.0, ge=0, le=100.0) # 0-100%
|
||||
community_rating: float = Field(default=3.0, ge=1.0, le=5.0) # 1-5 stars
|
||||
|
||||
# Economic metrics
|
||||
total_earnings: float = Field(default=0.0) # Total AITBC earned
|
||||
transaction_count: int = Field(default=0) # Total transactions
|
||||
success_rate: float = Field(default=0.0, ge=0, le=100.0) # Success percentage
|
||||
dispute_count: int = Field(default=0) # Number of disputes
|
||||
dispute_won_count: int = Field(default=0) # Disputes won
|
||||
|
||||
# Activity metrics
|
||||
jobs_completed: int = Field(default=0)
|
||||
jobs_failed: int = Field(default=0)
|
||||
average_response_time: float = Field(default=0.0) # milliseconds
|
||||
uptime_percentage: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Geographic and service info
|
||||
geographic_region: str = Field(default="", max_length=50)
|
||||
service_categories: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
specialization_tags: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_activity: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional metadata
|
||||
reputation_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
achievements: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
certifications: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TrustScoreCalculation(SQLModel, table=True):
|
||||
"""Trust score calculation records and factors"""
|
||||
|
||||
__tablename__ = "trust_score_calculations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"trust_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reputation.id")
|
||||
|
||||
# Calculation details
|
||||
category: TrustScoreCategory
|
||||
base_score: float = Field(ge=0, le=1000)
|
||||
weight_factor: float = Field(default=1.0, ge=0, le=10)
|
||||
adjusted_score: float = Field(ge=0, le=1000)
|
||||
|
||||
# Contributing factors
|
||||
performance_factor: float = Field(default=1.0)
|
||||
reliability_factor: float = Field(default=1.0)
|
||||
community_factor: float = Field(default=1.0)
|
||||
security_factor: float = Field(default=1.0)
|
||||
economic_factor: float = Field(default=1.0)
|
||||
|
||||
# Calculation metadata
|
||||
calculation_method: str = Field(default="weighted_average")
|
||||
confidence_level: float = Field(default=0.8, ge=0, le=1.0)
|
||||
|
||||
# Timestamps
|
||||
calculated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
effective_period: int = Field(default=86400) # seconds
|
||||
|
||||
# Additional data
|
||||
calculation_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class ReputationEvent(SQLModel, table=True):
|
||||
"""Reputation-changing events and transactions"""
|
||||
|
||||
__tablename__ = "reputation_events"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"event_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reputation.id")
|
||||
|
||||
# Event details
|
||||
event_type: str = Field(max_length=50) # "job_completed", "dispute_resolved", etc.
|
||||
event_subtype: str = Field(default="", max_length=50)
|
||||
impact_score: float = Field(ge=-100, le=100) # Positive or negative impact
|
||||
|
||||
# Scoring details
|
||||
trust_score_before: float = Field(ge=0, le=1000)
|
||||
trust_score_after: float = Field(ge=0, le=1000)
|
||||
reputation_level_before: Optional[ReputationLevel] = None
|
||||
reputation_level_after: Optional[ReputationLevel] = None
|
||||
|
||||
# Event context
|
||||
related_transaction_id: Optional[str] = None
|
||||
related_job_id: Optional[str] = None
|
||||
related_dispute_id: Optional[str] = None
|
||||
|
||||
# Event metadata
|
||||
event_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
verification_status: str = Field(default="pending") # pending, verified, rejected
|
||||
|
||||
# Timestamps
|
||||
occurred_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
processed_at: Optional[datetime] = None
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
|
||||
class AgentEconomicProfile(SQLModel, table=True):
|
||||
"""Detailed economic profile for agents"""
|
||||
|
||||
__tablename__ = "agent_economic_profiles"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"econ_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reputation.id")
|
||||
|
||||
# Earnings breakdown
|
||||
daily_earnings: float = Field(default=0.0)
|
||||
weekly_earnings: float = Field(default=0.0)
|
||||
monthly_earnings: float = Field(default=0.0)
|
||||
yearly_earnings: float = Field(default=0.0)
|
||||
|
||||
# Performance metrics
|
||||
average_job_value: float = Field(default=0.0)
|
||||
peak_hourly_rate: float = Field(default=0.0)
|
||||
utilization_rate: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Market position
|
||||
market_share: float = Field(default=0.0, ge=0, le=100.0)
|
||||
competitive_ranking: int = Field(default=0)
|
||||
price_tier: str = Field(default="standard") # budget, standard, premium
|
||||
|
||||
# Risk metrics
|
||||
default_risk_score: float = Field(default=0.0, ge=0, le=100.0)
|
||||
volatility_score: float = Field(default=0.0, ge=0, le=100.0)
|
||||
liquidity_score: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Timestamps
|
||||
profile_date: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_updated: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Historical data
|
||||
earnings_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
performance_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class CommunityFeedback(SQLModel, table=True):
|
||||
"""Community feedback and ratings for agents"""
|
||||
|
||||
__tablename__ = "community_feedback"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"feedback_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reputation.id")
|
||||
|
||||
# Feedback details
|
||||
reviewer_id: str = Field(index=True)
|
||||
reviewer_type: str = Field(default="client") # client, provider, peer
|
||||
|
||||
# Ratings
|
||||
overall_rating: float = Field(ge=1.0, le=5.0)
|
||||
performance_rating: float = Field(ge=1.0, le=5.0)
|
||||
communication_rating: float = Field(ge=1.0, le=5.0)
|
||||
reliability_rating: float = Field(ge=1.0, le=5.0)
|
||||
value_rating: float = Field(ge=1.0, le=5.0)
|
||||
|
||||
# Feedback content
|
||||
feedback_text: str = Field(default="", max_length=1000)
|
||||
feedback_tags: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Verification
|
||||
verified_transaction: bool = Field(default=False)
|
||||
verification_weight: float = Field(default=1.0, ge=0.1, le=10.0)
|
||||
|
||||
# Moderation
|
||||
moderation_status: str = Field(default="approved") # approved, pending, rejected
|
||||
moderator_notes: str = Field(default="", max_length=500)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
helpful_votes: int = Field(default=0)
|
||||
|
||||
# Additional metadata
|
||||
feedback_context: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class ReputationLevelThreshold(SQLModel, table=True):
|
||||
"""Configuration for reputation level thresholds"""
|
||||
|
||||
__tablename__ = "reputation_level_thresholds"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"threshold_{uuid4().hex[:8]}", primary_key=True)
|
||||
level: ReputationLevel
|
||||
|
||||
# Threshold requirements
|
||||
min_trust_score: float = Field(ge=0, le=1000)
|
||||
min_performance_rating: float = Field(ge=1.0, le=5.0)
|
||||
min_reliability_score: float = Field(ge=0, le=100.0)
|
||||
min_transactions: int = Field(default=0)
|
||||
min_success_rate: float = Field(ge=0, le=100.0)
|
||||
|
||||
# Benefits and restrictions
|
||||
max_concurrent_jobs: int = Field(default=1)
|
||||
priority_boost: float = Field(default=1.0)
|
||||
fee_discount: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
is_active: bool = Field(default=True)
|
||||
|
||||
# Additional configuration
|
||||
level_requirements: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
level_benefits: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
319
apps/coordinator-api/src/app/domain/rewards.py
Normal file
319
apps/coordinator-api/src/app/domain/rewards.py
Normal file
@@ -0,0 +1,319 @@
|
||||
"""
|
||||
Agent Reward System Domain Models
|
||||
Implements SQLModel definitions for performance-based rewards, incentives, and distributions
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class RewardTier(str, Enum):
|
||||
"""Reward tier enumeration"""
|
||||
BRONZE = "bronze"
|
||||
SILVER = "silver"
|
||||
GOLD = "gold"
|
||||
PLATINUM = "platinum"
|
||||
DIAMOND = "diamond"
|
||||
|
||||
|
||||
class RewardType(str, Enum):
|
||||
"""Reward type enumeration"""
|
||||
PERFORMANCE_BONUS = "performance_bonus"
|
||||
LOYALTY_BONUS = "loyalty_bonus"
|
||||
REFERRAL_BONUS = "referral_bonus"
|
||||
MILESTONE_BONUS = "milestone_bonus"
|
||||
COMMUNITY_BONUS = "community_bonus"
|
||||
SPECIAL_BONUS = "special_bonus"
|
||||
|
||||
|
||||
class RewardStatus(str, Enum):
|
||||
"""Reward status enumeration"""
|
||||
PENDING = "pending"
|
||||
APPROVED = "approved"
|
||||
DISTRIBUTED = "distributed"
|
||||
EXPIRED = "expired"
|
||||
CANCELLED = "cancelled"
|
||||
|
||||
|
||||
class RewardTierConfig(SQLModel, table=True):
|
||||
"""Reward tier configuration and thresholds"""
|
||||
|
||||
__tablename__ = "reward_tier_configs"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"tier_{uuid4().hex[:8]}", primary_key=True)
|
||||
tier: RewardTier
|
||||
|
||||
# Threshold requirements
|
||||
min_trust_score: float = Field(ge=0, le=1000)
|
||||
min_performance_rating: float = Field(ge=1.0, le=5.0)
|
||||
min_monthly_earnings: float = Field(ge=0)
|
||||
min_transaction_count: int = Field(ge=0)
|
||||
min_success_rate: float = Field(ge=0, le=100.0)
|
||||
|
||||
# Reward multipliers and benefits
|
||||
base_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
performance_bonus_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
loyalty_bonus_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
referral_bonus_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
|
||||
# Tier benefits
|
||||
max_concurrent_jobs: int = Field(default=1)
|
||||
priority_boost: float = Field(default=1.0)
|
||||
fee_discount: float = Field(default=0.0, ge=0, le=100.0)
|
||||
support_level: str = Field(default="basic")
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
is_active: bool = Field(default=True)
|
||||
|
||||
# Additional configuration
|
||||
tier_requirements: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
tier_benefits: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class AgentRewardProfile(SQLModel, table=True):
|
||||
"""Agent reward profile and earnings tracking"""
|
||||
|
||||
__tablename__ = "agent_reward_profiles"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"reward_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reputation.id")
|
||||
|
||||
# Current tier and status
|
||||
current_tier: RewardTier = Field(default=RewardTier.BRONZE)
|
||||
tier_progress: float = Field(default=0.0, ge=0, le=100.0) # Progress to next tier
|
||||
|
||||
# Earnings tracking
|
||||
base_earnings: float = Field(default=0.0)
|
||||
bonus_earnings: float = Field(default=0.0)
|
||||
total_earnings: float = Field(default=0.0)
|
||||
lifetime_earnings: float = Field(default=0.0)
|
||||
|
||||
# Performance metrics for rewards
|
||||
performance_score: float = Field(default=0.0)
|
||||
loyalty_score: float = Field(default=0.0)
|
||||
referral_count: int = Field(default=0)
|
||||
community_contributions: int = Field(default=0)
|
||||
|
||||
# Reward history
|
||||
rewards_distributed: int = Field(default=0)
|
||||
last_reward_date: Optional[datetime] = None
|
||||
current_streak: int = Field(default=0) # Consecutive reward periods
|
||||
longest_streak: int = Field(default=0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
last_activity: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional metadata
|
||||
reward_preferences: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
achievement_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class RewardCalculation(SQLModel, table=True):
|
||||
"""Reward calculation records and factors"""
|
||||
|
||||
__tablename__ = "reward_calculations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"calc_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reward_profiles.id")
|
||||
|
||||
# Calculation details
|
||||
reward_type: RewardType
|
||||
base_amount: float = Field(ge=0)
|
||||
tier_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
|
||||
# Bonus factors
|
||||
performance_bonus: float = Field(default=0.0)
|
||||
loyalty_bonus: float = Field(default=0.0)
|
||||
referral_bonus: float = Field(default=0.0)
|
||||
community_bonus: float = Field(default=0.0)
|
||||
special_bonus: float = Field(default=0.0)
|
||||
|
||||
# Final calculation
|
||||
total_reward: float = Field(ge=0)
|
||||
effective_multiplier: float = Field(default=1.0, ge=1.0)
|
||||
|
||||
# Calculation metadata
|
||||
calculation_period: str = Field(default="daily") # daily, weekly, monthly
|
||||
reference_date: datetime = Field(default_factory=datetime.utcnow)
|
||||
trust_score_at_calculation: float = Field(ge=0, le=1000)
|
||||
performance_metrics: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
calculated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
calculation_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class RewardDistribution(SQLModel, table=True):
|
||||
"""Reward distribution records and transactions"""
|
||||
|
||||
__tablename__ = "reward_distributions"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"dist_{uuid4().hex[:8]}", primary_key=True)
|
||||
calculation_id: str = Field(index=True, foreign_key="reward_calculations.id")
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reward_profiles.id")
|
||||
|
||||
# Distribution details
|
||||
reward_amount: float = Field(ge=0)
|
||||
reward_type: RewardType
|
||||
distribution_method: str = Field(default="automatic") # automatic, manual, batch
|
||||
|
||||
# Transaction details
|
||||
transaction_id: Optional[str] = None
|
||||
transaction_hash: Optional[str] = None
|
||||
transaction_status: str = Field(default="pending")
|
||||
|
||||
# Status tracking
|
||||
status: RewardStatus = Field(default=RewardStatus.PENDING)
|
||||
processed_at: Optional[datetime] = None
|
||||
confirmed_at: Optional[datetime] = None
|
||||
|
||||
# Distribution metadata
|
||||
batch_id: Optional[str] = None
|
||||
priority: int = Field(default=5, ge=1, le=10) # 1 = highest priority
|
||||
retry_count: int = Field(default=0)
|
||||
error_message: Optional[str] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
scheduled_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
distribution_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class RewardEvent(SQLModel, table=True):
|
||||
"""Reward-related events and triggers"""
|
||||
|
||||
__tablename__ = "reward_events"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"event_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reward_profiles.id")
|
||||
|
||||
# Event details
|
||||
event_type: str = Field(max_length=50) # "tier_upgrade", "milestone_reached", etc.
|
||||
event_subtype: str = Field(default="", max_length=50)
|
||||
trigger_source: str = Field(max_length=50) # "system", "manual", "automatic"
|
||||
|
||||
# Event impact
|
||||
reward_impact: float = Field(ge=0) # Total reward amount from this event
|
||||
tier_impact: Optional[RewardTier] = None
|
||||
|
||||
# Event context
|
||||
related_transaction_id: Optional[str] = None
|
||||
related_calculation_id: Optional[str] = None
|
||||
related_distribution_id: Optional[str] = None
|
||||
|
||||
# Event metadata
|
||||
event_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
verification_status: str = Field(default="pending") # pending, verified, rejected
|
||||
|
||||
# Timestamps
|
||||
occurred_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
processed_at: Optional[datetime] = None
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional metadata
|
||||
event_context: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class RewardMilestone(SQLModel, table=True):
|
||||
"""Reward milestones and achievements"""
|
||||
|
||||
__tablename__ = "reward_milestones"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"milestone_{uuid4().hex[:8]}", primary_key=True)
|
||||
agent_id: str = Field(index=True, foreign_key="agent_reward_profiles.id")
|
||||
|
||||
# Milestone details
|
||||
milestone_type: str = Field(max_length=50) # "earnings", "jobs", "reputation", etc.
|
||||
milestone_name: str = Field(max_length=100)
|
||||
milestone_description: str = Field(default="", max_length=500)
|
||||
|
||||
# Threshold and progress
|
||||
target_value: float = Field(ge=0)
|
||||
current_value: float = Field(default=0.0, ge=0)
|
||||
progress_percentage: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Rewards
|
||||
reward_amount: float = Field(default=0.0, ge=0)
|
||||
reward_type: RewardType = Field(default=RewardType.MILESTONE_BONUS)
|
||||
|
||||
# Status
|
||||
is_completed: bool = Field(default=False)
|
||||
is_claimed: bool = Field(default=False)
|
||||
completed_at: Optional[datetime] = None
|
||||
claimed_at: Optional[datetime] = None
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
milestone_config: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class RewardAnalytics(SQLModel, table=True):
|
||||
"""Reward system analytics and metrics"""
|
||||
|
||||
__tablename__ = "reward_analytics"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"analytics_{uuid4().hex[:8]}", primary_key=True)
|
||||
|
||||
# Analytics period
|
||||
period_type: str = Field(default="daily") # daily, weekly, monthly
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
|
||||
# Aggregate metrics
|
||||
total_rewards_distributed: float = Field(default=0.0)
|
||||
total_agents_rewarded: int = Field(default=0)
|
||||
average_reward_per_agent: float = Field(default=0.0)
|
||||
|
||||
# Tier distribution
|
||||
bronze_rewards: float = Field(default=0.0)
|
||||
silver_rewards: float = Field(default=0.0)
|
||||
gold_rewards: float = Field(default=0.0)
|
||||
platinum_rewards: float = Field(default=0.0)
|
||||
diamond_rewards: float = Field(default=0.0)
|
||||
|
||||
# Reward type distribution
|
||||
performance_rewards: float = Field(default=0.0)
|
||||
loyalty_rewards: float = Field(default=0.0)
|
||||
referral_rewards: float = Field(default=0.0)
|
||||
milestone_rewards: float = Field(default=0.0)
|
||||
community_rewards: float = Field(default=0.0)
|
||||
special_rewards: float = Field(default=0.0)
|
||||
|
||||
# Performance metrics
|
||||
calculation_count: int = Field(default=0)
|
||||
distribution_count: int = Field(default=0)
|
||||
success_rate: float = Field(default=0.0, ge=0, le=100.0)
|
||||
average_processing_time: float = Field(default=0.0) # milliseconds
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional analytics data
|
||||
analytics_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
426
apps/coordinator-api/src/app/domain/trading.py
Normal file
426
apps/coordinator-api/src/app/domain/trading.py
Normal file
@@ -0,0 +1,426 @@
|
||||
"""
|
||||
Agent-to-Agent Trading Protocol Domain Models
|
||||
Implements SQLModel definitions for P2P trading, matching, negotiation, and settlement
|
||||
"""
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from typing import Optional, Dict, List, Any
|
||||
from uuid import uuid4
|
||||
from enum import Enum
|
||||
|
||||
from sqlmodel import SQLModel, Field, Column, JSON
|
||||
from sqlalchemy import DateTime, Float, Integer, Text
|
||||
|
||||
|
||||
class TradeStatus(str, Enum):
|
||||
"""Trade status enumeration"""
|
||||
OPEN = "open"
|
||||
MATCHING = "matching"
|
||||
NEGOTIATING = "negotiating"
|
||||
AGREED = "agreed"
|
||||
SETTLING = "settling"
|
||||
COMPLETED = "completed"
|
||||
CANCELLED = "cancelled"
|
||||
FAILED = "failed"
|
||||
|
||||
|
||||
class TradeType(str, Enum):
|
||||
"""Trade type enumeration"""
|
||||
AI_POWER = "ai_power"
|
||||
COMPUTE_RESOURCES = "compute_resources"
|
||||
DATA_SERVICES = "data_services"
|
||||
MODEL_SERVICES = "model_services"
|
||||
INFERENCE_TASKS = "inference_tasks"
|
||||
TRAINING_TASKS = "training_tasks"
|
||||
|
||||
|
||||
class NegotiationStatus(str, Enum):
|
||||
"""Negotiation status enumeration"""
|
||||
PENDING = "pending"
|
||||
ACTIVE = "active"
|
||||
ACCEPTED = "accepted"
|
||||
REJECTED = "rejected"
|
||||
COUNTERED = "countered"
|
||||
EXPIRED = "expired"
|
||||
|
||||
|
||||
class SettlementType(str, Enum):
|
||||
"""Settlement type enumeration"""
|
||||
IMMEDIATE = "immediate"
|
||||
ESCROW = "escrow"
|
||||
MILESTONE = "milestone"
|
||||
SUBSCRIPTION = "subscription"
|
||||
|
||||
|
||||
class TradeRequest(SQLModel, table=True):
|
||||
"""P2P trade request from buyer agent"""
|
||||
|
||||
__tablename__ = "trade_requests"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"req_{uuid4().hex[:8]}", primary_key=True)
|
||||
request_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Request details
|
||||
buyer_agent_id: str = Field(index=True)
|
||||
trade_type: TradeType
|
||||
title: str = Field(max_length=200)
|
||||
description: str = Field(default="", max_length=1000)
|
||||
|
||||
# Requirements and specifications
|
||||
requirements: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
specifications: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
constraints: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Pricing and terms
|
||||
budget_range: Dict[str, float] = Field(default={}, sa_column=Column(JSON)) # min, max
|
||||
preferred_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
negotiation_flexible: bool = Field(default=True)
|
||||
|
||||
# Timing and duration
|
||||
start_time: Optional[datetime] = None
|
||||
end_time: Optional[datetime] = None
|
||||
duration_hours: Optional[int] = None
|
||||
urgency_level: str = Field(default="normal") # low, normal, high, urgent
|
||||
|
||||
# Geographic and service constraints
|
||||
preferred_regions: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
excluded_regions: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
service_level_required: str = Field(default="standard") # basic, standard, premium
|
||||
|
||||
# Status and metadata
|
||||
status: TradeStatus = Field(default=TradeStatus.OPEN)
|
||||
priority: int = Field(default=5, ge=1, le=10) # 1 = highest priority
|
||||
|
||||
# Matching and negotiation
|
||||
match_count: int = Field(default=0)
|
||||
negotiation_count: int = Field(default=0)
|
||||
best_match_score: float = Field(default=0.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
last_activity: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional metadata
|
||||
tags: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
trading_metadata: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradeMatch(SQLModel, table=True):
|
||||
"""Trade match between buyer request and seller offer"""
|
||||
|
||||
__tablename__ = "trade_matches"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"match_{uuid4().hex[:8]}", primary_key=True)
|
||||
match_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Match participants
|
||||
request_id: str = Field(index=True, foreign_key="trade_requests.request_id")
|
||||
buyer_agent_id: str = Field(index=True)
|
||||
seller_agent_id: str = Field(index=True)
|
||||
|
||||
# Matching details
|
||||
match_score: float = Field(ge=0, le=100) # 0-100 compatibility score
|
||||
confidence_level: float = Field(ge=0, le=1) # 0-1 confidence in match
|
||||
|
||||
# Compatibility factors
|
||||
price_compatibility: float = Field(ge=0, le=100)
|
||||
timing_compatibility: float = Field(ge=0, le=100)
|
||||
specification_compatibility: float = Field(ge=0, le=100)
|
||||
reputation_compatibility: float = Field(ge=0, le=100)
|
||||
geographic_compatibility: float = Field(ge=0, le=100)
|
||||
|
||||
# Seller offer details
|
||||
seller_offer: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
proposed_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Status and interaction
|
||||
status: TradeStatus = Field(default=TradeStatus.MATCHING)
|
||||
buyer_response: Optional[str] = None # interested, not_interested, negotiating
|
||||
seller_response: Optional[str] = None # accepted, rejected, countered
|
||||
|
||||
# Negotiation initiation
|
||||
negotiation_initiated: bool = Field(default=False)
|
||||
negotiation_initiator: Optional[str] = None # buyer, seller
|
||||
initial_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: Optional[datetime] = None
|
||||
last_interaction: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
match_factors: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
interaction_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradeNegotiation(SQLModel, table=True):
|
||||
"""Negotiation process between buyer and seller"""
|
||||
|
||||
__tablename__ = "trade_negotiations"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"neg_{uuid4().hex[:8]}", primary_key=True)
|
||||
negotiation_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Negotiation participants
|
||||
match_id: str = Field(index=True, foreign_key="trade_matches.match_id")
|
||||
buyer_agent_id: str = Field(index=True)
|
||||
seller_agent_id: str = Field(index=True)
|
||||
|
||||
# Negotiation details
|
||||
status: NegotiationStatus = Field(default=NegotiationStatus.PENDING)
|
||||
negotiation_round: int = Field(default=1)
|
||||
max_rounds: int = Field(default=5)
|
||||
|
||||
# Terms and conditions
|
||||
current_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
initial_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
final_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Negotiation parameters
|
||||
price_range: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
|
||||
service_level_agreements: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
delivery_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
payment_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Negotiation metrics
|
||||
concession_count: int = Field(default=0)
|
||||
counter_offer_count: int = Field(default=0)
|
||||
agreement_score: float = Field(default=0.0, ge=0, le=100)
|
||||
|
||||
# AI negotiation assistance
|
||||
ai_assisted: bool = Field(default=True)
|
||||
negotiation_strategy: str = Field(default="balanced") # aggressive, balanced, cooperative
|
||||
auto_accept_threshold: float = Field(default=85.0, ge=0, le=100)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
started_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
expires_at: Optional[datetime] = None
|
||||
last_offer_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
negotiation_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
ai_recommendations: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradeAgreement(SQLModel, table=True):
|
||||
"""Final trade agreement between buyer and seller"""
|
||||
|
||||
__tablename__ = "trade_agreements"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"agree_{uuid4().hex[:8]}", primary_key=True)
|
||||
agreement_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Agreement participants
|
||||
negotiation_id: str = Field(index=True, foreign_key="trade_negotiations.negotiation_id")
|
||||
buyer_agent_id: str = Field(index=True)
|
||||
seller_agent_id: str = Field(index=True)
|
||||
|
||||
# Agreement details
|
||||
trade_type: TradeType
|
||||
title: str = Field(max_length=200)
|
||||
description: str = Field(default="", max_length=1000)
|
||||
|
||||
# Final terms and conditions
|
||||
agreed_terms: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
specifications: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
service_level_agreement: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Pricing and payment
|
||||
total_price: float = Field(ge=0)
|
||||
currency: str = Field(default="AITBC")
|
||||
payment_schedule: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
settlement_type: SettlementType
|
||||
|
||||
# Delivery and performance
|
||||
delivery_timeline: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
performance_metrics: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
quality_standards: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Legal and compliance
|
||||
terms_and_conditions: str = Field(default="", max_length=5000)
|
||||
compliance_requirements: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
dispute_resolution: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Status and execution
|
||||
status: TradeStatus = Field(default=TradeStatus.AGREED)
|
||||
execution_status: str = Field(default="pending") # pending, active, completed, failed
|
||||
completion_percentage: float = Field(default=0.0, ge=0, le=100)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
signed_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
starts_at: Optional[datetime] = None
|
||||
ends_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
|
||||
# Additional data
|
||||
agreement_document: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
attachments: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradeSettlement(SQLModel, table=True):
|
||||
"""Trade settlement and payment processing"""
|
||||
|
||||
__tablename__ = "trade_settlements"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"settle_{uuid4().hex[:8]}", primary_key=True)
|
||||
settlement_id: str = Field(unique=True, index=True)
|
||||
|
||||
# Settlement reference
|
||||
agreement_id: str = Field(index=True, foreign_key="trade_agreements.agreement_id")
|
||||
buyer_agent_id: str = Field(index=True)
|
||||
seller_agent_id: str = Field(index=True)
|
||||
|
||||
# Settlement details
|
||||
settlement_type: SettlementType
|
||||
total_amount: float = Field(ge=0)
|
||||
currency: str = Field(default="AITBC")
|
||||
|
||||
# Payment processing
|
||||
payment_status: str = Field(default="pending") # pending, processing, completed, failed
|
||||
transaction_id: Optional[str] = None
|
||||
transaction_hash: Optional[str] = None
|
||||
block_number: Optional[int] = None
|
||||
|
||||
# Escrow details (if applicable)
|
||||
escrow_enabled: bool = Field(default=False)
|
||||
escrow_address: Optional[str] = None
|
||||
escrow_release_conditions: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Milestone payments (if applicable)
|
||||
milestone_payments: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
completed_milestones: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Fees and deductions
|
||||
platform_fee: float = Field(default=0.0)
|
||||
processing_fee: float = Field(default=0.0)
|
||||
gas_fee: float = Field(default=0.0)
|
||||
net_amount_seller: float = Field(ge=0)
|
||||
|
||||
# Status and timestamps
|
||||
status: TradeStatus = Field(default=TradeStatus.SETTLING)
|
||||
initiated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
processed_at: Optional[datetime] = None
|
||||
completed_at: Optional[datetime] = None
|
||||
refunded_at: Optional[datetime] = None
|
||||
|
||||
# Dispute and resolution
|
||||
dispute_raised: bool = Field(default=False)
|
||||
dispute_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
resolution_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Additional data
|
||||
settlement_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
audit_trail: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradeFeedback(SQLModel, table=True):
|
||||
"""Trade feedback and rating system"""
|
||||
|
||||
__tablename__ = "trade_feedback"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"feedback_{uuid4().hex[:8]}", primary_key=True)
|
||||
|
||||
# Feedback reference
|
||||
agreement_id: str = Field(index=True, foreign_key="trade_agreements.agreement_id")
|
||||
reviewer_agent_id: str = Field(index=True)
|
||||
reviewed_agent_id: str = Field(index=True)
|
||||
reviewer_role: str = Field(default="buyer") # buyer, seller
|
||||
|
||||
# Ratings
|
||||
overall_rating: float = Field(ge=1.0, le=5.0)
|
||||
communication_rating: float = Field(ge=1.0, le=5.0)
|
||||
performance_rating: float = Field(ge=1.0, le=5.0)
|
||||
timeliness_rating: float = Field(ge=1.0, le=5.0)
|
||||
value_rating: float = Field(ge=1.0, le=5.0)
|
||||
|
||||
# Feedback content
|
||||
feedback_text: str = Field(default="", max_length=1000)
|
||||
feedback_tags: List[str] = Field(default=[], sa_column=Column(JSON))
|
||||
|
||||
# Trade specifics
|
||||
trade_category: str = Field(default="general")
|
||||
trade_complexity: str = Field(default="medium") # simple, medium, complex
|
||||
trade_duration: Optional[int] = None # in hours
|
||||
|
||||
# Verification and moderation
|
||||
verified_trade: bool = Field(default=True)
|
||||
moderation_status: str = Field(default="approved") # approved, pending, rejected
|
||||
moderator_notes: str = Field(default="", max_length=500)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
trade_completed_at: datetime
|
||||
|
||||
# Additional data
|
||||
feedback_context: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
performance_metrics: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
|
||||
class TradingAnalytics(SQLModel, table=True):
|
||||
"""P2P trading system analytics and metrics"""
|
||||
|
||||
__tablename__ = "trading_analytics"
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(default_factory=lambda: f"analytics_{uuid4().hex[:8]}", primary_key=True)
|
||||
|
||||
# Analytics period
|
||||
period_type: str = Field(default="daily") # daily, weekly, monthly
|
||||
period_start: datetime
|
||||
period_end: datetime
|
||||
|
||||
# Trade volume metrics
|
||||
total_trades: int = Field(default=0)
|
||||
completed_trades: int = Field(default=0)
|
||||
failed_trades: int = Field(default=0)
|
||||
cancelled_trades: int = Field(default=0)
|
||||
|
||||
# Financial metrics
|
||||
total_trade_volume: float = Field(default=0.0)
|
||||
average_trade_value: float = Field(default=0.0)
|
||||
total_platform_fees: float = Field(default=0.0)
|
||||
|
||||
# Trade type distribution
|
||||
trade_type_distribution: Dict[str, int] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Agent metrics
|
||||
active_buyers: int = Field(default=0)
|
||||
active_sellers: int = Field(default=0)
|
||||
new_agents: int = Field(default=0)
|
||||
|
||||
# Performance metrics
|
||||
average_matching_time: float = Field(default=0.0) # minutes
|
||||
average_negotiation_time: float = Field(default=0.0) # minutes
|
||||
average_settlement_time: float = Field(default=0.0) # minutes
|
||||
success_rate: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Geographic distribution
|
||||
regional_distribution: Dict[str, int] = Field(default={}, sa_column=Column(JSON))
|
||||
|
||||
# Quality metrics
|
||||
average_rating: float = Field(default=0.0, ge=1.0, le=5.0)
|
||||
dispute_rate: float = Field(default=0.0, ge=0, le=100.0)
|
||||
repeat_trade_rate: float = Field(default=0.0, ge=0, le=100.0)
|
||||
|
||||
# Timestamps
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
# Additional analytics data
|
||||
analytics_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
trends_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
|
||||
@@ -32,7 +32,7 @@ class Wallet(SQLModel, table=True):
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
user_id: str = Field(foreign_key="user.id")
|
||||
user_id: str = Field(foreign_key="users.id")
|
||||
address: str = Field(unique=True, index=True)
|
||||
balance: float = Field(default=0.0)
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
@@ -49,8 +49,8 @@ class Transaction(SQLModel, table=True):
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: str = Field(primary_key=True)
|
||||
user_id: str = Field(foreign_key="user.id")
|
||||
wallet_id: Optional[int] = Field(foreign_key="wallet.id")
|
||||
user_id: str = Field(foreign_key="users.id")
|
||||
wallet_id: Optional[int] = Field(foreign_key="wallets.id")
|
||||
type: str = Field(max_length=20)
|
||||
status: str = Field(default="pending", max_length=20)
|
||||
amount: float
|
||||
@@ -71,7 +71,7 @@ class UserSession(SQLModel, table=True):
|
||||
__table_args__ = {"extend_existing": True}
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
user_id: str = Field(foreign_key="user.id")
|
||||
user_id: str = Field(foreign_key="users.id")
|
||||
token: str = Field(unique=True, index=True)
|
||||
expires_at: datetime
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
Reference in New Issue
Block a user