docs: add code quality and type checking workflows to master index
Some checks failed
Documentation Validation / validate-docs (push) Has been cancelled
Python Tests / test-python (push) Has been cancelled
API Endpoint Tests / test-api-endpoints (push) Has been cancelled
CLI Tests / test-cli (push) Has been cancelled
Integration Tests / test-service-integration (push) Has been cancelled
Package Tests / test-python-packages (map[name:aitbc-agent-sdk path:packages/py/aitbc-agent-sdk]) (push) Has been cancelled
Package Tests / test-python-packages (map[name:aitbc-core path:packages/py/aitbc-core]) (push) Has been cancelled
Package Tests / test-python-packages (map[name:aitbc-crypto path:packages/py/aitbc-crypto]) (push) Has been cancelled
Package Tests / test-python-packages (map[name:aitbc-sdk path:packages/py/aitbc-sdk]) (push) Has been cancelled
Package Tests / test-javascript-packages (map[name:aitbc-sdk-js path:packages/js/aitbc-sdk]) (push) Has been cancelled
Package Tests / test-javascript-packages (map[name:aitbc-token path:packages/solidity/aitbc-token]) (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled
Systemd Sync / sync-systemd (push) Has been cancelled

- Add Code Quality Module section with pre-commit hooks and quality checks
- Add Type Checking CI/CD Module section with MyPy workflow and coverage
- Update README with code quality achievements and project structure
- Migrate FastAPI apps from deprecated on_event to lifespan context manager
- Update pyproject.toml files to reference consolidated dependencies
- Remove unused app.py import in coordinator-api
- Add type hints to agent
This commit is contained in:
aitbc
2026-03-31 21:45:43 +02:00
parent 26592ddf55
commit 9db720add8
308 changed files with 34194 additions and 34575 deletions

View File

@@ -1,13 +1,21 @@
"""Domain models for the coordinator API."""
from .agent import (
AgentExecution,
AgentMarketplace,
AgentStatus,
AgentStep,
AgentStepExecution,
AIAgentWorkflow,
VerificationLevel,
)
from .gpu_marketplace import ConsumerGPUProfile, EdgeGPUMetrics, GPUBooking, GPURegistry, GPUReview
from .job import Job
from .miner import Miner
from .job_receipt import JobReceipt
from .marketplace import MarketplaceOffer, MarketplaceBid
from .user import User, Wallet, Transaction, UserSession
from .marketplace import MarketplaceBid, MarketplaceOffer
from .miner import Miner
from .payment import JobPayment, PaymentEscrow
from .gpu_marketplace import GPURegistry, ConsumerGPUProfile, EdgeGPUMetrics, GPUBooking, GPUReview
from .agent import AIAgentWorkflow, AgentStep, AgentExecution, AgentStepExecution, AgentMarketplace, AgentStatus
from .user import Transaction, User, UserSession, Wallet
__all__ = [
"Job",
@@ -32,4 +40,5 @@ __all__ = [
"AgentStepExecution",
"AgentMarketplace",
"AgentStatus",
"VerificationLevel",
]

View File

@@ -4,16 +4,16 @@ Implements SQLModel definitions for agent workflows, steps, and execution tracki
"""
from datetime import datetime
from typing import Optional, Dict, List, Any
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime
from sqlmodel import JSON, Column, Field, SQLModel
class AgentStatus(str, Enum):
class AgentStatus(StrEnum):
"""Agent execution status enumeration"""
PENDING = "pending"
RUNNING = "running"
COMPLETED = "completed"
@@ -21,15 +21,17 @@ class AgentStatus(str, Enum):
CANCELLED = "cancelled"
class VerificationLevel(str, Enum):
class VerificationLevel(StrEnum):
"""Verification level for agent execution"""
BASIC = "basic"
FULL = "full"
ZERO_KNOWLEDGE = "zero-knowledge"
class StepType(str, Enum):
class StepType(StrEnum):
"""Agent step type enumeration"""
INFERENCE = "inference"
TRAINING = "training"
DATA_PROCESSING = "data_processing"
@@ -39,32 +41,32 @@ class StepType(str, Enum):
class AIAgentWorkflow(SQLModel, table=True):
"""Definition of an AI agent workflow"""
__tablename__ = "ai_agent_workflows"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"agent_{uuid4().hex[:8]}", primary_key=True)
owner_id: str = Field(index=True)
name: str = Field(max_length=100)
description: str = Field(default="")
# Workflow specification
steps: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
dependencies: Dict[str, List[str]] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
steps: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
dependencies: dict[str, list[str]] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
# Execution constraints
max_execution_time: int = Field(default=3600) # seconds
max_cost_budget: float = Field(default=0.0)
# Verification requirements
requires_verification: bool = Field(default=True)
verification_level: VerificationLevel = Field(default=VerificationLevel.BASIC)
# Metadata
tags: str = Field(default="") # JSON string of tags
version: str = Field(default="1.0.0")
is_public: bool = Field(default=False)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -72,33 +74,33 @@ class AIAgentWorkflow(SQLModel, table=True):
class AgentStep(SQLModel, table=True):
"""Individual step in an AI agent workflow"""
__tablename__ = "agent_steps"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"step_{uuid4().hex[:8]}", primary_key=True)
workflow_id: str = Field(index=True)
step_order: int = Field(default=0)
# Step specification
name: str = Field(max_length=100)
step_type: StepType = Field(default=StepType.INFERENCE)
model_requirements: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
input_mappings: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
output_mappings: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
model_requirements: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
input_mappings: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
output_mappings: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Execution parameters
timeout_seconds: int = Field(default=300)
retry_policy: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
retry_policy: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
max_retries: int = Field(default=3)
# Verification
requires_proof: bool = Field(default=False)
verification_level: VerificationLevel = Field(default=VerificationLevel.BASIC)
# Dependencies
depends_on: str = Field(default="") # JSON string of step IDs
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -106,38 +108,38 @@ class AgentStep(SQLModel, table=True):
class AgentExecution(SQLModel, table=True):
"""Tracks execution state of AI agent workflows"""
__tablename__ = "agent_executions"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"exec_{uuid4().hex[:10]}", primary_key=True)
workflow_id: str = Field(index=True)
client_id: str = Field(index=True)
# Execution state
status: AgentStatus = Field(default=AgentStatus.PENDING)
current_step: int = Field(default=0)
step_states: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
step_states: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
# Results and verification
final_result: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
execution_receipt: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
verification_proof: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
final_result: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
execution_receipt: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
verification_proof: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
# Error handling
error_message: Optional[str] = Field(default=None)
failed_step: Optional[str] = Field(default=None)
error_message: str | None = Field(default=None)
failed_step: str | None = Field(default=None)
# Timing and cost
started_at: Optional[datetime] = Field(default=None)
completed_at: Optional[datetime] = Field(default=None)
total_execution_time: Optional[float] = Field(default=None) # seconds
started_at: datetime | None = Field(default=None)
completed_at: datetime | None = Field(default=None)
total_execution_time: float | None = Field(default=None) # seconds
total_cost: float = Field(default=0.0)
# Progress tracking
total_steps: int = Field(default=0)
completed_steps: int = Field(default=0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -145,38 +147,38 @@ class AgentExecution(SQLModel, table=True):
class AgentStepExecution(SQLModel, table=True):
"""Tracks execution of individual steps within an agent workflow"""
__tablename__ = "agent_step_executions"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"step_exec_{uuid4().hex[:10]}", primary_key=True)
execution_id: str = Field(index=True)
step_id: str = Field(index=True)
# Execution state
status: AgentStatus = Field(default=AgentStatus.PENDING)
# Step-specific data
input_data: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
output_data: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
input_data: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
output_data: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
# Performance metrics
execution_time: Optional[float] = Field(default=None) # seconds
execution_time: float | None = Field(default=None) # seconds
gpu_accelerated: bool = Field(default=False)
memory_usage: Optional[float] = Field(default=None) # MB
memory_usage: float | None = Field(default=None) # MB
# Verification
step_proof: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
verification_status: Optional[str] = Field(default=None)
step_proof: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
verification_status: str | None = Field(default=None)
# Error handling
error_message: Optional[str] = Field(default=None)
error_message: str | None = Field(default=None)
retry_count: int = Field(default=0)
# Timing
started_at: Optional[datetime] = Field(default=None)
completed_at: Optional[datetime] = Field(default=None)
started_at: datetime | None = Field(default=None)
completed_at: datetime | None = Field(default=None)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -184,38 +186,38 @@ class AgentStepExecution(SQLModel, table=True):
class AgentMarketplace(SQLModel, table=True):
"""Marketplace for AI agent workflows"""
__tablename__ = "agent_marketplace"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"amkt_{uuid4().hex[:8]}", primary_key=True)
workflow_id: str = Field(index=True)
# Marketplace metadata
title: str = Field(max_length=200)
description: str = Field(default="")
tags: str = Field(default="") # JSON string of tags
category: str = Field(default="general")
# Pricing
execution_price: float = Field(default=0.0)
subscription_price: float = Field(default=0.0)
pricing_model: str = Field(default="pay-per-use") # pay-per-use, subscription, freemium
# Reputation and usage
rating: float = Field(default=0.0)
total_executions: int = Field(default=0)
successful_executions: int = Field(default=0)
average_execution_time: Optional[float] = Field(default=None)
average_execution_time: float | None = Field(default=None)
# Access control
is_public: bool = Field(default=True)
authorized_users: str = Field(default="") # JSON string of authorized users
# Performance metrics
last_execution_status: Optional[AgentStatus] = Field(default=None)
last_execution_at: Optional[datetime] = Field(default=None)
last_execution_status: AgentStatus | None = Field(default=None)
last_execution_at: datetime | None = Field(default=None)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -224,66 +226,71 @@ class AgentMarketplace(SQLModel, table=True):
# Request/Response Models for API
class AgentWorkflowCreate(SQLModel):
"""Request model for creating agent workflows"""
name: str = Field(max_length=100)
description: str = Field(default="")
steps: Dict[str, Any]
dependencies: Dict[str, List[str]] = Field(default_factory=dict)
steps: dict[str, Any]
dependencies: dict[str, list[str]] = Field(default_factory=dict)
max_execution_time: int = Field(default=3600)
max_cost_budget: float = Field(default=0.0)
requires_verification: bool = Field(default=True)
verification_level: VerificationLevel = Field(default=VerificationLevel.BASIC)
tags: List[str] = Field(default_factory=list)
tags: list[str] = Field(default_factory=list)
is_public: bool = Field(default=False)
class AgentWorkflowUpdate(SQLModel):
"""Request model for updating agent workflows"""
name: Optional[str] = Field(default=None, max_length=100)
description: Optional[str] = Field(default=None)
steps: Optional[Dict[str, Any]] = Field(default=None)
dependencies: Optional[Dict[str, List[str]]] = Field(default=None)
max_execution_time: Optional[int] = Field(default=None)
max_cost_budget: Optional[float] = Field(default=None)
requires_verification: Optional[bool] = Field(default=None)
verification_level: Optional[VerificationLevel] = Field(default=None)
tags: Optional[List[str]] = Field(default=None)
is_public: Optional[bool] = Field(default=None)
name: str | None = Field(default=None, max_length=100)
description: str | None = Field(default=None)
steps: dict[str, Any] | None = Field(default=None)
dependencies: dict[str, list[str]] | None = Field(default=None)
max_execution_time: int | None = Field(default=None)
max_cost_budget: float | None = Field(default=None)
requires_verification: bool | None = Field(default=None)
verification_level: VerificationLevel | None = Field(default=None)
tags: list[str] | None = Field(default=None)
is_public: bool | None = Field(default=None)
class AgentExecutionRequest(SQLModel):
"""Request model for executing agent workflows"""
workflow_id: str
inputs: Dict[str, Any]
verification_level: Optional[VerificationLevel] = Field(default=VerificationLevel.BASIC)
max_execution_time: Optional[int] = Field(default=None)
max_cost_budget: Optional[float] = Field(default=None)
inputs: dict[str, Any]
verification_level: VerificationLevel | None = Field(default=VerificationLevel.BASIC)
max_execution_time: int | None = Field(default=None)
max_cost_budget: float | None = Field(default=None)
class AgentExecutionResponse(SQLModel):
"""Response model for agent execution"""
execution_id: str
workflow_id: str
status: AgentStatus
current_step: int
total_steps: int
started_at: Optional[datetime]
estimated_completion: Optional[datetime]
started_at: datetime | None
estimated_completion: datetime | None
current_cost: float
estimated_total_cost: Optional[float]
estimated_total_cost: float | None
class AgentExecutionStatus(SQLModel):
"""Response model for execution status"""
execution_id: str
workflow_id: str
status: AgentStatus
current_step: int
total_steps: int
step_states: Dict[str, Any]
final_result: Optional[Dict[str, Any]]
error_message: Optional[str]
started_at: Optional[datetime]
completed_at: Optional[datetime]
total_execution_time: Optional[float]
step_states: dict[str, Any]
final_result: dict[str, Any] | None
error_message: str | None
started_at: datetime | None
completed_at: datetime | None
total_execution_time: float | None
total_cost: float
verification_proof: Optional[Dict[str, Any]]
verification_proof: dict[str, Any] | None

View File

@@ -4,32 +4,35 @@ Implements SQLModel definitions for unified agent identity across multiple block
"""
from datetime import datetime
from typing import Optional, Dict, List, Any
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Index
from sqlalchemy import Index
from sqlmodel import JSON, Column, Field, SQLModel
class IdentityStatus(str, Enum):
class IdentityStatus(StrEnum):
"""Agent identity status enumeration"""
ACTIVE = "active"
INACTIVE = "inactive"
SUSPENDED = "suspended"
REVOKED = "revoked"
class VerificationType(str, Enum):
class VerificationType(StrEnum):
"""Identity verification type enumeration"""
BASIC = "basic"
ADVANCED = "advanced"
ZERO_KNOWLEDGE = "zero-knowledge"
MULTI_SIGNATURE = "multi-signature"
class ChainType(str, Enum):
class ChainType(StrEnum):
"""Blockchain chain type enumeration"""
ETHEREUM = "ethereum"
POLYGON = "polygon"
BSC = "bsc"
@@ -42,268 +45,276 @@ class ChainType(str, Enum):
class AgentIdentity(SQLModel, table=True):
"""Unified agent identity across blockchains"""
__tablename__ = "agent_identities"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"identity_{uuid4().hex[:8]}", primary_key=True)
agent_id: str = Field(index=True, unique=True) # Links to AIAgentWorkflow.id
owner_address: str = Field(index=True)
# Identity metadata
display_name: str = Field(max_length=100, default="")
description: str = Field(default="")
avatar_url: str = Field(default="")
# Status and verification
status: IdentityStatus = Field(default=IdentityStatus.ACTIVE)
verification_level: VerificationType = Field(default=VerificationType.BASIC)
is_verified: bool = Field(default=False)
verified_at: Optional[datetime] = Field(default=None)
verified_at: datetime | None = Field(default=None)
# Cross-chain capabilities
supported_chains: List[str] = Field(default_factory=list, sa_column=Column(JSON))
supported_chains: list[str] = Field(default_factory=list, sa_column=Column(JSON))
primary_chain: int = Field(default=1) # Default to Ethereum mainnet
# Reputation and trust
reputation_score: float = Field(default=0.0)
total_transactions: int = Field(default=0)
successful_transactions: int = Field(default=0)
last_activity: Optional[datetime] = Field(default=None)
last_activity: datetime | None = Field(default=None)
# Metadata and settings
identity_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
settings_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
identity_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
settings_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
tags: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes for performance
__table_args__ = (
Index('idx_agent_identity_owner', 'owner_address'),
Index('idx_agent_identity_status', 'status'),
Index('idx_agent_identity_verified', 'is_verified'),
Index('idx_agent_identity_reputation', 'reputation_score'),
Index("idx_agent_identity_owner", "owner_address"),
Index("idx_agent_identity_status", "status"),
Index("idx_agent_identity_verified", "is_verified"),
Index("idx_agent_identity_reputation", "reputation_score"),
)
class CrossChainMapping(SQLModel, table=True):
"""Mapping of agent identity across different blockchains"""
__tablename__ = "cross_chain_mappings"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"mapping_{uuid4().hex[:8]}", primary_key=True)
agent_id: str = Field(index=True)
chain_id: int = Field(index=True)
chain_type: ChainType = Field(default=ChainType.ETHEREUM)
chain_address: str = Field(index=True)
# Verification and status
is_verified: bool = Field(default=False)
verified_at: Optional[datetime] = Field(default=None)
verification_proof: Optional[Dict[str, Any]] = Field(default=None, sa_column=Column(JSON))
verified_at: datetime | None = Field(default=None)
verification_proof: dict[str, Any] | None = Field(default=None, sa_column=Column(JSON))
# Wallet information
wallet_address: Optional[str] = Field(default=None)
wallet_address: str | None = Field(default=None)
wallet_type: str = Field(default="agent-wallet") # agent-wallet, external-wallet, etc.
# Chain-specific metadata
chain_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
nonce: Optional[int] = Field(default=None)
chain_meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
nonce: int | None = Field(default=None)
# Activity tracking
last_transaction: Optional[datetime] = Field(default=None)
last_transaction: datetime | None = Field(default=None)
transaction_count: int = Field(default=0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Unique constraint
__table_args__ = (
Index('idx_cross_chain_agent_chain', 'agent_id', 'chain_id'),
Index('idx_cross_chain_address', 'chain_address'),
Index('idx_cross_chain_verified', 'is_verified'),
Index("idx_cross_chain_agent_chain", "agent_id", "chain_id"),
Index("idx_cross_chain_address", "chain_address"),
Index("idx_cross_chain_verified", "is_verified"),
)
class IdentityVerification(SQLModel, table=True):
"""Verification records for cross-chain identities"""
__tablename__ = "identity_verifications"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"verify_{uuid4().hex[:8]}", primary_key=True)
agent_id: str = Field(index=True)
chain_id: int = Field(index=True)
# Verification details
verification_type: VerificationType
verifier_address: str = Field(index=True) # Who performed the verification
proof_hash: str = Field(index=True)
proof_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
proof_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Status and results
is_valid: bool = Field(default=True)
verification_result: str = Field(default="pending") # pending, approved, rejected
rejection_reason: Optional[str] = Field(default=None)
rejection_reason: str | None = Field(default=None)
# Expiration and renewal
expires_at: Optional[datetime] = Field(default=None)
renewed_at: Optional[datetime] = Field(default=None)
expires_at: datetime | None = Field(default=None)
renewed_at: datetime | None = Field(default=None)
# Metadata
verification_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
verification_meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes
__table_args__ = (
Index('idx_identity_verify_agent_chain', 'agent_id', 'chain_id'),
Index('idx_identity_verify_verifier', 'verifier_address'),
Index('idx_identity_verify_hash', 'proof_hash'),
Index('idx_identity_verify_result', 'verification_result'),
Index("idx_identity_verify_agent_chain", "agent_id", "chain_id"),
Index("idx_identity_verify_verifier", "verifier_address"),
Index("idx_identity_verify_hash", "proof_hash"),
Index("idx_identity_verify_result", "verification_result"),
)
class AgentWallet(SQLModel, table=True):
"""Agent wallet information for cross-chain operations"""
__tablename__ = "agent_wallets"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"wallet_{uuid4().hex[:8]}", primary_key=True)
agent_id: str = Field(index=True)
chain_id: int = Field(index=True)
chain_address: str = Field(index=True)
# Wallet details
wallet_type: str = Field(default="agent-wallet")
contract_address: Optional[str] = Field(default=None)
contract_address: str | None = Field(default=None)
# Financial information
balance: float = Field(default=0.0)
spending_limit: float = Field(default=0.0)
total_spent: float = Field(default=0.0)
# Status and permissions
is_active: bool = Field(default=True)
permissions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
permissions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Security
requires_multisig: bool = Field(default=False)
multisig_threshold: int = Field(default=1)
multisig_signers: List[str] = Field(default_factory=list, sa_column=Column(JSON))
multisig_signers: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Activity tracking
last_transaction: Optional[datetime] = Field(default=None)
last_transaction: datetime | None = Field(default=None)
transaction_count: int = Field(default=0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes
__table_args__ = (
Index('idx_agent_wallet_agent_chain', 'agent_id', 'chain_id'),
Index('idx_agent_wallet_address', 'chain_address'),
Index('idx_agent_wallet_active', 'is_active'),
Index("idx_agent_wallet_agent_chain", "agent_id", "chain_id"),
Index("idx_agent_wallet_address", "chain_address"),
Index("idx_agent_wallet_active", "is_active"),
)
# Request/Response Models for API
class AgentIdentityCreate(SQLModel):
"""Request model for creating agent identities"""
agent_id: str
owner_address: str
display_name: str = Field(max_length=100, default="")
description: str = Field(default="")
avatar_url: str = Field(default="")
supported_chains: List[int] = Field(default_factory=list)
supported_chains: list[int] = Field(default_factory=list)
primary_chain: int = Field(default=1)
meta_data: Dict[str, Any] = Field(default_factory=dict)
tags: List[str] = Field(default_factory=list)
meta_data: dict[str, Any] = Field(default_factory=dict)
tags: list[str] = Field(default_factory=list)
class AgentIdentityUpdate(SQLModel):
"""Request model for updating agent identities"""
display_name: Optional[str] = Field(default=None, max_length=100)
description: Optional[str] = Field(default=None)
avatar_url: Optional[str] = Field(default=None)
status: Optional[IdentityStatus] = Field(default=None)
verification_level: Optional[VerificationType] = Field(default=None)
supported_chains: Optional[List[int]] = Field(default=None)
primary_chain: Optional[int] = Field(default=None)
meta_data: Optional[Dict[str, Any]] = Field(default=None)
settings: Optional[Dict[str, Any]] = Field(default=None)
tags: Optional[List[str]] = Field(default=None)
display_name: str | None = Field(default=None, max_length=100)
description: str | None = Field(default=None)
avatar_url: str | None = Field(default=None)
status: IdentityStatus | None = Field(default=None)
verification_level: VerificationType | None = Field(default=None)
supported_chains: list[int] | None = Field(default=None)
primary_chain: int | None = Field(default=None)
meta_data: dict[str, Any] | None = Field(default=None)
settings: dict[str, Any] | None = Field(default=None)
tags: list[str] | None = Field(default=None)
class CrossChainMappingCreate(SQLModel):
"""Request model for creating cross-chain mappings"""
agent_id: str
chain_id: int
chain_type: ChainType = Field(default=ChainType.ETHEREUM)
chain_address: str
wallet_address: Optional[str] = Field(default=None)
wallet_address: str | None = Field(default=None)
wallet_type: str = Field(default="agent-wallet")
chain_meta_data: Dict[str, Any] = Field(default_factory=dict)
chain_meta_data: dict[str, Any] = Field(default_factory=dict)
class CrossChainMappingUpdate(SQLModel):
"""Request model for updating cross-chain mappings"""
chain_address: Optional[str] = Field(default=None)
wallet_address: Optional[str] = Field(default=None)
wallet_type: Optional[str] = Field(default=None)
chain_meta_data: Optional[Dict[str, Any]] = Field(default=None)
is_verified: Optional[bool] = Field(default=None)
chain_address: str | None = Field(default=None)
wallet_address: str | None = Field(default=None)
wallet_type: str | None = Field(default=None)
chain_meta_data: dict[str, Any] | None = Field(default=None)
is_verified: bool | None = Field(default=None)
class IdentityVerificationCreate(SQLModel):
"""Request model for creating identity verifications"""
agent_id: str
chain_id: int
verification_type: VerificationType
verifier_address: str
proof_hash: str
proof_data: Dict[str, Any] = Field(default_factory=dict)
expires_at: Optional[datetime] = Field(default=None)
verification_meta_data: Dict[str, Any] = Field(default_factory=dict)
proof_data: dict[str, Any] = Field(default_factory=dict)
expires_at: datetime | None = Field(default=None)
verification_meta_data: dict[str, Any] = Field(default_factory=dict)
class AgentWalletCreate(SQLModel):
"""Request model for creating agent wallets"""
agent_id: str
chain_id: int
chain_address: str
wallet_type: str = Field(default="agent-wallet")
contract_address: Optional[str] = Field(default=None)
contract_address: str | None = Field(default=None)
spending_limit: float = Field(default=0.0)
permissions: List[str] = Field(default_factory=list)
permissions: list[str] = Field(default_factory=list)
requires_multisig: bool = Field(default=False)
multisig_threshold: int = Field(default=1)
multisig_signers: List[str] = Field(default_factory=list)
multisig_signers: list[str] = Field(default_factory=list)
class AgentWalletUpdate(SQLModel):
"""Request model for updating agent wallets"""
contract_address: Optional[str] = Field(default=None)
spending_limit: Optional[float] = Field(default=None)
permissions: Optional[List[str]] = Field(default=None)
is_active: Optional[bool] = Field(default=None)
requires_multisig: Optional[bool] = Field(default=None)
multisig_threshold: Optional[int] = Field(default=None)
multisig_signers: Optional[List[str]] = Field(default=None)
contract_address: str | None = Field(default=None)
spending_limit: float | None = Field(default=None)
permissions: list[str] | None = Field(default=None)
is_active: bool | None = Field(default=None)
requires_multisig: bool | None = Field(default=None)
multisig_threshold: int | None = Field(default=None)
multisig_signers: list[str] | None = Field(default=None)
# Response Models
class AgentIdentityResponse(SQLModel):
"""Response model for agent identity"""
id: str
agent_id: str
owner_address: str
@@ -313,32 +324,33 @@ class AgentIdentityResponse(SQLModel):
status: IdentityStatus
verification_level: VerificationType
is_verified: bool
verified_at: Optional[datetime]
supported_chains: List[str]
verified_at: datetime | None
supported_chains: list[str]
primary_chain: int
reputation_score: float
total_transactions: int
successful_transactions: int
last_activity: Optional[datetime]
meta_data: Dict[str, Any]
tags: List[str]
last_activity: datetime | None
meta_data: dict[str, Any]
tags: list[str]
created_at: datetime
updated_at: datetime
class CrossChainMappingResponse(SQLModel):
"""Response model for cross-chain mapping"""
id: str
agent_id: str
chain_id: int
chain_type: ChainType
chain_address: str
is_verified: bool
verified_at: Optional[datetime]
wallet_address: Optional[str]
verified_at: datetime | None
wallet_address: str | None
wallet_type: str
chain_meta_data: Dict[str, Any]
last_transaction: Optional[datetime]
chain_meta_data: dict[str, Any]
last_transaction: datetime | None
transaction_count: int
created_at: datetime
updated_at: datetime
@@ -346,21 +358,22 @@ class CrossChainMappingResponse(SQLModel):
class AgentWalletResponse(SQLModel):
"""Response model for agent wallet"""
id: str
agent_id: str
chain_id: int
chain_address: str
wallet_type: str
contract_address: Optional[str]
contract_address: str | None
balance: float
spending_limit: float
total_spent: float
is_active: bool
permissions: List[str]
permissions: list[str]
requires_multisig: bool
multisig_threshold: int
multisig_signers: List[str]
last_transaction: Optional[datetime]
multisig_signers: list[str]
last_transaction: datetime | None
transaction_count: int
created_at: datetime
updated_at: datetime

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class LearningStrategy(str, Enum):
class LearningStrategy(StrEnum):
"""Learning strategy enumeration"""
META_LEARNING = "meta_learning"
TRANSFER_LEARNING = "transfer_learning"
REINFORCEMENT_LEARNING = "reinforcement_learning"
@@ -22,8 +22,9 @@ class LearningStrategy(str, Enum):
FEDERATED_LEARNING = "federated_learning"
class PerformanceMetric(str, Enum):
class PerformanceMetric(StrEnum):
"""Performance metric enumeration"""
ACCURACY = "accuracy"
PRECISION = "precision"
RECALL = "recall"
@@ -36,8 +37,9 @@ class PerformanceMetric(str, Enum):
GENERALIZATION = "generalization"
class ResourceType(str, Enum):
class ResourceType(StrEnum):
"""Resource type enumeration"""
CPU = "cpu"
GPU = "gpu"
MEMORY = "memory"
@@ -46,8 +48,9 @@ class ResourceType(str, Enum):
CACHE = "cache"
class OptimizationTarget(str, Enum):
class OptimizationTarget(StrEnum):
"""Optimization target enumeration"""
SPEED = "speed"
ACCURACY = "accuracy"
EFFICIENCY = "efficiency"
@@ -58,121 +61,121 @@ class OptimizationTarget(str, Enum):
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))
performance_metrics: dict[str, float] = Field(default={}, sa_column=Column(JSON))
# Learning capabilities
learning_strategies: List[str] = Field(default=[], sa_column=Column(JSON))
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))
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))
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))
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
benchmark_scores: dict[str, float] = Field(default={}, sa_column=Column(JSON))
ranking_position: int | None = None
percentile_rank: float | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_assessed: Optional[datetime] = None
last_assessed: datetime | None = None
# Additional data
profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
profile_meta_data: 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))
base_algorithms: list[str] = Field(default=[], sa_column=Column(JSON))
meta_strategy: LearningStrategy
adaptation_targets: List[str] = Field(default=[], sa_column=Column(JSON))
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))
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)
training_time: float | None = None # hours
computational_cost: float | None = None # cost units
memory_requirement: float | None = None # GB
gpu_requirement: bool | None = 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
trained_at: datetime | None = None
deployed_at: datetime | None = None
# Additional data
model_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
model_profile_meta_data: 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
task_id: str | None = None
session_id: str | None = None
# Resource requirements
cpu_cores: float = Field(default=1.0)
memory_gb: float = Field(default=2.0)
@@ -180,302 +183,302 @@ class ResourceAllocation(SQLModel, table=True):
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))
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
allocated_at: datetime | None = None
started_at: datetime | None = None
completed_at: datetime | None = 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_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
resource_utilization: Dict[str, float] = Field(default={}, sa_column=Column(JSON))
allocation_profile_meta_data: 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_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_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))
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_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
optimization_duration: float | None = 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
applied_at: datetime | None = 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
completed_at: datetime | None = None
# Additional data
optimization_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
performance_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
optimization_profile_meta_data: 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))
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))
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
last_improved: datetime | None = 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
certification_level: str | None = None
last_validated: datetime | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Additional data
capability_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
training_history: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
capability_profile_meta_data: 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))
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))
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))
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))
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
trained_at: datetime | None = None
deployed_at: datetime | None = None
# Additional data
fusion_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
fusion_profile_meta_data: 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))
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
reward_history: list[float] = Field(default=[], sa_column=Column(JSON))
success_rate_history: list[float] = Field(default=[], sa_column=Column(JSON))
convergence_episode: int | None = 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))
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))
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
trained_at: datetime | None = None
deployed_at: datetime | None = None
# Additional data
rl_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
training_logs: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
rl_profile_meta_data: 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))
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))
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))
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
certification_level: str | None = None
last_evaluation: datetime | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Additional data
creative_profile_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
portfolio_samples: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
creative_profile_meta_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
portfolio_samples: list[dict[str, Any]] = Field(default=[], sa_column=Column(JSON))

