From 321aca594226b84660126321e1314371f94a1a5d Mon Sep 17 00:00:00 2001 From: zTgx <747674262@qq.com> Date: Fri, 10 Apr 2026 11:49:41 +0800 Subject: [PATCH] docs: add comprehensive configuration reference and usage guides - Add detailed configuration reference documentation covering all configuration layers, environment variables, and TOML file options including LLM settings, retry mechanisms, fallback strategies, retrieval configurations, and metrics tracking - Create Python usage guide with installation instructions, configuration methods (zero config, custom settings, config files), indexing examples from various sources (files, content, bytes), querying techniques, and document management operations - Develop Rust usage guide featuring engine builder patterns, multiple configuration approaches (presets, custom endpoints), indexing workflows with different input types and options, advanced querying with retrieve options and strategy preferences, streaming capabilities, and document graph functionality - Include comprehensive examples section for both Python and Rust with links to example repositories demonstrating various use cases --- docs/design/lovable-vectorless.png | Bin 42914 -> 0 bytes docs/guide/configuration.md | 218 ++++++++++++++++++ docs/guide/python.md | 193 ++++++++++++++++ docs/guide/rust.md | 357 +++++++++++++++++++++++++++++ 4 files changed, 768 insertions(+) delete mode 100644 docs/design/lovable-vectorless.png create mode 100644 docs/guide/configuration.md create mode 100644 docs/guide/python.md create mode 100644 docs/guide/rust.md diff --git a/docs/design/lovable-vectorless.png b/docs/design/lovable-vectorless.png deleted file mode 100644 index 40bb70471d912f09471ea1642791b4c179551838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42914 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 iz5oCK21!IgR09Af1|y0*&Yc7R0000 { + println!("Started: {} ({})", query, strategy); + } + RetrieveEvent::StageCompleted { stage, elapsed_ms } => { + println!("Stage {} done in {}ms", stage, elapsed_ms); + } + RetrieveEvent::NodeVisited { node_id, title, score } => { + println!("Visited: {} (score: {:.2})", title, score); + } + RetrieveEvent::ContentFound { node_id, title, preview, score } => { + println!("Found: {} — {} ({:.2})", title, preview, score); + } + RetrieveEvent::Backtracking { from, to, reason } => { + println!("Backtrack: {} → {} ({})", from, to, reason); + } + RetrieveEvent::SufficiencyCheck { level, tokens } => { + println!("Sufficiency: {:?}, {} tokens", level, tokens); + } + RetrieveEvent::Completed { response } => { + println!("Done: {}", response.content); + break; + } + RetrieveEvent::Error { message } => { + eprintln!("Error: {}", message); + break; + } + } +} +``` + +## Document Management + +```rust +// List documents +let docs = engine.list_documents().await?; +for doc in &docs { + println!("{}: {} ({})", doc.id, doc.name, doc.format); +} + +// Check existence +if engine.exists(&doc_id).await? { /* ... */ } + +// Remove +engine.remove(&doc_id).await?; + +// Batch remove +let ids = &["doc1", "doc2"]; +engine.batch_remove(ids).await?; + +// Clear all +let count = engine.clear().await?; +``` + +## Document Graph + +### Building a Graph + +```rust +use vectorless::document::{DocumentGraph, DocumentGraphConfig, DocumentGraphNode, WeightedKeyword}; +use vectorless::index::graph_builder::DocumentGraphBuilder; + +let config = DocumentGraphConfig { + enabled: true, + min_keyword_jaccard: 0.05, + min_shared_keywords: 2, + max_keywords_per_doc: 50, + max_edges_per_node: 20, + retrieval_boost_factor: 0.15, +}; + +let mut builder = DocumentGraphBuilder::new(config); + +builder.add_document("doc1", "Rust Guide", "md", 35, keywords(&[ + ("ownership", 0.95), ("borrowing", 0.90), ("lifetimes", 0.85), +])); +builder.add_document("doc2", "Async Rust", "md", 28, keywords(&[ + ("async", 0.95), ("lifetimes", 0.60), ("tokio", 0.90), +])); + +let graph = builder.build(); +``` + +### Exploring the Graph + +```rust +// Get neighbors (connected documents) +let neighbors = graph.get_neighbors("doc1"); +for edge in neighbors { + println!("→ {} [weight={:.3}, jaccard={:.3}]", + edge.target_doc_id, edge.weight, edge.evidence.keyword_jaccard); +} + +// Find documents by keyword +let entries = graph.find_by_keyword("lifetimes"); +for e in entries { + println!("{} (weight: {:.2})", e.doc_id, e.weight); +} + +// Stats +println!("Documents: {}", graph.node_count()); +println!("Edges: {}", graph.edge_count()); +``` + +## Custom Pilot + +```rust +use vectorless::retrieval::pilot::{Pilot, PilotDecision, SearchState, PilotConfig}; + +struct MyPilot; + +#[async_trait] +impl Pilot for MyPilot { + async fn guide(&self, state: &SearchState) -> PilotDecision { + // Custom navigation logic + PilotDecision::Continue + } +} +``` + +## Environment Variables + +| Variable | Description | +|----------|-------------| +| `OPENAI_API_KEY` | LLM API key | +| `VECTORLESS_MODEL` | Default model | +| `VECTORLESS_ENDPOINT` | Custom API endpoint URL | +| `VECTORLESS_WORKSPACE` | Workspace directory | + +## Examples + +See [examples/rust/](../../examples/rust/) for complete examples: + +| Example | Description | +|---------|-------------| +| `basic` | Core API: index, list, query | +| `advanced` | Full configuration file usage | +| `streaming` | Streaming retrieval with events | +| `document_graph` | Cross-document concept graph | +| `session` | Multi-document session operations | +| `feedback_learning` | User feedback and Pilot adaptation | +| `custom_pilot` | Custom navigation guidance | +| `reference_following` | In-document reference resolution | +| `strategy_hybrid` | BM25 + LLM hybrid retrieval | +| `strategy_cross_document` | Multi-document search | +| `strategy_page_range` | PDF page range filtering | +| `multi_format` | PDF, MD, DOCX, HTML handling | +| `events` | Event system monitoring | +| `storage_backend` | Custom storage implementations | +| `storage_compression` | Compression support | +| `storage_workspace` | Workspace and caching | +| `content_aggregation` | Content scoring and relevance | +| `batch_processing` | Batch document processing | +| `cli_tool` | Building CLI tools |