This commit is contained in:
2026-04-05 00:43:23 +05:30
commit 8be37d3e92
425 changed files with 101853 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
"""
Base feature class for all negoT8 negotiation features.
Every feature module must subclass BaseFeature and implement:
- get_context() → pre-fetches tool data; returns string injected into negotiators
- format_resolution() → returns a Telegram-ready Markdown string
"""
from abc import ABC, abstractmethod
class BaseFeature(ABC):
@abstractmethod
async def get_context(
self,
preferences_a: dict,
preferences_b: dict,
user_a_id: int = None,
user_b_id: int = None,
) -> str:
"""
Pre-fetch tool results (Tavily, Calculator, etc.) and return a
formatted string to inject into the negotiator as domain context.
Return "" if no external context is needed.
user_a_id / user_b_id are optional — only SchedulingFeature uses them
to query Google Calendar when the user hasn't specified times.
"""
...
@abstractmethod
def format_resolution(
self, resolution: dict, preferences_a: dict, preferences_b: dict
) -> str:
"""
Transform the raw resolution dict into a nice Telegram Markdown string.
"""
...
# ─── Feature dispatcher ───────────────────────────────────────────────────────
def get_feature(feature_type: str) -> BaseFeature:
"""Return the correct BaseFeature subclass for the given feature type."""
from features.scheduling import SchedulingFeature
from features.expenses import ExpensesFeature
from features.freelance import FreelanceFeature
from features.roommate import RoommateFeature
from features.trip import TripFeature
from features.marketplace import MarketplaceFeature
from features.collaborative import CollaborativeFeature
from features.conflict import ConflictFeature
from features.generic import GenericFeature
mapping = {
"scheduling": SchedulingFeature,
"expenses": ExpensesFeature,
"freelance": FreelanceFeature,
"roommate": RoommateFeature,
"trip": TripFeature,
"marketplace": MarketplaceFeature,
"collaborative": CollaborativeFeature,
"conflict": ConflictFeature,
"generic": GenericFeature,
}
cls = mapping.get(feature_type, GenericFeature)
return cls()