member_create в описаниях тула портала (t-261016064519): describe_tools + промпты min/hour
This commit is contained in:
parent
fc8d848bc5
commit
ecc9765996
2 changed files with 31 additions and 3 deletions
|
|
@ -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) "
|
||||||
|
|
|
||||||
|
|
@ -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 — "
|
||||||
"идентичность и лента портала.")
|
"идентичность и лента портала.")
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue