Improve agent reliability and token efficiency
Some checks failed
quality / test (3.10) (push) Has been cancelled
quality / test (3.12) (push) Has been cancelled

This commit is contained in:
kandrusyak
2026-07-27 19:20:48 +03:00
parent 701cdd35d2
commit d1c1ef68d3
9 changed files with 1023 additions and 173 deletions

View File

@@ -28,6 +28,7 @@ class AgentTool:
usage: str
description: str
execute: ToolExecutor
allowed_arguments: frozenset[str] = frozenset()
paragraph_before: bool = False
def prompt_line(self) -> str:
@@ -296,43 +297,49 @@ AGENT_TOOLS = (
),
AgentTool(
"remember",
'{"text": string}',
'{"text":"..."}',
"сохранить важный долгосрочный факт о пользователе.",
remember,
allowed_arguments=frozenset({"text"}),
),
AgentTool(
"list_memory",
'{"limit": number}',
'{} (необязательно: "limit", по умолчанию 20)',
"показать сохраненную память.",
list_memory,
allowed_arguments=frozenset({"limit"}),
),
AgentTool(
"delete_memory",
'{"id": number}',
'{"id":1}',
"удалить запись памяти.",
delete_memory,
allowed_arguments=frozenset({"id"}),
),
AgentTool(
"create_note",
'{"text": string}',
'{"text":"..."}',
"сохранить заметку.",
create_note,
allowed_arguments=frozenset({"text"}),
),
AgentTool(
"list_notes",
'{"limit": number}',
'{} (необязательно: "limit", по умолчанию 20)',
"показать заметки.",
list_notes,
allowed_arguments=frozenset({"limit"}),
),
AgentTool(
"delete_note",
'{"id": number}',
'{"id":1}',
"удалить заметку.",
delete_note,
allowed_arguments=frozenset({"id"}),
),
AgentTool(
"create_reminder",
'{"when": string, "text": string}',
'{"when":"30m","text":"..."}',
(
"поставить напоминание. when можно указывать как '30m', "
"'через 2 часа', '18:30', '2026-07-16 18:30'. Если пользователь "
@@ -340,51 +347,59 @@ AGENT_TOOLS = (
"текущего локального времени и передай 'YYYY-MM-DD HH:MM'."
),
create_reminder,
allowed_arguments=frozenset({"when", "text"}),
),
AgentTool(
"list_reminders",
'{"limit": number}',
'{} (необязательно: "limit", по умолчанию 20)',
"показать активные напоминания.",
list_reminders,
allowed_arguments=frozenset({"limit"}),
),
AgentTool(
"cancel_reminder",
'{"id": number}',
'{"id":1}',
"отменить напоминание.",
cancel_reminder,
allowed_arguments=frozenset({"id"}),
),
AgentTool(
"create_status",
'{"title": string, "status": string}',
'{"title":"..."} (необязательно: "status", по умолчанию "open")',
"начать отслеживать статус.",
create_status,
allowed_arguments=frozenset({"title", "status"}),
),
AgentTool(
"list_statuses",
'{"limit": number}',
'{} (необязательно: "limit", по умолчанию 30)',
"показать отслеживаемые статусы.",
list_statuses,
allowed_arguments=frozenset({"limit"}),
),
AgentTool(
"update_status",
'{"id": number, "status": string}',
'{"id":1,"status":"..."}',
"обновить статус.",
update_status,
allowed_arguments=frozenset({"id", "status"}),
),
AgentTool(
"delete_status",
'{"id": number}',
'{"id":1}',
"удалить отслеживаемый объект.",
delete_status,
allowed_arguments=frozenset({"id"}),
),
AgentTool(
"search_conversation",
'{"query": string, "limit": number}',
'{"query":"..."} (необязательно: "limit", по умолчанию 5)',
(
"найти старое обсуждение во всей сохраненной переписке по "
"содержательным ключевым словам."
),
search_conversation,
allowed_arguments=frozenset({"query", "limit"}),
paragraph_before=True,
),
)
@@ -406,6 +421,13 @@ def execute_agent_tool(
tool = AGENT_TOOL_BY_NAME.get(name.strip().lower())
if tool is None:
return {"ok": False, "error": f"unknown tool: {name}"}
unexpected_arguments = set(arguments) - tool.allowed_arguments
if unexpected_arguments:
unexpected = ", ".join(sorted(map(str, unexpected_arguments)))
return {
"ok": False,
"error": f"unexpected arguments: {unexpected}",
}
return tool.execute(
arguments,
ToolContext(