75 lines
1.8 KiB
Python
75 lines
1.8 KiB
Python
from __future__ import annotations
|
||
|
||
import json
|
||
from dataclasses import dataclass, asdict, field
|
||
from datetime import datetime
|
||
from typing import Any, Dict, Optional
|
||
|
||
|
||
def _iso_now() -> str:
|
||
return datetime.utcnow().isoformat()
|
||
|
||
|
||
@dataclass
|
||
class ValidationResult:
|
||
"""
|
||
Результат валидации контента/чанков.
|
||
"""
|
||
ok: bool
|
||
reason: Optional[str] = None
|
||
details: Dict[str, Any] = field(default_factory=dict)
|
||
timestamp: str = field(default_factory=_iso_now)
|
||
|
||
def to_dict(self) -> Dict[str, Any]:
|
||
return asdict(self)
|
||
|
||
def to_json(self) -> str:
|
||
return json.dumps(self.to_dict(), ensure_ascii=False, sort_keys=True)
|
||
|
||
|
||
@dataclass
|
||
class ContentSignature:
|
||
"""
|
||
Информация о подписи контента/объекта.
|
||
"""
|
||
signature: Optional[str]
|
||
public_key_hex: Optional[str]
|
||
algorithm: str = "ed25519"
|
||
|
||
def to_dict(self) -> Dict[str, Any]:
|
||
return asdict(self)
|
||
|
||
|
||
@dataclass
|
||
class TrustScore:
|
||
"""
|
||
Итоговый скор доверия (0.0 - 1.0)
|
||
"""
|
||
node_id: str
|
||
score: float
|
||
updated_at: str = field(default_factory=_iso_now)
|
||
reason: Optional[str] = None
|
||
|
||
def to_dict(self) -> Dict[str, Any]:
|
||
d = asdict(self)
|
||
# Нормализация диапазона
|
||
d["score"] = max(0.0, min(1.0, float(d["score"])))
|
||
return d
|
||
|
||
|
||
@dataclass
|
||
class NodeTrust:
|
||
"""
|
||
Состояние доверия к ноде.
|
||
"""
|
||
node_id: str
|
||
score: float = 0.5
|
||
blacklisted: bool = False
|
||
manual_override: bool = False
|
||
note: Optional[str] = None
|
||
updated_at: str = field(default_factory=_iso_now)
|
||
|
||
def to_dict(self) -> Dict[str, Any]:
|
||
d = asdict(self)
|
||
d["score"] = max(0.0, min(1.0, float(d["score"])))
|
||
return d |