A previous `git pull --rebase origin main` dropped 177 local commits,
losing 3400+ files across admin-v2, backend, studio-v2, website,
klausur-service, and many other services. The partial restore attempt
(660295e2) only recovered some files.
This commit restores all missing files from pre-rebase ref 98933f5e
while preserving post-rebase additions (night-scheduler, night-mode UI,
NightModeWidget dashboard integration).
Restored features include:
- AI Module Sidebar (FAB), OCR Labeling, OCR Compare
- GPU Dashboard, RAG Pipeline, Magic Help
- Klausur-Korrektur (8 files), Abitur-Archiv (5+ files)
- Companion, Zeugnisse-Crawler, Screen Flow
- Full backend, studio-v2, website, klausur-service
- All compliance SDKs, agent-core, voice-service
- CI/CD configs, documentation, scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
417 lines
12 KiB
Markdown
417 lines
12 KiB
Markdown
# Breakpilot Agent Core
|
|
|
|
Multi-Agent Architecture Infrastructure für Breakpilot.
|
|
|
|
## Übersicht
|
|
|
|
Das `agent-core` Modul stellt die gemeinsame Infrastruktur für Breakpilots Multi-Agent-System bereit:
|
|
|
|
- **Session Management**: Agent-Sessions mit Checkpoints und Recovery
|
|
- **Shared Brain**: Langzeit-Gedächtnis und Kontext-Verwaltung
|
|
- **Orchestration**: Message Bus, Supervisor und Task-Routing
|
|
|
|
## Architektur
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
│ Breakpilot Services │
|
|
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │
|
|
│ │Voice Service│ │Klausur Svc │ │ Admin-v2 / AlertAgent │ │
|
|
│ └──────┬──────┘ └──────┬──────┘ └───────────┬─────────────┘ │
|
|
│ │ │ │ │
|
|
│ └────────────────┼──────────────────────┘ │
|
|
│ │ │
|
|
│ ┌───────────────────────▼───────────────────────────────────┐ │
|
|
│ │ Agent Core │ │
|
|
│ │ ┌─────────────┐ ┌─────────────┐ ┌───────────────────┐ │ │
|
|
│ │ │ Sessions │ │Shared Brain │ │ Orchestrator │ │ │
|
|
│ │ │ - Manager │ │ - Memory │ │ - Message Bus │ │ │
|
|
│ │ │ - Heartbeat │ │ - Context │ │ - Supervisor │ │ │
|
|
│ │ │ - Checkpoint│ │ - Knowledge │ │ - Task Router │ │ │
|
|
│ │ └─────────────┘ └─────────────┘ └───────────────────┘ │ │
|
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
│ │ │
|
|
│ ┌───────────────────────▼───────────────────────────────────┐ │
|
|
│ │ Infrastructure │ │
|
|
│ │ Valkey (Redis) PostgreSQL Qdrant │ │
|
|
│ └───────────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Verzeichnisstruktur
|
|
|
|
```
|
|
agent-core/
|
|
├── __init__.py # Modul-Exports
|
|
├── README.md # Diese Datei
|
|
├── requirements.txt # Python-Abhängigkeiten
|
|
├── pytest.ini # Test-Konfiguration
|
|
│
|
|
├── soul/ # Agent SOUL Files (Persönlichkeiten)
|
|
│ ├── tutor-agent.soul.md
|
|
│ ├── grader-agent.soul.md
|
|
│ ├── quality-judge.soul.md
|
|
│ ├── alert-agent.soul.md
|
|
│ └── orchestrator.soul.md
|
|
│
|
|
├── brain/ # Shared Brain Implementation
|
|
│ ├── __init__.py
|
|
│ ├── memory_store.py # Langzeit-Gedächtnis
|
|
│ ├── context_manager.py # Konversations-Kontext
|
|
│ └── knowledge_graph.py # Entity-Beziehungen
|
|
│
|
|
├── sessions/ # Session Management
|
|
│ ├── __init__.py
|
|
│ ├── session_manager.py # Session-Lifecycle
|
|
│ ├── heartbeat.py # Liveness-Monitoring
|
|
│ └── checkpoint.py # Recovery-Checkpoints
|
|
│
|
|
├── orchestrator/ # Multi-Agent Orchestration
|
|
│ ├── __init__.py
|
|
│ ├── message_bus.py # Inter-Agent Kommunikation
|
|
│ ├── supervisor.py # Agent-Überwachung
|
|
│ └── task_router.py # Intent-basiertes Routing
|
|
│
|
|
└── tests/ # Unit Tests
|
|
├── conftest.py
|
|
├── test_session_manager.py
|
|
├── test_heartbeat.py
|
|
├── test_message_bus.py
|
|
├── test_memory_store.py
|
|
└── test_task_router.py
|
|
```
|
|
|
|
## Komponenten
|
|
|
|
### 1. Session Management
|
|
|
|
Verwaltet Agent-Sessions mit State-Machine und Recovery-Fähigkeiten.
|
|
|
|
```python
|
|
from agent_core.sessions import SessionManager, AgentSession
|
|
|
|
# Session Manager erstellen
|
|
manager = SessionManager(
|
|
redis_client=redis,
|
|
db_pool=pg_pool,
|
|
namespace="breakpilot"
|
|
)
|
|
|
|
# Session erstellen
|
|
session = await manager.create_session(
|
|
agent_type="tutor-agent",
|
|
user_id="user-123",
|
|
context={"subject": "math"}
|
|
)
|
|
|
|
# Checkpoint setzen
|
|
session.checkpoint("task_started", {"task_id": "abc"})
|
|
|
|
# Session beenden
|
|
session.complete({"result": "success"})
|
|
```
|
|
|
|
**Session States:**
|
|
- `ACTIVE` - Session läuft
|
|
- `PAUSED` - Session pausiert
|
|
- `COMPLETED` - Session erfolgreich beendet
|
|
- `FAILED` - Session fehlgeschlagen
|
|
|
|
### 2. Heartbeat Monitoring
|
|
|
|
Überwacht Agent-Liveness und triggert Recovery bei Timeout.
|
|
|
|
```python
|
|
from agent_core.sessions import HeartbeatMonitor, HeartbeatClient
|
|
|
|
# Monitor starten
|
|
monitor = HeartbeatMonitor(
|
|
timeout_seconds=30,
|
|
check_interval_seconds=5,
|
|
max_missed_beats=3
|
|
)
|
|
await monitor.start_monitoring()
|
|
|
|
# Agent registrieren
|
|
monitor.register("agent-1", "tutor-agent")
|
|
|
|
# Heartbeat senden
|
|
async with HeartbeatClient("agent-1", monitor) as client:
|
|
# Agent-Arbeit...
|
|
pass
|
|
```
|
|
|
|
### 3. Memory Store
|
|
|
|
Langzeit-Gedächtnis für Agents mit TTL und Access-Tracking.
|
|
|
|
```python
|
|
from agent_core.brain import MemoryStore
|
|
|
|
store = MemoryStore(redis_client=redis, db_pool=pg_pool)
|
|
|
|
# Erinnerung speichern
|
|
await store.remember(
|
|
key="evaluation:math:student-1",
|
|
value={"score": 85, "feedback": "Gut gemacht!"},
|
|
agent_id="grader-agent",
|
|
ttl_days=30
|
|
)
|
|
|
|
# Erinnerung abrufen
|
|
result = await store.recall("evaluation:math:student-1")
|
|
|
|
# Nach Pattern suchen
|
|
similar = await store.search("evaluation:math:*")
|
|
```
|
|
|
|
### 4. Context Manager
|
|
|
|
Verwaltet Konversationskontext mit automatischer Komprimierung.
|
|
|
|
```python
|
|
from agent_core.brain import ContextManager, MessageRole
|
|
|
|
ctx_manager = ContextManager(redis_client=redis)
|
|
|
|
# Kontext erstellen
|
|
context = ctx_manager.create_context(
|
|
session_id="session-123",
|
|
system_prompt="Du bist ein hilfreicher Tutor...",
|
|
max_messages=50
|
|
)
|
|
|
|
# Nachrichten hinzufügen
|
|
context.add_message(MessageRole.USER, "Was ist Photosynthese?")
|
|
context.add_message(MessageRole.ASSISTANT, "Photosynthese ist...")
|
|
|
|
# Für LLM API formatieren
|
|
messages = context.get_messages_for_llm()
|
|
```
|
|
|
|
### 5. Message Bus
|
|
|
|
Inter-Agent Kommunikation via Redis Pub/Sub.
|
|
|
|
```python
|
|
from agent_core.orchestrator import MessageBus, AgentMessage, MessagePriority
|
|
|
|
bus = MessageBus(redis_client=redis)
|
|
await bus.start()
|
|
|
|
# Handler registrieren
|
|
async def handle_message(msg):
|
|
return {"status": "processed"}
|
|
|
|
await bus.subscribe("grader-agent", handle_message)
|
|
|
|
# Nachricht senden
|
|
await bus.publish(AgentMessage(
|
|
sender="orchestrator",
|
|
receiver="grader-agent",
|
|
message_type="grade_request",
|
|
payload={"exam_id": "exam-1"},
|
|
priority=MessagePriority.HIGH
|
|
))
|
|
|
|
# Request-Response Pattern
|
|
response = await bus.request(message, timeout=30.0)
|
|
```
|
|
|
|
### 6. Agent Supervisor
|
|
|
|
Überwacht und koordiniert alle Agents.
|
|
|
|
```python
|
|
from agent_core.orchestrator import AgentSupervisor, RestartPolicy
|
|
|
|
supervisor = AgentSupervisor(message_bus=bus, heartbeat_monitor=monitor)
|
|
|
|
# Agent registrieren
|
|
await supervisor.register_agent(
|
|
agent_id="tutor-1",
|
|
agent_type="tutor-agent",
|
|
restart_policy=RestartPolicy.ON_FAILURE,
|
|
max_restarts=3,
|
|
capacity=10
|
|
)
|
|
|
|
# Agent starten
|
|
await supervisor.start_agent("tutor-1")
|
|
|
|
# Load Balancing
|
|
available = supervisor.get_available_agent("tutor-agent")
|
|
```
|
|
|
|
### 7. Task Router
|
|
|
|
Intent-basiertes Routing mit Fallback-Ketten.
|
|
|
|
```python
|
|
from agent_core.orchestrator import TaskRouter, RoutingRule, RoutingStrategy
|
|
|
|
router = TaskRouter(supervisor=supervisor)
|
|
|
|
# Eigene Regel hinzufügen
|
|
router.add_rule(RoutingRule(
|
|
intent_pattern="learning_*",
|
|
agent_type="tutor-agent",
|
|
priority=10,
|
|
fallback_agent="orchestrator"
|
|
))
|
|
|
|
# Task routen
|
|
result = await router.route(
|
|
intent="learning_math",
|
|
context={"grade": 10},
|
|
strategy=RoutingStrategy.LEAST_LOADED
|
|
)
|
|
|
|
if result.success:
|
|
print(f"Routed to {result.agent_id}")
|
|
```
|
|
|
|
## SOUL Files
|
|
|
|
SOUL-Dateien definieren die Persönlichkeit und Verhaltensregeln jedes Agents.
|
|
|
|
| Agent | SOUL File | Verantwortlichkeit |
|
|
|-------|-----------|-------------------|
|
|
| TutorAgent | tutor-agent.soul.md | Lernbegleitung, Fragen beantworten |
|
|
| GraderAgent | grader-agent.soul.md | Klausur-Korrektur, Bewertung |
|
|
| QualityJudge | quality-judge.soul.md | BQAS Qualitätsprüfung |
|
|
| AlertAgent | alert-agent.soul.md | Monitoring, Benachrichtigungen |
|
|
| Orchestrator | orchestrator.soul.md | Task-Koordination |
|
|
|
|
## Datenbank-Schema
|
|
|
|
### agent_sessions
|
|
```sql
|
|
CREATE TABLE agent_sessions (
|
|
id UUID PRIMARY KEY,
|
|
agent_type VARCHAR(50) NOT NULL,
|
|
user_id UUID REFERENCES users(id),
|
|
state VARCHAR(20) NOT NULL DEFAULT 'active',
|
|
context JSONB DEFAULT '{}',
|
|
checkpoints JSONB DEFAULT '[]',
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
last_heartbeat TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
```
|
|
|
|
### agent_memory
|
|
```sql
|
|
CREATE TABLE agent_memory (
|
|
id UUID PRIMARY KEY,
|
|
namespace VARCHAR(100) NOT NULL,
|
|
key VARCHAR(500) NOT NULL,
|
|
value JSONB NOT NULL,
|
|
agent_id VARCHAR(50) NOT NULL,
|
|
access_count INTEGER DEFAULT 0,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
expires_at TIMESTAMPTZ,
|
|
UNIQUE(namespace, key)
|
|
);
|
|
```
|
|
|
|
### agent_messages
|
|
```sql
|
|
CREATE TABLE agent_messages (
|
|
id UUID PRIMARY KEY,
|
|
sender VARCHAR(50) NOT NULL,
|
|
receiver VARCHAR(50) NOT NULL,
|
|
message_type VARCHAR(50) NOT NULL,
|
|
payload JSONB NOT NULL,
|
|
priority INTEGER DEFAULT 1,
|
|
correlation_id UUID,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
```
|
|
|
|
## Integration
|
|
|
|
### Mit Voice-Service
|
|
|
|
```python
|
|
from services.enhanced_task_orchestrator import EnhancedTaskOrchestrator
|
|
|
|
orchestrator = EnhancedTaskOrchestrator(
|
|
redis_client=redis,
|
|
db_pool=pg_pool
|
|
)
|
|
|
|
await orchestrator.start()
|
|
|
|
# Session für Voice-Interaktion
|
|
session = await orchestrator.create_session(
|
|
voice_session_id="voice-123",
|
|
user_id="teacher-1"
|
|
)
|
|
|
|
# Task verarbeiten (nutzt Multi-Agent wenn nötig)
|
|
await orchestrator.process_task(task)
|
|
```
|
|
|
|
### Mit BQAS
|
|
|
|
```python
|
|
from bqas.quality_judge_agent import QualityJudgeAgent
|
|
|
|
judge = QualityJudgeAgent(
|
|
message_bus=bus,
|
|
memory_store=memory
|
|
)
|
|
|
|
await judge.start()
|
|
|
|
# Direkte Evaluation
|
|
result = await judge.evaluate(
|
|
response="Der Satz des Pythagoras...",
|
|
task_type="learning_math",
|
|
context={"user_input": "Was ist Pythagoras?"}
|
|
)
|
|
|
|
if result["verdict"] == "production_ready":
|
|
# Response ist OK
|
|
pass
|
|
```
|
|
|
|
## Tests
|
|
|
|
```bash
|
|
# In agent-core Verzeichnis
|
|
cd agent-core
|
|
|
|
# Alle Tests ausführen
|
|
pytest -v
|
|
|
|
# Mit Coverage
|
|
pytest --cov=. --cov-report=html
|
|
|
|
# Einzelnes Test-Modul
|
|
pytest tests/test_session_manager.py -v
|
|
|
|
# Async-Tests
|
|
pytest tests/test_message_bus.py -v
|
|
```
|
|
|
|
## Metriken
|
|
|
|
Das Agent-Core exportiert folgende Metriken:
|
|
|
|
| Metrik | Beschreibung |
|
|
|--------|--------------|
|
|
| `agent_session_duration_seconds` | Dauer von Agent-Sessions |
|
|
| `agent_heartbeat_delay_seconds` | Zeit seit letztem Heartbeat |
|
|
| `agent_message_latency_ms` | Latenz der Inter-Agent Kommunikation |
|
|
| `agent_memory_access_total` | Memory-Zugriffe pro Agent |
|
|
| `agent_error_total` | Fehler pro Agent-Typ |
|
|
|
|
## Nächste Schritte
|
|
|
|
1. **Migration ausführen**: `psql -f backend/migrations/add_agent_core_tables.sql`
|
|
2. **Voice-Service erweitern**: Enhanced Orchestrator aktivieren
|
|
3. **BQAS integrieren**: Quality Judge Agent starten
|
|
4. **Monitoring aufsetzen**: Metriken in Grafana integrieren
|