34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
"""Snipe feature gates. Delegates to circuitforge_core.tiers."""
|
|
from __future__ import annotations
|
|
from circuitforge_core.tiers import can_use as _core_can_use, TIERS # noqa: F401
|
|
|
|
# Feature key → minimum tier required.
|
|
FEATURES: dict[str, str] = {
|
|
# Free tier
|
|
"metadata_trust_scoring": "free",
|
|
"hash_dedup": "free",
|
|
# Paid tier
|
|
"photo_analysis": "paid",
|
|
"serial_number_check": "paid",
|
|
"ai_image_detection": "paid",
|
|
"reverse_image_search": "paid",
|
|
"saved_searches": "paid",
|
|
"background_monitoring": "paid",
|
|
}
|
|
|
|
# Photo analysis features unlock if user has local vision model (moondream2 (MD2) or similar).
|
|
LOCAL_VISION_UNLOCKABLE: frozenset[str] = frozenset({
|
|
"photo_analysis",
|
|
"serial_number_check",
|
|
})
|
|
|
|
|
|
def can_use(
|
|
feature: str,
|
|
tier: str = "free",
|
|
has_byok: bool = False,
|
|
has_local_vision: bool = False,
|
|
) -> bool:
|
|
if has_local_vision and feature in LOCAL_VISION_UNLOCKABLE:
|
|
return True
|
|
return _core_can_use(feature, tier, has_byok=has_byok, _features=FEATURES)
|