View File

@@ -6,30 +6,28 @@ Domain models for agent portfolio management, trading strategies, and risk asses
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional
from uuid import uuid4
from datetime import datetime, timedelta
from enum import StrEnum
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class StrategyType(str, Enum):
class StrategyType(StrEnum):
CONSERVATIVE = "conservative"
BALANCED = "balanced"
AGGRESSIVE = "aggressive"
DYNAMIC = "dynamic"
class TradeStatus(str, Enum):
class TradeStatus(StrEnum):
PENDING = "pending"
EXECUTED = "executed"
FAILED = "failed"
CANCELLED = "cancelled"
class RiskLevel(str, Enum):
class RiskLevel(StrEnum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
@@ -38,31 +36,33 @@ class RiskLevel(str, Enum):
class PortfolioStrategy(SQLModel, table=True):
"""Trading strategy configuration for agent portfolios"""
__tablename__ = "portfolio_strategy"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
name: str = Field(index=True)
strategy_type: StrategyType = Field(index=True)
target_allocations: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
target_allocations: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
max_drawdown: float = Field(default=20.0) # Maximum drawdown percentage
rebalance_frequency: int = Field(default=86400) # Rebalancing frequency in seconds
volatility_threshold: float = Field(default=15.0) # Volatility threshold for rebalancing
is_active: bool = Field(default=True, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: portfolios: List["AgentPortfolio"] = Relationship(back_populates="strategy")
class AgentPortfolio(SQLModel, table=True):
"""Portfolio managed by an autonomous agent"""
__tablename__ = "agent_portfolio"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
agent_address: str = Field(index=True)
strategy_id: int = Field(foreign_key="portfolio_strategy.id", index=True)
contract_portfolio_id: Optional[str] = Field(default=None, index=True)
contract_portfolio_id: str | None = Field(default=None, index=True)
initial_capital: float = Field(default=0.0)
total_value: float = Field(default=0.0)
risk_score: float = Field(default=0.0) # Risk score (0-100)
@@ -71,7 +71,7 @@ class AgentPortfolio(SQLModel, table=True):
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_rebalance: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: strategy: PortfolioStrategy = Relationship(back_populates="portfolios")
# DISABLED: assets: List["PortfolioAsset"] = Relationship(back_populates="portfolio")
@@ -81,9 +81,10 @@ class AgentPortfolio(SQLModel, table=True):
class PortfolioAsset(SQLModel, table=True):
"""Asset holdings within a portfolio"""
__tablename__ = "portfolio_asset"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
token_symbol: str = Field(index=True)
token_address: str = Field(index=True)
@@ -94,16 +95,17 @@ class PortfolioAsset(SQLModel, table=True):
unrealized_pnl: float = Field(default=0.0) # Unrealized profit/loss
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: portfolio: AgentPortfolio = Relationship(back_populates="assets")
class PortfolioTrade(SQLModel, table=True):
"""Trade executed within a portfolio"""
__tablename__ = "portfolio_trade"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
sell_token: str = Field(index=True)
buy_token: str = Field(index=True)
@@ -112,19 +114,20 @@ class PortfolioTrade(SQLModel, table=True):
price: float = Field(default=0.0)
fee_amount: float = Field(default=0.0)
status: TradeStatus = Field(default=TradeStatus.PENDING, index=True)
transaction_hash: Optional[str] = Field(default=None, index=True)
executed_at: Optional[datetime] = Field(default=None, index=True)
transaction_hash: str | None = Field(default=None, index=True)
executed_at: datetime | None = Field(default=None, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
# Relationships
# DISABLED: portfolio: AgentPortfolio = Relationship(back_populates="trades")
class RiskMetrics(SQLModel, table=True):
"""Risk assessment metrics for a portfolio"""
__tablename__ = "risk_metrics"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
volatility: float = Field(default=0.0) # Portfolio volatility
max_drawdown: float = Field(default=0.0) # Maximum drawdown
@@ -133,21 +136,22 @@ class RiskMetrics(SQLModel, table=True):
alpha: float = Field(default=0.0) # Alpha coefficient
var_95: float = Field(default=0.0) # Value at Risk at 95% confidence
var_99: float = Field(default=0.0) # Value at Risk at 99% confidence
correlation_matrix: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
correlation_matrix: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
risk_level: RiskLevel = Field(default=RiskLevel.LOW, index=True)
overall_risk_score: float = Field(default=0.0) # Overall risk score (0-100)
stress_test_results: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
stress_test_results: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: portfolio: AgentPortfolio = Relationship(back_populates="risk_metrics")
class RebalanceHistory(SQLModel, table=True):
"""History of portfolio rebalancing events"""
__tablename__ = "rebalance_history"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
trigger_reason: str = Field(index=True) # Reason for rebalancing
pre_rebalance_value: float = Field(default=0.0)
@@ -160,9 +164,10 @@ class RebalanceHistory(SQLModel, table=True):
class PerformanceMetrics(SQLModel, table=True):
"""Performance metrics for portfolios"""
__tablename__ = "performance_metrics"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
period: str = Field(index=True) # Performance period (1d, 7d, 30d, etc.)
total_return: float = Field(default=0.0) # Total return percentage
@@ -186,25 +191,27 @@ class PerformanceMetrics(SQLModel, table=True):
class PortfolioAlert(SQLModel, table=True):
"""Alerts for portfolio events"""
__tablename__ = "portfolio_alert"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
alert_type: str = Field(index=True) # Type of alert
severity: str = Field(index=True) # Severity level
message: str = Field(default="")
meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
is_acknowledged: bool = Field(default=False, index=True)
acknowledged_at: Optional[datetime] = Field(default=None)
acknowledged_at: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
resolved_at: Optional[datetime] = Field(default=None)
resolved_at: datetime | None = Field(default=None)
class StrategySignal(SQLModel, table=True):
"""Trading signals generated by strategies"""
__tablename__ = "strategy_signal"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
strategy_id: int = Field(foreign_key="portfolio_strategy.id", index=True)
signal_type: str = Field(index=True) # BUY, SELL, HOLD
token_symbol: str = Field(index=True)
@@ -213,40 +220,42 @@ class StrategySignal(SQLModel, table=True):
stop_loss: float = Field(default=0.0) # Stop loss price
time_horizon: str = Field(default="1d") # Time horizon
reasoning: str = Field(default="") # Signal reasoning
meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
is_executed: bool = Field(default=False, index=True)
executed_at: Optional[datetime] = Field(default=None)
executed_at: datetime | None = Field(default=None)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(hours=24))
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
class PortfolioSnapshot(SQLModel, table=True):
"""Daily snapshot of portfolio state"""
__tablename__ = "portfolio_snapshot"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
snapshot_date: datetime = Field(index=True)
total_value: float = Field(default=0.0)
cash_balance: float = Field(default=0.0)
asset_count: int = Field(default=0)
top_holdings: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
sector_allocation: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
geographic_allocation: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
risk_metrics: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
performance_metrics: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
top_holdings: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
sector_allocation: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
geographic_allocation: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
risk_metrics: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
performance_metrics: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
created_at: datetime = Field(default_factory=datetime.utcnow)
class TradingRule(SQLModel, table=True):
"""Trading rules and constraints for portfolios"""
__tablename__ = "trading_rule"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
portfolio_id: int = Field(foreign_key="agent_portfolio.id", index=True)
rule_type: str = Field(index=True) # Type of rule
rule_name: str = Field(index=True)
parameters: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
parameters: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
is_active: bool = Field(default=True, index=True)
priority: int = Field(default=0) # Rule priority (higher = more important)
created_at: datetime = Field(default_factory=datetime.utcnow)
@@ -255,13 +264,14 @@ class TradingRule(SQLModel, table=True):
class MarketCondition(SQLModel, table=True):
"""Market conditions affecting portfolio decisions"""
__tablename__ = "market_condition"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
condition_type: str = Field(index=True) # BULL, BEAR, SIDEWAYS, VOLATILE
market_index: str = Field(index=True) # Market index (SPY, QQQ, etc.)
confidence: float = Field(default=0.0) # Confidence in condition
indicators: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
indicators: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
sentiment_score: float = Field(default=0.0) # Market sentiment score
volatility_index: float = Field(default=0.0) # VIX or similar
trend_strength: float = Field(default=0.0) # Trend strength

View File

@@ -7,29 +7,27 @@ Domain models for automated market making, liquidity pools, and swap transaction
from __future__ import annotations
from datetime import datetime, timedelta
from enum import Enum
from typing import Dict, List, Optional
from uuid import uuid4
from enum import StrEnum
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class PoolStatus(str, Enum):
class PoolStatus(StrEnum):
ACTIVE = "active"
INACTIVE = "inactive"
PAUSED = "paused"
MAINTENANCE = "maintenance"
class SwapStatus(str, Enum):
class SwapStatus(StrEnum):
PENDING = "pending"
EXECUTED = "executed"
FAILED = "failed"
CANCELLED = "cancelled"
class LiquidityPositionStatus(str, Enum):
class LiquidityPositionStatus(StrEnum):
ACTIVE = "active"
WITHDRAWN = "withdrawn"
PENDING = "pending"
@@ -37,9 +35,10 @@ class LiquidityPositionStatus(str, Enum):
class LiquidityPool(SQLModel, table=True):
"""Liquidity pool for automated market making"""
__tablename__ = "liquidity_pool"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
contract_pool_id: str = Field(index=True) # Contract pool ID
token_a: str = Field(index=True) # Token A address
token_b: str = Field(index=True) # Token B address
@@ -62,8 +61,8 @@ class LiquidityPool(SQLModel, table=True):
created_by: str = Field(index=True) # Creator address
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_trade_time: Optional[datetime] = Field(default=None)
last_trade_time: datetime | None = Field(default=None)
# Relationships
# DISABLED: positions: List["LiquidityPosition"] = Relationship(back_populates="pool")
# DISABLED: swaps: List["SwapTransaction"] = Relationship(back_populates="pool")
@@ -73,9 +72,10 @@ class LiquidityPool(SQLModel, table=True):
class LiquidityPosition(SQLModel, table=True):
"""Liquidity provider position in a pool"""
__tablename__ = "liquidity_position"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
provider_address: str = Field(index=True)
liquidity_amount: float = Field(default=0.0) # Amount of liquidity tokens
@@ -90,9 +90,9 @@ class LiquidityPosition(SQLModel, table=True):
status: LiquidityPositionStatus = Field(default=LiquidityPositionStatus.ACTIVE, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_deposit: Optional[datetime] = Field(default=None)
last_withdrawal: Optional[datetime] = Field(default=None)
last_deposit: datetime | None = Field(default=None)
last_withdrawal: datetime | None = Field(default=None)
# Relationships
# DISABLED: pool: LiquidityPool = Relationship(back_populates="positions")
# DISABLED: fee_claims: List["FeeClaim"] = Relationship(back_populates="position")
@@ -100,9 +100,10 @@ class LiquidityPosition(SQLModel, table=True):
class SwapTransaction(SQLModel, table=True):
"""Swap transaction executed in a pool"""
__tablename__ = "swap_transaction"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
user_address: str = Field(index=True)
token_in: str = Field(index=True)
@@ -115,23 +116,24 @@ class SwapTransaction(SQLModel, table=True):
fee_amount: float = Field(default=0.0) # Fee amount
fee_percentage: float = Field(default=0.0) # Applied fee percentage
status: SwapStatus = Field(default=SwapStatus.PENDING, index=True)
transaction_hash: Optional[str] = Field(default=None, index=True)
block_number: Optional[int] = Field(default=None)
gas_used: Optional[int] = Field(default=None)
gas_price: Optional[float] = Field(default=None)
executed_at: Optional[datetime] = Field(default=None, index=True)
transaction_hash: str | None = Field(default=None, index=True)
block_number: int | None = Field(default=None)
gas_used: int | None = Field(default=None)
gas_price: float | None = Field(default=None)
executed_at: datetime | None = Field(default=None, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
deadline: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(minutes=20))
# Relationships
# DISABLED: pool: LiquidityPool = Relationship(back_populates="swaps")
class PoolMetrics(SQLModel, table=True):
"""Historical metrics for liquidity pools"""
__tablename__ = "pool_metrics"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
timestamp: datetime = Field(index=True)
total_volume_24h: float = Field(default=0.0)
@@ -146,18 +148,19 @@ class PoolMetrics(SQLModel, table=True):
average_trade_size: float = Field(default=0.0) # Average trade size
impermanent_loss_24h: float = Field(default=0.0) # 24h impermanent loss
liquidity_provider_count: int = Field(default=0) # Number of liquidity providers
top_lps: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON)) # Top LPs by share
top_lps: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON)) # Top LPs by share
created_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: pool: LiquidityPool = Relationship(back_populates="metrics")
class FeeStructure(SQLModel, table=True):
"""Fee structure for liquidity pools"""
__tablename__ = "fee_structure"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
base_fee_percentage: float = Field(default=0.3) # Base fee percentage
current_fee_percentage: float = Field(default=0.3) # Current fee percentage
@@ -173,9 +176,10 @@ class FeeStructure(SQLModel, table=True):
class IncentiveProgram(SQLModel, table=True):
"""Incentive program for liquidity providers"""
__tablename__ = "incentive_program"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
program_name: str = Field(index=True)
reward_token: str = Field(index=True) # Reward token address
@@ -192,7 +196,7 @@ class IncentiveProgram(SQLModel, table=True):
end_time: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(days=30))
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: pool: LiquidityPool = Relationship(back_populates="incentives")
# DISABLED: rewards: List["LiquidityReward"] = Relationship(back_populates="program")
@@ -200,9 +204,10 @@ class IncentiveProgram(SQLModel, table=True):
class LiquidityReward(SQLModel, table=True):
"""Reward earned by liquidity providers"""
__tablename__ = "liquidity_reward"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
program_id: int = Field(foreign_key="incentive_program.id", index=True)
position_id: int = Field(foreign_key="liquidity_position.id", index=True)
provider_address: str = Field(index=True)
@@ -211,12 +216,12 @@ class LiquidityReward(SQLModel, table=True):
liquidity_share: float = Field(default=0.0) # Share of pool liquidity
time_weighted_share: float = Field(default=0.0) # Time-weighted share
is_claimed: bool = Field(default=False, index=True)
claimed_at: Optional[datetime] = Field(default=None)
claim_transaction_hash: Optional[str] = Field(default=None)
vesting_start: Optional[datetime] = Field(default=None)
vesting_end: Optional[datetime] = Field(default=None)
claimed_at: datetime | None = Field(default=None)
claim_transaction_hash: str | None = Field(default=None)
vesting_start: datetime | None = Field(default=None)
vesting_end: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
# Relationships
# DISABLED: program: IncentiveProgram = Relationship(back_populates="rewards")
# DISABLED: position: LiquidityPosition = Relationship(back_populates="fee_claims")
@@ -224,9 +229,10 @@ class LiquidityReward(SQLModel, table=True):
class FeeClaim(SQLModel, table=True):
"""Fee claim by liquidity providers"""
__tablename__ = "fee_claim"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
position_id: int = Field(foreign_key="liquidity_position.id", index=True)
provider_address: str = Field(index=True)
fee_amount: float = Field(default=0.0)
@@ -235,19 +241,20 @@ class FeeClaim(SQLModel, table=True):
claim_period_end: datetime = Field(index=True)
liquidity_share: float = Field(default=0.0) # Share of pool liquidity
is_claimed: bool = Field(default=False, index=True)
claimed_at: Optional[datetime] = Field(default=None)
claim_transaction_hash: Optional[str] = Field(default=None)
claimed_at: datetime | None = Field(default=None)
claim_transaction_hash: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
# Relationships
# DISABLED: position: LiquidityPosition = Relationship(back_populates="fee_claims")
class PoolConfiguration(SQLModel, table=True):
"""Configuration settings for liquidity pools"""
__tablename__ = "pool_configuration"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
config_key: str = Field(index=True)
config_value: str = Field(default="")
@@ -259,31 +266,33 @@ class PoolConfiguration(SQLModel, table=True):
class PoolAlert(SQLModel, table=True):
"""Alerts for pool events and conditions"""
__tablename__ = "pool_alert"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
alert_type: str = Field(index=True) # LOW_LIQUIDITY, HIGH_VOLATILITY, etc.
severity: str = Field(index=True) # LOW, MEDIUM, HIGH, CRITICAL
title: str = Field(default="")
message: str = Field(default="")
meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
threshold_value: float = Field(default=0.0) # Threshold that triggered alert
current_value: float = Field(default=0.0) # Current value
is_acknowledged: bool = Field(default=False, index=True)
acknowledged_by: Optional[str] = Field(default=None)
acknowledged_at: Optional[datetime] = Field(default=None)
acknowledged_by: str | None = Field(default=None)
acknowledged_at: datetime | None = Field(default=None)
is_resolved: bool = Field(default=False, index=True)
resolved_at: Optional[datetime] = Field(default=None)
resolved_at: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(hours=24))
class PoolSnapshot(SQLModel, table=True):
"""Daily snapshot of pool state"""
__tablename__ = "pool_snapshot"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
pool_id: int = Field(foreign_key="liquidity_pool.id", index=True)
snapshot_date: datetime = Field(index=True)
reserve_a: float = Field(default=0.0)
@@ -306,9 +315,10 @@ class PoolSnapshot(SQLModel, table=True):
class ArbitrageOpportunity(SQLModel, table=True):
"""Arbitrage opportunities across pools"""
__tablename__ = "arbitrage_opportunity"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
token_a: str = Field(index=True)
token_b: str = Field(index=True)
pool_1_id: int = Field(foreign_key="liquidity_pool.id", index=True)
@@ -322,8 +332,8 @@ class ArbitrageOpportunity(SQLModel, table=True):
required_amount: float = Field(default=0.0) # Amount needed for arbitrage
confidence: float = Field(default=0.0) # Confidence in opportunity
is_executed: bool = Field(default=False, index=True)
executed_at: Optional[datetime] = Field(default=None)
execution_tx_hash: Optional[str] = Field(default=None)
actual_profit: Optional[float] = Field(default=None)
executed_at: datetime | None = Field(default=None)
execution_tx_hash: str | None = Field(default=None)
actual_profit: float | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(minutes=5))

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class AnalyticsPeriod(str, Enum):
class AnalyticsPeriod(StrEnum):
"""Analytics period enumeration"""
REALTIME = "realtime"
HOURLY = "hourly"
DAILY = "daily"
@@ -23,8 +23,9 @@ class AnalyticsPeriod(str, Enum):
YEARLY = "yearly"
class MetricType(str, Enum):
class MetricType(StrEnum):
"""Metric type enumeration"""
VOLUME = "volume"
COUNT = "count"
AVERAGE = "average"
@@ -34,8 +35,9 @@ class MetricType(str, Enum):
VALUE = "value"
class InsightType(str, Enum):
class InsightType(StrEnum):
"""Insight type enumeration"""
TREND = "trend"
ANOMALY = "anomaly"
OPPORTUNITY = "opportunity"
@@ -44,8 +46,9 @@ class InsightType(str, Enum):
RECOMMENDATION = "recommendation"
class ReportType(str, Enum):
class ReportType(StrEnum):
"""Report type enumeration"""
MARKET_OVERVIEW = "market_overview"
AGENT_PERFORMANCE = "agent_performance"
ECONOMIC_ANALYSIS = "economic_analysis"
@@ -56,385 +59,385 @@ class ReportType(str, Enum):
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
previous_value: float | None = None
change_percentage: float | None = 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
geographic_region: str | None = None
agent_tier: str | None = None
trade_type: str | None = None
# Metadata
metric_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
metric_meta_data: 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))
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))
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))
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))
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
acknowledged_by: str | None = None
acknowledged_at: datetime | None = None
resolved_by: str | None = None
resolved_at: datetime | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = None
expires_at: datetime | None = 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))
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))
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))
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))
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))
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
delivered_at: datetime | None = None
# Additional data
report_metric_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
template_used: Optional[str] = None
report_metric_meta_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
template_used: str | None = 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))
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))
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))
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
last_modified_by: str | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_viewed_at: Optional[datetime] = None
last_viewed_at: datetime | None = 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))
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))
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
cron_expression: str | None = None
next_run: datetime | None = 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
started_at: datetime | None = None
completed_at: datetime | None = 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))
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_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
execution_log: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
job_metric_meta_data: 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
conditions: list[dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
threshold_value: float | None = 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))
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))
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))
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
last_triggered: datetime | None = 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_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
test_results: List[Dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
rule_metric_meta_data: 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))
trigger_value: float | None = None
threshold_value: float | None = None
deviation_percentage: float | None = 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))
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
acknowledged_by: str | None = None
acknowledged_at: datetime | None = None
resolved_by: str | None = None
resolved_at: datetime | None = 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))
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
expires_at: datetime | None = None
# Additional data
alert_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
related_insights: List[str] = Field(default=[], sa_column=Column(JSON))
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
default_dashboard: str | None = 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))
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))
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))
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
last_login: datetime | None = 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))
custom_settings: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
ui_preferences: dict[str, Any] = Field(default={}, sa_column=Column(JSON))

