gateway: add natural-language action mapping for reminders and mentor relay
This commit is contained in:
@@ -521,6 +521,57 @@ async def _handle_action_commands(
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _extract_nl_action_command(text: str) -> Optional[str]:
|
||||||
|
t = (text or "").strip()
|
||||||
|
if not t or t.startswith("/"):
|
||||||
|
return None
|
||||||
|
|
||||||
|
low = t.lower()
|
||||||
|
|
||||||
|
# Reminder by relative duration (UA/RU/EN)
|
||||||
|
m = re.match(
|
||||||
|
r"^(?:нагадай(?:\s+мені)?|напомни(?:\s+мне)?|remind me)\s+(?:через|in)\s+(\d+)\s*(хв|мин|m|год|hour|h|дн|день|day|d)\s+(.+)$",
|
||||||
|
low,
|
||||||
|
)
|
||||||
|
if m:
|
||||||
|
value = m.group(1)
|
||||||
|
unit = m.group(2)
|
||||||
|
payload = t[m.end(2):].strip()
|
||||||
|
if payload:
|
||||||
|
norm = "m"
|
||||||
|
if unit in {"год", "hour", "h"}:
|
||||||
|
norm = "h"
|
||||||
|
elif unit in {"дн", "день", "day", "d"}:
|
||||||
|
norm = "d"
|
||||||
|
return f"/remind_in {value}{norm} {payload}"
|
||||||
|
|
||||||
|
# Reminder by absolute datetime (UA/RU/EN)
|
||||||
|
m2 = re.match(
|
||||||
|
r"^(?:нагадай(?:\s+мені)?|напомни(?:\s+мне)?|remind me)\s+(?:на|at)\s+(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2})\s+(.+)$",
|
||||||
|
low,
|
||||||
|
)
|
||||||
|
if m2:
|
||||||
|
dt = m2.group(1)
|
||||||
|
payload = t[m2.end(1):].strip()
|
||||||
|
if payload:
|
||||||
|
return f"/remind {dt} {payload}"
|
||||||
|
|
||||||
|
# Mentor relay intent
|
||||||
|
for prefix in (
|
||||||
|
"передай менторам ",
|
||||||
|
"надішли менторам ",
|
||||||
|
"напиши менторам ",
|
||||||
|
"send to mentors ",
|
||||||
|
"relay to mentors ",
|
||||||
|
):
|
||||||
|
if low.startswith(prefix):
|
||||||
|
payload = t[len(prefix):].strip()
|
||||||
|
if payload:
|
||||||
|
return f"/relay_mentors {payload}"
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def _extract_preferred_language_from_profile_fact(fact: Optional[Dict[str, Any]]) -> Optional[str]:
|
def _extract_preferred_language_from_profile_fact(fact: Optional[Dict[str, Any]]) -> Optional[str]:
|
||||||
if not isinstance(fact, dict):
|
if not isinstance(fact, dict):
|
||||||
return None
|
return None
|
||||||
@@ -2696,6 +2747,21 @@ async def handle_telegram_webhook(
|
|||||||
)
|
)
|
||||||
if command_result is not None:
|
if command_result is not None:
|
||||||
return command_result
|
return command_result
|
||||||
|
|
||||||
|
nl_command = _extract_nl_action_command(text)
|
||||||
|
if nl_command:
|
||||||
|
logger.info(f"{agent_config.name}: NL action mapped to command: {nl_command}")
|
||||||
|
nl_result = await _handle_action_commands(
|
||||||
|
agent_config=agent_config,
|
||||||
|
text=nl_command,
|
||||||
|
chat_id=chat_id,
|
||||||
|
user_id=user_id,
|
||||||
|
username=username,
|
||||||
|
dao_id=dao_id,
|
||||||
|
telegram_token=telegram_token,
|
||||||
|
)
|
||||||
|
if nl_result is not None:
|
||||||
|
return nl_result
|
||||||
mentioned_bots = extract_bot_mentions(text)
|
mentioned_bots = extract_bot_mentions(text)
|
||||||
needs_complex_reasoning = requires_complex_reasoning(text)
|
needs_complex_reasoning = requires_complex_reasoning(text)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user