converge-knowledge 0.1.1

A self-learning knowledgebase with vector search, gRPC, and MCP interfaces
Documentation

Converge Knowledge

A self-learning knowledge base built in pure Rust, inspired by ruvector. The system gets smarter the more you use it through GNN-inspired learning, meta-learning, and agent memory patterns.

When to Use This

Use Case Capability Module
Building an AI agent with memory Store past actions, learn from mistakes AgenticDB
Semantic search over documents Vector similarity + learning KnowledgeBase
Ingesting markdown/PDF files Chunking, metadata extraction ingest
Claude Desktop integration Natural language knowledge access MCP Server
Microservice knowledge store High-performance RPC gRPC Server
Detecting recurring patterns Time-based activity analysis TimeCrystal
Quick adaptation to new tasks Few-shot learning MetaLearner
Preventing model forgetting EWC, experience replay OnlineLearner

Capabilities

1. Core Knowledge Base

When useful: You need semantic search over text with learning from user feedback.

use converge_knowledge::{KnowledgeBase, KnowledgeEntry, SearchOptions};

let kb = KnowledgeBase::open("./knowledge.db").await?;

// Add knowledge
kb.add_entry(KnowledgeEntry::new("Rust Ownership", "...")).await?;

// Search (learns from usage)
let results = kb.search("memory safety", SearchOptions::new(5)).await?;

// Feedback improves future searches
kb.record_feedback(results[0].id(), true).await?;

2. AgenticDB - Agent Memory System

When useful: Building AI agents that need to remember, learn, and improve over time.

Reflexion Episodes (Self-Critique)

When useful: Agent should learn from its mistakes and not repeat them.

use converge_knowledge::{AgenticDB, ReflexionEpisode, Critique, CritiqueType};

let db = AgenticDB::new();

// Agent failed - record what went wrong
let episode = ReflexionEpisode::new(
    "code_generation",
    "Write a sorting function",
    "fn sort() { /* buggy */ }",
    false,  // failed
)
.with_critique(Critique::new(
    CritiqueType::LogicError,
    "Off-by-one error in loop bounds",
    "Use 0..len instead of 0..=len",
));

db.add_reflexion(episode).await;

// Later: check past failures before attempting similar task
let past_failures = db.query_similar_failures("sorting algorithm", 5).await;

Skill Library

When useful: Agent should consolidate successful patterns for reuse.

use converge_knowledge::{Skill, SkillPattern};

let skill = Skill::new(
    "error_handling",
    "Rust Result Pattern",
    vec![
        SkillPattern::new("define_error", "#[derive(Error)] enum AppError {...}"),
        SkillPattern::new("propagate", "let value = risky_op()?;"),
    ],
)
.with_preconditions(vec!["Function can fail".into()])
.with_postconditions(vec!["Errors are typed".into()]);

db.register_skill(skill).await;

Causal Memory

When useful: Agent should understand cause-effect relationships.

use converge_knowledge::{CausalNode, CausalEdge};

// Build knowledge: "Using unwrap() causes panics"
let unwrap_id = memory.add_node(CausalNode::new("Using unwrap()", "code_pattern"));
let panic_id = memory.add_node(CausalNode::new("Runtime panic", "error"));

memory.add_edge(CausalEdge::new(unwrap_id, panic_id, "causes", 0.8));

// Query: What causes panics?
let causes = memory.find_causes(panic_id);

// Trace causal chain
let chain = memory.trace_chain(unwrap_id, 5);

Learning Sessions (RL)

When useful: Training agent behavior with rewards.

use converge_knowledge::{LearningSession, SessionTurn, Reward};

let session_id = db.start_session("Fix bug in auth module").await;

db.record_turn(session_id, "read auth.rs", "Found issue", Reward::Neutral).await;
db.record_turn(session_id, "edit auth.rs", "Fixed null check", Reward::Positive(0.5)).await;
db.record_turn(session_id, "run tests", "All passing", Reward::Positive(1.0)).await;

// Get trajectory for training
let trajectory = session.to_trajectory();
let discounted_return = session.discounted_return(0.99);

3. Time Crystals - Temporal Patterns

When useful: Detecting periodic behavior patterns (daily coding hours, weekly deploys, etc.)

use converge_knowledge::{TimeCrystal, TemporalPeriod, TemporalMemory};

let mut memory = TemporalMemory::new();

// Track daily coding activity
memory.record("coding", TemporalPeriod::Daily, 1.0);

// Predict activity at current time
let expected = memory.predict("coding");