View File

@@ -7,56 +7,58 @@ Domain models for managing trustless cross-chain atomic swaps between agents.
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Optional
from enum import StrEnum
from uuid import uuid4
from sqlmodel import Field, SQLModel, Relationship
from sqlmodel import Field, SQLModel
class SwapStatus(StrEnum):
CREATED = "created" # Order created but not initiated on-chain
INITIATED = "initiated" # Hashlock created and funds locked on source chain
PARTICIPATING = "participating" # Hashlock matched and funds locked on target chain
COMPLETED = "completed" # Secret revealed and funds claimed
REFUNDED = "refunded" # Timelock expired, funds returned
FAILED = "failed" # General error state
class SwapStatus(str, Enum):
CREATED = "created" # Order created but not initiated on-chain
INITIATED = "initiated" # Hashlock created and funds locked on source chain
PARTICIPATING = "participating" # Hashlock matched and funds locked on target chain
COMPLETED = "completed" # Secret revealed and funds claimed
REFUNDED = "refunded" # Timelock expired, funds returned
FAILED = "failed" # General error state
class AtomicSwapOrder(SQLModel, table=True):
"""Represents a cross-chain atomic swap order between two parties"""
__tablename__ = "atomic_swap_order"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
# Initiator details (Party A)
initiator_agent_id: str = Field(index=True)
initiator_address: str = Field()
source_chain_id: int = Field(index=True)
source_token: str = Field() # "native" or ERC20 address
source_token: str = Field() # "native" or ERC20 address
source_amount: float = Field()
# Participant details (Party B)
participant_agent_id: str = Field(index=True)
participant_address: str = Field()
target_chain_id: int = Field(index=True)
target_token: str = Field() # "native" or ERC20 address
target_token: str = Field() # "native" or ERC20 address
target_amount: float = Field()
# Cryptographic elements
hashlock: str = Field(index=True) # sha256 hash of the secret
secret: Optional[str] = Field(default=None) # The secret (revealed upon completion)
hashlock: str = Field(index=True) # sha256 hash of the secret
secret: str | None = Field(default=None) # The secret (revealed upon completion)
# Timelocks (Unix timestamps)
source_timelock: int = Field() # Party A's timelock (longer)
target_timelock: int = Field() # Party B's timelock (shorter)
source_timelock: int = Field() # Party A's timelock (longer)
target_timelock: int = Field() # Party B's timelock (shorter)
# Transaction tracking
source_initiate_tx: Optional[str] = Field(default=None)
target_participate_tx: Optional[str] = Field(default=None)
target_complete_tx: Optional[str] = Field(default=None)
source_complete_tx: Optional[str] = Field(default=None)
refund_tx: Optional[str] = Field(default=None)
source_initiate_tx: str | None = Field(default=None)
target_participate_tx: str | None = Field(default=None)
target_complete_tx: str | None = Field(default=None)
source_complete_tx: str | None = Field(default=None)
refund_tx: str | None = Field(default=None)
status: SwapStatus = Field(default=SwapStatus.CREATED, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)

View File

