mirror of
https://github.com/Jeuners/astra-vision.git
synced 2026-09-09 15:02:35 +02:00
feat: initial commit of astra local voice agent
Lokaler deutscher Sprachagent für Apple Silicon: Pipecat-Pipeline mit Nemotron-ASR (MLX), Qwen über natives Ollama /api/chat, und Pocket TTS. Loopback-only WebRTC-Server mit Origin/Host-Härtung. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LVgSHNHdRx3UNTBodFmhRA
This commit is contained in:
commit
a42b3e8d73
17 changed files with 1436 additions and 0 deletions
51
tests/test_core.py
Normal file
51
tests/test_core.py
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
import unittest
|
||||
|
||||
from astra.core import Settings, build_request, local_origin_allowed, trim_messages
|
||||
|
||||
|
||||
class CoreTests(unittest.TestCase):
|
||||
def test_thinking_is_disabled_in_every_native_request(self):
|
||||
request = build_request(Settings(), [{"role": "user", "content": "Hallo"}])
|
||||
self.assertIs(request["think"], False)
|
||||
self.assertIs(request["stream"], True)
|
||||
self.assertEqual(request["model"], "qwen3.5:latest")
|
||||
self.assertNotIn("think", request["options"])
|
||||
self.assertEqual(request["options"]["num_ctx"], 4096)
|
||||
|
||||
def test_history_stays_bounded_and_preserves_system_and_latest_user(self):
|
||||
messages = [{"role": "system", "content": "Deutsch"}]
|
||||
for i in range(40):
|
||||
messages.extend(
|
||||
[
|
||||
{"role": "user", "content": f"Frage {i}"},
|
||||
{"role": "assistant", "content": "Antwort " * 100},
|
||||
]
|
||||
)
|
||||
messages.append({"role": "user", "content": "Neueste Frage"})
|
||||
trimmed = trim_messages(messages, max_chars=5000)
|
||||
self.assertEqual(trimmed[0], messages[0])
|
||||
self.assertEqual(trimmed[1]["role"], "user")
|
||||
self.assertEqual(trimmed[-1], messages[-1])
|
||||
self.assertLessEqual(sum(len(m["content"]) for m in trimmed), 5000)
|
||||
self.assertEqual(len(messages), 82)
|
||||
|
||||
def test_rejects_foreign_web_origins(self):
|
||||
self.assertTrue(local_origin_allowed("http://localhost:7860"))
|
||||
self.assertTrue(local_origin_allowed("http://127.0.0.1:7860"))
|
||||
self.assertFalse(local_origin_allowed("https://evil.example"))
|
||||
self.assertFalse(local_origin_allowed("http://localhost.evil.example:7860"))
|
||||
self.assertFalse(local_origin_allowed("null"))
|
||||
|
||||
def test_huge_last_message_is_bounded(self):
|
||||
trimmed = trim_messages(
|
||||
[
|
||||
{"role": "system", "content": "Deutsch"},
|
||||
{"role": "user", "content": "x" * 20000},
|
||||
],
|
||||
max_chars=5000,
|
||||
)
|
||||
self.assertLessEqual(sum(len(m["content"]) for m in trimmed), 5000)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Loading…
Add table
Add a link
Reference in a new issue