Add offline analysis and client event tracking to Assistent API
- Introduced `/assistent/analyze-reply` endpoint for offline extraction of patches and client predictions without VRAM. - Added `/assistent/client-event` and `/assistent/client-events` endpoints for tracking UI interactions and retrieving event history. - Updated Debug API documentation to reflect new endpoints and their functionalities. - Enhanced Assistent session handling with improved client prediction logic and diagnostics. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -4,7 +4,12 @@ from __future__ import annotations
|
||||
|
||||
import time
|
||||
|
||||
from gpu_rent.debug_assistent import extract_assistent_patch
|
||||
from gpu_rent.debug_assistent import (
|
||||
analyze_assistent_reply,
|
||||
extract_assistent_patch,
|
||||
predict_client_turn,
|
||||
user_asks_generate,
|
||||
)
|
||||
from gpu_rent import debug_assistent_session as das
|
||||
|
||||
|
||||
@@ -33,6 +38,51 @@ def test_extract_assistent_patch_ignores_non_patch_json():
|
||||
assert out["patch"] is None
|
||||
|
||||
|
||||
def test_predict_client_turn_civitai_question_no_patch():
|
||||
pred = predict_client_turn("а ты знаешь какие то промпты с civitai", None)
|
||||
assert pred["user_asks_generate"] is False
|
||||
assert pred["would_generate"] is False
|
||||
assert pred["http_starts_generate"] is False
|
||||
assert pred["generate_reason"] == "none"
|
||||
|
||||
|
||||
def test_predict_client_turn_model_flag_without_user_phrase():
|
||||
pred = predict_client_turn(
|
||||
"а ты знаешь какие то промпты с civitai",
|
||||
{"prompt": "a redhead", "generate": True},
|
||||
persona="neutral",
|
||||
)
|
||||
assert pred["user_asks_generate"] is False
|
||||
assert pred["model_generate"] is True
|
||||
assert pred["would_generate"] is False
|
||||
assert pred["generate_reason"] == "model_flag_ignored"
|
||||
assert pred["persona_chip"] == "Нормальный"
|
||||
|
||||
|
||||
def test_predict_client_turn_narisuy_with_prompt():
|
||||
pred = predict_client_turn("нарисуй лису", {"prompt": "a fox"})
|
||||
assert pred["user_asks_generate"] is True
|
||||
assert pred["would_generate"] is True
|
||||
assert pred["generate_reason"] == "user_phrase"
|
||||
assert user_asks_generate("нарисуй лису") is True
|
||||
assert user_asks_generate("Давай сделаем изображение рыжей") is True
|
||||
assert user_asks_generate("что ты умеешь") is False
|
||||
|
||||
|
||||
def test_analyze_assistent_reply_offline():
|
||||
out = analyze_assistent_reply(
|
||||
message="сгенерируй",
|
||||
reply='ok\n```json\n{"prompt":"a cat","generate":true}\n```\n',
|
||||
persona="leonid",
|
||||
pack="ordinary",
|
||||
)
|
||||
assert out["ok"] is True
|
||||
assert out["offline"] is True
|
||||
assert out["patch"]["generate"] is True
|
||||
assert out["client"]["would_generate"] is True
|
||||
assert out["client"]["generate_reason"] == "user_phrase"
|
||||
|
||||
|
||||
def test_analyze_exact_merge_fills_omitted_params():
|
||||
patch = {"actions": ["generate"], "prompt": "x"}
|
||||
exact = {
|
||||
|
||||
@@ -145,7 +145,49 @@ def test_debug_server_routes(monkeypatch, tmp_path):
|
||||
assert "/assistent/extension" in data["paths"]
|
||||
assert "/assistent/api" in data["paths"]
|
||||
assert "/assistent/chat-eval" in data["paths"]
|
||||
assert "/assistent/analyze-reply" in data["paths"]
|
||||
assert "post" in data["paths"]["/assistent/chat-eval"]
|
||||
assert "post" in data["paths"]["/assistent/analyze-reply"]
|
||||
|
||||
req = urllib.request.Request(
|
||||
f"http://127.0.0.1:{port}/assistent/analyze-reply",
|
||||
data=json.dumps(
|
||||
{
|
||||
"message": "а ты знаешь какие то промпты с civitai",
|
||||
"reply": '```json\n{"prompt":"x","generate":true}\n```',
|
||||
"persona": "neutral",
|
||||
}
|
||||
).encode("utf-8"),
|
||||
headers={"Content-Type": "application/json"},
|
||||
method="POST",
|
||||
)
|
||||
with urllib.request.urlopen(req, timeout=5) as resp:
|
||||
scored = json.loads(resp.read().decode("utf-8"))
|
||||
assert scored["ok"] is True
|
||||
assert scored["client"]["would_generate"] is False
|
||||
assert scored["client"]["user_asks_generate"] is False
|
||||
assert scored["client"]["model_generate"] is True
|
||||
assert scored["client"]["persona_chip"] == "Нормальный"
|
||||
|
||||
beacon = urllib.request.Request(
|
||||
f"http://127.0.0.1:{port}/assistent/client-event",
|
||||
data=json.dumps(
|
||||
{
|
||||
"user": "а ты знаешь какие то промпты с civitai",
|
||||
"generating": False,
|
||||
"intent": {"generate": False, "modelAsked": True},
|
||||
"swarm_prompt": "old prompt",
|
||||
}
|
||||
).encode("utf-8"),
|
||||
headers={"Content-Type": "application/json"},
|
||||
method="POST",
|
||||
)
|
||||
with urllib.request.urlopen(beacon, timeout=5) as resp:
|
||||
stored = json.loads(resp.read().decode("utf-8"))
|
||||
assert stored["ok"] is True
|
||||
code, data = get("/assistent/client-events")
|
||||
assert data["ok"] is True
|
||||
assert data["events"][-1]["generating"] is False
|
||||
|
||||
code, data = get("/assistent/chat-eval")
|
||||
assert "ok" in data
|
||||
|
||||
Reference in New Issue
Block a user