@@ -3,14 +3,15 @@ Bounty System Domain Models
Database models for AI agent bounty system with ZK-proof verification
"""
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
from datetime import datetime
from enum import StrEnum
from typing import Any
from sqlmodel import JSON, Column, Field, SQLModel
class BountyStatus(str, Enum):
class BountyStatus(StrEnum):
CREATED = "created"
ACTIVE = "active"
SUBMITTED = "submitted"
@@ -20,28 +21,28 @@ class BountyStatus(str, Enum):
DISPUTED = "disputed"
class BountyTier(str, Enum):
class BountyTier(StrEnum):
BRONZE = "bronze"
SILVER = "silver"
GOLD = "gold"
PLATINUM = "platinum"
class SubmissionStatus(str, Enum):
class SubmissionStatus(StrEnum):
PENDING = "pending"
VERIFIED = "verified"
REJECTED = "rejected"
DISPUTED = "disputed"
class StakeStatus(str, Enum):
class StakeStatus(StrEnum):
ACTIVE = "active"
UNBONDING = "unbonding"
COMPLETED = "completed"
SLASHED = "slashed"
class PerformanceTier(str, Enum):
class PerformanceTier(StrEnum):
BRONZE = "bronze"
SILVER = "silver"
GOLD = "gold"
@@ -51,6 +52,7 @@ class PerformanceTier(str, Enum):
class Bounty(SQLModel, table=True):
"""AI agent bounty with ZK-proof verification requirements"""
__tablename__ = "bounties"
bounty_id: str = Field(primary_key=True, default_factory=lambda: f"bounty_{uuid.uuid4().hex[:8]}")
@@ -60,380 +62,387 @@ class Bounty(SQLModel, table=True):
creator_id: str = Field(index=True)
tier: BountyTier = Field(default=BountyTier.BRONZE)
status: BountyStatus = Field(default=BountyStatus.CREATED)
# Performance requirements
performance_criteria: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
performance_criteria: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
min_accuracy: float = Field(default=90.0)
max_response_time: Optional[int] = Field(default=None) # milliseconds
max_response_time: int | None = Field(default=None) # milliseconds
# Timing
deadline: datetime = Field(index=True)
creation_time: datetime = Field(default_factory=datetime.utcnow)
# Limits
max_submissions: int = Field(default=100)
submission_count: int = Field(default=0)
# Configuration
requires_zk_proof: bool = Field(default=True)
auto_verify_threshold: float = Field(default=95.0)
# Winner information
winning_submission_id: Optional[str] = Field(default=None)
winner_address: Optional[str] = Field(default=None)
winning_submission_id: str | None = Field(default=None)
winner_address: str | None = Field(default=None)
# Fees
creation_fee: float = Field(default=0.0)
success_fee: float = Field(default=0.0)
platform_fee: float = Field(default=0.0)
# Metadata
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
category: Optional[str] = Field(default=None)
difficulty: Optional[str] = Field(default=None)
tags: list[str] = Field(default_factory=list, sa_column=Column(JSON))
category: str | None = Field(default=None)
difficulty: str | None = Field(default=None)
# Relationships
# DISABLED: submissions: List["BountySubmission"] = Relationship(back_populates="bounty")
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_bounty_status_deadline", "columns": ["status", "deadline"]},
{"name": "ix_bounty_creator_status", "columns": ["creator_id", "status"]},
{"name": "ix_bounty_tier_reward", "columns": ["tier", "reward_amount"]},
]}
)
]
}
class BountySubmission(SQLModel, table=True):
"""Submission for a bounty with ZK-proof and performance metrics"""
__tablename__ = "bounty_submissions"
submission_id: str = Field(primary_key=True, default_factory=lambda: f"sub_{uuid.uuid4().hex[:8]}")
bounty_id: str = Field(foreign_key="bounties.bounty_id", index=True)
submitter_address: str = Field(index=True)
# Performance metrics
accuracy: float = Field(index=True)
response_time: Optional[int] = Field(default=None) # milliseconds
compute_power: Optional[float] = Field(default=None)
energy_efficiency: Optional[float] = Field(default=None)
response_time: int | None = Field(default=None) # milliseconds
compute_power: float | None = Field(default=None)
energy_efficiency: float | None = Field(default=None)
# ZK-proof data
zk_proof: Optional[Dict[str, Any]] = Field(default_factory=dict, sa_column=Column(JSON))
zk_proof: dict[str, Any] | None = Field(default_factory=dict, sa_column=Column(JSON))
performance_hash: str = Field(index=True)
# Status and verification
status: SubmissionStatus = Field(default=SubmissionStatus.PENDING)
verification_time: Optional[datetime] = Field(default=None)
verifier_address: Optional[str] = Field(default=None)
verification_time: datetime | None = Field(default=None)
verifier_address: str | None = Field(default=None)
# Dispute information
dispute_reason: Optional[str] = Field(default=None)
dispute_time: Optional[datetime] = Field(default=None)
dispute_reason: str | None = Field(default=None)
dispute_time: datetime | None = Field(default=None)
dispute_resolved: bool = Field(default=False)
# Timing
submission_time: datetime = Field(default_factory=datetime.utcnow)
# Metadata
submission_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
test_results: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
submission_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
test_results: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Relationships
# DISABLED: bounty: Bounty = Relationship(back_populates="submissions")
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_submission_bounty_status", "columns": ["bounty_id", "status"]},
{"name": "ix_submission_submitter_time", "columns": ["submitter_address", "submission_time"]},
{"name": "ix_submission_accuracy", "columns": ["accuracy"]},
]}
)
]
}
class AgentStake(SQLModel, table=True):
"""Staking position on an AI agent wallet"""
__tablename__ = "agent_stakes"
stake_id: str = Field(primary_key=True, default_factory=lambda: f"stake_{uuid.uuid4().hex[:8]}")
staker_address: str = Field(index=True)
agent_wallet: str = Field(index=True)
# Stake details
amount: float = Field(index=True)
lock_period: int = Field(default=30) # days
start_time: datetime = Field(default_factory=datetime.utcnow)
end_time: datetime
# Status and rewards
status: StakeStatus = Field(default=StakeStatus.ACTIVE)
accumulated_rewards: float = Field(default=0.0)
last_reward_time: datetime = Field(default_factory=datetime.utcnow)
# APY and performance
current_apy: float = Field(default=5.0) # percentage
agent_tier: PerformanceTier = Field(default=PerformanceTier.BRONZE)
performance_multiplier: float = Field(default=1.0)
# Configuration
auto_compound: bool = Field(default=False)
unbonding_time: Optional[datetime] = Field(default=None)
unbonding_time: datetime | None = Field(default=None)
# Penalties and bonuses
early_unbond_penalty: float = Field(default=0.0)
lock_bonus_multiplier: float = Field(default=1.0)
# Metadata
stake_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
stake_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_stake_agent_status", "columns": ["agent_wallet", "status"]},
{"name": "ix_stake_staker_status", "columns": ["staker_address", "status"]},
{"name": "ix_stake_amount_apy", "columns": ["amount", "current_apy"]},
]}
)
]
}
class AgentMetrics(SQLModel, table=True):
"""Performance metrics for AI agents"""
__tablename__ = "agent_metrics"
agent_wallet: str = Field(primary_key=True, index=True)
# Staking metrics
total_staked: float = Field(default=0.0)
staker_count: int = Field(default=0)
total_rewards_distributed: float = Field(default=0.0)
# Performance metrics
average_accuracy: float = Field(default=0.0)
total_submissions: int = Field(default=0)
successful_submissions: int = Field(default=0)
success_rate: float = Field(default=0.0)
# Tier and scoring
current_tier: PerformanceTier = Field(default=PerformanceTier.BRONZE)
tier_score: float = Field(default=60.0)
reputation_score: float = Field(default=0.0)
# Timing
last_update_time: datetime = Field(default_factory=datetime.utcnow)
first_submission_time: Optional[datetime] = Field(default=None)
first_submission_time: datetime | None = Field(default=None)
# Additional metrics
average_response_time: Optional[float] = Field(default=None)
total_compute_time: Optional[float] = Field(default=None)
energy_efficiency_score: Optional[float] = Field(default=None)
average_response_time: float | None = Field(default=None)
total_compute_time: float | None = Field(default=None)
energy_efficiency_score: float | None = Field(default=None)
# Historical data
weekly_accuracy: List[float] = Field(default_factory=list, sa_column=Column(JSON))
monthly_earnings: List[float] = Field(default_factory=list, sa_column=Column(JSON))
weekly_accuracy: list[float] = Field(default_factory=list, sa_column=Column(JSON))
monthly_earnings: list[float] = Field(default_factory=list, sa_column=Column(JSON))
# Metadata
agent_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
agent_meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Relationships
# DISABLED: stakes: List[AgentStake] = Relationship(back_populates="agent_metrics")
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_metrics_tier_score", "columns": ["current_tier", "tier_score"]},
{"name": "ix_metrics_staked", "columns": ["total_staked"]},
{"name": "ix_metrics_accuracy", "columns": ["average_accuracy"]},
]}
)
]
}
class StakingPool(SQLModel, table=True):
"""Staking pool for an agent"""
__tablename__ = "staking_pools"
agent_wallet: str = Field(primary_key=True, index=True)
# Pool metrics
total_staked: float = Field(default=0.0)
total_rewards: float = Field(default=0.0)
pool_apy: float = Field(default=5.0)
# Staker information
staker_count: int = Field(default=0)
active_stakers: List[str] = Field(default_factory=list, sa_column=Column(JSON))
active_stakers: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Distribution
last_distribution_time: datetime = Field(default_factory=datetime.utcnow)
distribution_frequency: int = Field(default=1) # days
# Pool configuration
min_stake_amount: float = Field(default=100.0)
max_stake_amount: float = Field(default=100000.0)
auto_compound_enabled: bool = Field(default=False)
# Performance tracking
pool_performance_score: float = Field(default=0.0)
volatility_score: float = Field(default=0.0)
# Metadata
pool_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
pool_meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_pool_apy_staked", "columns": ["pool_apy", "total_staked"]},
{"name": "ix_pool_performance", "columns": ["pool_performance_score"]},
]}
)
]
}
class BountyIntegration(SQLModel, table=True):
"""Integration between performance verification and bounty completion"""
__tablename__ = "bounty_integrations"
integration_id: str = Field(primary_key=True, default_factory=lambda: f"int_{uuid.uuid4().hex[:8]}")
# Mapping information
performance_hash: str = Field(index=True)
bounty_id: str = Field(foreign_key="bounties.bounty_id", index=True)
submission_id: str = Field(foreign_key="bounty_submissions.submission_id", index=True)
# Status and timing
status: BountyStatus = Field(default=BountyStatus.CREATED)
created_at: datetime = Field(default_factory=datetime.utcnow)
processed_at: Optional[datetime] = Field(default=None)
processed_at: datetime | None = Field(default=None)
# Processing information
processing_attempts: int = Field(default=0)
error_message: Optional[str] = Field(default=None)
gas_used: Optional[int] = Field(default=None)
error_message: str | None = Field(default=None)
gas_used: int | None = Field(default=None)
# Verification results
auto_verified: bool = Field(default=False)
verification_threshold_met: bool = Field(default=False)
performance_score: Optional[float] = Field(default=None)
performance_score: float | None = Field(default=None)
# Metadata
integration_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
integration_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_integration_hash_status", "columns": ["performance_hash", "status"]},
{"name": "ix_integration_bounty", "columns": ["bounty_id"]},
{"name": "ix_integration_created", "columns": ["created_at"]},
]}
)
]
}
class BountyStats(SQLModel, table=True):
"""Aggregated bounty statistics"""
__tablename__ = "bounty_stats"
stats_id: str = Field(primary_key=True, default_factory=lambda: f"stats_{uuid.uuid4().hex[:8]}")
# Time period
period_start: datetime = Field(index=True)
period_end: datetime = Field(index=True)
period_type: str = Field(default="daily") # daily, weekly, monthly
# Bounty counts
total_bounties: int = Field(default=0)
active_bounties: int = Field(default=0)
completed_bounties: int = Field(default=0)
expired_bounties: int = Field(default=0)
disputed_bounties: int = Field(default=0)
# Financial metrics
total_value_locked: float = Field(default=0.0)
total_rewards_paid: float = Field(default=0.0)
total_fees_collected: float = Field(default=0.0)
average_reward: float = Field(default=0.0)
# Performance metrics
success_rate: float = Field(default=0.0)
average_completion_time: Optional[float] = Field(default=None) # hours
average_accuracy: Optional[float] = Field(default=None)
average_completion_time: float | None = Field(default=None) # hours
average_accuracy: float | None = Field(default=None)
# Participant metrics
unique_creators: int = Field(default=0)
unique_submitters: int = Field(default=0)
total_submissions: int = Field(default=0)
# Tier distribution
tier_distribution: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
tier_distribution: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
# Metadata
stats_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
stats_meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_stats_period", "columns": ["period_start", "period_end", "period_type"]},
{"name": "ix_stats_created", "columns": ["period_start"]},
]}
)
]
}
class EcosystemMetrics(SQLModel, table=True):
"""Ecosystem-wide metrics for dashboard"""
__tablename__ = "ecosystem_metrics"
metrics_id: str = Field(primary_key=True, default_factory=lambda: f"eco_{uuid.uuid4().hex[:8]}")
# Time period
timestamp: datetime = Field(default_factory=datetime.utcnow, index=True)
period_type: str = Field(default="hourly") # hourly, daily, weekly
# Developer metrics
active_developers: int = Field(default=0)
new_developers: int = Field(default=0)
developer_earnings_total: float = Field(default=0.0)
developer_earnings_average: float = Field(default=0.0)
# Agent metrics
total_agents: int = Field(default=0)
active_agents: int = Field(default=0)
agent_utilization_rate: float = Field(default=0.0)
average_agent_performance: float = Field(default=0.0)
# Staking metrics
total_staked: float = Field(default=0.0)
total_stakers: int = Field(default=0)
average_apy: float = Field(default=0.0)
staking_rewards_total: float = Field(default=0.0)
# Bounty metrics
active_bounties: int = Field(default=0)
bounty_completion_rate: float = Field(default=0.0)
average_bounty_reward: float = Field(default=0.0)
bounty_volume_total: float = Field(default=0.0)
# Treasury metrics
treasury_balance: float = Field(default=0.0)
treasury_inflow: float = Field(default=0.0)
treasury_outflow: float = Field(default=0.0)
dao_revenue: float = Field(default=0.0)
# Token metrics
token_circulating_supply: float = Field(default=0.0)
token_staked_percentage: float = Field(default=0.0)
token_burn_rate: float = Field(default=0.0)
# Metadata
metrics_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
metrics_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
{"indexes": [
__table_args__ = {
"indexes": [
{"name": "ix_ecosystem_timestamp", "columns": ["timestamp", "period_type"]},
{"name": "ix_ecosystem_developers", "columns": ["active_developers"]},
{"name": "ix_ecosystem_staked", "columns": ["total_staked"]},
]}
)
]
}
# Update relationships
# DISABLED: AgentStake.agent_metrics = Relationship(back_populates="stakes")
# DISABLED: AgentStake.agent_metrics = Relationship(back_populates="stakes")

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class CertificationLevel(str, Enum):
class CertificationLevel(StrEnum):
"""Certification level enumeration"""
BASIC = "basic"
INTERMEDIATE = "intermediate"
ADVANCED = "advanced"
@@ -21,8 +21,9 @@ class CertificationLevel(str, Enum):
PREMIUM = "premium"
class CertificationStatus(str, Enum):
class CertificationStatus(StrEnum):
"""Certification status enumeration"""
PENDING = "pending"
ACTIVE = "active"
EXPIRED = "expired"
@@ -30,8 +31,9 @@ class CertificationStatus(str, Enum):
SUSPENDED = "suspended"
class VerificationType(str, Enum):
class VerificationType(StrEnum):
"""Verification type enumeration"""
IDENTITY = "identity"
PERFORMANCE = "performance"
RELIABILITY = "reliability"
@@ -40,8 +42,9 @@ class VerificationType(str, Enum):
CAPABILITY = "capability"
class PartnershipType(str, Enum):
class PartnershipType(StrEnum):
"""Partnership type enumeration"""
TECHNOLOGY = "technology"
SERVICE = "service"
RESELLER = "reseller"
@@ -50,8 +53,9 @@ class PartnershipType(str, Enum):
AFFILIATE = "affiliate"
class BadgeType(str, Enum):
class BadgeType(StrEnum):
"""Badge type enumeration"""
ACHIEVEMENT = "achievement"
MILESTONE = "milestone"
RECOGNITION = "recognition"
@@ -62,392 +66,392 @@ class BadgeType(str, Enum):
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
expires_at: datetime | None = 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
last_renewed_at: datetime | None = 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))
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))
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
audit_log: list[dict[str, Any]] = Field(default=[], sa_column=Column(JSON))
last_verified_at: datetime | None = None
# Additional data
cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
cert_meta_data: 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))
criteria: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
minimum_threshold: float | None = None
maximum_threshold: float | None = 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))
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
expiry_date: datetime | None = None
# Additional data
cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
cert_meta_data: 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
started_at: datetime | None = None
completed_at: datetime | None = None
processing_time: float | None = 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))
result_score: float | None = 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))
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
reviewed_by: str | None = None
reviewed_at: datetime | None = None
approved_by: str | None = None
approved_at: datetime | None = 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))
compliance_score: float | None = 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_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
cert_meta_data: 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))
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))
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))
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))
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
max_participants: int | None = 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
launched_at: datetime | None = None
expires_at: datetime | None = None
# Additional data
program_cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
contact_info: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
program_cert_meta_data: 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))
approved_by: str | None = None
approved_at: datetime | None = 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))
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))
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
agreement_signed_at: datetime | None = None
agreement_expires_at: datetime | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_activity: Optional[datetime] = None
last_activity: datetime | None = None
# Additional data
partnership_cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
partnership_cert_meta_data: 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))
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))
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
max_awards: int | None = 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
available_until: datetime | None = None
# Additional data
badge_cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
badge_cert_meta_data: 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))
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
next_milestone: str | None = None
# Expiration and renewal
expires_at: Optional[datetime] = None
expires_at: datetime | None = None
is_permanent: bool = Field(default=True)
renewal_criteria: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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
last_viewed_at: datetime | None = None
# Additional data
badge_cert_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
badge_cert_meta_data: 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
started_at: datetime | None = None
completed_at: datetime | None = 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))
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))
overall_score: float | None = None
compliance_score: float | None = None
risk_score: float | None = 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))
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
follow_up_date: datetime | None = 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))
report_url: str | None = 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_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
audit_cert_meta_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
notes: str = Field(default="", max_length=2000)

View File

@@ -3,149 +3,164 @@ 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
from datetime import datetime
from enum import StrEnum
from typing import Any
class DeveloperTier(str, Enum):
from sqlmodel import JSON, Column, Field, SQLModel
class DeveloperTier(StrEnum):
NOVICE = "novice"
BUILDER = "builder"
EXPERT = "expert"
MASTER = "master"
PARTNER = "partner"
class SolutionStatus(str, Enum):
class SolutionStatus(StrEnum):
DRAFT = "draft"
REVIEW = "review"
PUBLISHED = "published"
DEPRECATED = "deprecated"
REJECTED = "rejected"
class LabStatus(str, Enum):
class LabStatus(StrEnum):
PROPOSED = "proposed"
FUNDING = "funding"
ACTIVE = "active"
COMPLETED = "completed"
ARCHIVED = "archived"
class HackathonStatus(str, Enum):
class HackathonStatus(StrEnum):
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
bio: str | None = 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
skills: list[str] = Field(default_factory=list, sa_column=Column(JSON))
github_handle: str | None = None
website: str | None = 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
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_meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
solution_meta_data: 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
published_at: datetime | None = 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
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))
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
target_completion: datetime | None = 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))
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")
parent_post_id: str | None = 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))
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

View File

@@ -7,15 +7,13 @@ Domain models for cross-chain asset transfers, bridge requests, and validator ma
from __future__ import annotations
from datetime import datetime, timedelta
from enum import Enum
from typing import Dict, List, Optional
from uuid import uuid4
from enum import StrEnum
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class BridgeRequestStatus(str, Enum):
class BridgeRequestStatus(StrEnum):
PENDING = "pending"
CONFIRMED = "confirmed"
COMPLETED = "completed"
@@ -25,7 +23,7 @@ class BridgeRequestStatus(str, Enum):
RESOLVED = "resolved"
class ChainType(str, Enum):
class ChainType(StrEnum):
ETHEREUM = "ethereum"
POLYGON = "polygon"
BSC = "bsc"
@@ -36,7 +34,7 @@ class ChainType(str, Enum):
HARMONY = "harmony"
class TransactionType(str, Enum):
class TransactionType(StrEnum):
INITIATION = "initiation"
CONFIRMATION = "confirmation"
COMPLETION = "completion"
@@ -44,7 +42,7 @@ class TransactionType(str, Enum):
DISPUTE = "dispute"
class ValidatorStatus(str, Enum):
class ValidatorStatus(StrEnum):
ACTIVE = "active"
INACTIVE = "inactive"
SUSPENDED = "suspended"
@@ -53,9 +51,10 @@ class ValidatorStatus(str, Enum):
class BridgeRequest(SQLModel, table=True):
"""Cross-chain bridge transfer request"""
__tablename__ = "bridge_request"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
contract_request_id: str = Field(index=True) # Contract request ID
sender_address: str = Field(index=True)
recipient_address: str = Field(index=True)
@@ -68,21 +67,21 @@ class BridgeRequest(SQLModel, table=True):
total_amount: float = Field(default=0.0) # Amount including fee
exchange_rate: float = Field(default=1.0) # Exchange rate between tokens
status: BridgeRequestStatus = Field(default=BridgeRequestStatus.PENDING, index=True)
zk_proof: Optional[str] = Field(default=None) # Zero-knowledge proof
merkle_proof: Optional[str] = Field(default=None) # Merkle proof for completion
lock_tx_hash: Optional[str] = Field(default=None, index=True) # Lock transaction hash
unlock_tx_hash: Optional[str] = Field(default=None, index=True) # Unlock transaction hash
zk_proof: str | None = Field(default=None) # Zero-knowledge proof
merkle_proof: str | None = Field(default=None) # Merkle proof for completion
lock_tx_hash: str | None = Field(default=None, index=True) # Lock transaction hash
unlock_tx_hash: str | None = Field(default=None, index=True) # Unlock transaction hash
confirmations: int = Field(default=0) # Number of confirmations received
required_confirmations: int = Field(default=3) # Required confirmations
dispute_reason: Optional[str] = Field(default=None)
resolution_action: Optional[str] = Field(default=None)
dispute_reason: str | None = Field(default=None)
resolution_action: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
confirmed_at: Optional[datetime] = Field(default=None)
completed_at: Optional[datetime] = Field(default=None)
resolved_at: Optional[datetime] = Field(default=None)
confirmed_at: datetime | None = Field(default=None)
completed_at: datetime | None = Field(default=None)
resolved_at: datetime | None = Field(default=None)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(hours=24))
# Relationships
# transactions: List["BridgeTransaction"] = Relationship(back_populates="bridge_request")
# disputes: List["BridgeDispute"] = Relationship(back_populates="bridge_request")
@@ -90,9 +89,10 @@ class BridgeRequest(SQLModel, table=True):
class SupportedToken(SQLModel, table=True):
"""Supported tokens for cross-chain bridging"""
__tablename__ = "supported_token"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
token_address: str = Field(index=True)
token_symbol: str = Field(index=True)
token_name: str = Field(default="")
@@ -104,18 +104,19 @@ class SupportedToken(SQLModel, table=True):
requires_whitelist: bool = Field(default=False)
is_active: bool = Field(default=True, index=True)
is_wrapped: bool = Field(default=False) # Whether it's a wrapped token
original_token: Optional[str] = Field(default=None) # Original token address for wrapped tokens
supported_chains: List[int] = Field(default_factory=list, sa_column=Column(JSON))
bridge_contracts: Dict[int, str] = Field(default_factory=dict, sa_column=Column(JSON)) # Chain ID -> Contract address
original_token: str | None = Field(default=None) # Original token address for wrapped tokens
supported_chains: list[int] = Field(default_factory=list, sa_column=Column(JSON))
bridge_contracts: dict[int, str] = Field(default_factory=dict, sa_column=Column(JSON)) # Chain ID -> Contract address
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class ChainConfig(SQLModel, table=True):
"""Configuration for supported blockchain networks"""
__tablename__ = "chain_config"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
chain_id: int = Field(index=True)
chain_name: str = Field(index=True)
chain_type: ChainType = Field(index=True)
@@ -140,9 +141,10 @@ class ChainConfig(SQLModel, table=True):
class Validator(SQLModel, table=True):
"""Bridge validator for cross-chain confirmations"""
__tablename__ = "validator"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
validator_address: str = Field(index=True)
validator_name: str = Field(default="")
weight: int = Field(default=1) # Validator weight
@@ -154,43 +156,44 @@ class Validator(SQLModel, table=True):
earned_fees: float = Field(default=0.0) # Total fees earned
reputation_score: float = Field(default=100.0) # Reputation score (0-100)
uptime_percentage: float = Field(default=100.0) # Uptime percentage
last_validation: Optional[datetime] = Field(default=None)
last_seen: Optional[datetime] = Field(default=None)
last_validation: datetime | None = Field(default=None)
last_seen: datetime | None = Field(default=None)
status: ValidatorStatus = Field(default=ValidatorStatus.ACTIVE, index=True)
is_active: bool = Field(default=True, index=True)
supported_chains: List[int] = Field(default_factory=list, sa_column=Column(JSON))
val_meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
supported_chains: list[int] = Field(default_factory=list, sa_column=Column(JSON))
val_meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# transactions: List["BridgeTransaction"] = Relationship(back_populates="validator")
class BridgeTransaction(SQLModel, table=True):
"""Transactions related to bridge requests"""
__tablename__ = "bridge_transaction"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
bridge_request_id: int = Field(foreign_key="bridge_request.id", index=True)
validator_address: Optional[str] = Field(default=None, index=True)
validator_address: str | None = Field(default=None, index=True)
transaction_type: TransactionType = Field(index=True)
transaction_hash: Optional[str] = Field(default=None, index=True)
block_number: Optional[int] = Field(default=None)
block_hash: Optional[str] = Field(default=None)
gas_used: Optional[int] = Field(default=None)
gas_price: Optional[float] = Field(default=None)
transaction_cost: Optional[float] = Field(default=None)
signature: Optional[str] = Field(default=None) # Validator signature
merkle_proof: Optional[List[str]] = Field(default_factory=list, sa_column=Column(JSON))
transaction_hash: str | None = Field(default=None, index=True)
block_number: int | None = Field(default=None)
block_hash: str | None = Field(default=None)
gas_used: int | None = Field(default=None)
gas_price: float | None = Field(default=None)
transaction_cost: float | None = Field(default=None)
signature: str | None = Field(default=None) # Validator signature
merkle_proof: list[str] | None = Field(default_factory=list, sa_column=Column(JSON))
confirmations: int = Field(default=0) # Number of confirmations
is_successful: bool = Field(default=False)
error_message: Optional[str] = Field(default=None)
error_message: str | None = Field(default=None)
retry_count: int = Field(default=0)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
confirmed_at: Optional[datetime] = Field(default=None)
completed_at: Optional[datetime] = Field(default=None)
confirmed_at: datetime | None = Field(default=None)
completed_at: datetime | None = Field(default=None)
# Relationships
# bridge_request: BridgeRequest = Relationship(back_populates="transactions")
# validator: Optional[Validator] = Relationship(back_populates="transactions")
@@ -198,53 +201,56 @@ class BridgeTransaction(SQLModel, table=True):
class BridgeDispute(SQLModel, table=True):
"""Dispute records for failed bridge transfers"""
__tablename__ = "bridge_dispute"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
bridge_request_id: int = Field(foreign_key="bridge_request.id", index=True)
dispute_type: str = Field(index=True) # TIMEOUT, INSUFFICIENT_FUNDS, VALIDATOR_MISBEHAVIOR, etc.
dispute_reason: str = Field(default="")
dispute_status: str = Field(default="open") # open, investigating, resolved, rejected
reporter_address: str = Field(index=True)
evidence: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
resolution_action: Optional[str] = Field(default=None)
resolution_details: Optional[str] = Field(default=None)
refund_amount: Optional[float] = Field(default=None)
compensation_amount: Optional[float] = Field(default=None)
penalty_amount: Optional[float] = Field(default=None)
investigator_address: Optional[str] = Field(default=None)
investigation_notes: Optional[str] = Field(default=None)
evidence: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
resolution_action: str | None = Field(default=None)
resolution_details: str | None = Field(default=None)
refund_amount: float | None = Field(default=None)
compensation_amount: float | None = Field(default=None)
penalty_amount: float | None = Field(default=None)
investigator_address: str | None = Field(default=None)
investigation_notes: str | None = Field(default=None)
is_resolved: bool = Field(default=False, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
resolved_at: Optional[datetime] = Field(default=None)
resolved_at: datetime | None = Field(default=None)
# Relationships
# bridge_request: BridgeRequest = Relationship(back_populates="disputes")
class MerkleProof(SQLModel, table=True):
"""Merkle proofs for bridge transaction verification"""
__tablename__ = "merkle_proof"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
bridge_request_id: int = Field(foreign_key="bridge_request.id", index=True)
proof_hash: str = Field(index=True) # Merkle proof hash
merkle_root: str = Field(index=True) # Merkle root
proof_data: List[str] = Field(default_factory=list, sa_column=Column(JSON)) # Proof data
proof_data: list[str] = Field(default_factory=list, sa_column=Column(JSON)) # Proof data
leaf_index: int = Field(default=0) # Leaf index in tree
tree_depth: int = Field(default=0) # Tree depth
is_valid: bool = Field(default=False)
verified_at: Optional[datetime] = Field(default=None)
verified_at: datetime | None = Field(default=None)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(hours=24))
created_at: datetime = Field(default_factory=datetime.utcnow)
class BridgeStatistics(SQLModel, table=True):
"""Statistics for bridge operations"""
__tablename__ = "bridge_statistics"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
chain_id: int = Field(index=True)
token_address: str = Field(index=True)
date: datetime = Field(index=True)
@@ -263,35 +269,37 @@ class BridgeStatistics(SQLModel, table=True):
class BridgeAlert(SQLModel, table=True):
"""Alerts for bridge operations and issues"""
__tablename__ = "bridge_alert"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
alert_type: str = Field(index=True) # HIGH_FAILURE_RATE, LOW_LIQUIDITY, VALIDATOR_OFFLINE, etc.
severity: str = Field(index=True) # LOW, MEDIUM, HIGH, CRITICAL
chain_id: Optional[int] = Field(default=None, index=True)
token_address: Optional[str] = Field(default=None, index=True)
validator_address: Optional[str] = Field(default=None, index=True)
bridge_request_id: Optional[int] = Field(default=None, index=True)
chain_id: int | None = Field(default=None, index=True)
token_address: str | None = Field(default=None, index=True)
validator_address: str | None = Field(default=None, index=True)
bridge_request_id: int | None = Field(default=None, index=True)
title: str = Field(default="")
message: str = Field(default="")
val_meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
val_meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
threshold_value: float = Field(default=0.0) # Threshold that triggered alert
current_value: float = Field(default=0.0) # Current value
is_acknowledged: bool = Field(default=False, index=True)
acknowledged_by: Optional[str] = Field(default=None)
acknowledged_at: Optional[datetime] = Field(default=None)
acknowledged_by: str | None = Field(default=None)
acknowledged_at: datetime | None = Field(default=None)
is_resolved: bool = Field(default=False, index=True)
resolved_at: Optional[datetime] = Field(default=None)
resolution_notes: Optional[str] = Field(default=None)
resolved_at: datetime | None = Field(default=None)
resolution_notes: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
expires_at: datetime = Field(default_factory=lambda: datetime.utcnow() + timedelta(hours=24))
class BridgeConfiguration(SQLModel, table=True):
"""Configuration settings for bridge operations"""
__tablename__ = "bridge_configuration"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
config_key: str = Field(index=True)
config_value: str = Field(default="")
config_type: str = Field(default="string") # string, number, boolean, json
@@ -303,9 +311,10 @@ class BridgeConfiguration(SQLModel, table=True):
class LiquidityPool(SQLModel, table=True):
"""Liquidity pools for bridge operations"""
__tablename__ = "bridge_liquidity_pool"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
chain_id: int = Field(index=True)
token_address: str = Field(index=True)
pool_address: str = Field(index=True)
@@ -321,9 +330,10 @@ class LiquidityPool(SQLModel, table=True):
class BridgeSnapshot(SQLModel, table=True):
"""Daily snapshot of bridge operations"""
__tablename__ = "bridge_snapshot"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
snapshot_date: datetime = Field(index=True)
total_volume_24h: float = Field(default=0.0)
total_transactions_24h: int = Field(default=0)
@@ -335,16 +345,17 @@ class BridgeSnapshot(SQLModel, table=True):
active_validators: int = Field(default=0)
total_liquidity: float = Field(default=0.0)
bridge_utilization: float = Field(default=0.0)
top_tokens: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
top_chains: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
top_tokens: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
top_chains: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
created_at: datetime = Field(default_factory=datetime.utcnow)
class ValidatorReward(SQLModel, table=True):
"""Rewards earned by validators"""
__tablename__ = "validator_reward"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
validator_address: str = Field(index=True)
bridge_request_id: int = Field(foreign_key="bridge_request.id", index=True)
reward_amount: float = Field(default=0.0)
@@ -352,6 +363,6 @@ class ValidatorReward(SQLModel, table=True):
reward_type: str = Field(index=True) # VALIDATION_FEE, PERFORMANCE_BONUS, etc.
reward_period: str = Field(index=True) # Daily, weekly, monthly
is_claimed: bool = Field(default=False, index=True)
claimed_at: Optional[datetime] = Field(default=None)
claim_transaction_hash: Optional[str] = Field(default=None)
claimed_at: datetime | None = Field(default=None)
claim_transaction_hash: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)

View File

@@ -3,44 +3,40 @@ Cross-Chain Reputation Extensions
Extends the existing reputation system with cross-chain capabilities
"""
from datetime import datetime, date
from typing import Optional, Dict, List, Any
from datetime import date, datetime
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON, Index
from sqlalchemy import DateTime, func
from .reputation import AgentReputation, ReputationEvent, ReputationLevel
from sqlmodel import JSON, Column, Field, Index, SQLModel
class CrossChainReputationConfig(SQLModel, table=True):
"""Chain-specific reputation configuration for cross-chain aggregation"""
__tablename__ = "cross_chain_reputation_configs"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"config_{uuid4().hex[:8]}", primary_key=True)
chain_id: int = Field(index=True, unique=True)
# Weighting configuration
chain_weight: float = Field(default=1.0) # Weight in cross-chain aggregation
base_reputation_bonus: float = Field(default=0.0) # Base reputation for new agents
# Scoring configuration
transaction_success_weight: float = Field(default=0.1)
transaction_failure_weight: float = Field(default=-0.2)
dispute_penalty_weight: float = Field(default=-0.3)
# Thresholds
minimum_transactions_for_score: int = Field(default=5)
reputation_decay_rate: float = Field(default=0.01) # Daily decay rate
anomaly_detection_threshold: float = Field(default=0.3) # Score change threshold
# Configuration metadata
is_active: bool = Field(default=True)
configuration_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
configuration_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -48,114 +44,114 @@ class CrossChainReputationConfig(SQLModel, table=True):
class CrossChainReputationAggregation(SQLModel, table=True):
"""Aggregated cross-chain reputation data"""
__tablename__ = "cross_chain_reputation_aggregations"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"agg_{uuid4().hex[:8]}", primary_key=True)
agent_id: str = Field(index=True)
# Aggregated scores
aggregated_score: float = Field(index=True, ge=0.0, le=1.0)
weighted_score: float = Field(default=0.0, ge=0.0, le=1.0)
normalized_score: float = Field(default=0.0, ge=0.0, le=1.0)
# Chain breakdown
chain_count: int = Field(default=0)
active_chains: List[int] = Field(default_factory=list, sa_column=Column(JSON))
chain_scores: Dict[int, float] = Field(default_factory=dict, sa_column=Column(JSON))
chain_weights: Dict[int, float] = Field(default_factory=dict, sa_column=Column(JSON))
active_chains: list[int] = Field(default_factory=list, sa_column=Column(JSON))
chain_scores: dict[int, float] = Field(default_factory=dict, sa_column=Column(JSON))
chain_weights: dict[int, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Consistency metrics
score_variance: float = Field(default=0.0)
score_range: float = Field(default=0.0)
consistency_score: float = Field(default=1.0, ge=0.0, le=1.0)
# Verification status
verification_status: str = Field(default="pending") # pending, verified, failed
verification_details: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
verification_details: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Timestamps
last_updated: datetime = Field(default_factory=datetime.utcnow)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes
__table_args__ = (
Index('idx_cross_chain_agg_agent', 'agent_id'),
Index('idx_cross_chain_agg_score', 'aggregated_score'),
Index('idx_cross_chain_agg_updated', 'last_updated'),
Index('idx_cross_chain_agg_status', 'verification_status'),
Index("idx_cross_chain_agg_agent", "agent_id"),
Index("idx_cross_chain_agg_score", "aggregated_score"),
Index("idx_cross_chain_agg_updated", "last_updated"),
Index("idx_cross_chain_agg_status", "verification_status"),
)
class CrossChainReputationEvent(SQLModel, table=True):
"""Cross-chain reputation events and synchronizations"""
__tablename__ = "cross_chain_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)
source_chain_id: int = Field(index=True)
target_chain_id: Optional[int] = Field(index=True)
target_chain_id: int | None = Field(index=True)
# Event details
event_type: str = Field(max_length=50) # aggregation, migration, verification, etc.
impact_score: float = Field(ge=-1.0, le=1.0)
description: str = Field(default="")
# Cross-chain data
source_reputation: Optional[float] = Field(default=None)
target_reputation: Optional[float] = Field(default=None)
reputation_change: Optional[float] = Field(default=None)
source_reputation: float | None = Field(default=None)
target_reputation: float | None = Field(default=None)
reputation_change: float | None = Field(default=None)
# Event metadata
event_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
event_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
source: str = Field(default="system") # system, user, oracle, etc.
verified: bool = Field(default=False)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
processed_at: Optional[datetime] = None
processed_at: datetime | None = None
# Indexes
__table_args__ = (
Index('idx_cross_chain_event_agent', 'agent_id'),
Index('idx_cross_chain_event_chains', 'source_chain_id', 'target_chain_id'),
Index('idx_cross_chain_event_type', 'event_type'),
Index('idx_cross_chain_event_created', 'created_at'),
Index("idx_cross_chain_event_agent", "agent_id"),
Index("idx_cross_chain_event_chains", "source_chain_id", "target_chain_id"),
Index("idx_cross_chain_event_type", "event_type"),
Index("idx_cross_chain_event_created", "created_at"),
)
class ReputationMetrics(SQLModel, table=True):
"""Aggregated reputation metrics for analytics"""
__tablename__ = "reputation_metrics"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"metrics_{uuid4().hex[:8]}", primary_key=True)
chain_id: int = Field(index=True)
metric_date: date = Field(index=True)
# Aggregated metrics
total_agents: int = Field(default=0)
average_reputation: float = Field(default=0.0)
reputation_distribution: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
reputation_distribution: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
# Performance metrics
total_transactions: int = Field(default=0)
success_rate: float = Field(default=0.0)
dispute_rate: float = Field(default=0.0)
# Distribution metrics
level_distribution: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
score_distribution: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
level_distribution: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
score_distribution: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
# Cross-chain metrics
cross_chain_agents: int = Field(default=0)
average_consistency_score: float = Field(default=0.0)
chain_diversity_score: float = Field(default=0.0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -164,8 +160,9 @@ class ReputationMetrics(SQLModel, table=True):
# Request/Response Models for Cross-Chain API
class CrossChainReputationRequest(SQLModel):
"""Request model for cross-chain reputation operations"""
agent_id: str
chain_ids: Optional[List[int]] = None
chain_ids: list[int] | None = None
include_history: bool = False
include_metrics: bool = False
aggregation_method: str = "weighted" # weighted, average, normalized
@@ -173,24 +170,27 @@ class CrossChainReputationRequest(SQLModel):
class CrossChainReputationUpdateRequest(SQLModel):
"""Request model for cross-chain reputation updates"""
agent_id: str
chain_id: int
reputation_score: float = Field(ge=0.0, le=1.0)
transaction_data: Dict[str, Any] = Field(default_factory=dict)
transaction_data: dict[str, Any] = Field(default_factory=dict)
source: str = "system"
description: str = ""
class CrossChainAggregationRequest(SQLModel):
"""Request model for cross-chain aggregation"""
agent_ids: List[str]
chain_ids: Optional[List[int]] = None
agent_ids: list[str]
chain_ids: list[int] | None = None
aggregation_method: str = "weighted"
force_recalculate: bool = False
class CrossChainVerificationRequest(SQLModel):
"""Request model for cross-chain reputation verification"""
agent_id: str
threshold: float = Field(default=0.5)
verification_method: str = "consistency" # consistency, weighted, minimum
@@ -200,37 +200,40 @@ class CrossChainVerificationRequest(SQLModel):
# Response Models
class CrossChainReputationResponse(SQLModel):
"""Response model for cross-chain reputation"""
agent_id: str
chain_reputations: Dict[int, Dict[str, Any]]
chain_reputations: dict[int, dict[str, Any]]
aggregated_score: float
weighted_score: float
normalized_score: float
chain_count: int
active_chains: List[int]
active_chains: list[int]
consistency_score: float
verification_status: str
last_updated: datetime
meta_data: Dict[str, Any] = Field(default_factory=dict)
meta_data: dict[str, Any] = Field(default_factory=dict)
class CrossChainAnalyticsResponse(SQLModel):
"""Response model for cross-chain analytics"""
chain_id: Optional[int]
chain_id: int | None
total_agents: int
cross_chain_agents: int
average_reputation: float
average_consistency_score: float
chain_diversity_score: float
reputation_distribution: Dict[str, int]
level_distribution: Dict[str, int]
score_distribution: Dict[str, int]
performance_metrics: Dict[str, Any]
cross_chain_metrics: Dict[str, Any]
reputation_distribution: dict[str, int]
level_distribution: dict[str, int]
score_distribution: dict[str, int]
performance_metrics: dict[str, Any]
cross_chain_metrics: dict[str, Any]
generated_at: datetime
class ReputationAnomalyResponse(SQLModel):
"""Response model for reputation anomalies"""
agent_id: str
chain_id: int
anomaly_type: str
@@ -241,16 +244,17 @@ class ReputationAnomalyResponse(SQLModel):
current_score: float
score_change: float
confidence: float
meta_data: Dict[str, Any] = Field(default_factory=dict)
meta_data: dict[str, Any] = Field(default_factory=dict)
class CrossChainLeaderboardResponse(SQLModel):
"""Response model for cross-chain reputation leaderboard"""
agents: List[CrossChainReputationResponse]
agents: list[CrossChainReputationResponse]
total_count: int
page: int
page_size: int
chain_filter: Optional[int]
chain_filter: int | None
sort_by: str
sort_order: str
last_updated: datetime
@@ -258,11 +262,12 @@ class CrossChainLeaderboardResponse(SQLModel):
class ReputationVerificationResponse(SQLModel):
"""Response model for reputation verification"""
agent_id: str
threshold: float
is_verified: bool
verification_score: float
chain_verifications: Dict[int, bool]
verification_details: Dict[str, Any]
consistency_analysis: Dict[str, Any]
chain_verifications: dict[int, bool]
verification_details: dict[str, Any]
consistency_analysis: dict[str, Any]
verified_at: datetime

View File

@@ -7,14 +7,14 @@ Domain models for managing multi-jurisdictional DAOs, regional councils, and glo
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional
from enum import StrEnum
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class ProposalState(str, Enum):
class ProposalState(StrEnum):
PENDING = "pending"
ACTIVE = "active"
CANCELED = "canceled"
@@ -24,91 +24,100 @@ class ProposalState(str, Enum):
EXPIRED = "expired"
EXECUTED = "executed"
class ProposalType(str, Enum):
class ProposalType(StrEnum):
GRANT = "grant"
PARAMETER_CHANGE = "parameter_change"
MEMBER_ELECTION = "member_election"
GENERAL = "general"
class DAOMember(SQLModel, table=True):
"""A member participating in DAO governance"""
__tablename__ = "dao_member"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
wallet_address: str = Field(index=True, unique=True)
staked_amount: float = Field(default=0.0)
voting_power: float = Field(default=0.0)
is_council_member: bool = Field(default=False)
council_region: Optional[str] = Field(default=None, index=True)
council_region: str | None = Field(default=None, index=True)
joined_at: datetime = Field(default_factory=datetime.utcnow)
last_active: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: votes: List["Vote"] = Relationship(back_populates="member")
class DAOProposal(SQLModel, table=True):
"""A governance proposal"""
__tablename__ = "dao_proposal"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
contract_proposal_id: Optional[str] = Field(default=None, index=True)
contract_proposal_id: str | None = Field(default=None, index=True)
proposer_address: str = Field(index=True)
title: str = Field()
description: str = Field()
proposal_type: ProposalType = Field(default=ProposalType.GENERAL)
target_region: Optional[str] = Field(default=None, index=True) # None = Global
target_region: str | None = Field(default=None, index=True) # None = Global
status: ProposalState = Field(default=ProposalState.PENDING, index=True)
for_votes: float = Field(default=0.0)
against_votes: float = Field(default=0.0)
abstain_votes: float = Field(default=0.0)
execution_payload: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
execution_payload: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
start_time: datetime = Field(default_factory=datetime.utcnow)
end_time: datetime = Field(default_factory=datetime.utcnow)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: votes: List["Vote"] = Relationship(back_populates="proposal")
class Vote(SQLModel, table=True):
"""A vote cast on a proposal"""
__tablename__ = "dao_vote"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
proposal_id: str = Field(foreign_key="dao_proposal.id", index=True)
member_id: str = Field(foreign_key="dao_member.id", index=True)
support: bool = Field() # True = For, False = Against
support: bool = Field() # True = For, False = Against
weight: float = Field()
tx_hash: Optional[str] = Field(default=None)
tx_hash: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: proposal: DAOProposal = Relationship(back_populates="votes")
# DISABLED: member: DAOMember = Relationship(back_populates="votes")
class TreasuryAllocation(SQLModel, table=True):
"""Tracks allocations and spending from the global treasury"""
__tablename__ = "treasury_allocation"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
proposal_id: Optional[str] = Field(foreign_key="dao_proposal.id", default=None)
proposal_id: str | None = Field(foreign_key="dao_proposal.id", default=None)
amount: float = Field()
token_symbol: str = Field(default="AITBC")
recipient_address: str = Field()
purpose: str = Field()
tx_hash: Optional[str] = Field(default=None)
tx_hash: str | None = Field(default=None)
executed_at: datetime = Field(default_factory=datetime.utcnow)

View File

@@ -7,50 +7,53 @@ Domain models for managing agent memory and knowledge graphs on IPFS/Filecoin.
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, Optional, List
from enum import StrEnum
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class MemoryType(str, Enum):
class MemoryType(StrEnum):
VECTOR_DB = "vector_db"
KNOWLEDGE_GRAPH = "knowledge_graph"
POLICY_WEIGHTS = "policy_weights"
EPISODIC = "episodic"
class StorageStatus(str, Enum):
PENDING = "pending" # Upload to IPFS pending
UPLOADED = "uploaded" # Available on IPFS
PINNED = "pinned" # Pinned on Filecoin/Pinata
ANCHORED = "anchored" # CID written to blockchain
FAILED = "failed" # Upload failed
class StorageStatus(StrEnum):
PENDING = "pending" # Upload to IPFS pending
UPLOADED = "uploaded" # Available on IPFS
PINNED = "pinned" # Pinned on Filecoin/Pinata
ANCHORED = "anchored" # CID written to blockchain
FAILED = "failed" # Upload failed
class AgentMemoryNode(SQLModel, table=True):
"""Represents a chunk of memory or knowledge stored on decentralized storage"""
__tablename__ = "agent_memory_node"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
agent_id: str = Field(index=True)
memory_type: MemoryType = Field(index=True)
# Decentralized Storage Identifiers
cid: Optional[str] = Field(default=None, index=True) # IPFS Content Identifier
size_bytes: Optional[int] = Field(default=None)
cid: str | None = Field(default=None, index=True) # IPFS Content Identifier
size_bytes: int | None = Field(default=None)
# Encryption and Security
is_encrypted: bool = Field(default=True)
encryption_key_id: Optional[str] = Field(default=None) # Reference to KMS or Lit Protocol
zk_proof_hash: Optional[str] = Field(default=None) # Hash of the ZK proof verifying content validity
encryption_key_id: str | None = Field(default=None) # Reference to KMS or Lit Protocol
zk_proof_hash: str | None = Field(default=None) # Hash of the ZK proof verifying content validity
status: StorageStatus = Field(default=StorageStatus.PENDING, index=True)
meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
tags: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Blockchain Anchoring
anchor_tx_hash: Optional[str] = Field(default=None)
anchor_tx_hash: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)

