Add deep Assistent probes to the Debug API.

Expose /assistent subpaths for extension/DLL, overlay personas, roles, memory sqlite, live Assistent* API smoke, and optional chat_smoke so agents can diagnose missing tab, empty chat, and wrong models over HTTP.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-23 06:27:31 +03:00
co-authored by Cursor
parent 5847eaab3f
commit 2d404436bd
7 changed files with 1148 additions and 110 deletions
+135 -7
View File
@@ -84,7 +84,54 @@ _OPENAPI: dict[str, Any] = {
"/gpu": {"get": {"summary": "nvidia-smi / CUDA / torch probe"}},
"/swarm": {"get": {"summary": "SwarmUI backend_status + ListBackends"}},
"/ollama": {"get": {"summary": "Ollama tags + ps"}},
"/assistent": {"get": {"summary": "Extension + personas + LLM readiness"}},
"/assistent": {
"get": {
"summary": "Deep Assistent bundle (extension/roles/api/hints)",
"parameters": [
{
"name": "chat_smoke",
"in": "query",
"schema": {"type": "boolean"},
"description": "1-token Ollama /api/chat with preferred model",
},
{
"name": "logs",
"in": "query",
"schema": {"type": "boolean"},
"description": "Include filtered swarmui journal lines",
},
],
}
},
"/assistent/extension": {
"get": {"summary": "DLL/Sqlite deps/Tab assets under Extensions/swarm-assistent"}
},
"/assistent/overlay": {
"get": {"summary": "Overlay personas + _base/assistant.json vs local seed"}
},
"/assistent/roles": {
"get": {"summary": "ollama-roles.json vs /api/tags (default_chat)"}
},
"/assistent/memory": {
"get": {"summary": "assistent.sqlite presence + counts + Sqlite DLL hint"}
},
"/assistent/api": {
"get": {
"summary": "Live AssistentListPersonas/Models/Memory/Chats smoke",
"parameters": [
{
"name": "chat_smoke",
"in": "query",
"schema": {"type": "boolean"},
"description": "Also run 1-token Ollama chat",
}
],
}
},
"/assistent/wanted": {"get": {"summary": "Wanted-models queue on data volume"}},
"/assistent/logs": {
"get": {"summary": "journalctl swarmui filtered for Assistent/Sqlite/build"}
},
},
}
@@ -420,12 +467,92 @@ def _make_handler(hub: DebugHub):
)
self._json(200, payload)
return
if path == "/assistent":
payload = hub.cached(
"assistent",
CACHE_TTL_DEFAULT,
lambda: debug_checks.collect_assistent(hub.cfg),
)
if path == "/assistent" or path.startswith("/assistent/"):
from gpu_rent import debug_assistent
def _flag(name: str) -> bool:
raw = (qs.get(name) or ["0"])[0].strip().lower()
return raw in {"1", "true", "yes", "on"}
chat_smoke = _flag("chat_smoke")
include_logs = _flag("logs")
sub = path[len("/assistent") :].lstrip("/") or ""
if sub == "":
cache_key = f"assistent:{int(chat_smoke)}:{int(include_logs)}"
payload = hub.cached(
cache_key,
CACHE_TTL_DEFAULT,
lambda: debug_checks.collect_assistent(
hub.cfg,
chat_smoke=chat_smoke,
include_logs=include_logs,
),
)
elif sub == "extension":
payload = hub.cached(
"assistent/extension",
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_extension(hub.cfg),
)
elif sub == "overlay":
payload = hub.cached(
"assistent/overlay",
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_overlay(hub.cfg),
)
elif sub == "roles":
payload = hub.cached(
"assistent/roles",
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_roles(hub.cfg),
)
elif sub == "memory":
payload = hub.cached(
"assistent/memory",
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_memory(hub.cfg),
)
elif sub == "api":
cache_key = f"assistent/api:{int(chat_smoke)}"
payload = hub.cached(
cache_key,
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_api(
hub.cfg, chat_smoke=chat_smoke
),
)
elif sub == "wanted":
payload = hub.cached(
"assistent/wanted",
CACHE_TTL_DEFAULT,
lambda: debug_assistent.collect_assistent_wanted(hub.cfg),
)
elif sub == "logs":
payload = hub.cached(
"assistent/logs",
CACHE_TTL_LOGS,
lambda: debug_assistent.collect_assistent_logs(hub.cfg),
)
else:
self._json(
404,
{
"ok": False,
"error": f"unknown path {path}",
"try": [
"/assistent",
"/assistent/extension",
"/assistent/overlay",
"/assistent/roles",
"/assistent/memory",
"/assistent/api",
"/assistent/wanted",
"/assistent/logs",
],
},
)
return
self._json(200, payload)
return
@@ -483,6 +610,7 @@ def start_debug_server(
f"Debug API {base}/",
f" {base}/openapi.json",
f" {base}/snapshot",
f" {base}/assistent",
]
if log:
for line in lines: