---
name: semtools
description: This skill provides semantic search capabilities using embedding-based similarity matching for code and text. Enables meaning-based search beyond keyword matching, with optional document parsing (PDF, DOCX, PPTX) support.
license: MIT
---

# Semtools: Semantic Search

Perform semantic (meaning-based) search across code and documents using embedding-based similarity matching.

## Purpose

The semtools skill provides access to Semtools, a high-performance Rust-based CLI for semantic search and document processing. Unlike traditional text search (ripgrep) which matches exact strings, or structural search (ast-grep) which matches syntax patterns, semtools understands **semantic meaning** through embeddings.

**Key capabilities:**

1. **Semantic Search**: Find code/text by meaning, not just keywords
2. **Workspace Management**: Index large codebases for fast repeated searches
3. **Document Parsing**: Convert PDFs, DOCX, PPTX to searchable text (requires API key)

Semtools excels at **discovery** - finding relevant code when you don't know the exact keywords, function names, or syntax patterns.

## When to Use This Skill

Use the semtools skill when you need meaning-based search:

**Semantic Code Discovery:**
- Finding code that implements a concept ("error handling", "data validation")
- Discovering similar functionality across different modules
- Locating examples of a pattern when you don't know exact names
- Understanding what code does without reading everything

**Documentation & Knowledge:**
- Searching documentation by concept, not keywords
- Finding related discussions in comments or docs
- Discovering similar issues or solutions
- Analyzing technical documents (PDFs, reports)

**Use Cases:**
- "Find all authentication-related code" (without knowing function names)
- "Show me error handling patterns" (regardless of specific error types)
- "Find code similar to this implementation" (semantic similarity)
- "Search research papers for 'distributed consensus'" (document search)

**Choose semtools over file-search (ripgrep/ast-grep) when:**
- You know the **concept** but not the **keywords**
- Exact string matching misses relevant results
- You want semantically similar code, not exact matches
- Searching across languages or mixed content

**Still use file-search when:**
- You know exact keywords, function names, or patterns
- You need structural code matching (ast-grep)
- Speed is critical (ripgrep is faster for exact matches)
- You're searching for specific symbols or references

## Available Commands

Semtools provides three CLI commands you can use via `execute_command`:

- **`search`** - Semantic search across code and text files
- **`workspace`** - Manage workspaces for caching embeddings
- **`parse`** - Convert documents (PDF, DOCX, PPTX) to searchable text

**All commands work out-of-the-box** in your execution environment. Document parsing requires the LLAMA_CLOUD_API_KEY environment variable to be set.

## Core Operations

### 1. Semantic Search (`search`)

Find files and code sections by semantic meaning:

```bash
# Basic semantic search
search "authentication logic" src/

# Search with more context (5 lines before/after)
search "error handling" --n-lines 5 src/

# Get more results (default: 3)
search "database queries" --top-k 10 src/

# Control similarity threshold (0.0-1.0, lower = more lenient)
search "API endpoints" --max-distance 0.4 src/
```

**Parameters:**
- `--n-lines N`: Show N lines of context around matches (default: 3)
- `--top-k K`: Return top K most similar matches (default: 3)
- `--max-distance D`: Maximum embedding distance (0.0-1.0, default: 0.3)
- `-i`: Case-insensitive matching

**Output format:**
```
Match 1 (similarity: 0.12)
File: src/auth/handlers.py
Lines: 42-47
----
def authenticate_user(username: str, password: str) -> Optional[User]:
    """Authenticate user credentials against database."""
    user = get_user_by_username(username)
    if user and verify_password(password, user.password_hash):
        return user
    return None
----

Match 2 (similarity: 0.18)
File: src/middleware/auth.py
...
```

### 2. Workspace Management (`workspace`)

For large codebases, create workspaces to cache embeddings and enable fast repeated searches:

```bash
# Create/activate workspace
workspace use my-project

# Set workspace via environment variable
export SEMTOOLS_WORKSPACE=my-project

# Index files in workspace (workspace auto-detected from env var)
search "query" src/

# Check workspace status
workspace status

# Clean up old workspaces
workspace prune
```