View File

@@ -7,40 +7,43 @@ Domain models for managing the developer ecosystem, bounties, certifications, an
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional
from enum import StrEnum
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class BountyStatus(str, Enum):
class BountyStatus(StrEnum):
OPEN = "open"
IN_PROGRESS = "in_progress"
IN_REVIEW = "in_review"
COMPLETED = "completed"
CANCELLED = "cancelled"
class CertificationLevel(str, Enum):
class CertificationLevel(StrEnum):
BEGINNER = "beginner"
INTERMEDIATE = "intermediate"
ADVANCED = "advanced"
EXPERT = "expert"
class DeveloperProfile(SQLModel, table=True):
"""Profile for a developer in the AITBC ecosystem"""
__tablename__ = "developer_profile"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
wallet_address: str = Field(index=True, unique=True)
github_handle: Optional[str] = Field(default=None)
email: Optional[str] = Field(default=None)
github_handle: str | None = Field(default=None)
email: str | None = Field(default=None)
reputation_score: float = Field(default=0.0)
total_earned_aitbc: float = Field(default=0.0)
skills: List[str] = Field(default_factory=list, sa_column=Column(JSON))
skills: list[str] = Field(default_factory=list, sa_column=Column(JSON))
is_active: bool = Field(default=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -49,87 +52,95 @@ class DeveloperProfile(SQLModel, table=True):
# DISABLED: certifications: List["DeveloperCertification"] = Relationship(back_populates="developer")
# DISABLED: bounty_submissions: List["BountySubmission"] = Relationship(back_populates="developer")
class DeveloperCertification(SQLModel, table=True):
"""Certifications earned by developers"""
__tablename__ = "developer_certification"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
developer_id: str = Field(foreign_key="developer_profile.id", index=True)
certification_name: str = Field(index=True)
level: CertificationLevel = Field(default=CertificationLevel.BEGINNER)
issued_by: str = Field() # Could be an agent or a DAO entity
issued_by: str = Field() # Could be an agent or a DAO entity
issued_at: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = Field(default=None)
ipfs_credential_cid: Optional[str] = Field(default=None) # Proof of certification
expires_at: datetime | None = Field(default=None)
ipfs_credential_cid: str | None = Field(default=None) # Proof of certification
# Relationships
# DISABLED: developer: DeveloperProfile = Relationship(back_populates="certifications")
class RegionalHub(SQLModel, table=True):
"""Regional developer hubs for local coordination"""
__tablename__ = "regional_hub"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
region_code: str = Field(index=True, unique=True) # e.g. "US-EAST", "EU-CENTRAL"
region_code: str = Field(index=True, unique=True) # e.g. "US-EAST", "EU-CENTRAL"
name: str = Field()
description: Optional[str] = Field(default=None)
lead_wallet_address: str = Field() # Hub lead
description: str | None = Field(default=None)
lead_wallet_address: str = Field() # Hub lead
member_count: int = Field(default=0)
budget_allocation: float = Field(default=0.0)
spent_budget: float = Field(default=0.0)
created_at: datetime = Field(default_factory=datetime.utcnow)
class BountyTask(SQLModel, table=True):
"""Automated bounty board tasks"""
__tablename__ = "bounty_task"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
title: str = Field()
description: str = Field()
required_skills: List[str] = Field(default_factory=list, sa_column=Column(JSON))
required_skills: list[str] = Field(default_factory=list, sa_column=Column(JSON))
difficulty_level: CertificationLevel = Field(default=CertificationLevel.INTERMEDIATE)
reward_amount: float = Field()
reward_token: str = Field(default="AITBC")
status: BountyStatus = Field(default=BountyStatus.OPEN, index=True)
creator_address: str = Field(index=True)
assigned_developer_id: Optional[str] = Field(foreign_key="developer_profile.id", default=None)
deadline: Optional[datetime] = Field(default=None)
assigned_developer_id: str | None = Field(foreign_key="developer_profile.id", default=None)
deadline: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: submissions: List["BountySubmission"] = Relationship(back_populates="bounty")
class BountySubmission(SQLModel, table=True):
"""Submissions for bounty tasks"""
__tablename__ = "bounty_submission"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
bounty_id: str = Field(foreign_key="bounty_task.id", index=True)
developer_id: str = Field(foreign_key="developer_profile.id", index=True)
github_pr_url: Optional[str] = Field(default=None)
github_pr_url: str | None = Field(default=None)
submission_notes: str = Field(default="")
is_approved: bool = Field(default=False)
review_notes: Optional[str] = Field(default=None)
reviewer_address: Optional[str] = Field(default=None)
tx_hash_reward: Optional[str] = Field(default=None) # Hash of the reward payout transaction
review_notes: str | None = Field(default=None)
reviewer_address: str | None = Field(default=None)
tx_hash_reward: str | None = Field(default=None) # Hash of the reward payout transaction
submitted_at: datetime = Field(default_factory=datetime.utcnow)
reviewed_at: Optional[datetime] = Field(default=None)
reviewed_at: datetime | None = Field(default=None)
# Relationships
# DISABLED: bounty: BountyTask = Relationship(back_populates="submissions")

View File

@@ -7,14 +7,14 @@ Domain models for managing cross-agent knowledge sharing and collaborative model
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional
from enum import StrEnum
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class TrainingStatus(str, Enum):
class TrainingStatus(StrEnum):
INITIALIZED = "initiated"
GATHERING_PARTICIPANTS = "gathering_participants"
TRAINING = "training"
@@ -22,36 +22,39 @@ class TrainingStatus(str, Enum):
COMPLETED = "completed"
FAILED = "failed"
class ParticipantStatus(str, Enum):
class ParticipantStatus(StrEnum):
INVITED = "invited"
JOINED = "joined"
TRAINING = "training"
SUBMITTED = "submitted"
DROPPED = "dropped"
class FederatedLearningSession(SQLModel, table=True):
"""Represents a collaborative training session across multiple agents"""
__tablename__ = "federated_learning_session"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
initiator_agent_id: str = Field(index=True)
task_description: str = Field()
model_architecture_cid: str = Field() # IPFS CID pointing to model structure definition
initial_weights_cid: Optional[str] = Field(default=None) # Optional starting point
model_architecture_cid: str = Field() # IPFS CID pointing to model structure definition
initial_weights_cid: str | None = Field(default=None) # Optional starting point
target_participants: int = Field(default=3)
current_round: int = Field(default=0)
total_rounds: int = Field(default=10)
aggregation_strategy: str = Field(default="fedavg") # e.g. fedavg, fedprox
aggregation_strategy: str = Field(default="fedavg") # e.g. fedavg, fedprox
min_participants_per_round: int = Field(default=2)
reward_pool_amount: float = Field(default=0.0) # Total AITBC allocated to reward participants
reward_pool_amount: float = Field(default=0.0) # Total AITBC allocated to reward participants
status: TrainingStatus = Field(default=TrainingStatus.INITIALIZED, index=True)
global_model_cid: Optional[str] = Field(default=None) # Final aggregated model
global_model_cid: str | None = Field(default=None) # Final aggregated model
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -59,63 +62,69 @@ class FederatedLearningSession(SQLModel, table=True):
# DISABLED: participants: List["TrainingParticipant"] = Relationship(back_populates="session")
# DISABLED: rounds: List["TrainingRound"] = Relationship(back_populates="session")
class TrainingParticipant(SQLModel, table=True):
"""An agent participating in a federated learning session"""
__tablename__ = "training_participant"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
session_id: str = Field(foreign_key="federated_learning_session.id", index=True)
agent_id: str = Field(index=True)
status: ParticipantStatus = Field(default=ParticipantStatus.JOINED, index=True)
data_samples_count: int = Field(default=0) # Claimed number of local samples used
compute_power_committed: float = Field(default=0.0) # TFLOPS
data_samples_count: int = Field(default=0) # Claimed number of local samples used
compute_power_committed: float = Field(default=0.0) # TFLOPS
reputation_score_at_join: float = Field(default=0.0)
earned_reward: float = Field(default=0.0)
joined_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: session: FederatedLearningSession = Relationship(back_populates="participants")
class TrainingRound(SQLModel, table=True):
"""A specific round of federated learning"""
__tablename__ = "training_round"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
session_id: str = Field(foreign_key="federated_learning_session.id", index=True)
round_number: int = Field()
status: str = Field(default="pending") # pending, active, aggregating, completed
starting_model_cid: str = Field() # Global model weights at start of round
aggregated_model_cid: Optional[str] = Field(default=None) # Resulting weights after round
metrics: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON)) # e.g. loss, accuracy
status: str = Field(default="pending") # pending, active, aggregating, completed
starting_model_cid: str = Field() # Global model weights at start of round
aggregated_model_cid: str | None = Field(default=None) # Resulting weights after round
metrics: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON)) # e.g. loss, accuracy
started_at: datetime = Field(default_factory=datetime.utcnow)
completed_at: Optional[datetime] = Field(default=None)
completed_at: datetime | None = Field(default=None)
# Relationships
# DISABLED: session: FederatedLearningSession = Relationship(back_populates="rounds")
# DISABLED: updates: List["LocalModelUpdate"] = Relationship(back_populates="round")
class LocalModelUpdate(SQLModel, table=True):
"""A local model update submitted by a participant for a specific round"""
__tablename__ = "local_model_update"
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
round_id: str = Field(foreign_key="training_round.id", index=True)
participant_agent_id: str = Field(index=True)
weights_cid: str = Field() # IPFS CID of the locally trained weights
zk_proof_hash: Optional[str] = Field(default=None) # Proof that training was executed correctly
weights_cid: str = Field() # IPFS CID of the locally trained weights
zk_proof_hash: str | None = Field(default=None) # Proof that training was executed correctly
is_aggregated: bool = Field(default=False)
rejected_reason: Optional[str] = Field(default=None) # e.g. "outlier", "failed zk verification"
rejected_reason: str | None = Field(default=None) # e.g. "outlier", "failed zk verification"
submitted_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships

View File

@@ -5,20 +5,18 @@ Domain models for global marketplace operations, multi-region support, and cross
from __future__ import annotations
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Any
from datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON, Index, Relationship
from sqlalchemy import DateTime, func
from .marketplace import MarketplaceOffer, MarketplaceBid
from .agent_identity import AgentIdentity
from sqlalchemy import Index
from sqlmodel import JSON, Column, Field, SQLModel
class MarketplaceStatus(str, Enum):
class MarketplaceStatus(StrEnum):
"""Global marketplace offer status"""
ACTIVE = "active"
INACTIVE = "inactive"
PENDING = "pending"
@@ -27,8 +25,9 @@ class MarketplaceStatus(str, Enum):
EXPIRED = "expired"
class RegionStatus(str, Enum):
class RegionStatus(StrEnum):
"""Global marketplace region status"""
ACTIVE = "active"
INACTIVE = "inactive"
MAINTENANCE = "maintenance"
@@ -37,329 +36,350 @@ class RegionStatus(str, Enum):
class MarketplaceRegion(SQLModel, table=True):
"""Global marketplace region configuration"""
__tablename__ = "marketplace_regions"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"region_{uuid4().hex[:8]}", primary_key=True)
region_code: str = Field(index=True, unique=True) # us-east-1, eu-west-1, etc.
region_name: str = Field(index=True)
geographic_area: str = Field(default="global")
# Configuration
base_currency: str = Field(default="USD")
timezone: str = Field(default="UTC")
language: str = Field(default="en")
# Load balancing
load_factor: float = Field(default=1.0, ge=0.1, le=10.0)
max_concurrent_requests: int = Field(default=1000)
priority_weight: float = Field(default=1.0, ge=0.1, le=10.0)
# Status and health
status: RegionStatus = Field(default=RegionStatus.ACTIVE)
health_score: float = Field(default=1.0, ge=0.0, le=1.0)
last_health_check: Optional[datetime] = Field(default=None)
last_health_check: datetime | None = Field(default=None)
# API endpoints
api_endpoint: str = Field(default="")
websocket_endpoint: str = Field(default="")
blockchain_rpc_endpoints: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
blockchain_rpc_endpoints: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
# Performance metrics
average_response_time: float = Field(default=0.0)
request_rate: float = Field(default=0.0)
error_rate: float = Field(default=0.0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes
__table_args__ = (
Index('idx_marketplace_region_code', 'region_code'),
Index('idx_marketplace_region_status', 'status'),
Index('idx_marketplace_region_health', 'health_score'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_marketplace_region_code", "region_code"),
Index("idx_marketplace_region_status", "status"),
Index("idx_marketplace_region_health", "health_score"),
]
}
class GlobalMarketplaceConfig(SQLModel, table=True):
"""Global marketplace configuration settings"""
__tablename__ = "global_marketplace_configs"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"config_{uuid4().hex[:8]}", primary_key=True)
config_key: str = Field(index=True, unique=True)
config_value: str = Field(default="") # Changed from Any to str
config_type: str = Field(default="string") # string, number, boolean, json
# Configuration metadata
description: str = Field(default="")
category: str = Field(default="general")
is_public: bool = Field(default=False)
is_encrypted: bool = Field(default=False)
# Validation rules
min_value: Optional[float] = Field(default=None)
max_value: Optional[float] = Field(default=None)
allowed_values: List[str] = Field(default_factory=list, sa_column=Column(JSON))
min_value: float | None = Field(default=None)
max_value: float | None = Field(default=None)
allowed_values: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_modified_by: Optional[str] = Field(default=None)
last_modified_by: str | None = Field(default=None)
# Indexes
__table_args__ = (
Index('idx_global_config_key', 'config_key'),
Index('idx_global_config_category', 'category'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_global_config_key", "config_key"),
Index("idx_global_config_category", "category"),
]
}
class GlobalMarketplaceOffer(SQLModel, table=True):
"""Global marketplace offer with multi-region support"""
__tablename__ = "global_marketplace_offers"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"offer_{uuid4().hex[:8]}", primary_key=True)
original_offer_id: str = Field(index=True) # Reference to original marketplace offer
# Global offer data
agent_id: str = Field(index=True)
service_type: str = Field(index=True) # gpu, compute, storage, etc.
resource_specification: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
resource_specification: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Pricing (multi-currency support)
base_price: float = Field(default=0.0)
currency: str = Field(default="USD")
price_per_region: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
price_per_region: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
dynamic_pricing_enabled: bool = Field(default=False)
# Availability
total_capacity: int = Field(default=0)
available_capacity: int = Field(default=0)
regions_available: List[str] = Field(default_factory=list, sa_column=Column(JSON))
regions_available: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Global status
global_status: MarketplaceStatus = Field(default=MarketplaceStatus.ACTIVE)
region_statuses: Dict[str, MarketplaceStatus] = Field(default_factory=dict, sa_column=Column(JSON))
region_statuses: dict[str, MarketplaceStatus] = Field(default_factory=dict, sa_column=Column(JSON))
# Quality metrics
global_rating: float = Field(default=0.0, ge=0.0, le=5.0)
total_transactions: int = Field(default=0)
success_rate: float = Field(default=0.0, ge=0.0, le=1.0)
# Cross-chain support
supported_chains: List[int] = Field(default_factory=list, sa_column=Column(JSON))
cross_chain_pricing: Dict[int, float] = Field(default_factory=dict, sa_column=Column(JSON))
supported_chains: list[int] = Field(default_factory=list, sa_column=Column(JSON))
cross_chain_pricing: dict[int, float] = Field(default_factory=dict, 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] = Field(default=None)
expires_at: datetime | None = Field(default=None)
# Indexes
__table_args__ = (
Index('idx_global_offer_agent', 'agent_id'),
Index('idx_global_offer_service', 'service_type'),
Index('idx_global_offer_status', 'global_status'),
Index('idx_global_offer_created', 'created_at'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_global_offer_agent", "agent_id"),
Index("idx_global_offer_service", "service_type"),
Index("idx_global_offer_status", "global_status"),
Index("idx_global_offer_created", "created_at"),
]
}
class GlobalMarketplaceTransaction(SQLModel, table=True):
"""Global marketplace transaction with cross-chain support"""
__tablename__ = "global_marketplace_transactions"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"tx_{uuid4().hex[:8]}", primary_key=True)
transaction_hash: Optional[str] = Field(index=True)
transaction_hash: str | None = Field(index=True)
# Transaction participants
buyer_id: str = Field(index=True)
seller_id: str = Field(index=True)
offer_id: str = Field(index=True)
# Transaction details
service_type: str = Field(index=True)
quantity: int = Field(default=1)
unit_price: float = Field(default=0.0)
total_amount: float = Field(default=0.0)
currency: str = Field(default="USD")
# Cross-chain information
source_chain: Optional[int] = Field(default=None)
target_chain: Optional[int] = Field(default=None)
bridge_transaction_id: Optional[str] = Field(default=None)
source_chain: int | None = Field(default=None)
target_chain: int | None = Field(default=None)
bridge_transaction_id: str | None = Field(default=None)
cross_chain_fee: float = Field(default=0.0)
# Regional information
source_region: str = Field(default="global")
target_region: str = Field(default="global")
regional_fees: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
regional_fees: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Transaction status
status: str = Field(default="pending") # pending, confirmed, completed, failed, cancelled
payment_status: str = Field(default="pending") # pending, paid, refunded
delivery_status: str = Field(default="pending") # pending, delivered, failed
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
confirmed_at: Optional[datetime] = Field(default=None)
completed_at: Optional[datetime] = Field(default=None)
confirmed_at: datetime | None = Field(default=None)
completed_at: datetime | None = Field(default=None)
# Transaction metadata
transaction_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
transaction_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Indexes
__table_args__ = (
Index('idx_global_tx_buyer', 'buyer_id'),
Index('idx_global_tx_seller', 'seller_id'),
Index('idx_global_tx_offer', 'offer_id'),
Index('idx_global_tx_status', 'status'),
Index('idx_global_tx_created', 'created_at'),
Index('idx_global_tx_chain', 'source_chain', 'target_chain'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_global_tx_buyer", "buyer_id"),
Index("idx_global_tx_seller", "seller_id"),
Index("idx_global_tx_offer", "offer_id"),
Index("idx_global_tx_status", "status"),
Index("idx_global_tx_created", "created_at"),
Index("idx_global_tx_chain", "source_chain", "target_chain"),
]
}
class GlobalMarketplaceAnalytics(SQLModel, table=True):
"""Global marketplace analytics and metrics"""
__tablename__ = "global_marketplace_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="hourly") # hourly, daily, weekly, monthly
period_start: datetime = Field(index=True)
period_end: datetime = Field(index=True)
region: Optional[str] = Field(default="global", index=True)
region: str | None = Field(default="global", index=True)
# Marketplace metrics
total_offers: int = Field(default=0)
total_transactions: int = Field(default=0)
total_volume: float = Field(default=0.0)
average_price: float = Field(default=0.0)
# Performance metrics
average_response_time: float = Field(default=0.0)
success_rate: float = Field(default=0.0)
error_rate: float = Field(default=0.0)
# User metrics
active_buyers: int = Field(default=0)
active_sellers: int = Field(default=0)
new_users: int = Field(default=0)
# Cross-chain metrics
cross_chain_transactions: int = Field(default=0)
cross_chain_volume: float = Field(default=0.0)
supported_chains: List[int] = Field(default_factory=list, sa_column=Column(JSON))
supported_chains: list[int] = Field(default_factory=list, sa_column=Column(JSON))
# Regional metrics
regional_distribution: Dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
regional_performance: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
regional_distribution: dict[str, int] = Field(default_factory=dict, sa_column=Column(JSON))
regional_performance: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Additional analytics data
analytics_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
analytics_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Indexes
__table_args__ = (
Index('idx_global_analytics_period', 'period_type', 'period_start'),
Index('idx_global_analytics_region', 'region'),
Index('idx_global_analytics_created', 'created_at'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_global_analytics_period", "period_type", "period_start"),
Index("idx_global_analytics_region", "region"),
Index("idx_global_analytics_created", "created_at"),
]
}
class GlobalMarketplaceGovernance(SQLModel, table=True):
"""Global marketplace governance and rules"""
__tablename__ = "global_marketplace_governance"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"gov_{uuid4().hex[:8]}", primary_key=True)
# Governance rule
rule_type: str = Field(index=True) # pricing, security, compliance, quality
rule_name: str = Field(index=True)
rule_description: str = Field(default="")
# Rule configuration
rule_parameters: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
conditions: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
rule_parameters: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
conditions: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Scope and applicability
global_scope: bool = Field(default=True)
applicable_regions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
applicable_services: List[str] = Field(default_factory=list, sa_column=Column(JSON))
applicable_regions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
applicable_services: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Enforcement
is_active: bool = Field(default=True)
enforcement_level: str = Field(default="warning") # warning, restriction, ban
penalty_parameters: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
penalty_parameters: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Governance metadata
created_by: str = Field(default="")
approved_by: Optional[str] = Field(default=None)
approved_by: str | None = Field(default=None)
version: int = Field(default=1)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
effective_from: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = Field(default=None)
expires_at: datetime | None = Field(default=None)
# Indexes
__table_args__ = (
Index('idx_global_gov_rule_type', 'rule_type'),
Index('idx_global_gov_active', 'is_active'),
Index('idx_global_gov_effective', 'effective_from', 'expires_at'),
)
__table_args__ = {
"extend_existing": True,
"indexes": [
Index("idx_global_gov_rule_type", "rule_type"),
Index("idx_global_gov_active", "is_active"),
Index("idx_global_gov_effective", "effective_from", "expires_at"),
]
}
# Request/Response Models for API
class GlobalMarketplaceOfferRequest(SQLModel):
"""Request model for creating global marketplace offers"""
agent_id: str
service_type: str
resource_specification: Dict[str, Any]
resource_specification: dict[str, Any]
base_price: float
currency: str = "USD"
total_capacity: int
regions_available: List[str] = []
supported_chains: List[int] = []
regions_available: list[str] = []
supported_chains: list[int] = []
dynamic_pricing_enabled: bool = False
expires_at: Optional[datetime] = None
expires_at: datetime | None = None
class GlobalMarketplaceTransactionRequest(SQLModel):
"""Request model for creating global marketplace transactions"""
buyer_id: str
offer_id: str
quantity: int = 1
source_region: str = "global"
target_region: str = "global"
payment_method: str = "crypto"
source_chain: Optional[int] = None
target_chain: Optional[int] = None
source_chain: int | None = None
target_chain: int | None = None
class GlobalMarketplaceAnalyticsRequest(SQLModel):
"""Request model for global marketplace analytics"""
period_type: str = "daily"
start_date: datetime
end_date: datetime
region: Optional[str] = "global"
metrics: List[str] = []
region: str | None = "global"
metrics: list[str] = []
include_cross_chain: bool = False
include_regional: bool = False
@@ -367,31 +387,33 @@ class GlobalMarketplaceAnalyticsRequest(SQLModel):
# Response Models
class GlobalMarketplaceOfferResponse(SQLModel):
"""Response model for global marketplace offers"""
id: str
agent_id: str
service_type: str
resource_specification: Dict[str, Any]
resource_specification: dict[str, Any]
base_price: float
currency: str
price_per_region: Dict[str, float]
price_per_region: dict[str, float]
total_capacity: int
available_capacity: int
regions_available: List[str]
regions_available: list[str]
global_status: MarketplaceStatus
global_rating: float
total_transactions: int
success_rate: float
supported_chains: List[int]
cross_chain_pricing: Dict[int, float]
supported_chains: list[int]
cross_chain_pricing: dict[int, float]
created_at: datetime
updated_at: datetime
expires_at: Optional[datetime]
expires_at: datetime | None
class GlobalMarketplaceTransactionResponse(SQLModel):
"""Response model for global marketplace transactions"""
id: str
transaction_hash: Optional[str]
transaction_hash: str | None
buyer_id: str
seller_id: str
offer_id: str
@@ -400,8 +422,8 @@ class GlobalMarketplaceTransactionResponse(SQLModel):
unit_price: float
total_amount: float
currency: str
source_chain: Optional[int]
target_chain: Optional[int]
source_chain: int | None
target_chain: int | None
cross_chain_fee: float
source_region: str
target_region: str
@@ -410,12 +432,13 @@ class GlobalMarketplaceTransactionResponse(SQLModel):
delivery_status: str
created_at: datetime
updated_at: datetime
confirmed_at: Optional[datetime]
completed_at: Optional[datetime]
confirmed_at: datetime | None
completed_at: datetime | None
class GlobalMarketplaceAnalyticsResponse(SQLModel):
"""Response model for global marketplace analytics"""
period_type: str
period_start: datetime
period_end: datetime
@@ -430,6 +453,6 @@ class GlobalMarketplaceAnalyticsResponse(SQLModel):
active_sellers: int
cross_chain_transactions: int
cross_chain_volume: float
regional_distribution: Dict[str, int]
regional_performance: Dict[str, float]
regional_distribution: dict[str, int]
regional_performance: dict[str, float]
generated_at: datetime