// Detect anomalies (unusual 3am activity)
let crystal = memory.get("coding").unwrap();
if crystal.is_anomalous(&now, observed_value, 0.3) {
    alert("Unusual activity detected");
}

// Find best time for an activity
let best_hour = crystal.best_time();  // Returns hour with highest activity

4. Online Learning - Continual Adaptation

When useful: Model should adapt to new data without forgetting previous knowledge.

EWC (Elastic Weight Consolidation)

use converge_knowledge::OnlineLearner;

let mut learner = OnlineLearner::new("preferences", 64)
    .with_learning_rate(0.01)
    .with_ewc_lambda(0.5);  // Forgetting prevention strength

// Train on Task A
for (features, target) in task_a_data {
    learner.update(&features, target);
}

// Consolidate - remember what was important for Task A
learner.consolidate();

// Train on Task B - EWC prevents forgetting Task A
for (features, target) in task_b_data {
    learner.update(&features, target);
}

Distribution Drift Detection

use converge_knowledge::DriftDetector;

let mut detector = DriftDetector::new(64).with_threshold(2.0);

// Monitor incoming features
if detector.update(&features) {
    println!("Distribution shift detected - consider retraining");
}

if detector.is_drifting() {
    trigger_adaptation();
}

Experience Replay

use converge_knowledge::ExperienceWindow;

let mut window = ExperienceWindow::new(1000);

// Store experiences
window.add(features, target, Some("task_a".into()));

// Sample for rehearsal (prevents forgetting)
let batch = window.sample(32);
for exp in batch {
    model.train(&exp.features, exp.target);
}

5. Meta-Learning - Learning to Learn

When useful: Agent faces many similar tasks and should learn to adapt quickly.

MAML/Reptile-Style Meta-Learning

use converge_knowledge::{MetaLearner, FewShotLearner, TaskFeatures};

let mut meta = MetaLearner::new("task_solver", 64)
    .with_meta_lr(0.1)
    .with_inner_lr(0.01);

// After completing each task, update meta-learner
meta.meta_update("task_1", &final_params, task_embedding);
meta.meta_update("task_2", &final_params, task_embedding);

// For a new task: get good initialization
let init_params = meta.initialize_for_task(Some(&task_embedding));

Few-Shot Learning

// Quick adaptation with few examples
let mut few_shot = FewShotLearner::from_meta(&meta, Some(&task_embedding))
    .with_adapt_steps(5);

// Add just a few examples
few_shot.add_example(vec![1.0, 2.0], 5.0);
few_shot.add_example(vec![2.0, 3.0], 8.0);

// Adapt and predict
few_shot.adapt();
let prediction = few_shot.predict(&[3.0, 4.0]);

Learning Strategy Selection

use converge_knowledge::{LearningStrategy, TaskFeatures};

// Register strategies that worked
let strategy = LearningStrategy::new("few_shot")
    .with_description("For small datasets")
    .with_hyperparam("lr", 0.1)
    .with_preferred_features(TaskFeatures::new().with_data_size(10));

meta.register_strategy(strategy);

// Select best strategy for new task
let task = TaskFeatures::new().with_data_size(15).with_noise(0.1);
let selected = db.select_strategy(&task).await;

6. Document Ingestion

When useful: Importing documents from files into the knowledge base.

Markdown Files

use converge_knowledge::ingest::{MarkdownIngester, MarkdownDocument};

let ingester = MarkdownIngester::new();

// Ingest single file (extracts front-matter, chunks by headers)
let doc = ingester.ingest_file("docs/guide.md").await?;

// Ingest directory recursively
let docs = ingester.ingest_directory("./docs", true).await?;

for chunk in &doc.chunks {
    kb.add_entry(KnowledgeEntry::new(&chunk.heading_hierarchy.join(" > "), &chunk.content)).await?;
}

PDF Files

use converge_knowledge::ingest::{PdfIngester, PdfDocument};

let ingester = PdfIngester::new();
let doc = ingester.ingest_file("paper.pdf")?;

println!("Title: {:?}", doc.title);
println!("Pages: {}", doc.page_count);

for chunk in &doc.chunks {
    println!("Page {}: {}", chunk.page_number, &chunk.content[..100]);
}

Knowledge Classification (Case vs Background)

use converge_knowledge::ingest::{KnowledgeRouter, RoutingRule, RoutingCondition, KnowledgeType};

let mut router = KnowledgeRouter::new();

// Project docs are "case knowledge" (high priority, context-specific)
router.add_rule(RoutingRule {
    condition: RoutingCondition::SourcePath("projects/*".into()),
    knowledge_type: KnowledgeTypeHint::Case,
});

