relay preparing for public internet
This commit is contained in:
@@ -451,6 +451,8 @@ def test_tracker_derives_relay_url_from_public_self_url():
|
||||
with urllib.request.urlopen(f"http://127.0.0.1:{port}/v1/network/map", timeout=5) as resp:
|
||||
body = _json.loads(resp.read())
|
||||
assert body["relay_url"] == "wss://ai.neuron.d-popov.com/ws"
|
||||
assert body["relay"]["mode"] == "external"
|
||||
assert body["relay"]["url"] == "wss://ai.neuron.d-popov.com/ws"
|
||||
finally:
|
||||
tracker.stop()
|
||||
|
||||
@@ -501,10 +503,46 @@ def test_tracker_network_map_exposes_relay_and_registered_peer():
|
||||
tracker.stop()
|
||||
|
||||
assert body["relay_url"] == "wss://ai.neuron.d-popov.com/ws"
|
||||
assert body["relay"]["mode"] == "external"
|
||||
assert body["nodes"][0]["relay_addr"] == "wss://ai.neuron.d-popov.com/rpc/peer123"
|
||||
assert body["nodes"][0]["peer_id"] == "peer123"
|
||||
|
||||
|
||||
def test_tracker_can_embed_relay_server_and_advertise_it():
|
||||
import json as _json
|
||||
import urllib.request
|
||||
|
||||
import websockets.sync.client as wsc # type: ignore[import]
|
||||
from meshnet_tracker.server import TrackerServer
|
||||
|
||||
tracker = TrackerServer(
|
||||
host="127.0.0.1",
|
||||
port=0,
|
||||
embedded_relay=True,
|
||||
embedded_relay_host="127.0.0.1",
|
||||
embedded_relay_port=0,
|
||||
)
|
||||
port = tracker.start()
|
||||
try:
|
||||
with urllib.request.urlopen(f"http://127.0.0.1:{port}/v1/network/map", timeout=5) as resp:
|
||||
body = _json.loads(resp.read())
|
||||
assert body["relay"]["mode"] == "embedded"
|
||||
assert body["relay_url"].startswith("ws://127.0.0.1:")
|
||||
assert body["relay_url"].endswith("/ws")
|
||||
with wsc.connect(body["relay_url"], open_timeout=5) as ws:
|
||||
ws.send(_json.dumps({
|
||||
"topic": "peer-register",
|
||||
"version": 1,
|
||||
"from_peer": "embedded-peer",
|
||||
"msg_id": "embedded-reg-1",
|
||||
"payload": {"peer_id": "embedded-peer", "addr": ""},
|
||||
}))
|
||||
peer_list = _json.loads(ws.recv(timeout=5))
|
||||
assert peer_list["topic"] == "peer-list"
|
||||
finally:
|
||||
tracker.stop()
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# mDNS (no-op without zeroconf installed)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -260,6 +260,49 @@ def test_eos_token_id_stops_generation():
|
||||
assert len(tail_backend.calls) == 2
|
||||
|
||||
|
||||
def test_stateless_fallback_stops_at_eos_token_id():
|
||||
"""When kv caching is off, EOS must still stop generation by token id —
|
||||
EOS decodes to "" (skip_special_tokens) so the text check never fires."""
|
||||
|
||||
class _StatelessHead(_CachedHeadBackend):
|
||||
supports_kv_cache = False
|
||||
|
||||
head_backend = _StatelessHead()
|
||||
tail_backend = _CachedTailBackend([(" a", 1), ("", 99), (" never", 3)])
|
||||
head = TorchNodeServer(backend=head_backend, tracker_mode=True)
|
||||
tail = TorchNodeServer(backend=tail_backend)
|
||||
head_port = head.start()
|
||||
tail_port = tail.start()
|
||||
try:
|
||||
content = _chat_once(head_port, tail_port, max_tokens=8)
|
||||
finally:
|
||||
head.stop()
|
||||
tail.stop()
|
||||
|
||||
assert content == " a"
|
||||
# Stops after the EOS step instead of burning steps until max_tokens.
|
||||
assert len(tail_backend.calls) == 2
|
||||
assert head_backend.decode_calls == []
|
||||
|
||||
|
||||
def test_decode_forward_logging_is_rate_limited():
|
||||
"""Shard nodes log a per-session decode summary, not one line per token."""
|
||||
tail_backend = _CachedTailBackend([])
|
||||
tail = TorchNodeServer(backend=tail_backend)
|
||||
tail.start()
|
||||
try:
|
||||
srv = tail._server
|
||||
assert srv.note_decode_step("s1", now=0.0) == 1
|
||||
assert srv.note_decode_step("s1", now=1.0) is None
|
||||
assert srv.note_decode_step("s1", now=4.9) is None
|
||||
assert srv.note_decode_step("s1", now=5.5) == 4
|
||||
assert srv.note_decode_step("s1", now=6.0) is None
|
||||
# Sessions are throttled independently.
|
||||
assert srv.note_decode_step("s2", now=6.0) == 1
|
||||
finally:
|
||||
tail.stop()
|
||||
|
||||
|
||||
def test_downstream_cache_miss_falls_back_to_full_reprefill():
|
||||
head_backend = _CachedHeadBackend()
|
||||
# Call 1 (the first decode) raises KVCacheMiss → node answers 409 →
|
||||
|
||||
Reference in New Issue
Block a user