View File

@@ -3,13 +3,15 @@ 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
from datetime import datetime
from enum import StrEnum
from typing import Any
class ProposalStatus(str, Enum):
from sqlmodel import JSON, Column, Field, SQLModel
class ProposalStatus(StrEnum):
DRAFT = "draft"
ACTIVE = "active"
SUCCEEDED = "succeeded"
@@ -17,111 +19,123 @@ class ProposalStatus(str, Enum):
EXECUTED = "executed"
CANCELLED = "cancelled"
class VoteType(str, Enum):
class VoteType(StrEnum):
FOR = "for"
AGAINST = "against"
ABSTAIN = "abstain"
class GovernanceRole(str, Enum):
class GovernanceRole(StrEnum):
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
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
delegate_to: str | None = Field(default=None) # Profile ID they delegate their vote to
joined_at: datetime = Field(default_factory=datetime.utcnow)
last_voted_at: Optional[datetime] = None
last_voted_at: datetime | None = 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))
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)
passing_threshold: float = Field(default=0.5) # Usually 50%
snapshot_block: int | None = Field(default=None)
snapshot_timestamp: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
voting_starts: datetime
voting_ends: datetime
executed_at: Optional[datetime] = None
executed_at: datetime | None = 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
reason: str | None = 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))
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"
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))
metrics: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
generated_at: datetime = Field(default_factory=datetime.utcnow)

View File

@@ -3,28 +3,28 @@
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Optional
from enum import StrEnum
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class GPUArchitecture(str, Enum):
TURING = "turing" # RTX 20 series
AMPERE = "ampere" # RTX 30 series
class GPUArchitecture(StrEnum):
TURING = "turing" # RTX 20 series
AMPERE = "ampere" # RTX 30 series
ADA_LOVELACE = "ada_lovelace" # RTX 40 series
PASCAL = "pascal" # GTX 10 series
VOLTA = "volta" # Titan V, Tesla V100
PASCAL = "pascal" # GTX 10 series
VOLTA = "volta" # Titan V, Tesla V100
UNKNOWN = "unknown"
class GPURegistry(SQLModel, table=True):
"""Registered GPUs available in the marketplace."""
__tablename__ = "gpu_registry"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"gpu_{uuid4().hex[:8]}", primary_key=True)
miner_id: str = Field(index=True)
model: str = Field(index=True)
@@ -41,9 +41,10 @@ class GPURegistry(SQLModel, table=True):
class ConsumerGPUProfile(SQLModel, table=True):
"""Consumer GPU optimization profiles for edge computing"""
__tablename__ = "consumer_gpu_profiles"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"cgp_{uuid4().hex[:8]}", primary_key=True)
gpu_model: str = Field(index=True)
architecture: GPUArchitecture = Field(default=GPUArchitecture.UNKNOWN)
@@ -51,27 +52,27 @@ class ConsumerGPUProfile(SQLModel, table=True):
edge_optimized: bool = Field(default=False)
# Hardware specifications
cuda_cores: Optional[int] = Field(default=None)
memory_gb: Optional[int] = Field(default=None)
memory_bandwidth_gbps: Optional[float] = Field(default=None)
tensor_cores: Optional[int] = Field(default=None)
base_clock_mhz: Optional[int] = Field(default=None)
boost_clock_mhz: Optional[int] = Field(default=None)
cuda_cores: int | None = Field(default=None)
memory_gb: int | None = Field(default=None)
memory_bandwidth_gbps: float | None = Field(default=None)
tensor_cores: int | None = Field(default=None)
base_clock_mhz: int | None = Field(default=None)
boost_clock_mhz: int | None = Field(default=None)
# Edge optimization metrics
power_consumption_w: Optional[float] = Field(default=None)
thermal_design_power_w: Optional[float] = Field(default=None)
noise_level_db: Optional[float] = Field(default=None)
power_consumption_w: float | None = Field(default=None)
thermal_design_power_w: float | None = Field(default=None)
noise_level_db: float | None = Field(default=None)
# Performance characteristics
fp32_tflops: Optional[float] = Field(default=None)
fp16_tflops: Optional[float] = Field(default=None)
int8_tops: Optional[float] = Field(default=None)
fp32_tflops: float | None = Field(default=None)
fp16_tflops: float | None = Field(default=None)
int8_tops: float | None = Field(default=None)
# Edge-specific optimizations
low_latency_mode: bool = Field(default=False)
mobile_optimized: bool = Field(default=False)
thermal_throttling_resistance: Optional[float] = Field(default=None)
thermal_throttling_resistance: float | None = Field(default=None)
# Compatibility flags
supported_cuda_versions: list = Field(default_factory=list, sa_column=Column(JSON, nullable=True))
@@ -79,7 +80,7 @@ class ConsumerGPUProfile(SQLModel, table=True):
supported_ollama_models: list = Field(default_factory=list, sa_column=Column(JSON, nullable=True))
# Pricing and availability
market_price_usd: Optional[float] = Field(default=None)
market_price_usd: float | None = Field(default=None)
edge_premium_multiplier: float = Field(default=1.0)
availability_score: float = Field(default=1.0)
@@ -89,9 +90,10 @@ class ConsumerGPUProfile(SQLModel, table=True):
class EdgeGPUMetrics(SQLModel, table=True):
"""Real-time edge GPU performance metrics"""
__tablename__ = "edge_gpu_metrics"
__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="gpu_registry.id")
@@ -113,35 +115,37 @@ class EdgeGPUMetrics(SQLModel, table=True):
# Geographic and network info
region: str = Field()
city: Optional[str] = Field(default=None)
isp: Optional[str] = Field(default=None)
connection_type: Optional[str] = Field(default=None)
city: str | None = Field(default=None)
isp: str | None = Field(default=None)
connection_type: str | None = Field(default=None)
timestamp: datetime = Field(default_factory=datetime.utcnow, index=True)
class GPUBooking(SQLModel, table=True):
"""Active and historical GPU bookings."""
__tablename__ = "gpu_bookings"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"bk_{uuid4().hex[:10]}", primary_key=True)
gpu_id: str = Field(index=True)
client_id: str = Field(default="", index=True)
job_id: Optional[str] = Field(default=None, index=True)
job_id: str | None = Field(default=None, index=True)
duration_hours: float = Field(default=0.0)
total_cost: float = Field(default=0.0)
status: str = Field(default="active", index=True) # active, completed, cancelled
start_time: datetime = Field(default_factory=datetime.utcnow)
end_time: Optional[datetime] = Field(default=None)
end_time: datetime | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)
class GPUReview(SQLModel, table=True):
"""Reviews for GPUs."""
__tablename__ = "gpu_reviews"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: f"rv_{uuid4().hex[:10]}", primary_key=True)
gpu_id: str = Field(index=True)
user_id: str = Field(default="")

View File

@@ -1,39 +1,38 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from typing import Any, Dict
from uuid import uuid4
from sqlalchemy import Column, JSON, String, ForeignKey
from sqlalchemy.orm import Mapped, relationship
from sqlalchemy import JSON, Column, ForeignKey, String
from sqlmodel import Field, SQLModel
class Job(SQLModel, table=True):
__tablename__ = "job"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
client_id: str = Field(index=True)
state: str = Field(default="QUEUED", max_length=20)
payload: dict = Field(sa_column=Column(JSON, nullable=False))
constraints: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
payload: Dict[str, Any] = Field(sa_column=Column(JSON, nullable=False))
constraints: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
ttl_seconds: int = Field(default=900)
requested_at: datetime = Field(default_factory=datetime.utcnow)
expires_at: datetime = Field(default_factory=datetime.utcnow)
assigned_miner_id: Optional[str] = Field(default=None, index=True)
assigned_miner_id: str | None = Field(default=None, index=True)
result: Dict[str, Any] | None = Field(default=None, sa_column=Column(JSON, nullable=True))
receipt: Dict[str, Any] | None = Field(default=None, sa_column=Column(JSON, nullable=True))
receipt_id: str | None = Field(default=None, index=True)
error: str | None = None
result: Optional[dict] = Field(default=None, sa_column=Column(JSON, nullable=True))
receipt: Optional[dict] = Field(default=None, sa_column=Column(JSON, nullable=True))
receipt_id: Optional[str] = Field(default=None, index=True)
error: Optional[str] = None
# Payment tracking
payment_id: Optional[str] = Field(default=None, sa_column=Column(String, ForeignKey("job_payments.id"), index=True))
payment_status: Optional[str] = Field(default=None, max_length=20) # pending, escrowed, released, refunded
payment_id: str | None = Field(default=None, sa_column=Column(String, ForeignKey("job_payments.id"), index=True))
payment_status: str | None = Field(default=None, max_length=20) # pending, escrowed, released, refunded
# Relationships
# payment: Mapped[Optional["JobPayment"]] = relationship(back_populates="jobs")

View File

@@ -3,14 +3,14 @@ from __future__ import annotations
from datetime import datetime
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class JobReceipt(SQLModel, table=True):
__tablename__ = "jobreceipt"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
job_id: str = Field(index=True, foreign_key="job.id")
receipt_id: str = Field(index=True)

View File

@@ -1,17 +1,16 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from uuid import uuid4
from sqlalchemy import Column, JSON
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class MarketplaceOffer(SQLModel, table=True):
__tablename__ = "marketplaceoffer"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
provider: str = Field(index=True)
capacity: int = Field(default=0, nullable=False)
@@ -21,22 +20,22 @@ class MarketplaceOffer(SQLModel, table=True):
created_at: datetime = Field(default_factory=datetime.utcnow, nullable=False, index=True)
attributes: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
# GPU-specific fields
gpu_model: Optional[str] = Field(default=None, index=True)
gpu_memory_gb: Optional[int] = Field(default=None)
gpu_count: Optional[int] = Field(default=1)
cuda_version: Optional[str] = Field(default=None)
price_per_hour: Optional[float] = Field(default=None)
region: Optional[str] = Field(default=None, index=True)
gpu_model: str | None = Field(default=None, index=True)
gpu_memory_gb: int | None = Field(default=None)
gpu_count: int | None = Field(default=1)
cuda_version: str | None = Field(default=None)
price_per_hour: float | None = Field(default=None)
region: str | None = Field(default=None, index=True)
class MarketplaceBid(SQLModel, table=True):
__tablename__ = "marketplacebid"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True)
provider: str = Field(index=True)
capacity: int = Field(default=0, nullable=False)
price: float = Field(default=0.0, nullable=False)
notes: Optional[str] = Field(default=None)
notes: str | None = Field(default=None)
status: str = Field(default="pending", nullable=False)
submitted_at: datetime = Field(default_factory=datetime.utcnow, nullable=False, index=True)

View File

@@ -1,28 +1,28 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional
from typing import Any, Dict
from sqlalchemy import Column, JSON
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class Miner(SQLModel, table=True):
__tablename__ = "miner"
__table_args__ = {"extend_existing": True}
id: str = Field(primary_key=True, index=True)
region: Optional[str] = Field(default=None, index=True)
capabilities: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
region: str | None = Field(default=None, index=True)
capabilities: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
concurrency: int = Field(default=1)
status: str = Field(default="ONLINE", index=True)
inflight: int = Field(default=0)
extra_metadata: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
extra_metadata: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
last_heartbeat: datetime = Field(default_factory=datetime.utcnow, index=True)
session_token: Optional[str] = None
last_job_at: Optional[datetime] = Field(default=None, index=True)
session_token: str | None = None
last_job_at: datetime | None = Field(default=None, index=True)
jobs_completed: int = Field(default=0)
jobs_failed: int = Field(default=0)
total_job_duration_ms: int = Field(default=0)
average_job_duration_ms: float = Field(default=0.0)
last_receipt_id: Optional[str] = Field(default=None, index=True)
last_receipt_id: str | None = Field(default=None, index=True)

View File

@@ -3,73 +3,71 @@
from __future__ import annotations
from datetime import datetime
from typing import Optional, List
from uuid import uuid4
from sqlalchemy import Column, String, DateTime, Numeric, ForeignKey, JSON
from sqlalchemy.orm import Mapped, relationship
from sqlalchemy import JSON, Column, Numeric
from sqlmodel import Field, SQLModel
class JobPayment(SQLModel, table=True):
"""Payment record for a job"""
__tablename__ = "job_payments"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
job_id: str = Field(index=True)
# Payment details
amount: float = Field(sa_column=Column(Numeric(20, 8), nullable=False))
currency: str = Field(default="AITBC", max_length=10)
status: str = Field(default="pending", max_length=20)
payment_method: str = Field(default="aitbc_token", max_length=20)
# Addresses
escrow_address: Optional[str] = Field(default=None, max_length=100)
refund_address: Optional[str] = Field(default=None, max_length=100)
escrow_address: str | None = Field(default=None, max_length=100)
refund_address: str | None = Field(default=None, max_length=100)
# Transaction hashes
transaction_hash: Optional[str] = Field(default=None, max_length=100)
refund_transaction_hash: Optional[str] = Field(default=None, max_length=100)
transaction_hash: str | None = Field(default=None, max_length=100)
refund_transaction_hash: str | None = Field(default=None, max_length=100)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
escrowed_at: Optional[datetime] = None
released_at: Optional[datetime] = None
refunded_at: Optional[datetime] = None
expires_at: Optional[datetime] = None
escrowed_at: datetime | None = None
released_at: datetime | None = None
refunded_at: datetime | None = None
expires_at: datetime | None = None
# Additional metadata
meta_data: Optional[dict] = Field(default=None, sa_column=Column(JSON))
meta_data: dict | None = Field(default=None, sa_column=Column(JSON))
# Relationships
# jobs: Mapped[List["Job"]] = relationship(back_populates="payment")
class PaymentEscrow(SQLModel, table=True):
"""Escrow record for holding payments"""
__tablename__ = "payment_escrows"
__table_args__ = {"extend_existing": True}
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
payment_id: str = Field(index=True)
# Escrow details
amount: float = Field(sa_column=Column(Numeric(20, 8), nullable=False))
currency: str = Field(default="AITBC", max_length=10)
address: str = Field(max_length=100)
# Status
is_active: bool = Field(default=True)
is_released: bool = Field(default=False)
is_refunded: bool = Field(default=False)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
released_at: Optional[datetime] = None
refunded_at: Optional[datetime] = None
expires_at: Optional[datetime] = None
released_at: datetime | None = None
refunded_at: datetime | None = None
expires_at: datetime | None = None

View File