**Benefits:**
- **Fast repeated searches**: Embeddings cached, no re-computation
- **Large codebases**: IVF_PQ indexing for scalability
- **Session persistence**: Maintain context across multiple searches

**When to use workspaces:**
- Searching the same codebase multiple times
- Very large projects (1000+ files)
- Interactive exploration sessions
- CI/CD pipelines with repeated searches

### 3. Document Parsing (`parse`) ⚠️ Requires API Key

Convert documents to searchable markdown (requires LlamaParse API key):

```bash
# Parse PDFs to markdown
parse research_papers/*.pdf

# Parse Word documents
parse reports/*.docx

# Parse presentations
parse slides/*.pptx

# Parse and pipe to search
parse docs/*.pdf | xargs search "neural networks"
```

**Supported formats:**
- PDF (.pdf)
- Word (.docx)
- PowerPoint (.pptx)

**Configuration:**
```bash
# Via environment variable
export LLAMA_CLOUD_API_KEY="llx-..."

# Via config file
cat > ~/.parse_config.json << EOF
{
  "api_key": "llx-...",
  "max_concurrent_requests": 10,
  "timeout_seconds": 3600
}
EOF
```

**Important:** Document parsing is **optional**. Semantic search works without it.

## Workflow Patterns

### Pattern 1: Concept Discovery

When you know what you're looking for conceptually but not by name:

```bash
# Step 1: Broad semantic search
search "rate limiting implementation" src/

# Step 2: Review results, refine query
search "throttle requests per user" src/ --top-k 10

# Step 3: Use ripgrep for exact follow-up
rg "RateLimiter" --type py src/
```

### Pattern 2: Similar Code Finder

When you want to find code similar to a reference implementation:

```bash
# Step 1: Extract key concepts from reference code
# [Read example_auth.py and identify key concepts]

# Step 2: Search for similar implementations
search "user authentication with JWT tokens" src/

# Step 3: Compare implementations
# [Review semantic matches to find similar approaches]
```

### Pattern 3: Documentation Search

When researching concepts in documentation or comments:

```bash
# Search code comments semantically
search "thread safety guarantees" src/ --n-lines 10

# Search markdown documentation
search "deployment best practices" docs/

# Combined search
search "performance optimization" --top-k 20
```

### Pattern 4: Cross-Language Search

When searching for concepts across different languages:

```bash
# Semantic search works across languages
search "connection pooling" src/

# May find:
# - Java: "ConnectionPool manager"
# - Python: "database connection reuse"
# - Go: "pool of persistent connections"
# All semantically related despite different terminology
```

### Pattern 5: Document Analysis (with API key)

When analyzing PDFs or documents:

```bash
# Step 1: Parse documents to markdown
parse research/*.pdf > papers.md

# Step 2: Search converted content
search "transformer architecture" papers.md

# Step 3: Combine with code search
search "attention mechanism implementation" src/
```

## Integration with file-search

Semtools and file-search (ripgrep/ast-grep) are **complementary tools**. Use them together for comprehensive search:

### Search Strategy Matrix

| You Know | Use First | Then Use | Why |
|----------|-----------|----------|-----|
| Exact keywords | ripgrep | search | Fast exact match, then find similar |
| Concept only | search | ripgrep | Find relevant code, then search specifics |
| Function name | ripgrep | search | Find definition, then find similar usage |
| Code pattern | ast-grep | search | Find structure, then find similar logic |
| Approximate idea | search | ripgrep + ast-grep | Discover, then drill down |

### Layered Search Approach

```bash
# Layer 1: Semantic discovery (what's related?)
search "user session management" --top-k 10

# Layer 2: Exact text search (what's the implementation?)
rg "SessionManager|session_store" --type py

# Layer 3: Structural search (how is it used?)
sg --pattern 'session.$METHOD($$$)' --lang python

# Layer 4: Reference tracking (where is it called?)
# [Use serena skill for symbol-level tracking]
```

## Best Practices

### 1. Start Broad, Then Narrow

