mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
a25a1c2679
Phase 0.5: Universal RuVector Integration (v2.5.9) ## Agent Architecture Migration - **CoverageAnalyzerAgent**: Migrated from EventEmitter to extend BaseAgent - Full RuVector integration with HybridRouter support - Implements abstract methods: initializeComponents(), performTask(), loadKnowledge(), cleanup() - New getCoverageStatus() method for agent-specific status - Configuration via CoverageAnalyzerConfig extending BaseAgentConfig - **QualityGateAgent**: Migrated from EventEmitter to extend BaseAgent - Full RuVector integration with HybridRouter support - Implements abstract methods: initializeComponents(), performTask(), loadKnowledge(), cleanup() - New getQualityGateStatus() method for agent-specific status - Configuration via QualityGateConfig extending BaseAgentConfig ## RuVector Methods Now Available on All Agents All QE agents now inherit these methods from BaseAgent: - hasRuVectorCache() - Check if RuVector GNN cache is enabled - getRuVectorMetrics() - Get GNN/LoRA/cache performance metrics - getCacheHitRate() - Get cache hit rate (0-1) - getRoutingStats() - Get routing decisions and latency statistics - forceRuVectorLearn() - Trigger LoRA learning consolidation - getCostSavingsReport() - Get cost savings from caching - getLLMStats() - Get LLM provider status including RuVector ## Other Changes - Updated QEAgentFactory to use new single-config constructor pattern - Added 6 RuVector MCP tools for external integration - Updated verification script - All 6 tests pass - Added BaseAgent.RuVector.test.ts unit tests - Added ruvector-agent-usage.ts example 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1095 lines
71 KiB
HTML
1095 lines
71 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Agent Learning System Architecture | Agentic QE</title>
|
|
<style>
|
|
:root {
|
|
--bg-primary: #0d1117;
|
|
--bg-secondary: #161b22;
|
|
--bg-tertiary: #21262d;
|
|
--border-color: #30363d;
|
|
--text-primary: #e6edf3;
|
|
--text-secondary: #8b949e;
|
|
--accent-blue: #58a6ff;
|
|
--accent-green: #3fb950;
|
|
--accent-purple: #a371f7;
|
|
--accent-orange: #d29922;
|
|
--accent-red: #f85149;
|
|
--accent-cyan: #39c5cf;
|
|
}
|
|
|
|
* {
|
|
margin: 0;
|
|
padding: 0;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
body {
|
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans', Helvetica, Arial, sans-serif;
|
|
background: var(--bg-primary);
|
|
color: var(--text-primary);
|
|
line-height: 1.6;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
.container {
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: 2rem;
|
|
}
|
|
|
|
header {
|
|
background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-tertiary) 100%);
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding: 3rem 2rem;
|
|
text-align: center;
|
|
position: relative;
|
|
overflow: hidden;
|
|
}
|
|
|
|
header::before {
|
|
content: '';
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: 3px;
|
|
background: linear-gradient(90deg, var(--accent-blue), var(--accent-purple), var(--accent-cyan));
|
|
}
|
|
|
|
header h1 {
|
|
font-size: 2.5rem;
|
|
font-weight: 600;
|
|
margin-bottom: 0.5rem;
|
|
background: linear-gradient(135deg, var(--accent-blue), var(--accent-purple));
|
|
-webkit-background-clip: text;
|
|
-webkit-text-fill-color: transparent;
|
|
background-clip: text;
|
|
}
|
|
|
|
header p {
|
|
color: var(--text-secondary);
|
|
font-size: 1.1rem;
|
|
}
|
|
|
|
nav {
|
|
background: var(--bg-secondary);
|
|
border-bottom: 1px solid var(--border-color);
|
|
padding: 1rem 2rem;
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 100;
|
|
}
|
|
|
|
nav ul {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.5rem;
|
|
list-style: none;
|
|
justify-content: center;
|
|
}
|
|
|
|
nav a {
|
|
color: var(--text-secondary);
|
|
text-decoration: none;
|
|
padding: 0.5rem 1rem;
|
|
border-radius: 6px;
|
|
font-size: 0.875rem;
|
|
transition: all 0.2s;
|
|
}
|
|
|
|
nav a:hover {
|
|
color: var(--text-primary);
|
|
background: var(--bg-tertiary);
|
|
}
|
|
|
|
section {
|
|
margin: 3rem 0;
|
|
padding: 2rem;
|
|
background: var(--bg-secondary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 12px;
|
|
}
|
|
|
|
h2 {
|
|
font-size: 1.75rem;
|
|
font-weight: 600;
|
|
margin-bottom: 1.5rem;
|
|
padding-bottom: 0.75rem;
|
|
border-bottom: 2px solid var(--border-color);
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
h2 .section-number {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 2rem;
|
|
height: 2rem;
|
|
background: var(--accent-blue);
|
|
color: var(--bg-primary);
|
|
border-radius: 50%;
|
|
font-size: 0.875rem;
|
|
font-weight: 700;
|
|
}
|
|
|
|
h3 {
|
|
font-size: 1.25rem;
|
|
font-weight: 600;
|
|
margin: 1.5rem 0 1rem;
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
h4 {
|
|
font-size: 1rem;
|
|
font-weight: 600;
|
|
margin: 1rem 0 0.5rem;
|
|
color: var(--accent-purple);
|
|
}
|
|
|
|
p {
|
|
margin-bottom: 1rem;
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.diagram-container {
|
|
background: var(--bg-primary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 8px;
|
|
padding: 1.5rem;
|
|
margin: 1.5rem 0;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.diagram {
|
|
font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
|
|
font-size: 0.8rem;
|
|
line-height: 1.4;
|
|
white-space: pre;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.diagram .highlight-blue { color: var(--accent-blue); }
|
|
.diagram .highlight-green { color: var(--accent-green); }
|
|
.diagram .highlight-purple { color: var(--accent-purple); }
|
|
.diagram .highlight-orange { color: var(--accent-orange); }
|
|
.diagram .highlight-cyan { color: var(--accent-cyan); }
|
|
|
|
.code-block {
|
|
background: var(--bg-primary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 8px;
|
|
padding: 1rem 1.5rem;
|
|
margin: 1rem 0;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.code-block code {
|
|
font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
|
|
font-size: 0.875rem;
|
|
color: var(--accent-green);
|
|
}
|
|
|
|
.file-reference {
|
|
display: inline-block;
|
|
background: var(--bg-tertiary);
|
|
padding: 0.25rem 0.75rem;
|
|
border-radius: 4px;
|
|
font-family: monospace;
|
|
font-size: 0.8rem;
|
|
color: var(--accent-orange);
|
|
margin: 0.25rem 0;
|
|
}
|
|
|
|
table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
margin: 1.5rem 0;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
th, td {
|
|
padding: 0.75rem 1rem;
|
|
text-align: left;
|
|
border: 1px solid var(--border-color);
|
|
}
|
|
|
|
th {
|
|
background: var(--bg-tertiary);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
td {
|
|
background: var(--bg-primary);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
td code {
|
|
background: var(--bg-tertiary);
|
|
padding: 0.15rem 0.4rem;
|
|
border-radius: 3px;
|
|
font-size: 0.8rem;
|
|
color: var(--accent-cyan);
|
|
}
|
|
|
|
.info-box {
|
|
background: linear-gradient(135deg, rgba(88, 166, 255, 0.1), rgba(163, 113, 247, 0.1));
|
|
border: 1px solid var(--accent-blue);
|
|
border-radius: 8px;
|
|
padding: 1rem 1.5rem;
|
|
margin: 1rem 0;
|
|
}
|
|
|
|
.info-box.success {
|
|
background: linear-gradient(135deg, rgba(63, 185, 80, 0.1), rgba(57, 197, 207, 0.1));
|
|
border-color: var(--accent-green);
|
|
}
|
|
|
|
.benefit-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
gap: 1.5rem;
|
|
margin: 1.5rem 0;
|
|
}
|
|
|
|
.benefit-card {
|
|
background: var(--bg-primary);
|
|
border: 1px solid var(--border-color);
|
|
border-radius: 8px;
|
|
padding: 1.5rem;
|
|
transition: transform 0.2s, border-color 0.2s;
|
|
}
|
|
|
|
.benefit-card:hover {
|
|
transform: translateY(-2px);
|
|
border-color: var(--accent-blue);
|
|
}
|
|
|
|
.benefit-card h4 {
|
|
margin-top: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.benefit-card ul {
|
|
margin: 0.5rem 0 0 1.5rem;
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.benefit-card li {
|
|
margin: 0.25rem 0;
|
|
}
|
|
|
|
.flow-step {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 1rem;
|
|
margin: 1rem 0;
|
|
padding: 1rem;
|
|
background: var(--bg-primary);
|
|
border-radius: 8px;
|
|
border-left: 3px solid var(--accent-blue);
|
|
}
|
|
|
|
.flow-step .step-number {
|
|
flex-shrink: 0;
|
|
width: 2rem;
|
|
height: 2rem;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: var(--accent-blue);
|
|
color: var(--bg-primary);
|
|
border-radius: 50%;
|
|
font-weight: 700;
|
|
font-size: 0.875rem;
|
|
}
|
|
|
|
.flow-step .step-content h4 {
|
|
margin: 0 0 0.5rem 0;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.flow-step .step-content p {
|
|
margin: 0;
|
|
font-size: 0.9rem;
|
|
}
|
|
|
|
.tag {
|
|
display: inline-block;
|
|
padding: 0.2rem 0.5rem;
|
|
border-radius: 4px;
|
|
font-size: 0.75rem;
|
|
font-weight: 600;
|
|
margin-right: 0.25rem;
|
|
}
|
|
|
|
.tag.new { background: var(--accent-green); color: var(--bg-primary); }
|
|
.tag.key { background: var(--accent-orange); color: var(--bg-primary); }
|
|
.tag.phase { background: var(--accent-purple); color: var(--bg-primary); }
|
|
|
|
footer {
|
|
text-align: center;
|
|
padding: 2rem;
|
|
color: var(--text-secondary);
|
|
border-top: 1px solid var(--border-color);
|
|
margin-top: 3rem;
|
|
}
|
|
|
|
footer a {
|
|
color: var(--accent-blue);
|
|
text-decoration: none;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.container { padding: 1rem; }
|
|
header { padding: 2rem 1rem; }
|
|
header h1 { font-size: 1.75rem; }
|
|
section { padding: 1.5rem; }
|
|
nav ul { justify-content: flex-start; }
|
|
.diagram { font-size: 0.65rem; }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<h1>Agent Learning System Architecture</h1>
|
|
<p>Complete Agent Lifecycle with RuvLLM, RuVector, and ReasoningBank Integration</p>
|
|
</header>
|
|
|
|
<nav>
|
|
<ul>
|
|
<li><a href="#spawning">Agent Spawning</a></li>
|
|
<li><a href="#initialization">Initialization</a></li>
|
|
<li><a href="#llm-selection">LLM Selection</a></li>
|
|
<li><a href="#learning">Learning</a></li>
|
|
<li><a href="#pattern-retrieval">Pattern Retrieval</a></li>
|
|
<li><a href="#architecture">Architecture</a></li>
|
|
<li><a href="#integration">Integration</a></li>
|
|
<li><a href="#benefits">Benefits</a></li>
|
|
</ul>
|
|
</nav>
|
|
|
|
<div class="container">
|
|
<!-- Section 1: Agent Spawning -->
|
|
<section id="spawning">
|
|
<h2><span class="section-number">1</span> Agent Spawning - Two Entry Points</h2>
|
|
|
|
<h3>A. Via Claude Code Task Tool</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram">User → Claude Code → Task Tool → External Agent Process
|
|
└── Direct CLI execution</div>
|
|
</div>
|
|
<p>When you use Claude Code's Task tool:</p>
|
|
<ul style="margin-left: 1.5rem; color: var(--text-secondary);">
|
|
<li>Spawns an external process</li>
|
|
<li>Agent runs independently</li>
|
|
<li>Hooks notify visualization dashboard</li>
|
|
</ul>
|
|
|
|
<h3>B. Via AQE MCP Tools</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram">User → Claude Code → MCP Tool → AgentSpawnHandler → AgentRegistry → QEAgentFactory
|
|
│ │
|
|
│ └─ Creates BaseAgentConfig
|
|
│ │ └─ agentType
|
|
│ │ └─ capabilities
|
|
│ │ └─ memoryStore (SHARED) <span class="highlight-orange">← KEY!</span>
|
|
│ │ └─ enableLearning: true
|
|
│ │ └─ learningConfig
|
|
│ │
|
|
│ └─ Creates Agent Instance
|
|
│ └─ TestGeneratorAgent
|
|
│ CoverageAnalyzerAgent
|
|
│ etc.
|
|
│
|
|
└─ Returns AgentInstance metadata</div>
|
|
</div>
|
|
<p class="file-reference">Key File: src/mcp/handlers/agent-spawn.ts:56-232</p>
|
|
</section>
|
|
|
|
<!-- Section 2: BaseAgent Initialization -->
|
|
<section id="initialization">
|
|
<h2><span class="section-number">2</span> BaseAgent Initialization - Multi-Stage Process</h2>
|
|
|
|
<div class="diagram-container">
|
|
<div class="diagram"><span class="highlight-blue">BaseAgent.initialize()</span>
|
|
│
|
|
└─ 1. Load Knowledge (subclass-specific)
|
|
│
|
|
└─ 2. Restore State from Memory
|
|
│
|
|
└─ 3. Create Performance Tracker
|
|
│
|
|
└─ 4. Create LearningEngine ──────────────────────────────────────────┌
|
|
│ │ │
|
|
│ └─ Q-Learning Algorithm (default) │
|
|
│ └─ Q-Table: Map<state, Map<action, reward>> │
|
|
│ └─ SwarmMemoryManager (SHARED) │
|
|
│ └─ HNSWPatternAdapter (Phase 0 M0.3) <span class="highlight-cyan">← RuVector!</span> │
|
|
│ │
|
|
└─ 5. Initialize LLM Provider ────────────────────────────────────────┌
|
|
│ │ │
|
|
│ └─ Selection Priority: │
|
|
│ 1. HybridRouter (if enableHybridRouter: true) <span class="highlight-green">← NEW!</span> │
|
|
│ └─ Routes: RuVector Cache → RuvLLM → Cloud │
|
|
│ 2. RuvLLM (LOCAL - default) <span class="highlight-cyan">← RuvLLM!</span> │
|
|
│ 3. Claude (if ANTHROPIC_API_KEY) │
|
|
│ 4. OpenRouter (if OPENROUTER_API_KEY) │
|
|
│ │
|
|
└─ 5b. Initialize HybridRouter ──────────────────────────────────────┌
|
|
│ │ │
|
|
│ └─ Create RuVectorClient (GNN cache client) │
|
|
│ └─ Configure cache threshold (default: 0.85) │
|
|
│ └─ Enable LoRA learning (rank: 8) │
|
|
│ └─ Enable EWC++ anti-forgetting │
|
|
│ │
|
|
└─ 6. Initialize Federated Learning (Phase 0 M0.5) ─────────────────┌
|
|
│ └─ Register with FederatedManager │
|
|
│ │
|
|
└─ 7. Initialize Subclass Components │
|
|
(TestGeneratorAgent → PatternExtractor, ReasoningBank) │
|
|
│
|
|
┌────────────────────────────────────────────────────────────────────┘
|
|
│
|
|
▾
|
|
<span class="highlight-green">┌─────────────────────────────────────────────────────────────────────┌
|
|
│ INITIALIZATION COMPLETE │
|
|
│ │
|
|
│ Agent State: │
|
|
│ └─ learningEngine: LearningEngine (with Q-table + HNSW) │
|
|
│ └─ llmProvider: RuvllmProvider (local) OR Claude/OpenRouter │
|
|
│ └─ hybridRouter: HybridRouter (if enableHybridRouter) ← NEW! │
|
|
│ │ └─ ruvectorClient: RuVectorClient (GNN cache) │
|
|
│ └─ llmSessionId: "sess-xxx" (for session continuity) │
|
|
│ └─ federatedManager: FederatedManager (cross-agent learning) │
|
|
│ └─ memoryStore: SwarmMemoryManager (SQLite .agentic-qe/memory.db) │
|
|
└─────────────────────────────────────────────────────────────────────┘</span></div>
|
|
</div>
|
|
|
|
<h4>Key Files:</h4>
|
|
<p class="file-reference">src/agents/BaseAgent.ts:216-276 (initialize)</p>
|
|
<p class="file-reference">src/learning/LearningEngine.ts:107-179 (constructor + init)</p>
|
|
<p class="file-reference">src/agents/BaseAgent.ts:668-727 (LLM initialization)</p>
|
|
</section>
|
|
|
|
<!-- Section 3: LLM Provider Selection -->
|
|
<section id="llm-selection">
|
|
<h2><span class="section-number">3</span> LLM Provider Selection</h2>
|
|
|
|
<h3>Provider Selection Matrix</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram"><span class="highlight-blue">┌─────────────────────────────────────────────────────────────────────┌
|
|
│ LLM PROVIDER SELECTION │
|
|
└─────────────────────────────────────────────────────────────────────┌</span>
|
|
│ │
|
|
│ Environment Check Selected Provider │
|
|
│ ───────────────── ─────────────── │
|
|
│ │
|
|
│ 1. <span class="highlight-green">enableHybridRouter: true</span> ⇒ <span class="highlight-green">HybridRouter (NEW!)</span> │
|
|
│ (Phase 0.5) └─ Cache-first routing │
|
|
│ │
|
|
│ 2. LLM_PROVIDER env override ⇒ Use specified provider │
|
|
│ │
|
|
│ 3. Inside Claude Code + │
|
|
│ ANTHROPIC_API_KEY ⇒ <span class="highlight-purple">Claude API</span> │
|
|
│ │
|
|
│ 4. OPENROUTER_API_KEY ⇒ <span class="highlight-orange">OpenRouter (300+ models)</span> │
|
|
│ │
|
|
│ 5. ANTHROPIC_API_KEY ⇒ <span class="highlight-purple">Claude API</span> │
|
|
│ │
|
|
│ 6. RuvLLM available ⇒ <span class="highlight-cyan">RuvLLM (LOCAL, FREE)</span> │
|
|
│ (default for QE agents) │
|
|
│ │
|
|
│ 7. Fallback ⇒ Algorithmic-only mode │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────────┘</div>
|
|
</div>
|
|
|
|
<h3>HybridRouter with RuVector Cache</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram"><span class="highlight-cyan">┌─────────────────────────────────────────────────────────────────────┌
|
|
│ HYBRIDROUTER CACHE-FIRST ROUTING │
|
|
│ (src/providers/HybridRouter.ts) │
|
|
└─────────────────────────────────────────────────────────────────────┌</span>
|
|
│ │
|
|
│ Request Flow: │
|
|
│ │
|
|
│ ┌──────────────────┌ │
|
|
│ │ Agent Request │ prompt + context │
|
|
│ └────────⁁─────────┘ │
|
|
│ │ │
|
|
│ ▾ │
|
|
│ <span class="highlight-green">┌──────────────────┌</span> │
|
|
│ <span class="highlight-green">│ 1. RuVector │</span> GNN cache lookup │
|
|
│ <span class="highlight-green">│ Cache │</span> - Sub-ms latency (<1ms) │
|
|
│ <span class="highlight-green">│ (Docker) │</span> - 0.85 confidence threshold │
|
|
│ <span class="highlight-green">└────────⁁─────────┘</span> - If HIT → return cached response │
|
|
│ │ <span class="highlight-orange">MISS</span> │
|
|
│ ▾ │
|
|
│ <span class="highlight-cyan">┌──────────────────┌</span> │
|
|
│ <span class="highlight-cyan">│ 2. RuvLLM │</span> Local inference │
|
|
│ <span class="highlight-cyan">│ (Local) │</span> - Zero cost │
|
|
│ <span class="highlight-cyan">│ │</span> - TRM/SONA enabled │
|
|
│ <span class="highlight-cyan">└────────⁁─────────┘</span> - Cache response for future │
|
|
│ │ <span class="highlight-orange">UNAVAILABLE</span> │
|
|
│ ▾ │
|
|
│ <span class="highlight-purple">┌──────────────────┌</span> │
|
|
│ <span class="highlight-purple">│ 3. Cloud LLM │</span> Claude/OpenRouter fallback │
|
|
│ <span class="highlight-purple">│ (Remote) │</span> - Higher quality │
|
|
│ <span class="highlight-purple">│ │</span> - Cache response + trigger learning │
|
|
│ <span class="highlight-purple">└──────────────────┘</span> │
|
|
│ │
|
|
│ <span class="highlight-blue">Learning Features:</span> │
|
|
│ └─ LoRA: Low-rank adaptation (rank: 8, alpha: 16) │
|
|
│ └─ EWC++: Elastic Weight Consolidation (anti-forgetting) │
|
|
│ └─ GNN: Graph Neural Network pattern matching │
|
|
│ │
|
|
│ <span class="highlight-green">Cost Savings:</span> │
|
|
│ └─ Cache hits: ~$0.00 per request │
|
|
│ └─ Local LLM: ~$0.00 per request │
|
|
│ └─ Cloud only when necessary │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────────┘</div>
|
|
</div>
|
|
|
|
<h3>RuvLLM Features</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram"><span class="highlight-purple">┌─────────────────────────────────────────────────────────────────────┌
|
|
│ RUVLLM PROVIDER │
|
|
│ (src/providers/RuvllmProvider.ts) │
|
|
└─────────────────────────────────────────────────────────────────────┌</span>
|
|
│ │
|
|
│ <span class="highlight-green">┌──────────────────┌</span> │
|
|
│ <span class="highlight-green">│ TRM (Test-time │</span> Iterative reasoning refinement │
|
|
│ <span class="highlight-green">│ Reasoning & │</span> - Up to 7 iterations │
|
|
│ <span class="highlight-green">│ Metacognition) │</span> - Converges at 95% confidence │
|
|
│ <span class="highlight-green">└────────⁁─────────┘</span> - Improves output quality │
|
|
│ │ │
|
|
│ <span class="highlight-cyan">┌────────▾─────────┌</span> │
|
|
│ <span class="highlight-cyan">│ SONA (Self- │</span> Continuous model adaptation │
|
|
│ <span class="highlight-cyan">│ Organizing │</span> - LoRA rank: 8, alpha: 16 │
|
|
│ <span class="highlight-cyan">│ Neural Arch) │</span> - EWC lambda: 2000 │
|
|
│ <span class="highlight-cyan">└────────⁁─────────┘</span> - Prevents catastrophic forgetting │
|
|
│ │ │
|
|
│ <span class="highlight-orange">┌────────▾─────────┌</span> │
|
|
│ <span class="highlight-orange">│ Sessions │</span> Multi-turn context preservation │
|
|
│ <span class="highlight-orange">│ │</span> - 50% latency reduction │
|
|
│ <span class="highlight-orange">│ │</span> - Context reuse across calls │
|
|
│ <span class="highlight-orange">└────────⁁─────────┘</span> - Session timeout: 30 min │
|
|
│ │ │
|
|
│ <span class="highlight-blue">┌────────▾─────────┌</span> │
|
|
│ <span class="highlight-blue">│ Batch API │</span> Parallel request processing │
|
|
│ <span class="highlight-blue">│ │</span> - 4x throughput │
|
|
│ <span class="highlight-blue">│ │</span> - Rate limiting protection │
|
|
│ <span class="highlight-blue">└──────────────────┘</span> │
|
|
│ │
|
|
│ Default Model: llama-3.2-3b-instruct │
|
|
│ Port: 8080 │
|
|
│ Context Size: 4096 │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────────────┘</div>
|
|
</div>
|
|
|
|
<h3>When LLM is Called During Task Execution</h3>
|
|
<div class="flow-step">
|
|
<span class="step-number">1</span>
|
|
<div class="step-content">
|
|
<h4>Phase 1: Code Analysis</h4>
|
|
<p><code>analyzeCodeWithConsciousness()</code> - May use LLM for analysis</p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">2</span>
|
|
<div class="step-content">
|
|
<h4>Phase 2: Pattern Retrieval <span class="tag">NO LLM</span></h4>
|
|
<p><code>findApplicablePatterns()</code> - Uses HNSW vector search O(log n), <1ms p95</p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">3</span>
|
|
<div class="step-content">
|
|
<h4>Phase 3: Pattern Recognition</h4>
|
|
<p><code>recognizePatterns()</code> - May use LLM</p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">4</span>
|
|
<div class="step-content">
|
|
<h4>Phase 4: Test Strategy Selection <span class="tag">NO LLM</span></h4>
|
|
<p><code>selectTestStrategy()</code> - Algorithmic, no LLM</p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">5</span>
|
|
<div class="step-content">
|
|
<h4>Phase 5: Test Generation <span class="tag key">LLM CALLED</span></h4>
|
|
<p><code>generateUnitTests()</code>, <code>generateIntegrationTests()</code>, <code>generateEdgeCaseTests()</code> - LLM called via <code>this.llmChat(prompt)</code></p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">6</span>
|
|
<div class="step-content">
|
|
<h4>Phase 6: Test Optimization <span class="tag">NO LLM</span></h4>
|
|
<p><code>optimizeTestSelection()</code> - Algorithmic</p>
|
|
</div>
|
|
</div>
|
|
<div class="flow-step">
|
|
<span class="step-number">7</span>
|
|
<div class="step-content">
|
|
<h4>Phase 7: Pattern Extraction & Storage</h4>
|
|
<p>Extracts patterns for future reuse via <code>this.llmEmbed()</code> for embedding generation</p>
|
|
</div>
|
|
</div>
|
|
|
|
<p class="file-reference">Key File: src/agents/TestGeneratorAgent.ts:390-666 (generateTestsWithAI)</p>
|
|
</section>
|
|
|
|
<!-- Section 4: Learning from Execution -->
|
|
<section id="learning">
|
|
<h2><span class="section-number">4</span> Learning from Execution</h2>
|
|
<p class="file-reference">src/learning/LearningEngine.ts:227-345</p>
|
|
|
|
<h3>1. Extract Experience</h3>
|
|
<div class="code-block">
|
|
<code>TaskExperience {
|
|
state: encode(complexity, capabilities, resources)
|
|
action: encode(strategy, parallelization, retry)
|
|
reward: calculated from results
|
|
nextState: updated state
|
|
timestamp: when executed
|
|
}</code>
|
|
</div>
|
|
|
|
<h4>Reward Calculation</h4>
|
|
<table>
|
|
<tr><th>Condition</th><th>Reward</th></tr>
|
|
<tr><td>Success</td><td><code>+1.0</code></td></tr>
|
|
<tr><td>Failure</td><td><code>-1.0</code></td></tr>
|
|
<tr><td>Fast execution</td><td><code>+0.2 bonus</code></td></tr>
|
|
<tr><td>Errors</td><td><code>-0.3 penalty</code></td></tr>
|
|
<tr><td>Coverage (test gen)</td><td><code>+0.5 bonus</code></td></tr>
|
|
<tr><td>User feedback</td><td><code>-1 to +1</code></td></tr>
|
|
<tr><td colspan="2">Final: clamp to [-2, +2]</td></tr>
|
|
</table>
|
|
|
|
<h3>2. Update Q-Table (Q-Learning Algorithm)</h3>
|
|
<div class="info-box">
|
|
<p style="font-family: monospace; font-size: 1.1rem; color: var(--text-primary); margin: 0;">
|
|
Q(s,a) ← Q(s,a) + α[r + γ·max(Q(s',a')) - Q(s,a)]
|
|
</p>
|
|
</div>
|
|
<table>
|
|
<tr><th>Variable</th><th>Meaning</th><th>Value</th></tr>
|
|
<tr><td>α</td><td>Learning rate</td><td><code>0.1</code></td></tr>
|
|
<tr><td>γ</td><td>Discount factor</td><td><code>0.95</code></td></tr>
|
|
<tr><td>s</td><td>Current state</td><td>-</td></tr>
|
|
<tr><td>a</td><td>Action taken</td><td>-</td></tr>
|
|
<tr><td>r</td><td>Reward received</td><td>-</td></tr>
|
|
<tr><td>s'</td><td>Next state</td><td>-</td></tr>
|
|
</table>
|
|
<p>Persisted to: SwarmMemoryManager → q_values table</p>
|
|
|
|
<h3>3. Update Patterns (Dual Storage)</h3>
|
|
<div class="diagram-container">
|
|
<div class="diagram">Pattern Update:
|
|
└─ usageCount++
|
|
└─ successRate = (old * count + result) / (count + 1)
|
|
└─ confidence = min(0.95, confidence + 0.01)
|
|
|
|
<span class="highlight-blue">┌────────────────────────────────────────────────────┌
|
|
│ DUAL STORAGE │
|
|
└────────────────────────────────────────────────────┌</span>
|
|
│ │
|
|
│ <span class="highlight-orange">┌─────────────────┌</span> <span class="highlight-cyan">┌─────────────────────┌</span> │
|
|
│ <span class="highlight-orange">│ SQLite │</span> <span class="highlight-cyan">│ HNSW (RuVector) │</span> │
|
|
│ <span class="highlight-orange">│ (Primary) │</span> <span class="highlight-cyan">│ (Vector Search) │</span> │
|
|
│ <span class="highlight-orange">└─────────────────┌</span> <span class="highlight-cyan">└─────────────────────┌</span> │
|
|
│ │ │ │ │ │
|
|
│ │ patterns table │ │ O(log n) search │ │
|
|
│ │ q_values table │ │ <1ms p95 latency │ │
|
|
│ │ experiences │ │ 768-dim embeddings │ │
|
|
│ │ │ │ │ │
|
|
│ │ .agentic-qe/ │ │ In-memory index │ │
|
|
│ │ memory.db │ │ │ │
|
|
│ │ │ │ │ │
|
|
│ └────────⁁────────┘ └──────────⁁──────────┘ │
|
|
│ │ │ │
|
|
│ └────────⁁─────────────┘ │
|
|
│ │ │
|
|
└────────────────────⁁──────────────────────────────┘
|
|
│
|
|
▾
|
|
<span class="highlight-green">SHARED ACROSS ALL AGENTS</span>
|
|
(Single source of truth)</div>
|
|
</div>
|
|
|
|
<h3>4. Exploration Decay</h3>
|
|
<div class="info-box success">
|
|
<p style="font-family: monospace; margin: 0; color: var(--text-primary);">
|
|
explorationRate *= 0.995
|
|
</p>
|
|
<p style="margin: 0.5rem 0 0 0;">
|
|
0.30 (start) → → → → → → → → 0.01 (min)<br>
|
|
Over ~1000 tasks: EXPLORING → EXPLOITING
|
|
</p>
|
|
</div>
|
|
|
|
<h3>5. Federated Sharing (Optional)</h3>
|
|
<ul style="margin-left: 1.5rem; color: var(--text-secondary);">
|
|
<li>Generate embedding for pattern</li>
|
|
<li>Calculate priority from reward</li>
|
|
<li>Share with FederatedManager</li>
|
|
<li>Other agents can <code>syncWithTeam()</code> to get shared patterns</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<!-- Section 5: Pattern Retrieval -->
|
|
<section id="pattern-retrieval">
|
|
<h2><span class="section-number">5</span> Pattern Retrieval During Future Tasks</h2>
|
|
|
|
<div class="flow-step">
|
|
<span class="step-number">1</span>
|
|
<div class="step-content">
|
|
<h4>Extract Code Signature</h4>
|
|
<div class="code-block">
|
|
<code>codeSignature = {
|
|
functionName: "createUser"
|
|
complexity: "medium"
|
|
patterns: ["service", "async", "validation"]
|
|
}</code>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="flow-step">
|
|
<span class="step-number">2</span>
|
|
<div class="step-content">
|
|
<h4>Query HNSW (O(log n) Vector Search)</h4>
|
|
<div class="code-block">
|
|
<code>learningEngine.searchSimilarPatterns("createUser test")
|
|
↓
|
|
hnswAdapter.searchSimilar(query, k=5)
|
|
↓
|
|
1. Generate query embedding (RuvLLM or hash fallback)
|
|
2. Search HNSW index (O(log n), <1ms)
|
|
3. Return top-k similar patterns
|
|
|
|
Results:
|
|
└─ Pattern: "service-async-test" (similarity: 0.92)
|
|
└─ Pattern: "validation-test" (similarity: 0.87)
|
|
└─ Pattern: "crud-service-test" (similarity: 0.81)</code>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="flow-step">
|
|
<span class="step-number">3</span>
|
|
<div class="step-content">
|
|
<h4>Apply Patterns (Reduce LLM Calls)</h4>
|
|
<p>For each high-confidence pattern (applicability > 0.7):</p>
|
|
<ul style="margin-left: 1.5rem; color: var(--text-secondary);">
|
|
<li>Use pattern template for test structure</li>
|
|
<li>Customize with code-specific details</li>
|
|
<li>SKIP LLM call for template portions</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="info-box success">
|
|
<h4 style="margin: 0 0 0.5rem 0; color: var(--accent-green);">Performance Comparison</h4>
|
|
<table style="margin: 0;">
|
|
<tr>
|
|
<td><strong>WITHOUT PATTERNS:</strong></td>
|
|
<td>10 tests → 10 LLM calls → ~5000ms</td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>WITH PATTERNS:</strong></td>
|
|
<td>7 from patterns + 3 LLM calls → ~2000ms</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2" style="color: var(--accent-green);"><strong>60% faster, 70% cost reduction</strong></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Section 6: Complete Data Flow Architecture -->
|
|
<section id="architecture">
|
|
<h2><span class="section-number">6</span> Complete Data Flow Architecture</h2>
|
|
|
|
<div class="diagram-container">
|
|
<div class="diagram"> <span class="highlight-blue">┌─────────────────────────────────┌</span>
|
|
<span class="highlight-blue">│ USER REQUEST │</span>
|
|
<span class="highlight-blue">│ "Generate tests for X.ts" │</span>
|
|
<span class="highlight-blue">└─────────────────⁁───────────────┘</span>
|
|
│
|
|
▾
|
|
<span class="highlight-purple">┌─────────────────────────────────┌</span>
|
|
<span class="highlight-purple">│ CLAUDE CODE │</span>
|
|
<span class="highlight-purple">│ (Orchestrator / Interface) │</span>
|
|
<span class="highlight-purple">└─────────────────⁁───────────────┘</span>
|
|
│
|
|
┌─────────────────────&btee;───────────────────┌
|
|
│ │
|
|
▾ ▾
|
|
<span class="highlight-green">┌─────────────────────────┌</span> <span class="highlight-orange">┌─────────────────────────┌</span>
|
|
<span class="highlight-green">│ MCP Tools │</span> <span class="highlight-orange">│ Task Tool │</span>
|
|
<span class="highlight-green">│ (aqe-mcp server) │</span> <span class="highlight-orange">│ (direct spawn) │</span>
|
|
<span class="highlight-green">└───────────⁁─────────────┘</span> <span class="highlight-orange">└───────────⁁─────────────┘</span>
|
|
│ │
|
|
▾ │
|
|
<span class="highlight-cyan">┌─────────────────────────┌</span> │
|
|
<span class="highlight-cyan">│ AgentRegistry │</span> │
|
|
<span class="highlight-cyan">│ └─ Shared Memory ─────⁁──────────────────────&btee;</span>
|
|
<span class="highlight-cyan">│ └─ Creates Config │</span> │
|
|
<span class="highlight-cyan">└───────────⁁─────────────┘</span> │
|
|
│ │
|
|
└───────────────────⁁───────────────────┘
|
|
│
|
|
▾
|
|
<span class="highlight-blue">┌─────────────────────────────────┌</span>
|
|
<span class="highlight-blue">│ QE AGENT (BaseAgent) │</span>
|
|
<span class="highlight-blue">│ ┌───────────────────────────┌ │</span>
|
|
<span class="highlight-blue">│ │ TestGeneratorAgent │ │</span>
|
|
<span class="highlight-blue">│ │ CoverageAnalyzerAgent │ │</span>
|
|
<span class="highlight-blue">│ │ SecurityScannerAgent │ │</span>
|
|
<span class="highlight-blue">│ │ etc. │ │</span>
|
|
<span class="highlight-blue">│ └───────────────────────────┘ │</span>
|
|
<span class="highlight-blue">└─────────────────⁁───────────────┘</span>
|
|
│
|
|
┌──────────────────────────&btee;──────────────────────────┌
|
|
│ │ │
|
|
▾ ▾ ▾
|
|
<span class="highlight-purple">┌─────────────────┌</span> <span class="highlight-cyan">┌─────────────────┌</span> <span class="highlight-orange">┌─────────────────┌</span>
|
|
<span class="highlight-purple">│ LLM Provider │</span> <span class="highlight-cyan">│ Learning Engine │</span> <span class="highlight-orange">│ Memory Store │</span>
|
|
<span class="highlight-purple">│ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ ┌─────────────┌ │</span> <span class="highlight-cyan">│ ┌─────────────┌ │</span> <span class="highlight-orange">│ ┌─────────────┌ │</span>
|
|
<span class="highlight-purple">│ │ RuvLLM │ │</span>←→<span class="highlight-cyan">│⇒│ Q-Table │ │</span>←→<span class="highlight-orange">│⇒│ SQLite DB │ │</span>
|
|
<span class="highlight-purple">│ │ (LOCAL) │ │</span> <span class="highlight-cyan">│ │ Algorithm │ │</span> <span class="highlight-orange">│ │ patterns │ │</span>
|
|
<span class="highlight-purple">│ │ │ │</span> <span class="highlight-cyan">│ │ │ │</span> <span class="highlight-orange">│ │ q_values │ │</span>
|
|
<span class="highlight-purple">│ │ ┌─────────┌ │ │</span> <span class="highlight-cyan">│ └─────────────┘ │</span> <span class="highlight-orange">│ │ experiences │ │</span>
|
|
<span class="highlight-purple">│ │ │ TRM │ │ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ └─────────────┘ │</span>
|
|
<span class="highlight-purple">│ │ │ SONA │ │ │</span> <span class="highlight-cyan">│ ┌─────────────┌ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ │ │ Session │ │ │</span> <span class="highlight-cyan">│ │ HNSW │ │</span> <span class="highlight-orange">│ .agentic-qe/ │</span>
|
|
<span class="highlight-purple">│ │ │ Batch │ │ │</span> <span class="highlight-cyan">│ │ Adapter │ │</span>←→<span class="highlight-orange">│⇒memory.db │</span>
|
|
<span class="highlight-purple">│ │ └─────────┘ │ │</span> <span class="highlight-cyan">│ │ (RuVector) │ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ └─────────────┘ │</span> <span class="highlight-cyan">│ └─────────────┘ │</span> <span class="highlight-orange">│ SHARED ACROSS │</span>
|
|
<span class="highlight-purple">│ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ ALL AGENTS │</span>
|
|
<span class="highlight-purple">│ OR │</span> <span class="highlight-cyan">│ Federated │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ │</span> <span class="highlight-cyan">│ Learning │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ ┌─────────────┌ │</span> <span class="highlight-cyan">│ (cross-agent) │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ │ Claude │ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ │ OpenRouter │ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">│ └─────────────┘ │</span> <span class="highlight-cyan">│ │</span> <span class="highlight-orange">│ │</span>
|
|
<span class="highlight-purple">└─────────────────┘</span> <span class="highlight-cyan">└─────────────────┘</span> <span class="highlight-orange">└─────────────────┘</span>
|
|
│ │ │
|
|
│ │ │
|
|
└──────────────────────────&btee;──────────────────────────┘
|
|
│
|
|
▾
|
|
<span class="highlight-green">┌─────────────────────────────────┌</span>
|
|
<span class="highlight-green">│ TASK RESULT │</span>
|
|
<span class="highlight-green">│ TestSuite, Coverage Report, │</span>
|
|
<span class="highlight-green">│ Quality Metrics, etc. │</span>
|
|
<span class="highlight-green">└─────────────────────────────────┘</span></div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Section 7: Ruv Solutions Integration -->
|
|
<section id="integration">
|
|
<h2><span class="section-number">7</span> Ruv Solutions Integration Summary</h2>
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Solution</th>
|
|
<th>Component</th>
|
|
<th>Purpose</th>
|
|
<th>Location</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><strong>RuvLLM</strong></td>
|
|
<td><code>RuvllmProvider</code></td>
|
|
<td>Local LLM inference with TRM/SONA/Sessions</td>
|
|
<td><code>src/providers/RuvllmProvider.ts</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>RuVector</strong></td>
|
|
<td><code>HNSWPatternStore</code></td>
|
|
<td>O(log n) vector similarity search</td>
|
|
<td><code>src/memory/HNSWPatternStore.ts</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>RuVector</strong></td>
|
|
<td><code>HNSWPatternAdapter</code></td>
|
|
<td>Bridge to LearningEngine</td>
|
|
<td><code>src/learning/HNSWPatternAdapter.ts</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>RuVector</strong></td>
|
|
<td><code>HybridRouter</code></td>
|
|
<td>Cache-first routing</td>
|
|
<td><code>src/providers/HybridRouter.ts</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>RuVector</strong></td>
|
|
<td><code>RuVectorClient</code></td>
|
|
<td>GNN cache client with LoRA/EWC++</td>
|
|
<td><code>src/providers/RuVectorClient.ts</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>@ruvector/core</strong></td>
|
|
<td>VectorDB</td>
|
|
<td>HNSW index implementation</td>
|
|
<td><code>node_modules/@ruvector/core</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><strong>AgentDB</strong></td>
|
|
<td><code>ReasoningBank</code></td>
|
|
<td>Pattern storage and retrieval</td>
|
|
<td><code>node_modules/agentdb</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<h3>Agent RuVector Methods</h3>
|
|
<p>All QE agents that extend <code>BaseAgent</code> have access to:</p>
|
|
|
|
<h4>Metrics & Status Methods</h4>
|
|
<table>
|
|
<tr><th>Method</th><th>Return</th><th>Description</th></tr>
|
|
<tr><td><code>hasRuVectorCache()</code></td><td><code>boolean</code></td><td>Check if HybridRouter with RuVector cache is enabled</td></tr>
|
|
<tr><td><code>getRuVectorMetrics()</code></td><td><code>Promise<object | null></code></td><td>Get GNN/LoRA/cache metrics from RuVector</td></tr>
|
|
<tr><td><code>getCacheHitRate()</code></td><td><code>number</code></td><td>Get cache hit rate (0-1)</td></tr>
|
|
<tr><td><code>getRoutingStats()</code></td><td><code>object</code></td><td>Get routing decisions & latencies</td></tr>
|
|
<tr><td><code>getCostSavingsReport()</code></td><td><code>object</code></td><td>Get cost savings from cache and local routing</td></tr>
|
|
<tr><td><code>getLLMStats()</code></td><td><code>object</code></td><td>Get LLM provider status including RuVector</td></tr>
|
|
</table>
|
|
|
|
<h4>Learning Methods</h4>
|
|
<table>
|
|
<tr><th>Method</th><th>Return</th><th>Description</th></tr>
|
|
<tr><td><code>forceRuVectorLearn()</code></td><td><code>Promise<{success, ...}></code></td><td>Trigger LoRA consolidation with EWC++</td></tr>
|
|
</table>
|
|
|
|
<h4>MCP Tools for RuVector</h4>
|
|
<table>
|
|
<tr><th>Tool Name</th><th>Description</th></tr>
|
|
<tr><td><code>ruvector_health</code></td><td>Check RuVector Docker health</td></tr>
|
|
<tr><td><code>ruvector_metrics</code></td><td>Get GNN/LoRA/cache metrics</td></tr>
|
|
<tr><td><code>ruvector_force_learn</code></td><td>Trigger LoRA consolidation</td></tr>
|
|
<tr><td><code>ruvector_store_pattern</code></td><td>Store pattern in GNN cache</td></tr>
|
|
<tr><td><code>ruvector_search</code></td><td>Search similar patterns</td></tr>
|
|
<tr><td><code>ruvector_cost_savings</code></td><td>Get cost savings report</td></tr>
|
|
</table>
|
|
|
|
<h4>Usage Example</h4>
|
|
<div class="code-block">
|
|
<code>// Configure agent with HybridRouter
|
|
const agent = new TestGeneratorAgent({
|
|
type: 'test-generator',
|
|
capabilities: [...],
|
|
context: {...},
|
|
memoryStore,
|
|
eventBus,
|
|
llm: {
|
|
enabled: true,
|
|
enableHybridRouter: true, // Enable Phase 0.5 features
|
|
ruvectorCache: {
|
|
baseUrl: 'http://localhost:8080',
|
|
cacheThreshold: 0.85,
|
|
learningEnabled: true,
|
|
loraRank: 8,
|
|
ewcEnabled: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
// Check cache status
|
|
console.log('RuVector enabled:', agent.hasRuVectorCache());
|
|
console.log('Cache hit rate:', agent.getCacheHitRate());
|
|
|
|
// Get cost savings
|
|
const savings = agent.getCostSavingsReport();
|
|
console.log(`Saved: $${savings.savings} (${savings.savingsPercentage}%)`);
|
|
|
|
// Trigger learning
|
|
const result = await agent.forceRuVectorLearn();
|
|
console.log('Learning result:', result);</code>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Section 8: Benefits -->
|
|
<section id="benefits">
|
|
<h2><span class="section-number">8</span> Benefits of This Architecture</h2>
|
|
|
|
<div class="benefit-grid">
|
|
<div class="benefit-card">
|
|
<h4><span style="color: var(--accent-green);">$</span> Reduced LLM Costs</h4>
|
|
<ul>
|
|
<li>Pattern templates reduce LLM calls by up to 70%</li>
|
|
<li>Local RuvLLM provides zero-cost inference</li>
|
|
<li>Session reuse cuts latency by 50%</li>
|
|
<li>HybridRouter cache-first routing further reduces cloud calls</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="benefit-card">
|
|
<h4><span style="color: var(--accent-cyan);">↑</span> Continuous Improvement</h4>
|
|
<ul>
|
|
<li>Q-learning optimizes strategy selection</li>
|
|
<li>Patterns improve with each successful task</li>
|
|
<li>Federated learning shares knowledge across agents</li>
|
|
<li>LoRA + EWC++ enables continuous self-learning</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="benefit-card">
|
|
<h4><span style="color: var(--accent-blue);">⚡</span> Fast Pattern Retrieval</h4>
|
|
<ul>
|
|
<li>HNSW provides O(log n) vector search</li>
|
|
<li><1ms p95 latency for pattern matching</li>
|
|
<li>Scales to millions of patterns</li>
|
|
<li>Phase 0.5: GNN cache provides sub-ms pattern matching</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="benefit-card">
|
|
<h4><span style="color: var(--accent-purple);">🗄</span> Unified Data Store</h4>
|
|
<ul>
|
|
<li>Single SQLite database prevents fragmentation</li>
|
|
<li>All agents share learned patterns</li>
|
|
<li>CLI, MCP, and direct spawning all contribute</li>
|
|
<li>RuVector Docker provides distributed cache layer</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="benefit-card">
|
|
<h4><span style="color: var(--accent-orange);">↓</span> Graceful Degradation</h4>
|
|
<ul>
|
|
<li>If LLM unavailable → algorithmic fallback</li>
|
|
<li>If HNSW fails → SQLite-only mode</li>
|
|
<li>If patterns unavailable → full LLM generation</li>
|
|
<li>If RuVector unavailable → fallback to RuvLLM → Cloud</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
|
|
<footer>
|
|
<p>Agent Learning System Architecture — Agentic QE Fleet</p>
|
|
<p>Documentation: <a href="https://github.com/ruvnet/agentic-qe">GitHub Repository</a></p>
|
|
</footer>
|
|
</body>
|
|
</html>
|