@@ -6,16 +6,17 @@ SQLModel definitions for pricing history, strategies, and market metrics
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Optional, Dict, Any, List
from enum import StrEnum
from typing import Any
from uuid import uuid4
from sqlalchemy import Column, JSON, Index
from sqlalchemy import JSON, Column, Index
from sqlmodel import Field, SQLModel, Text
class PricingStrategyType(str, Enum):
class PricingStrategyType(StrEnum):
"""Pricing strategy types for database"""
AGGRESSIVE_GROWTH = "aggressive_growth"
PROFIT_MAXIMIZATION = "profit_maximization"
MARKET_BALANCE = "market_balance"
@@ -28,8 +29,9 @@ class PricingStrategyType(str, Enum):
COMPETITOR_BASED = "competitor_based"
class ResourceType(str, Enum):
class ResourceType(StrEnum):
"""Resource types for pricing"""
GPU = "gpu"
SERVICE = "service"
STORAGE = "storage"
@@ -37,8 +39,9 @@ class ResourceType(str, Enum):
COMPUTE = "compute"
class PriceTrend(str, Enum):
class PriceTrend(StrEnum):
"""Price trend indicators"""
INCREASING = "increasing"
DECREASING = "decreasing"
STABLE = "stable"
@@ -48,6 +51,7 @@ class PriceTrend(str, Enum):
class PricingHistory(SQLModel, table=True):
"""Historical pricing data for analysis and machine learning"""
__tablename__ = "pricing_history"
__table_args__ = {
"extend_existing": True,
@@ -55,54 +59,55 @@ class PricingHistory(SQLModel, table=True):
Index("idx_pricing_history_resource_timestamp", "resource_id", "timestamp"),
Index("idx_pricing_history_type_region", "resource_type", "region"),
Index("idx_pricing_history_timestamp", "timestamp"),
Index("idx_pricing_history_provider", "provider_id")
]
Index("idx_pricing_history_provider", "provider_id"),
],
}
id: str = Field(default_factory=lambda: f"ph_{uuid4().hex[:12]}", primary_key=True)
resource_id: str = Field(index=True)
resource_type: ResourceType = Field(index=True)
provider_id: Optional[str] = Field(default=None, index=True)
provider_id: str | None = Field(default=None, index=True)
region: str = Field(default="global", index=True)
# Pricing data
price: float = Field(index=True)
base_price: float
price_change: Optional[float] = None # Change from previous price
price_change_percent: Optional[float] = None # Percentage change
price_change: float | None = None # Change from previous price
price_change_percent: float | None = None # Percentage change
# Market conditions at time of pricing
demand_level: float = Field(index=True)
supply_level: float = Field(index=True)
market_volatility: float
utilization_rate: float
# Strategy and factors
strategy_used: PricingStrategyType = Field(index=True)
strategy_parameters: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
pricing_factors: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
strategy_parameters: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
pricing_factors: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Performance metrics
confidence_score: float
forecast_accuracy: Optional[float] = None
recommendation_followed: Optional[bool] = None
forecast_accuracy: float | None = None
recommendation_followed: bool | None = None
# Metadata
timestamp: datetime = Field(default_factory=datetime.utcnow, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Additional context
competitor_prices: List[float] = Field(default_factory=list, sa_column=Column(JSON))
competitor_prices: list[float] = Field(default_factory=list, sa_column=Column(JSON))
market_sentiment: float = Field(default=0.0)
external_factors: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
external_factors: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Reasoning and audit trail
price_reasoning: List[str] = Field(default_factory=list, sa_column=Column(JSON))
audit_log: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
price_reasoning: list[str] = Field(default_factory=list, sa_column=Column(JSON))
audit_log: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
class ProviderPricingStrategy(SQLModel, table=True):
"""Provider pricing strategies and configurations"""
__tablename__ = "provider_pricing_strategies"
__table_args__ = {
"extend_existing": True,
@@ -110,61 +115,62 @@ class ProviderPricingStrategy(SQLModel, table=True):
Index("idx_provider_strategies_provider", "provider_id"),
Index("idx_provider_strategies_type", "strategy_type"),
Index("idx_provider_strategies_active", "is_active"),
Index("idx_provider_strategies_resource", "resource_type", "provider_id")
]
Index("idx_provider_strategies_resource", "resource_type", "provider_id"),
],
}
id: str = Field(default_factory=lambda: f"pps_{uuid4().hex[:12]}", primary_key=True)
provider_id: str = Field(index=True)
strategy_type: PricingStrategyType = Field(index=True)
resource_type: Optional[ResourceType] = Field(default=None, index=True)
resource_type: ResourceType | None = Field(default=None, index=True)
# Strategy configuration
strategy_name: str
strategy_description: Optional[str] = None
parameters: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
strategy_description: str | None = None
parameters: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Constraints and limits
min_price: Optional[float] = None
max_price: Optional[float] = None
min_price: float | None = None
max_price: float | None = None
max_change_percent: float = Field(default=0.5)
min_change_interval: int = Field(default=300) # seconds
strategy_lock_period: int = Field(default=3600) # seconds
# Strategy rules
rules: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
custom_conditions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
rules: list[dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
custom_conditions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Status and metadata
is_active: bool = Field(default=True, index=True)
auto_optimize: bool = Field(default=True)
learning_enabled: bool = Field(default=True)
priority: int = Field(default=5) # 1-10 priority level
# Geographic scope
regions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
regions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
global_strategy: bool = Field(default=True)
# Performance tracking
total_revenue_impact: float = Field(default=0.0)
market_share_impact: float = Field(default=0.0)
customer_satisfaction_impact: float = Field(default=0.0)
strategy_effectiveness_score: float = Field(default=0.0)
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_applied: Optional[datetime] = None
expires_at: Optional[datetime] = None
last_applied: datetime | None = None
expires_at: datetime | None = None
# Audit information
created_by: Optional[str] = None
updated_by: Optional[str] = None
created_by: str | None = None
updated_by: str | None = None
version: int = Field(default=1)
class MarketMetrics(SQLModel, table=True):
"""Real-time and historical market metrics"""
__tablename__ = "market_metrics"
__table_args__ = {
"extend_existing": True,
@@ -173,62 +179,63 @@ class MarketMetrics(SQLModel, table=True):
Index("idx_market_metrics_timestamp", "timestamp"),
Index("idx_market_metrics_demand", "demand_level"),
Index("idx_market_metrics_supply", "supply_level"),
Index("idx_market_metrics_composite", "region", "resource_type", "timestamp")
]
Index("idx_market_metrics_composite", "region", "resource_type", "timestamp"),
],
}
id: str = Field(default_factory=lambda: f"mm_{uuid4().hex[:12]}", primary_key=True)
region: str = Field(index=True)
resource_type: ResourceType = Field(index=True)
# Core market metrics
demand_level: float = Field(index=True)
supply_level: float = Field(index=True)
average_price: float = Field(index=True)
price_volatility: float = Field(index=True)
utilization_rate: float = Field(index=True)
# Market depth and liquidity
total_capacity: float
available_capacity: float
pending_orders: int
completed_orders: int
order_book_depth: float
# Competitive landscape
competitor_count: int
average_competitor_price: float
price_spread: float # Difference between highest and lowest prices
market_concentration: float # HHI or similar metric
# Market sentiment and activity
market_sentiment: float = Field(default=0.0)
trading_volume: float
price_momentum: float # Rate of price change
liquidity_score: float
# Regional factors
regional_multiplier: float = Field(default=1.0)
currency_adjustment: float = Field(default=1.0)
regulatory_factors: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
regulatory_factors: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Data quality and confidence
data_sources: List[str] = Field(default_factory=list, sa_column=Column(JSON))
data_sources: list[str] = Field(default_factory=list, sa_column=Column(JSON))
confidence_score: float
data_freshness: int # Age of data in seconds
completeness_score: float
# Timestamps
timestamp: datetime = Field(default_factory=datetime.utcnow, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Additional metrics
custom_metrics: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
external_factors: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
custom_metrics: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
external_factors: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
class PriceForecast(SQLModel, table=True):
"""Price forecasting data and accuracy tracking"""
__tablename__ = "price_forecasts"
__table_args__ = {
"extend_existing": True,
@@ -236,53 +243,54 @@ class PriceForecast(SQLModel, table=True):
Index("idx_price_forecasts_resource", "resource_id"),
Index("idx_price_forecasts_target", "target_timestamp"),
Index("idx_price_forecasts_created", "created_at"),
Index("idx_price_forecasts_horizon", "forecast_horizon_hours")
]
Index("idx_price_forecasts_horizon", "forecast_horizon_hours"),
],
}
id: str = Field(default_factory=lambda: f"pf_{uuid4().hex[:12]}", primary_key=True)
resource_id: str = Field(index=True)
resource_type: ResourceType = Field(index=True)
region: str = Field(default="global", index=True)
# Forecast parameters
forecast_horizon_hours: int = Field(index=True)
model_version: str
strategy_used: PricingStrategyType
# Forecast data points
forecast_points: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
confidence_intervals: Dict[str, List[float]] = Field(default_factory=dict, sa_column=Column(JSON))
forecast_points: list[dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
confidence_intervals: dict[str, list[float]] = Field(default_factory=dict, sa_column=Column(JSON))
# Forecast metadata
average_forecast_price: float
price_range_forecast: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
price_range_forecast: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
trend_forecast: PriceTrend
volatility_forecast: float
# Model performance
model_confidence: float
accuracy_score: Optional[float] = None # Populated after actual prices are known
mean_absolute_error: Optional[float] = None
mean_absolute_percentage_error: Optional[float] = None
accuracy_score: float | None = None # Populated after actual prices are known
mean_absolute_error: float | None = None
mean_absolute_percentage_error: float | None = None
# Input data used for forecast
input_data_summary: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
market_conditions_at_forecast: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
input_data_summary: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
market_conditions_at_forecast: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
target_timestamp: datetime = Field(index=True) # When forecast is for
evaluated_at: Optional[datetime] = None # When forecast was evaluated
evaluated_at: datetime | None = None # When forecast was evaluated
# Status and outcomes
forecast_status: str = Field(default="pending") # pending, evaluated, expired
outcome: Optional[str] = None # accurate, inaccurate, mixed
lessons_learned: List[str] = Field(default_factory=list, sa_column=Column(JSON))
outcome: str | None = None # accurate, inaccurate, mixed
lessons_learned: list[str] = Field(default_factory=list, sa_column=Column(JSON))
class PricingOptimization(SQLModel, table=True):
"""Pricing optimization experiments and results"""
__tablename__ = "pricing_optimizations"
__table_args__ = {
"extend_existing": True,
@@ -290,64 +298,65 @@ class PricingOptimization(SQLModel, table=True):
Index("idx_pricing_opt_provider", "provider_id"),
Index("idx_pricing_opt_experiment", "experiment_id"),
Index("idx_pricing_opt_status", "status"),
Index("idx_pricing_opt_created", "created_at")
]
Index("idx_pricing_opt_created", "created_at"),
],
}
id: str = Field(default_factory=lambda: f"po_{uuid4().hex[:12]}", primary_key=True)
experiment_id: str = Field(index=True)
provider_id: str = Field(index=True)
resource_type: Optional[ResourceType] = Field(default=None, index=True)
resource_type: ResourceType | None = Field(default=None, index=True)
# Experiment configuration
experiment_name: str
experiment_type: str # ab_test, multivariate, optimization
hypothesis: str
control_strategy: PricingStrategyType
test_strategy: PricingStrategyType
# Experiment parameters
sample_size: int
confidence_level: float = Field(default=0.95)
statistical_power: float = Field(default=0.8)
minimum_detectable_effect: float
# Experiment scope
regions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
regions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
duration_days: int
start_date: datetime
end_date: Optional[datetime] = None
end_date: datetime | None = None
# Results
control_performance: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
test_performance: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
statistical_significance: Optional[float] = None
effect_size: Optional[float] = None
control_performance: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
test_performance: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
statistical_significance: float | None = None
effect_size: float | None = None
# Business impact
revenue_impact: Optional[float] = None
profit_impact: Optional[float] = None
market_share_impact: Optional[float] = None
customer_satisfaction_impact: Optional[float] = None
revenue_impact: float | None = None
profit_impact: float | None = None
market_share_impact: float | None = None
customer_satisfaction_impact: float | None = None
# Status and metadata
status: str = Field(default="planned") # planned, running, completed, failed
conclusion: Optional[str] = None
recommendations: List[str] = Field(default_factory=list, sa_column=Column(JSON))
conclusion: str | None = None
recommendations: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
updated_at: datetime = Field(default_factory=datetime.utcnow)
completed_at: Optional[datetime] = None
completed_at: datetime | None = None
# Audit trail
created_by: Optional[str] = None
reviewed_by: Optional[str] = None
approved_by: Optional[str] = None
created_by: str | None = None
reviewed_by: str | None = None
approved_by: str | None = None
class PricingAlert(SQLModel, table=True):
"""Pricing alerts and notifications"""
__tablename__ = "pricing_alerts"
__table_args__ = {
"extend_existing": True,
@@ -356,61 +365,62 @@ class PricingAlert(SQLModel, table=True):
Index("idx_pricing_alerts_type", "alert_type"),
Index("idx_pricing_alerts_status", "status"),
Index("idx_pricing_alerts_severity", "severity"),
Index("idx_pricing_alerts_created", "created_at")
]
Index("idx_pricing_alerts_created", "created_at"),
],
}
id: str = Field(default_factory=lambda: f"pa_{uuid4().hex[:12]}", primary_key=True)
provider_id: Optional[str] = Field(default=None, index=True)
resource_id: Optional[str] = Field(default=None, index=True)
resource_type: Optional[ResourceType] = Field(default=None, index=True)
provider_id: str | None = Field(default=None, index=True)
resource_id: str | None = Field(default=None, index=True)
resource_type: ResourceType | None = Field(default=None, index=True)
# Alert details
alert_type: str = Field(index=True) # price_volatility, strategy_performance, market_change, etc.
severity: str = Field(index=True) # low, medium, high, critical
title: str
description: str
# Alert conditions
trigger_conditions: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
threshold_values: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
actual_values: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
trigger_conditions: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
threshold_values: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
actual_values: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Alert context
market_conditions: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
strategy_context: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
historical_context: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
market_conditions: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
strategy_context: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
historical_context: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Recommendations and actions
recommendations: List[str] = Field(default_factory=list, sa_column=Column(JSON))
automated_actions_taken: List[str] = Field(default_factory=list, sa_column=Column(JSON))
manual_actions_required: List[str] = Field(default_factory=list, sa_column=Column(JSON))
recommendations: list[str] = Field(default_factory=list, sa_column=Column(JSON))
automated_actions_taken: list[str] = Field(default_factory=list, sa_column=Column(JSON))
manual_actions_required: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Status and resolution
status: str = Field(default="active") # active, acknowledged, resolved, dismissed
resolution: Optional[str] = None
resolution_notes: Optional[str] = Field(default=None, sa_column=Text)
resolution: str | None = None
resolution_notes: str | None = Field(default=None, sa_column=Text)
# Impact assessment
business_impact: Optional[str] = None
revenue_impact_estimate: Optional[float] = None
customer_impact_estimate: Optional[str] = None
business_impact: str | None = None
revenue_impact_estimate: float | None = None
customer_impact_estimate: str | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
first_seen: datetime = Field(default_factory=datetime.utcnow)
last_seen: datetime = Field(default_factory=datetime.utcnow)
acknowledged_at: Optional[datetime] = None
resolved_at: Optional[datetime] = None
acknowledged_at: datetime | None = None
resolved_at: datetime | None = None
# Communication
notification_sent: bool = Field(default=False)
notification_channels: List[str] = Field(default_factory=list, sa_column=Column(JSON))
notification_channels: list[str] = Field(default_factory=list, sa_column=Column(JSON))
escalation_level: int = Field(default=0)
class PricingRule(SQLModel, table=True):
"""Custom pricing rules and conditions"""
__tablename__ = "pricing_rules"
__table_args__ = {
"extend_existing": True,
@@ -418,61 +428,62 @@ class PricingRule(SQLModel, table=True):
Index("idx_pricing_rules_provider", "provider_id"),
Index("idx_pricing_rules_strategy", "strategy_id"),
Index("idx_pricing_rules_active", "is_active"),
Index("idx_pricing_rules_priority", "priority")
]
Index("idx_pricing_rules_priority", "priority"),
],
}
id: str = Field(default_factory=lambda: f"pr_{uuid4().hex[:12]}", primary_key=True)
provider_id: Optional[str] = Field(default=None, index=True)
strategy_id: Optional[str] = Field(default=None, index=True)
provider_id: str | None = Field(default=None, index=True)
strategy_id: str | None = Field(default=None, index=True)
# Rule definition
rule_name: str
rule_description: Optional[str] = None
rule_description: str | None = None
rule_type: str # condition, action, constraint, optimization
# Rule logic
condition_expression: str = Field(..., description="Logical condition for rule")
action_expression: str = Field(..., description="Action to take when condition is met")
priority: int = Field(default=5, index=True) # 1-10 priority
# Rule scope
resource_types: List[ResourceType] = Field(default_factory=list, sa_column=Column(JSON))
regions: List[str] = Field(default_factory=list, sa_column=Column(JSON))
time_conditions: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
resource_types: list[ResourceType] = Field(default_factory=list, sa_column=Column(JSON))
regions: list[str] = Field(default_factory=list, sa_column=Column(JSON))
time_conditions: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Rule parameters
parameters: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
thresholds: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
multipliers: Dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
parameters: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
thresholds: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
multipliers: dict[str, float] = Field(default_factory=dict, sa_column=Column(JSON))
# Status and execution
is_active: bool = Field(default=True, index=True)
execution_count: int = Field(default=0)
success_count: int = Field(default=0)
failure_count: int = Field(default=0)
last_executed: Optional[datetime] = None
last_success: Optional[datetime] = None
last_executed: datetime | None = None
last_success: datetime | None = None
# Performance metrics
average_execution_time: Optional[float] = None
average_execution_time: float | None = None
success_rate: float = Field(default=1.0)
business_impact: Optional[float] = None
business_impact: float | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = None
expires_at: datetime | None = None
# Audit trail
created_by: Optional[str] = None
updated_by: Optional[str] = None
created_by: str | None = None
updated_by: str | None = None
version: int = Field(default=1)
change_log: List[Dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
change_log: list[dict[str, Any]] = Field(default_factory=list, sa_column=Column(JSON))
class PricingAuditLog(SQLModel, table=True):
"""Audit log for pricing changes and decisions"""
__tablename__ = "pricing_audit_log"
__table_args__ = {
"extend_existing": True,
@@ -481,61 +492,62 @@ class PricingAuditLog(SQLModel, table=True):
Index("idx_pricing_audit_resource", "resource_id"),
Index("idx_pricing_audit_action", "action_type"),
Index("idx_pricing_audit_timestamp", "timestamp"),
Index("idx_pricing_audit_user", "user_id")
]
Index("idx_pricing_audit_user", "user_id"),
],
}
id: str = Field(default_factory=lambda: f"pal_{uuid4().hex[:12]}", primary_key=True)
provider_id: Optional[str] = Field(default=None, index=True)
resource_id: Optional[str] = Field(default=None, index=True)
user_id: Optional[str] = Field(default=None, index=True)
provider_id: str | None = Field(default=None, index=True)
resource_id: str | None = Field(default=None, index=True)
user_id: str | None = Field(default=None, index=True)
# Action details
action_type: str = Field(index=True) # price_change, strategy_update, rule_creation, etc.
action_description: str
action_source: str # manual, automated, api, system
# State changes
before_state: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
after_state: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
changed_fields: List[str] = Field(default_factory=list, sa_column=Column(JSON))
before_state: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
after_state: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
changed_fields: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# Context and reasoning
decision_reasoning: Optional[str] = Field(default=None, sa_column=Text)
market_conditions: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
business_context: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
decision_reasoning: str | None = Field(default=None, sa_column=Text)
market_conditions: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
business_context: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
# Impact and outcomes
immediate_impact: Optional[Dict[str, float]] = Field(default_factory=dict, sa_column=Column(JSON))
expected_impact: Optional[Dict[str, float]] = Field(default_factory=dict, sa_column=Column(JSON))
actual_impact: Optional[Dict[str, float]] = Field(default_factory=dict, sa_column=Column(JSON))
immediate_impact: dict[str, float] | None = Field(default_factory=dict, sa_column=Column(JSON))
expected_impact: dict[str, float] | None = Field(default_factory=dict, sa_column=Column(JSON))
actual_impact: dict[str, float] | None = Field(default_factory=dict, sa_column=Column(JSON))
# Compliance and approval
compliance_flags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
compliance_flags: list[str] = Field(default_factory=list, sa_column=Column(JSON))
approval_required: bool = Field(default=False)
approved_by: Optional[str] = None
approved_at: Optional[datetime] = None
approved_by: str | None = None
approved_at: datetime | None = None
# Technical details
api_endpoint: Optional[str] = None
request_id: Optional[str] = None
session_id: Optional[str] = None
ip_address: Optional[str] = None
api_endpoint: str | None = None
request_id: str | None = None
session_id: str | None = None
ip_address: str | None = None
# Timestamps
timestamp: datetime = Field(default_factory=datetime.utcnow, index=True)
created_at: datetime = Field(default_factory=datetime.utcnow)
# Additional metadata
meta_data: Dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
tags: List[str] = Field(default_factory=list, sa_column=Column(JSON))
meta_data: dict[str, Any] = Field(default_factory=dict, sa_column=Column(JSON))
tags: list[str] = Field(default_factory=list, sa_column=Column(JSON))
# View definitions for common queries
class PricingSummaryView(SQLModel):
"""View for pricing summary analytics"""
__tablename__ = "pricing_summary_view"
provider_id: str
resource_type: ResourceType
region: str
@@ -552,8 +564,9 @@ class PricingSummaryView(SQLModel):
class MarketHeatmapView(SQLModel):
"""View for market heatmap data"""
__tablename__ = "market_heatmap_view"
region: str
resource_type: ResourceType
demand_level: float

View File