Use semantic search for discovery, then narrow with exact search:

```bash
# GOOD: Broad semantic discovery first
search "authentication" src/ --top-k 10
# [Review results to learn terminology]
rg "authenticate|verify_credentials" --type py src/

# AVOID: Starting too narrow and missing variations
rg "authenticate" --type py  # Misses "verify_credentials", "check_auth", etc.
```

### 2. Adjust Similarity Threshold

Tune `--max-distance` based on results:

```bash
# Too many irrelevant results? Decrease distance (more strict)
search "query" --max-distance 0.2

# Missing relevant results? Increase distance (more lenient)
search "query" --max-distance 0.5

# Default (0.3) works well for most cases
search "query"
```

### 3. Use Workspaces for Repeated Searches

For interactive exploration, always use workspaces:

```bash
# GOOD: Create workspace once, search many times
export SEMTOOLS_WORKSPACE=my-analysis
search "concept1" src/
search "concept2" src/
search "concept3" src/

# INEFFICIENT: Re-compute embeddings every time
search "concept1" src/
search "concept2" src/
```

### 4. Combine with Context Tools

Get more context around semantic matches:

```bash
# Find semantically similar code
search "retry logic" src/ --n-lines 2

# Get more context with ripgrep
rg -C 10 "retry" src/specific_file.py

# Or read the full file
cat src/specific_file.py
```

### 5. Phrase Queries Conceptually

Write queries as concepts, not exact keywords:

```bash
# GOOD: Conceptual queries
search "handling network timeouts"
search "user input validation"
search "concurrent data access"

# LESS EFFECTIVE: Exact keyword queries (use ripgrep instead)
search "timeout"  # Use: rg "timeout"
search "validate"  # Use: rg "validate"
```

## Understanding Semantic Distance

Semtools uses embedding vectors to measure semantic similarity:

- **Distance 0.0**: Identical meaning
- **Distance 0.1-0.2**: Very similar (synonyms, paraphrases)
- **Distance 0.2-0.3**: Related concepts (default threshold)
- **Distance 0.3-0.4**: Loosely related
- **Distance 0.5+**: Weakly related or unrelated

**Practical guidelines:**

```bash
# Strict matching (only close matches)
--max-distance 0.2

# Balanced matching (default, recommended)
--max-distance 0.3

# Lenient matching (exploratory search)
--max-distance 0.4

# Very lenient (may include false positives)
--max-distance 0.5
```

## Local vs. Cloud Embeddings

**Semantic Search (Local):**
- Uses local embeddings (model2vec, potion-multilingual-128M)
- **No API calls** or cloud dependencies
- Fast, private, no cost
- Works offline

**Document Parsing (Cloud):**
- Uses LlamaParse API (cloud-based)
- Requires API key and internet connection
- Processes PDFs, DOCX, PPTX
- Usage-based pricing (check LlamaIndex pricing)

**Privacy consideration:** Semantic search is 100% local. Only document parsing sends data to LlamaParse API.

## Performance Considerations

### Speed Characteristics

**Without workspace:**
- First search: ~2-5 seconds (embedding computation)
- Subsequent searches: ~2-5 seconds each (re-compute embeddings)

**With workspace (cached embeddings):**
- First search: ~2-5 seconds (builds index)
- Subsequent searches: ~0.1-0.5 seconds (cached)
- Large codebases: IVF_PQ indexing for scalability

**Comparison:**
- ripgrep: 0.01-0.1 seconds (fastest, exact match)
- ast-grep: 0.1-0.5 seconds (fast, structural)
- semtools (cached): 0.1-0.5 seconds (fast, semantic)
- semtools (uncached): 2-5 seconds (slower, semantic)

### Optimization Tips

```bash
# 1. Use workspaces for repeated searches
export SEMTOOLS_WORKSPACE=my-project

# 2. Limit search scope to relevant directories
search "query" src/ --not tests/

# 3. Use --top-k to control result count
search "query" --top-k 5

# 4. Pipe to head for quick preview
search "query" | head -50
```

## Unix Pipeline Integration