// Reference docs are "background knowledge" (supporting context)
router.add_rule(RoutingRule {
    condition: RoutingCondition::Category("reference".into()),
    knowledge_type: KnowledgeTypeHint::Background,
});

// Classify incoming content
let knowledge_type = router.classify(&path, &content, &metadata);

7. Interfaces

gRPC Server

When useful: Microservice integration, high-performance RPC.

# Start server
just server

# Or with cargo
cargo run --bin converge-knowledge-server -- --address 0.0.0.0:50051
service KnowledgeService {
    rpc AddEntry(AddEntryRequest) returns (AddEntryResponse);
    rpc Search(SearchRequest) returns (SearchResponse);
    rpc SearchStream(SearchRequest) returns (stream SearchResult);
    rpc RecordFeedback(FeedbackRequest) returns (FeedbackResponse);
    // ... 12 methods total
}

MCP Server (Claude Desktop)

When useful: Using the knowledge base directly from Claude Desktop.

just mcp  # Start MCP server

Tools available in Claude:

  • knowledge_search - Semantic search
  • knowledge_add - Add entries
  • knowledge_get - Get by ID
  • knowledge_feedback - Improve search
  • knowledge_stats - Statistics

CLI

# Add knowledge
just add "Topic" "Content here..."

# Search
just search "query terms"

# Import files
just import ./docs/

# Stats
just stats

Architecture

┌─────────────────────────────────────────────────────────────────────┐
│                       Converge Knowledge                             │
├─────────────────────────────────────────────────────────────────────┤
│  Interfaces                                                          │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────────────────────┐ │
│  │   CLI   │  │  gRPC   │  │   MCP   │  │     Library API         │ │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────────────┬────────────┘ │
│       └────────────┴────────────┴────────────────────┘              │
│                              │                                       │
├──────────────────────────────┼───────────────────────────────────────┤
│  Core                        │                                       │
│  ┌───────────────────────────┴────────────────────────────────────┐ │
│  │                      KnowledgeBase                              │ │
│  │  ┌─────────────┐  ┌───────────────┐  ┌──────────────────────┐  │ │
│  │  │  Embedding  │  │   Learning    │  │      Storage         │  │ │
│  │  │   Engine    │  │    Engine     │  │      Backend         │  │ │
│  │  │ Hash/OpenAI │  │  GNN + EWC    │  │      Bincode         │  │ │
│  │  └─────────────┘  └───────────────┘  └──────────────────────┘  │ │
│  └─────────────────────────────────────────────────────────────────┘ │
│                                                                       │
├───────────────────────────────────────────────────────────────────────┤
│  AgenticDB (Agent Memory)                                            │
│  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│  │  Reflexion   │ │    Skill     │ │   Causal     │ │   Learning   │ │
│  │  Episodes    │ │   Library    │ │   Memory     │ │   Sessions   │ │
│  │ Self-critique│ │   Patterns   │ │  Hypergraph  │ │  RL Rewards  │ │
│  └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│                                                                       │
├───────────────────────────────────────────────────────────────────────┤
│  Advanced Learning                                                    │
│  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│  │    Time      │ │   Online     │ │    Meta      │ │   Drift      │ │
│  │  Crystals    │ │   Learner    │ │   Learner    │ │  Detector    │ │
│  │  Temporal    │ │   EWC+Replay │ │  MAML-style  │ │  Shift Alert │ │
│  └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│                                                                       │
├───────────────────────────────────────────────────────────────────────┤
│  Ingestion                                                           │
│  ┌──────────────┐ ┌──────────────┐ ┌──────────────┐                  │
│  │   Markdown   │ │     PDF      │ │   Knowledge  │                  │
│  │   Ingester   │ │   Ingester   │ │    Router    │                  │
│  │  Chunks/YAML │ │  Pages/Meta  │ │ Case vs Bkgd │                  │
│  └──────────────┘ └──────────────┘ └──────────────┘                  │
└───────────────────────────────────────────────────────────────────────┘

Quick Start

# Build
cargo build --release

# Run tests
cargo test

# Start gRPC server
cargo run --bin converge-knowledge-server

# Start MCP server (for Claude Desktop)
cargo run --bin converge-knowledge-mcp

# Use CLI
cargo run -- search "your query"

Dependencies

  • Rust 2024 Edition (1.85+)
  • tokio - Async runtime
  • tonic - gRPC
  • serde - Serialization
  • pulldown-cmark - Markdown parsing
  • pdf-extract - PDF text extraction
  • OpenAI API (optional) - Production embeddings

License

MIT