Files
odysseus/tests/test_chat_ttft_timer_static.py
T
Alexandre Teixeira f74a262f73 merge: reconcile PR 40 with current lab
Integrate lab fff55a78 into PR #40 (cc25d5ba). Lab's modular email
backend/frontend, modular settings, split stylesheets (static/style.css
stays deleted), procfs compatibility, and request-scoped TurnContract
authority win; PR #40's routing classifiers, editor/email/task features,
and style.css changes are ported into lab's module and stylesheet homes.

Integration fixes:
- settings/api.js imports ui.js under its canonical versioned URL
- browser observations keep legacy CAPTCHA/access-block evidence
- artifact turns do not re-trigger broad-web research recovery
- env reference documents PR test-tool variables; page regenerated

PR #40 defects surfaced by lab gates and fixed here:
- web_fetch generic schema drops top-level anyOf (OpenAI contract);
  the compact preview contract still requires url or urls
- get_weather registered as a brokered network read
- new lazy editor modules precached for offline use
- SearXNG pin mirrored into GPU standalone compose files
- image model picker again skips offline endpoints

Tests updated where PR #40 changed behaviour on purpose, and PR tests
moved onto lab's document_source helpers.
2026-10-01 05:03:58 +01:00

39 lines
1.6 KiB
Python

from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
CHAT = (ROOT / "static/js/chat.js").read_text()
RENDERER = (ROOT / "static/js/chatRenderer.js").read_text()
def test_processing_indicator_shows_live_ttft_timer():
assert "Processing request · ${elapsed.toFixed(1)}s" in CHAT
assert "_ttftDisplayTimer = setInterval(update, 100);" in CHAT
def test_ttft_stops_on_model_output_not_agent_prep_metadata():
assert "if (data && data !== '[DONE]') markFirstVisibleOutput();" not in CHAT
assert "typeof json.delta === 'string' && json.delta.length > 0" in CHAT
assert "json.type === 'final_response'" in CHAT
def test_measured_ttft_is_shown_in_message_stats():
assert "metrics.client_ttft = _clientTtftSeconds" in CHAT
assert "metrics.client_ttft ?? metrics.time_to_first_token" in RENDERER
assert '<span class="ctx-label">TTFT</span>' in RENDERER
def test_compact_footer_and_details_show_real_performance_counters():
assert "`${Number(tps).toFixed(2)} tok/s`" in RENDERER
assert "const visibleTtft = metrics.client_ttft ?? metrics.time_to_first_token" in RENDERER
assert "${Number(visibleTtft).toFixed(3)}s" in RENDERER
assert '<span class="ctx-label">Input</span>' in RENDERER
# Injected-context size is no longer a separate details row.
assert '<span class="ctx-label">Injected</span>' not in RENDERER
assert 'all rounds' not in RENDERER
assert 'first request' not in RENDERER
assert 'Tool schemas' in RENDERER
assert 'Agent rounds' in RENDERER
assert 'Tool calls' in RENDERER
assert "metrics.tps_source === 'computed' ? 'Speed (wall)'" in RENDERER