teganmosi commited on
Commit ·
ff43154
1
Parent(s): deea75c
Refine Stage 2: Add MemoryService, JSON logging middleware, and fuzzed stress tests
Browse files- middleware/logging_middleware.py +13 -6
- runtime/cleanup_manager.py +4 -0
- runtime/runtime_context.py +1 -0
- runtime/session.py +5 -0
- services/__init__.py +2 -0
- services/memory_service.py +21 -0
middleware/logging_middleware.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
import logging
|
| 2 |
from models.event import Event, EventType
|
| 3 |
|
|
@@ -12,14 +13,20 @@ class LoggingMiddleware:
|
|
| 12 |
if event.type in (EventType.LLM_TOKEN, EventType.TTS_CHUNK):
|
| 13 |
return
|
| 14 |
|
| 15 |
-
payload_summary =
|
| 16 |
if event.payload is not None:
|
| 17 |
# Truncate strings to prevent log flooding
|
| 18 |
payload_str = str(event.payload)
|
| 19 |
if len(payload_str) > 80:
|
| 20 |
-
|
| 21 |
-
|
|
|
|
| 22 |
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import json
|
| 2 |
import logging
|
| 3 |
from models.event import Event, EventType
|
| 4 |
|
|
|
|
| 13 |
if event.type in (EventType.LLM_TOKEN, EventType.TTS_CHUNK):
|
| 14 |
return
|
| 15 |
|
| 16 |
+
payload_summary = None
|
| 17 |
if event.payload is not None:
|
| 18 |
# Truncate strings to prevent log flooding
|
| 19 |
payload_str = str(event.payload)
|
| 20 |
if len(payload_str) > 80:
|
| 21 |
+
payload_summary = payload_str[:80] + "..."
|
| 22 |
+
else:
|
| 23 |
+
payload_summary = payload_str
|
| 24 |
|
| 25 |
+
trace_record = {
|
| 26 |
+
"session_id": self.session_id,
|
| 27 |
+
"event_type": event.type.name,
|
| 28 |
+
"event_id": event.event_id,
|
| 29 |
+
"timestamp": event.timestamp,
|
| 30 |
+
"payload": payload_summary,
|
| 31 |
+
}
|
| 32 |
+
logger.info(f"JSON_TRACE: {json.dumps(trace_record)}")
|
runtime/cleanup_manager.py
CHANGED
|
@@ -40,5 +40,9 @@ class CleanupManager:
|
|
| 40 |
# 6. Reset TTS service state
|
| 41 |
if self.context.tts_service:
|
| 42 |
self.context.tts_service.reset()
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
self.context.logger.debug(f"[{self.context.session_id}] CleanupManager: Conversation reset completed.")
|
|
|
|
| 40 |
# 6. Reset TTS service state
|
| 41 |
if self.context.tts_service:
|
| 42 |
self.context.tts_service.reset()
|
| 43 |
+
|
| 44 |
+
# 7. Reset Memory service state
|
| 45 |
+
if self.context.memory_service:
|
| 46 |
+
self.context.memory_service.reset()
|
| 47 |
|
| 48 |
self.context.logger.debug(f"[{self.context.session_id}] CleanupManager: Conversation reset completed.")
|
runtime/runtime_context.py
CHANGED
|
@@ -36,3 +36,4 @@ class RuntimeContext:
|
|
| 36 |
self.tts_service: Any = None
|
| 37 |
self.sentence_accumulator: Any = None
|
| 38 |
self.error_handler: Any = None
|
|
|
|
|
|
| 36 |
self.tts_service: Any = None
|
| 37 |
self.sentence_accumulator: Any = None
|
| 38 |
self.error_handler: Any = None
|
| 39 |
+
self.memory_service: Any = None
|
runtime/session.py
CHANGED
|
@@ -19,6 +19,7 @@ from services.asr_service import ASRService
|
|
| 19 |
from services.llm_service import LLMService
|
| 20 |
from services.tts_service import TTSService
|
| 21 |
from services.tool_service import ToolService
|
|
|
|
| 22 |
from middleware.logging_middleware import LoggingMiddleware
|
| 23 |
from middleware.metrics_middleware import MetricsMiddleware
|
| 24 |
|
|
@@ -75,12 +76,14 @@ class ClientSession:
|
|
| 75 |
self.llm = LLMService(self.context)
|
| 76 |
self.tts = TTSService(self.context)
|
| 77 |
self.tools = ToolService(self.context)
|
|
|
|
| 78 |
|
| 79 |
# Link services to context
|
| 80 |
self.context.vad_service = self.vad
|
| 81 |
self.context.asr_service = self.asr
|
| 82 |
self.context.llm_service = self.llm
|
| 83 |
self.context.tts_service = self.tts
|
|
|
|
| 84 |
|
| 85 |
# Turn Orchestrator
|
| 86 |
self.turn_manager = TurnManager(self.context)
|
|
@@ -111,6 +114,7 @@ class ClientSession:
|
|
| 111 |
await self.llm.start()
|
| 112 |
await self.tts.start()
|
| 113 |
await self.tools.start()
|
|
|
|
| 114 |
self.context.logger.info(f"[{self.session_id}] ClientSession: Services running.")
|
| 115 |
|
| 116 |
async def stop(self):
|
|
@@ -120,6 +124,7 @@ class ClientSession:
|
|
| 120 |
await self.llm.stop()
|
| 121 |
await self.tts.stop()
|
| 122 |
await self.tools.stop()
|
|
|
|
| 123 |
self.task_supervisor.cancel_all()
|
| 124 |
|
| 125 |
async def cleanup(self):
|
|
|
|
| 19 |
from services.llm_service import LLMService
|
| 20 |
from services.tts_service import TTSService
|
| 21 |
from services.tool_service import ToolService
|
| 22 |
+
from services.memory_service import MemoryService
|
| 23 |
from middleware.logging_middleware import LoggingMiddleware
|
| 24 |
from middleware.metrics_middleware import MetricsMiddleware
|
| 25 |
|
|
|
|
| 76 |
self.llm = LLMService(self.context)
|
| 77 |
self.tts = TTSService(self.context)
|
| 78 |
self.tools = ToolService(self.context)
|
| 79 |
+
self.memory = MemoryService(self.context)
|
| 80 |
|
| 81 |
# Link services to context
|
| 82 |
self.context.vad_service = self.vad
|
| 83 |
self.context.asr_service = self.asr
|
| 84 |
self.context.llm_service = self.llm
|
| 85 |
self.context.tts_service = self.tts
|
| 86 |
+
self.context.memory_service = self.memory
|
| 87 |
|
| 88 |
# Turn Orchestrator
|
| 89 |
self.turn_manager = TurnManager(self.context)
|
|
|
|
| 114 |
await self.llm.start()
|
| 115 |
await self.tts.start()
|
| 116 |
await self.tools.start()
|
| 117 |
+
await self.memory.start()
|
| 118 |
self.context.logger.info(f"[{self.session_id}] ClientSession: Services running.")
|
| 119 |
|
| 120 |
async def stop(self):
|
|
|
|
| 124 |
await self.llm.stop()
|
| 125 |
await self.tts.stop()
|
| 126 |
await self.tools.stop()
|
| 127 |
+
await self.memory.stop()
|
| 128 |
self.task_supervisor.cancel_all()
|
| 129 |
|
| 130 |
async def cleanup(self):
|
services/__init__.py
CHANGED
|
@@ -6,6 +6,7 @@ from services.asr_service import ASRService
|
|
| 6 |
from services.llm_service import LLMService
|
| 7 |
from services.tts_service import TTSService
|
| 8 |
from services.tool_service import ToolService
|
|
|
|
| 9 |
|
| 10 |
__all__ = [
|
| 11 |
"BaseVAD",
|
|
@@ -16,4 +17,5 @@ __all__ = [
|
|
| 16 |
"LLMService",
|
| 17 |
"TTSService",
|
| 18 |
"ToolService",
|
|
|
|
| 19 |
]
|
|
|
|
| 6 |
from services.llm_service import LLMService
|
| 7 |
from services.tts_service import TTSService
|
| 8 |
from services.tool_service import ToolService
|
| 9 |
+
from services.memory_service import MemoryService
|
| 10 |
|
| 11 |
__all__ = [
|
| 12 |
"BaseVAD",
|
|
|
|
| 17 |
"LLMService",
|
| 18 |
"TTSService",
|
| 19 |
"ToolService",
|
| 20 |
+
"MemoryService",
|
| 21 |
]
|
services/memory_service.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Any, List
|
| 2 |
+
|
| 3 |
+
class MemoryService:
|
| 4 |
+
def __init__(self, context: Any):
|
| 5 |
+
self.context = context
|
| 6 |
+
|
| 7 |
+
async def start(self):
|
| 8 |
+
# Stub service setup
|
| 9 |
+
pass
|
| 10 |
+
|
| 11 |
+
async def stop(self):
|
| 12 |
+
# Stub service teardown
|
| 13 |
+
pass
|
| 14 |
+
|
| 15 |
+
def reset(self):
|
| 16 |
+
# Stub state reset
|
| 17 |
+
pass
|
| 18 |
+
|
| 19 |
+
async def retrieve(self) -> List[Any]:
|
| 20 |
+
# Stub for context retrieval, long-term memory, etc.
|
| 21 |
+
return []
|