Semtools is designed for Unix-style composition:

```bash
# Find and parse PDFs, then search
find docs/ -name "*.pdf" | xargs parse | xargs search "topic"

# Search and filter with grep
search "authentication" src/ | grep -i "jwt"

# Count matches
search "error handling" src/ | grep "Match" | wc -l

# Combine with other tools
search "API" src/ | xargs -I {} rg -l "REST" {}
```

## Limitations

### When NOT to Use Semtools

1. **Exact keyword search**: Use ripgrep for known keywords
   ```bash
   # WRONG TOOL: Semantic search for exact function name
   search "authenticate_user"

   # RIGHT TOOL: Use ripgrep for exact matches
   rg "authenticate_user" --type py
   ```

2. **Structural code patterns**: Use ast-grep for syntax matching
   ```bash
   # WRONG TOOL: Semantic search for code structure
   search "class with constructor"

   # RIGHT TOOL: Use ast-grep for structure
   sg --pattern 'class $NAME { constructor($$$) { $$$ } }'
   ```

3. **Symbol references**: Use serena for LSP-based tracking
   ```bash
   # WRONG TOOL: Semantic search for all usages
   search "MyClass usage"

   # RIGHT TOOL: Use serena for precise references
   serena find_referencing_symbols --name 'MyClass'
   ```

4. **Small codebases**: Overhead not worth it for <100 files
   - ripgrep is faster and simpler for small projects

### Known Edge Cases

- **Ambiguous queries**: Vague concepts return broad results
- **Technical jargon**: Domain-specific terms may have lower accuracy
- **Short code snippets**: Limited context reduces embedding quality
- **Mixed languages**: Embeddings tuned for English (multilingual model used)
- **Generated code**: Repetitive patterns may cluster together

## Troubleshooting

### No Semantic Matches Found

If semantic search returns zero results:

1. **Verify files exist**: Use ripgrep to confirm content
   ```bash
   rg "concept" src/
   ```

2. **Increase similarity threshold**: Be more lenient
   ```bash
   search "query" --max-distance 0.5
   ```

3. **Rephrase query**: Try different terminology
   ```bash
   search "user authentication"
   search "verify user credentials"
   search "login validation"
   ```

4. **Check file types**: Ensure searching correct extensions
   ```bash
   search "query" src/*.py  # Target specific types
   ```

### Too Many Irrelevant Results

If semantic search returns too much noise:

1. **Decrease similarity threshold**: Be more strict
   ```bash
   search "query" --max-distance 0.2
   ```

2. **Limit result count**: Review top matches only
   ```bash
   search "query" --top-k 3
   ```

3. **Narrow directory scope**: Search specific paths
   ```bash
   search "query" src/specific_module/
   ```

4. **Refine query**: Add more specific concepts
   ```bash
   # Vague
   search "data"

   # Specific
   search "data validation with regex patterns"
   ```

### Document Parsing Fails

If `parse` fails:

1. **Verify API key is set**:
   ```bash
   echo $LLAMA_CLOUD_API_KEY
   ```

2. **Check file format**: Ensure supported format (PDF, DOCX, PPTX)
   ```bash
   file document.pdf  # Verify file type
   ```

3. **Check file size**: Large files may timeout
   ```bash
   du -h document.pdf  # Check size
   ```

4. **Review parse config**: Adjust timeouts if needed
   ```bash
   cat ~/.parse_config.json
   ```

### Workspace Issues

If workspace commands fail:

```bash
# Check workspace status
workspace status

# Prune corrupted workspaces
workspace prune

# Recreate workspace
rm -rf ~/.semtools/workspaces/my-workspace
export SEMTOOLS_WORKSPACE=my-workspace
```

## Resources

- [Semtools GitHub](https://github.com/run-llama/semtools)
- [LlamaParse Documentation](https://docs.llamaindex.ai/en/stable/llama_cloud/llama_parse/)
- [model2vec Embeddings](https://github.com/MinishLab/model2vec)
- [Semantic Search Concepts](https://en.wikipedia.org/wiki/Semantic_search)