@@ -4,14 +4,14 @@ Defines various pricing strategies and their configurations for dynamic pricing
"""
from dataclasses import dataclass, field
from typing import Dict, List, Any, Optional
from enum import Enum
from datetime import datetime
import json
from enum import StrEnum
from typing import Any
class PricingStrategy(str, Enum):
class PricingStrategy(StrEnum):
"""Dynamic pricing strategy types"""
AGGRESSIVE_GROWTH = "aggressive_growth"
PROFIT_MAXIMIZATION = "profit_maximization"
MARKET_BALANCE = "market_balance"
@@ -24,16 +24,18 @@ class PricingStrategy(str, Enum):
COMPETITOR_BASED = "competitor_based"
class StrategyPriority(str, Enum):
class StrategyPriority(StrEnum):
"""Strategy priority levels"""
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
CRITICAL = "critical"
class RiskTolerance(str, Enum):
class RiskTolerance(StrEnum):
"""Risk tolerance levels for pricing strategies"""
CONSERVATIVE = "conservative"
MODERATE = "moderate"
AGGRESSIVE = "aggressive"
@@ -42,47 +44,47 @@ class RiskTolerance(str, Enum):
@dataclass
class StrategyParameters:
"""Parameters for pricing strategy configuration"""
# Base pricing parameters
base_multiplier: float = 1.0
min_price_margin: float = 0.1 # 10% minimum margin
max_price_margin: float = 2.0 # 200% maximum margin
# Market sensitivity parameters
demand_sensitivity: float = 0.5 # 0-1, how much demand affects price
supply_sensitivity: float = 0.3 # 0-1, how much supply affects price
competition_sensitivity: float = 0.4 # 0-1, how much competition affects price
# Time-based parameters
peak_hour_multiplier: float = 1.2
off_peak_multiplier: float = 0.8
weekend_multiplier: float = 1.1
# Performance parameters
performance_bonus_rate: float = 0.1 # 10% bonus for high performance
performance_penalty_rate: float = 0.05 # 5% penalty for low performance
# Risk management parameters
max_price_change_percent: float = 0.3 # Maximum 30% change per update
volatility_threshold: float = 0.2 # Trigger for circuit breaker
confidence_threshold: float = 0.7 # Minimum confidence for price changes
# Strategy-specific parameters
growth_target_rate: float = 0.15 # 15% growth target for growth strategies
profit_target_margin: float = 0.25 # 25% profit target for profit strategies
market_share_target: float = 0.1 # 10% market share target
# Regional parameters
regional_adjustments: Dict[str, float] = field(default_factory=dict)
regional_adjustments: dict[str, float] = field(default_factory=dict)
# Custom parameters
custom_parameters: Dict[str, Any] = field(default_factory=dict)
custom_parameters: dict[str, Any] = field(default_factory=dict)
@dataclass
class StrategyRule:
"""Individual rule within a pricing strategy"""
rule_id: str
name: str
description: str
@@ -91,41 +93,41 @@ class StrategyRule:
priority: StrategyPriority
enabled: bool = True
created_at: datetime = field(default_factory=datetime.utcnow)
# Rule execution tracking
execution_count: int = 0
last_executed: Optional[datetime] = None
last_executed: datetime | None = None
success_rate: float = 1.0
@dataclass
class PricingStrategyConfig:
"""Complete configuration for a pricing strategy"""
strategy_id: str
name: str
description: str
strategy_type: PricingStrategy
parameters: StrategyParameters
rules: List[StrategyRule] = field(default_factory=list)
rules: list[StrategyRule] = field(default_factory=list)
# Strategy metadata
risk_tolerance: RiskTolerance = RiskTolerance.MODERATE
priority: StrategyPriority = StrategyPriority.MEDIUM
auto_optimize: bool = True
learning_enabled: bool = True
# Strategy constraints
min_price: Optional[float] = None
max_price: Optional[float] = None
resource_types: List[str] = field(default_factory=list)
regions: List[str] = field(default_factory=list)
min_price: float | None = None
max_price: float | None = None
resource_types: list[str] = field(default_factory=list)
regions: list[str] = field(default_factory=list)
# Performance tracking
created_at: datetime = field(default_factory=datetime.utcnow)
updated_at: datetime = field(default_factory=datetime.utcnow)
last_applied: Optional[datetime] = None
last_applied: datetime | None = None
# Strategy effectiveness metrics
total_revenue_impact: float = 0.0
market_share_impact: float = 0.0
@@ -135,11 +137,11 @@ class PricingStrategyConfig:
class StrategyLibrary:
"""Library of predefined pricing strategies"""
@staticmethod
def get_aggressive_growth_strategy() -> PricingStrategyConfig:
"""Get aggressive growth strategy configuration"""
parameters = StrategyParameters(
base_multiplier=0.85,
min_price_margin=0.05, # Lower margins for growth
@@ -153,9 +155,9 @@ class StrategyLibrary:
performance_bonus_rate=0.05,
performance_penalty_rate=0.02,
growth_target_rate=0.25, # 25% growth target
market_share_target=0.15 # 15% market share target
market_share_target=0.15, # 15% market share target
)
rules = [
StrategyRule(
rule_id="growth_competitive_undercut",
@@ -163,7 +165,7 @@ class StrategyLibrary:
description="Undercut competitors by 5% to gain market share",
condition="competitor_price > 0 and current_price > competitor_price * 0.95",
action="set_price = competitor_price * 0.95",
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
),
StrategyRule(
rule_id="growth_volume_discount",
@@ -171,10 +173,10 @@ class StrategyLibrary:
description="Offer discounts for high-volume customers",
condition="customer_volume > threshold and customer_loyalty < 6_months",
action="apply_discount = 0.1",
priority=StrategyPriority.MEDIUM
)
priority=StrategyPriority.MEDIUM,
),
]
return PricingStrategyConfig(
strategy_id="aggressive_growth_v1",
name="Aggressive Growth Strategy",
@@ -183,13 +185,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.AGGRESSIVE,
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
)
@staticmethod
def get_profit_maximization_strategy() -> PricingStrategyConfig:
"""Get profit maximization strategy configuration"""
parameters = StrategyParameters(
base_multiplier=1.25,
min_price_margin=0.3, # Higher margins for profit
@@ -203,9 +205,9 @@ class StrategyLibrary:
performance_bonus_rate=0.15,
performance_penalty_rate=0.08,
profit_target_margin=0.35, # 35% profit target
max_price_change_percent=0.2 # More conservative changes
max_price_change_percent=0.2, # More conservative changes
)
rules = [
StrategyRule(
rule_id="profit_demand_premium",
@@ -213,7 +215,7 @@ class StrategyLibrary:
description="Apply premium pricing during high demand periods",
condition="demand_level > 0.8 and competitor_capacity < 0.7",
action="set_price = current_price * 1.3",
priority=StrategyPriority.CRITICAL
priority=StrategyPriority.CRITICAL,
),
StrategyRule(
rule_id="profit_performance_premium",
@@ -221,10 +223,10 @@ class StrategyLibrary:
description="Charge premium for high-performance resources",
condition="performance_score > 0.9 and customer_satisfaction > 0.85",
action="apply_premium = 0.2",
priority=StrategyPriority.HIGH
)
priority=StrategyPriority.HIGH,
),
]
return PricingStrategyConfig(
strategy_id="profit_maximization_v1",
name="Profit Maximization Strategy",
@@ -233,13 +235,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.MODERATE,
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
)
@staticmethod
def get_market_balance_strategy() -> PricingStrategyConfig:
"""Get market balance strategy configuration"""
parameters = StrategyParameters(
base_multiplier=1.0,
min_price_margin=0.15,
@@ -253,9 +255,9 @@ class StrategyLibrary:
performance_bonus_rate=0.1,
performance_penalty_rate=0.05,
volatility_threshold=0.15, # Lower volatility threshold
confidence_threshold=0.8 # Higher confidence requirement
confidence_threshold=0.8, # Higher confidence requirement
)
rules = [
StrategyRule(
rule_id="balance_market_follow",
@@ -263,7 +265,7 @@ class StrategyLibrary:
description="Follow market trends while maintaining stability",
condition="market_trend == increasing and price_position < market_average",
action="adjust_price = market_average * 0.98",
priority=StrategyPriority.MEDIUM
priority=StrategyPriority.MEDIUM,
),
StrategyRule(
rule_id="balance_stability_maintain",
@@ -271,10 +273,10 @@ class StrategyLibrary:
description="Maintain price stability during volatile periods",
condition="volatility > 0.15 and confidence < 0.7",
action="freeze_price = true",
priority=StrategyPriority.HIGH
)
priority=StrategyPriority.HIGH,
),
]
return PricingStrategyConfig(
strategy_id="market_balance_v1",
name="Market Balance Strategy",
@@ -283,13 +285,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.MODERATE,
priority=StrategyPriority.MEDIUM
priority=StrategyPriority.MEDIUM,
)
@staticmethod
def get_competitive_response_strategy() -> PricingStrategyConfig:
"""Get competitive response strategy configuration"""
parameters = StrategyParameters(
base_multiplier=0.95,
min_price_margin=0.1,
@@ -301,9 +303,9 @@ class StrategyLibrary:
off_peak_multiplier=0.85,
weekend_multiplier=1.05,
performance_bonus_rate=0.08,
performance_penalty_rate=0.03
performance_penalty_rate=0.03,
)
rules = [
StrategyRule(
rule_id="competitive_price_match",
@@ -311,7 +313,7 @@ class StrategyLibrary:
description="Match or beat competitor prices",
condition="competitor_price < current_price * 0.95",
action="set_price = competitor_price * 0.98",
priority=StrategyPriority.CRITICAL
priority=StrategyPriority.CRITICAL,
),
StrategyRule(
rule_id="competitive_promotion_response",
@@ -319,10 +321,10 @@ class StrategyLibrary:
description="Respond to competitor promotions",
condition="competitor_promotion == true and market_share_declining",
action="apply_promotion = competitor_promotion_rate * 1.1",
priority=StrategyPriority.HIGH
)
priority=StrategyPriority.HIGH,
),
]
return PricingStrategyConfig(
strategy_id="competitive_response_v1",
name="Competitive Response Strategy",
@@ -331,13 +333,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.MODERATE,
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
)
@staticmethod
def get_demand_elasticity_strategy() -> PricingStrategyConfig:
"""Get demand elasticity strategy configuration"""
parameters = StrategyParameters(
base_multiplier=1.0,
min_price_margin=0.12,
@@ -350,9 +352,9 @@ class StrategyLibrary:
weekend_multiplier=1.1,
performance_bonus_rate=0.1,
performance_penalty_rate=0.05,
max_price_change_percent=0.4 # Allow larger changes for elasticity
max_price_change_percent=0.4, # Allow larger changes for elasticity
)
rules = [
StrategyRule(
rule_id="elasticity_demand_capture",
@@ -360,7 +362,7 @@ class StrategyLibrary:
description="Aggressively price to capture demand surges",
condition="demand_growth_rate > 0.2 and supply_constraint == true",
action="set_price = current_price * 1.25",
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
),
StrategyRule(
rule_id="elasticity_demand_stimulation",
@@ -368,10 +370,10 @@ class StrategyLibrary:
description="Lower prices to stimulate demand during lulls",
condition="demand_level < 0.4 and inventory_turnover < threshold",
action="apply_discount = 0.15",
priority=StrategyPriority.MEDIUM
)
priority=StrategyPriority.MEDIUM,
),
]
return PricingStrategyConfig(
strategy_id="demand_elasticity_v1",
name="Demand Elasticity Strategy",
@@ -380,13 +382,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.AGGRESSIVE,
priority=StrategyPriority.MEDIUM
priority=StrategyPriority.MEDIUM,
)
@staticmethod
def get_penetration_pricing_strategy() -> PricingStrategyConfig:
"""Get penetration pricing strategy configuration"""
parameters = StrategyParameters(
base_multiplier=0.7, # Low initial prices
min_price_margin=0.05,
@@ -398,9 +400,9 @@ class StrategyLibrary:
off_peak_multiplier=0.6,
weekend_multiplier=0.9,
growth_target_rate=0.3, # 30% growth target
market_share_target=0.2 # 20% market share target
market_share_target=0.2, # 20% market share target
)
rules = [
StrategyRule(
rule_id="penetration_market_entry",
@@ -408,7 +410,7 @@ class StrategyLibrary:
description="Very low prices for new market entry",
condition="market_share < 0.05 and time_in_market < 6_months",
action="set_price = cost * 1.1",
priority=StrategyPriority.CRITICAL
priority=StrategyPriority.CRITICAL,
),
StrategyRule(
rule_id="penetration_gradual_increase",
@@ -416,10 +418,10 @@ class StrategyLibrary:
description="Gradually increase prices after market penetration",
condition="market_share > 0.1 and customer_loyalty > 12_months",
action="increase_price = 0.05",
priority=StrategyPriority.MEDIUM
)
priority=StrategyPriority.MEDIUM,
),
]
return PricingStrategyConfig(
strategy_id="penetration_pricing_v1",
name="Penetration Pricing Strategy",
@@ -428,13 +430,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.AGGRESSIVE,
priority=StrategyPriority.HIGH
priority=StrategyPriority.HIGH,
)
@staticmethod
def get_premium_pricing_strategy() -> PricingStrategyConfig:
"""Get premium pricing strategy configuration"""
parameters = StrategyParameters(
base_multiplier=1.8, # High base prices
min_price_margin=0.5,
@@ -447,9 +449,9 @@ class StrategyLibrary:
weekend_multiplier=1.4,
performance_bonus_rate=0.2,
performance_penalty_rate=0.1,
profit_target_margin=0.4 # 40% profit target
profit_target_margin=0.4, # 40% profit target
)
rules = [
StrategyRule(
rule_id="premium_quality_assurance",
@@ -457,7 +459,7 @@ class StrategyLibrary:
description="Maintain premium pricing for quality assurance",
condition="quality_score > 0.95 and brand_recognition > high",
action="maintain_premium = true",
priority=StrategyPriority.CRITICAL
priority=StrategyPriority.CRITICAL,
),
StrategyRule(
rule_id="premium_exclusivity",
@@ -465,10 +467,10 @@ class StrategyLibrary:
description="Premium pricing for exclusive features",
condition="exclusive_features == true and customer_segment == premium",
action="apply_premium = 0.3",
priority=StrategyPriority.HIGH
)
priority=StrategyPriority.HIGH,
),
]
return PricingStrategyConfig(
strategy_id="premium_pricing_v1",
name="Premium Pricing Strategy",
@@ -477,13 +479,13 @@ class StrategyLibrary:
parameters=parameters,
rules=rules,
risk_tolerance=RiskTolerance.CONSERVATIVE,
priority=StrategyPriority.MEDIUM
priority=StrategyPriority.MEDIUM,
)
@staticmethod
def get_all_strategies() -> Dict[PricingStrategy, PricingStrategyConfig]:
def get_all_strategies() -> dict[PricingStrategy, PricingStrategyConfig]:
"""Get all available pricing strategies"""
return {
PricingStrategy.AGGRESSIVE_GROWTH: StrategyLibrary.get_aggressive_growth_strategy(),
PricingStrategy.PROFIT_MAXIMIZATION: StrategyLibrary.get_profit_maximization_strategy(),
@@ -491,88 +493,79 @@ class StrategyLibrary:
PricingStrategy.COMPETITIVE_RESPONSE: StrategyLibrary.get_competitive_response_strategy(),
PricingStrategy.DEMAND_ELASTICITY: StrategyLibrary.get_demand_elasticity_strategy(),
PricingStrategy.PENETRATION_PRICING: StrategyLibrary.get_penetration_pricing_strategy(),
PricingStrategy.PREMIUM_PRICING: StrategyLibrary.get_premium_pricing_strategy()
PricingStrategy.PREMIUM_PRICING: StrategyLibrary.get_premium_pricing_strategy(),
}
class StrategyOptimizer:
"""Optimizes pricing strategies based on performance data"""
def __init__(self):
self.performance_history: Dict[str, List[Dict[str, Any]]] = {}
self.performance_history: dict[str, list[dict[str, Any]]] = {}
self.optimization_rules = self._initialize_optimization_rules()
def optimize_strategy(
self,
strategy_config: PricingStrategyConfig,
performance_data: Dict[str, Any]
self, strategy_config: PricingStrategyConfig, performance_data: dict[str, Any]
) -> PricingStrategyConfig:
"""Optimize strategy parameters based on performance"""
strategy_id = strategy_config.strategy_id
# Store performance data
if strategy_id not in self.performance_history:
self.performance_history[strategy_id] = []
self.performance_history[strategy_id].append({
"timestamp": datetime.utcnow(),
"performance": performance_data
})
self.performance_history[strategy_id].append({"timestamp": datetime.utcnow(), "performance": performance_data})
# Apply optimization rules
optimized_config = self._apply_optimization_rules(strategy_config, performance_data)
# Update strategy effectiveness score
optimized_config.strategy_effectiveness_score = self._calculate_effectiveness_score(
performance_data
)
optimized_config.strategy_effectiveness_score = self._calculate_effectiveness_score(performance_data)
return optimized_config
def _initialize_optimization_rules(self) -> List[Dict[str, Any]]:
def _initialize_optimization_rules(self) -> list[dict[str, Any]]:
"""Initialize optimization rules"""
return [
{
"name": "Revenue Optimization",
"condition": "revenue_growth < target and price_elasticity > 0.5",
"action": "decrease_base_multiplier",
"adjustment": -0.05
"adjustment": -0.05,
},
{
"name": "Margin Protection",
"condition": "profit_margin < minimum and demand_inelastic",
"action": "increase_base_multiplier",
"adjustment": 0.03
"adjustment": 0.03,
},
{
"name": "Market Share Growth",
"condition": "market_share_declining and competitive_pressure_high",
"action": "increase_competition_sensitivity",
"adjustment": 0.1
"adjustment": 0.1,
},
{
"name": "Volatility Reduction",
"condition": "price_volatility > threshold and customer_complaints_high",
"action": "decrease_max_price_change",
"adjustment": -0.1
"adjustment": -0.1,
},
{
"name": "Demand Capture",
"condition": "demand_surge_detected and capacity_available",
"action": "increase_demand_sensitivity",
"adjustment": 0.15
}
"adjustment": 0.15,
},
]
def _apply_optimization_rules(
self,
strategy_config: PricingStrategyConfig,
performance_data: Dict[str, Any]
self, strategy_config: PricingStrategyConfig, performance_data: dict[str, Any]
) -> PricingStrategyConfig:
"""Apply optimization rules to strategy configuration"""
# Create a copy to avoid modifying the original
optimized_config = PricingStrategyConfig(
strategy_id=strategy_config.strategy_id,
@@ -598,7 +591,7 @@ class StrategyOptimizer:
profit_target_margin=strategy_config.parameters.profit_target_margin,
market_share_target=strategy_config.parameters.market_share_target,
regional_adjustments=strategy_config.parameters.regional_adjustments.copy(),
custom_parameters=strategy_config.parameters.custom_parameters.copy()
custom_parameters=strategy_config.parameters.custom_parameters.copy(),
),
rules=strategy_config.rules.copy(),
risk_tolerance=strategy_config.risk_tolerance,
@@ -608,24 +601,24 @@ class StrategyOptimizer:
min_price=strategy_config.min_price,
max_price=strategy_config.max_price,
resource_types=strategy_config.resource_types.copy(),
regions=strategy_config.regions.copy()
regions=strategy_config.regions.copy(),
)
# Apply each optimization rule
for rule in self.optimization_rules:
if self._evaluate_rule_condition(rule["condition"], performance_data):
self._apply_rule_action(optimized_config, rule["action"], rule["adjustment"])
return optimized_config
def _evaluate_rule_condition(self, condition: str, performance_data: Dict[str, Any]) -> bool:
def _evaluate_rule_condition(self, condition: str, performance_data: dict[str, Any]) -> bool:
"""Evaluate optimization rule condition"""
# Simple condition evaluation (in production, use a proper expression evaluator)
try:
# Replace variables with actual values
condition_eval = condition
# Common performance metrics
metrics = {
"revenue_growth": performance_data.get("revenue_growth", 0),
@@ -636,26 +629,26 @@ class StrategyOptimizer:
"price_volatility": performance_data.get("price_volatility", 0.1),
"customer_complaints_high": performance_data.get("customer_complaints_high", False),
"demand_surge_detected": performance_data.get("demand_surge_detected", False),
"capacity_available": performance_data.get("capacity_available", True)
"capacity_available": performance_data.get("capacity_available", True),
}
# Simple condition parsing
for key, value in metrics.items():
condition_eval = condition_eval.replace(key, str(value))
# Evaluate simple conditions
if "and" in condition_eval:
parts = condition_eval.split(" and ")
return all(self._evaluate_simple_condition(part.strip()) for part in parts)
else:
return self._evaluate_simple_condition(condition_eval.strip())
except Exception as e:
except Exception:
return False
def _evaluate_simple_condition(self, condition: str) -> bool:
"""Evaluate a simple condition"""
try:
# Handle common comparison operators
if "<" in condition:
@@ -673,13 +666,13 @@ class StrategyOptimizer:
return False
else:
return bool(condition)
except Exception:
return False
def _apply_rule_action(self, config: PricingStrategyConfig, action: str, adjustment: float):
"""Apply optimization rule action"""
if action == "decrease_base_multiplier":
config.parameters.base_multiplier = max(0.5, config.parameters.base_multiplier + adjustment)
elif action == "increase_base_multiplier":
@@ -690,22 +683,22 @@ class StrategyOptimizer:
config.parameters.max_price_change_percent = max(0.1, config.parameters.max_price_change_percent + adjustment)
elif action == "increase_demand_sensitivity":
config.parameters.demand_sensitivity = min(1.0, config.parameters.demand_sensitivity + adjustment)
def _calculate_effectiveness_score(self, performance_data: Dict[str, Any]) -> float:
def _calculate_effectiveness_score(self, performance_data: dict[str, Any]) -> float:
"""Calculate overall strategy effectiveness score"""
# Weight different performance metrics
weights = {
"revenue_growth": 0.3,
"profit_margin": 0.25,
"market_share": 0.2,
"customer_satisfaction": 0.15,
"price_stability": 0.1
"price_stability": 0.1,
}
score = 0.0
total_weight = 0.0
for metric, weight in weights.items():
if metric in performance_data:
value = performance_data[metric]
@@ -714,8 +707,8 @@ class StrategyOptimizer:
normalized_value = min(1.0, max(0.0, value))
else: # price_stability (lower is better, so invert)
normalized_value = min(1.0, max(0.0, 1.0 - value))
score += normalized_value * weight
total_weight += weight
return score / total_weight if total_weight > 0 else 0.5

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class ReputationLevel(str, Enum):
class ReputationLevel(StrEnum):
"""Agent reputation level enumeration"""
BEGINNER = "beginner"
INTERMEDIATE = "intermediate"
ADVANCED = "advanced"
@@ -21,8 +21,9 @@ class ReputationLevel(str, Enum):
MASTER = "master"
class TrustScoreCategory(str, Enum):
class TrustScoreCategory(StrEnum):
"""Trust score calculation categories"""
PERFORMANCE = "performance"
RELIABILITY = "reliability"
COMMUNITY = "community"
@@ -32,224 +33,224 @@ class TrustScoreCategory(str, Enum):
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))
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))
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))
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
reputation_level_before: ReputationLevel | None = None
reputation_level_after: ReputationLevel | None = None
# Event context
related_transaction_id: Optional[str] = None
related_job_id: Optional[str] = None
related_dispute_id: Optional[str] = None
related_transaction_id: str | None = None
related_job_id: str | None = None
related_dispute_id: str | None = None
# Event metadata
event_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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
processed_at: datetime | None = None
expires_at: datetime | None = 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))
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))
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))
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))
level_requirements: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
level_benefits: dict[str, Any] = Field(default={}, sa_column=Column(JSON))

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class RewardTier(str, Enum):
class RewardTier(StrEnum):
"""Reward tier enumeration"""
BRONZE = "bronze"
SILVER = "silver"
GOLD = "gold"
@@ -21,8 +21,9 @@ class RewardTier(str, Enum):
DIAMOND = "diamond"
class RewardType(str, Enum):
class RewardType(StrEnum):
"""Reward type enumeration"""
PERFORMANCE_BONUS = "performance_bonus"
LOYALTY_BONUS = "loyalty_bonus"
REFERRAL_BONUS = "referral_bonus"
@@ -31,8 +32,9 @@ class RewardType(str, Enum):
SPECIAL_BONUS = "special_bonus"
class RewardStatus(str, Enum):
class RewardStatus(StrEnum):
"""Reward status enumeration"""
PENDING = "pending"
APPROVED = "approved"
DISTRIBUTED = "distributed"
@@ -42,261 +44,261 @@ class RewardStatus(str, Enum):
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))
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
last_reward_date: datetime | None = 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))
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))
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
expires_at: datetime | None = None
# Additional data
calculation_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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_id: str | None = None
transaction_hash: str | None = 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
processed_at: datetime | None = None
confirmed_at: datetime | None = None
# Distribution metadata
batch_id: Optional[str] = None
batch_id: str | None = None
priority: int = Field(default=5, ge=1, le=10) # 1 = highest priority
retry_count: int = Field(default=0)
error_message: Optional[str] = None
error_message: str | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
scheduled_at: Optional[datetime] = None
scheduled_at: datetime | None = None
# Additional data
distribution_details: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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
tier_impact: RewardTier | None = None
# Event context
related_transaction_id: Optional[str] = None
related_calculation_id: Optional[str] = None
related_distribution_id: Optional[str] = None
related_transaction_id: str | None = None
related_calculation_id: str | None = None
related_distribution_id: str | None = None
# Event metadata
event_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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
processed_at: datetime | None = None
expires_at: datetime | None = None
# Additional metadata
event_context: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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
completed_at: datetime | None = None
claimed_at: datetime | None = None
# Timestamps
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
expires_at: Optional[datetime] = None
expires_at: datetime | None = None
# Additional data
milestone_config: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
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)
@@ -304,16 +306,16 @@ class RewardAnalytics(SQLModel, table=True):
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))
analytics_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))

View File

@@ -3,17 +3,17 @@ 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 datetime import datetime
from enum import StrEnum
from typing import Any
from uuid import uuid4
from enum import Enum
from sqlmodel import SQLModel, Field, Column, JSON
from sqlalchemy import DateTime, Float, Integer, Text
from sqlmodel import JSON, Column, Field, SQLModel
class TradeStatus(str, Enum):
class TradeStatus(StrEnum):
"""Trade status enumeration"""
OPEN = "open"
MATCHING = "matching"
NEGOTIATING = "negotiating"
@@ -24,8 +24,9 @@ class TradeStatus(str, Enum):
FAILED = "failed"
class TradeType(str, Enum):
class TradeType(StrEnum):
"""Trade type enumeration"""
AI_POWER = "ai_power"
COMPUTE_RESOURCES = "compute_resources"
DATA_SERVICES = "data_services"
@@ -34,8 +35,9 @@ class TradeType(str, Enum):
TRAINING_TASKS = "training_tasks"
class NegotiationStatus(str, Enum):
class NegotiationStatus(StrEnum):
"""Negotiation status enumeration"""
PENDING = "pending"
ACTIVE = "active"
ACCEPTED = "accepted"
@@ -44,8 +46,9 @@ class NegotiationStatus(str, Enum):
EXPIRED = "expired"
class SettlementType(str, Enum):
class SettlementType(StrEnum):
"""Settlement type enumeration"""
IMMEDIATE = "immediate"
ESCROW = "escrow"
MILESTONE = "milestone"
@@ -54,373 +57,373 @@ class SettlementType(str, Enum):
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))
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))
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
start_time: datetime | None = None
end_time: datetime | None = None
duration_hours: int | None = 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))
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
expires_at: datetime | None = None
last_activity: datetime = Field(default_factory=datetime.utcnow)
# Additional metadata
tags: List[str] = Field(default=[], sa_column=Column(JSON))
trading_meta_data: Dict[str, Any] = Field(default={}, sa_column=Column(JSON))
tags: list[str] = Field(default=[], sa_column=Column(JSON))
trading_meta_data: 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))
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
buyer_response: str | None = None # interested, not_interested, negotiating
seller_response: str | None = 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))
negotiation_initiator: str | None = 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
expires_at: datetime | None = None
last_interaction: datetime | None = 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))
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))
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))
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
started_at: datetime | None = None
completed_at: datetime | None = None
expires_at: datetime | None = None
last_offer_at: datetime | None = 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))
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))
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))
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))
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))
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
starts_at: datetime | None = None
ends_at: datetime | None = None
completed_at: datetime | None = 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))
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
transaction_id: str | None = None
transaction_hash: str | None = None
block_number: int | None = 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))
escrow_address: str | None = 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))
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
processed_at: datetime | None = None
completed_at: datetime | None = None
refunded_at: datetime | None = 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))
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))
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))
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
trade_duration: int | None = 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))
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))
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))
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))
analytics_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))
trends_data: dict[str, Any] = Field(default={}, sa_column=Column(JSON))

View File

@@ -2,25 +2,26 @@
User domain models for AITBC
"""
from sqlmodel import SQLModel, Field, Relationship, Column
from sqlalchemy import JSON
from datetime import datetime
from typing import Optional, List
from sqlalchemy import JSON
from sqlmodel import Column, Field, SQLModel
class User(SQLModel, table=True):
"""User model"""
__tablename__ = "users"
__table_args__ = {"extend_existing": True}
id: str = Field(primary_key=True)
email: str = Field(unique=True, index=True)
username: str = Field(unique=True, index=True)
status: str = Field(default="active", max_length=20)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
last_login: Optional[datetime] = None
last_login: datetime | None = None
# Relationships
# DISABLED: wallets: List["Wallet"] = Relationship(back_populates="user")
# DISABLED: transactions: List["Transaction"] = Relationship(back_populates="user")
@@ -28,16 +29,17 @@ class User(SQLModel, table=True):
class Wallet(SQLModel, table=True):
"""Wallet model for storing user balances"""
__tablename__ = "wallets"
__table_args__ = {"extend_existing": True}
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
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)
updated_at: datetime = Field(default_factory=datetime.utcnow)
# Relationships
# DISABLED: user: User = Relationship(back_populates="wallets")
# DISABLED: transactions: List["Transaction"] = Relationship(back_populates="wallet")
@@ -45,21 +47,22 @@ class Wallet(SQLModel, table=True):
class Transaction(SQLModel, table=True):
"""Transaction model"""
__tablename__ = "transactions"
__table_args__ = {"extend_existing": True}
id: str = Field(primary_key=True)
user_id: str = Field(foreign_key="users.id")
wallet_id: Optional[int] = Field(foreign_key="wallets.id")
wallet_id: int | None = Field(foreign_key="wallets.id")
type: str = Field(max_length=20)
status: str = Field(default="pending", max_length=20)
amount: float
fee: float = Field(default=0.0)
description: Optional[str] = None
tx_metadata: Optional[str] = Field(default=None, sa_column=Column(JSON))
description: str | None = None
tx_metadata: str | None = Field(default=None, sa_column=Column(JSON))
created_at: datetime = Field(default_factory=datetime.utcnow)
confirmed_at: Optional[datetime] = None
confirmed_at: datetime | None = None
# Relationships
# DISABLED: user: User = Relationship(back_populates="transactions")
# DISABLED: wallet: Optional[Wallet] = Relationship(back_populates="transactions")
@@ -67,10 +70,11 @@ class Transaction(SQLModel, table=True):
class UserSession(SQLModel, table=True):
"""User session model"""
__tablename__ = "user_sessions"
__table_args__ = {"extend_existing": True}
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
user_id: str = Field(foreign_key="users.id")
token: str = Field(unique=True, index=True)
expires_at: datetime

View File

@@ -7,38 +7,40 @@ Domain models for managing agent wallets across multiple blockchain networks.
from __future__ import annotations
from datetime import datetime
from enum import Enum
from typing import Dict, List, Optional
from uuid import uuid4
from enum import StrEnum
from sqlalchemy import Column, JSON
from sqlmodel import Field, SQLModel, Relationship
from sqlalchemy import JSON, Column
from sqlmodel import Field, SQLModel
class WalletType(str, Enum):
EOA = "eoa" # Externally Owned Account
class WalletType(StrEnum):
EOA = "eoa" # Externally Owned Account
SMART_CONTRACT = "smart_contract" # Smart Contract Wallet (e.g. Safe)
MULTI_SIG = "multi_sig" # Multi-Signature Wallet
MPC = "mpc" # Multi-Party Computation Wallet
MULTI_SIG = "multi_sig" # Multi-Signature Wallet
MPC = "mpc" # Multi-Party Computation Wallet
class NetworkType(str, Enum):
class NetworkType(StrEnum):
EVM = "evm"
SOLANA = "solana"
APTOS = "aptos"
SUI = "sui"
class AgentWallet(SQLModel, table=True):
"""Represents a wallet owned by an AI agent"""
__tablename__ = "agent_wallet"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
agent_id: str = Field(index=True)
address: str = Field(index=True)
public_key: str = Field()
wallet_type: WalletType = Field(default=WalletType.EOA, index=True)
is_active: bool = Field(default=True)
encrypted_private_key: Optional[str] = Field(default=None) # Only if managed internally
kms_key_id: Optional[str] = Field(default=None) # Reference to external KMS
meta_data: Dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
encrypted_private_key: str | None = Field(default=None) # Only if managed internally
kms_key_id: str | None = Field(default=None) # Reference to external KMS
meta_data: dict[str, str] = Field(default_factory=dict, sa_column=Column(JSON))
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
@@ -46,30 +48,34 @@ class AgentWallet(SQLModel, table=True):
# DISABLED: balances: List["TokenBalance"] = Relationship(back_populates="wallet")
# DISABLED: transactions: List["WalletTransaction"] = Relationship(back_populates="wallet")
class NetworkConfig(SQLModel, table=True):
"""Configuration for supported blockchain networks"""
__tablename__ = "wallet_network_config"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
chain_id: int = Field(index=True, unique=True)
name: str = Field(index=True)
network_type: NetworkType = Field(default=NetworkType.EVM)
rpc_url: str = Field()
ws_url: Optional[str] = Field(default=None)
ws_url: str | None = Field(default=None)
explorer_url: str = Field()
native_currency_symbol: str = Field()
native_currency_decimals: int = Field(default=18)
is_testnet: bool = Field(default=False, index=True)
is_active: bool = Field(default=True)
class TokenBalance(SQLModel, table=True):
"""Tracks token balances for agent wallets across networks"""
__tablename__ = "token_balance"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
wallet_id: int = Field(foreign_key="agent_wallet.id", index=True)
chain_id: int = Field(foreign_key="wallet_network_config.chain_id", index=True)
token_address: str = Field(index=True) # "native" for native currency
token_address: str = Field(index=True) # "native" for native currency
token_symbol: str = Field()
balance: float = Field(default=0.0)
last_updated: datetime = Field(default_factory=datetime.utcnow)
@@ -77,29 +83,32 @@ class TokenBalance(SQLModel, table=True):
# Relationships
# DISABLED: wallet: AgentWallet = Relationship(back_populates="balances")
class TransactionStatus(str, Enum):
class TransactionStatus(StrEnum):
PENDING = "pending"
SUBMITTED = "submitted"
CONFIRMED = "confirmed"
FAILED = "failed"
DROPPED = "dropped"
class WalletTransaction(SQLModel, table=True):
"""Record of transactions executed by agent wallets"""
__tablename__ = "wallet_transaction"
id: Optional[int] = Field(default=None, primary_key=True)
id: int | None = Field(default=None, primary_key=True)
wallet_id: int = Field(foreign_key="agent_wallet.id", index=True)
chain_id: int = Field(foreign_key="wallet_network_config.chain_id", index=True)
tx_hash: Optional[str] = Field(default=None, index=True)
tx_hash: str | None = Field(default=None, index=True)
to_address: str = Field(index=True)
value: float = Field(default=0.0)
data: Optional[str] = Field(default=None)
gas_limit: Optional[int] = Field(default=None)
gas_price: Optional[float] = Field(default=None)
nonce: Optional[int] = Field(default=None)
data: str | None = Field(default=None)
gas_limit: int | None = Field(default=None)
gas_price: float | None = Field(default=None)
nonce: int | None = Field(default=None)
status: TransactionStatus = Field(default=TransactionStatus.PENDING, index=True)
error_message: Optional[str] = Field(default=None)
error_message: str | None = Field(default=None)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)