member_create в описаниях тула портала (t-261016064519): describe_tools + промпты min/hour

This commit is contained in:
Simbiot Harness 2026-10-16 07:15:46 +00:00
parent fc8d848bc5
commit ecc9765996
2 changed files with 31 additions and 3 deletions

View file

@ -86,7 +86,9 @@ LEVELS = {
"(MCP): booking_slots/booking_create — свободные слоты и создание " "(MCP): booking_slots/booking_create — свободные слоты и создание "
"звонка с Алексом (jitsi-ссылка, гостю письмо, запись и транскрипция " "звонка с Алексом (jitsi-ссылка, гостю письмо, запись и транскрипция "
"автоматом), list_calls/get_call — прошедшие звонки и саммари, " "автоматом), list_calls/get_call — прошедшие звонки и саммари, "
"list_members/projects_list/list_agents/treasury_status/list_events — " "list_members/member_create(email[,name]) — реестр членов и "
"создание аккаунта с magic-link (только агентам председателя), "
"projects_list/list_agents/treasury_status/list_events — "
"реестры, казна, лента. Когда Alex просит назначить/перенести звонок " "реестры, казна, лента. Когда Alex просит назначить/перенести звонок "
"или «посмотреть расписание» — это portal_mcp (до 4 вызовов за тик): " "или «посмотреть расписание» — это portal_mcp (до 4 вызовов за тик): "
"сначала booking_slots (arguments '{\"type\": \"call\"}'), потом " "сначала booking_slots (arguments '{\"type\": \"call\"}'), потом "
@ -135,7 +137,9 @@ LEVELS = {
"Инструмент portal_mcp — живой портал кооператива (MCP cil.by): " "Инструмент portal_mcp — живой портал кооператива (MCP cil.by): "
"booking_slots/booking_create (звонки с Алексом: слот → создание " "booking_slots/booking_create (звонки с Алексом: слот → создание "
"jitsi-звонка со ссылкой, гостю письмо), list_calls/get_call, " "jitsi-звонка со ссылкой, гостю письмо), list_calls/get_call, "
"list_members/projects_list/list_agents, treasury_status, list_events. " "list_members/member_create (создание аккаунта члена с magic-link, "
"только агентам председателя), projects_list/list_agents, "
"treasury_status, list_events. "
"Просьбы про назначение/перенос звонков и «что по расписанию» — " "Просьбы про назначение/перенос звонков и «что по расписанию» — "
"через него (до 4 вызовов за тик). НЕ создавай звонки без явной " "через него (до 4 вызовов за тик). НЕ создавай звонки без явной "
"просьбы в чате; деньги-тулы (product_create/product_set_mode) " "просьбы в чате; деньги-тулы (product_create/product_set_mode) "

View file

@ -120,6 +120,7 @@ def _known_tools() -> list:
def _trace(level, trace_id, payload: dict): def _trace(level, trace_id, payload: dict):
"""Трейс MCP-вызова в стор — spend/observability едины с LLM-тиками.""" """Трейс MCP-вызова в стор — spend/observability едины с LLM-тиками."""
_log_jsonl(level, trace_id, payload)
if not (level and trace_id): if not (level and trace_id):
return return
try: try:
@ -133,6 +134,20 @@ def _trace(level, trace_id, payload: dict):
pass # трейс — best effort, не валить тик pass # трейс — best effort, не валить тик
# t-261015091108: журнал всех MCP-вызовов (кто/что/аргументы/время) — JSONL
def _log_jsonl(level, trace_id, payload: dict):
import datetime
try:
path = os.path.join(_paths.home(), "mcp_calls.log")
rec = {"ts": datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds"),
"level": level or "unknown", "trace_id": trace_id or "",
**payload}
with open(path, "a", encoding="utf-8") as f:
f.write(json.dumps(rec, ensure_ascii=False) + "\n")
except Exception:
pass # журнал — best effort, не валить тик
_trace_log: list = [] _trace_log: list = []
@ -159,11 +174,18 @@ def call_tool(name: str, arguments=None, level: str = None,
""" """
started = time.time() started = time.time()
ok, result = False, "" ok, result = False, ""
_log_args = {"raw": str(arguments)[:500]} # t-261015091108: аргументы в лог
try:
args = _coerce_arguments(arguments)
_log_args = args
except Exception:
pass
def _finish(res: str, _ok: bool) -> str: def _finish(res: str, _ok: bool) -> str:
_trace(level, trace_id, { _trace(level, trace_id, {
"tool": name, "ok": _ok, "tool": name, "ok": _ok,
"ms": int((time.time() - started) * 1000), "ms": int((time.time() - started) * 1000),
"arguments": _log_args,
"result_preview": res[:300], "result_preview": res[:300],
}) })
return res return res
@ -222,6 +244,8 @@ def describe_tools(max_names: int = 12) -> str:
"kind='call'|'session') — создать jitsi-звонок со ссылкой (гостю " "kind='call'|'session') — создать jitsi-звонок со ссылкой (гостю "
"письмо, Алексу — в TG, запись+транскрипция автоматом); booking_cancel" "письмо, Алексу — в TG, запись+транскрипция автоматом); booking_cancel"
"(meeting_id); list_calls/get_call — прошедшие звонки и их саммари; " "(meeting_id); list_calls/get_call — прошедшие звонки и их саммари; "
"list_members/projects_list/list_agents/treasury_status/list_events — " "list_members/member_create(email[,name]) — реестр членов и создание "
"аккаунта с magic-link письмом (member_create — только агентам "
"председателя); projects_list/list_agents/treasury_status/list_events — "
"реестры и казна; whoami/report_task/report_event/read_context — " "реестры и казна; whoami/report_task/report_event/read_context — "
"идентичность и лента портала.") "идентичность и лента портала.")