Skip to content

Commit cc75e62

Browse files
committed
feat: support LiteLLM
1 parent e15bd8c commit cc75e62

5 files changed

Lines changed: 1058 additions & 47 deletions

File tree

README.md

Lines changed: 96 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,58 +7,124 @@ An MCP (Model Context Protocol) server for indexing and querying codebases using
77
- **Semantic Code Search**: Find relevant code using natural language queries
88
- **Incremental Indexing**: Only re-indexes changed files for fast updates
99
- **Multi-Language Support**: Python, JavaScript/TypeScript, Rust, Go
10-
- **Vector Embeddings**: Uses sentence-transformers for semantic similarity
10+
- **Flexible Embeddings**: Local SentenceTransformers (default) or 100+ cloud providers via [LiteLLM](https://docs.litellm.ai/docs/embedding/supported_embedding)
1111
- **SQLite Storage**: Portable, no external database required
1212

13-
## Installation
13+
## Usage with Claude Code
14+
15+
No installation needed — `uvx` runs it directly.
16+
17+
### Default (Local Embeddings)
18+
19+
Uses a local SentenceTransformers model (`sentence-transformers/all-MiniLM-L6-v2`). No API key required:
1420

1521
```bash
16-
pip install cocoindex-code
22+
claude mcp add cocoindex-code -- uvx cocoindex-code
1723
```
1824

19-
Or with uv:
25+
### OpenAI
2026

2127
```bash
22-
uv pip install cocoindex-code
28+
claude mcp add cocoindex-code \
29+
-e COCOINDEX_CODE_EMBEDDING_MODEL=text-embedding-3-small \
30+
-e OPENAI_API_KEY=your-api-key \
31+
-- uvx cocoindex-code
2332
```
2433

25-
## Usage with Claude Code
34+
### Azure OpenAI
2635

27-
Add to your Claude Code MCP configuration (`.claude/mcp_config.json`):
36+
```bash
37+
claude mcp add cocoindex-code \
38+
-e COCOINDEX_CODE_EMBEDDING_MODEL=azure/your-deployment-name \
39+
-e AZURE_API_KEY=your-api-key \
40+
-e AZURE_API_BASE=https://your-resource.openai.azure.com \
41+
-e AZURE_API_VERSION=2024-06-01 \
42+
-- uvx cocoindex-code
43+
```
2844

29-
```json
30-
{
31-
"mcpServers": {
32-
"cocoindex-code": {
33-
"command": "cocoindex-code",
34-
"env": {
35-
"COCOINDEX_CODE_ROOT_PATH": "/path/to/your/codebase"
36-
}
37-
}
38-
}
39-
}
45+
### Gemini
46+
47+
```bash
48+
claude mcp add cocoindex-code \
49+
-e COCOINDEX_CODE_EMBEDDING_MODEL=gemini/text-embedding-004 \
50+
-e GEMINI_API_KEY=your-api-key \
51+
-- uvx cocoindex-code
4052
```
4153

42-
Or without explicit path (auto-discovers from current directory):
54+
### Mistral
4355

44-
```json
45-
{
46-
"mcpServers": {
47-
"cocoindex-code": {
48-
"command": "cocoindex-code"
49-
}
50-
}
51-
}
56+
```bash
57+
claude mcp add cocoindex-code \
58+
-e COCOINDEX_CODE_EMBEDDING_MODEL=mistral/mistral-embed \
59+
-e MISTRAL_API_KEY=your-api-key \
60+
-- uvx cocoindex-code
5261
```
5362

54-
## Configuration
63+
### Voyage (Code-Optimized)
64+
65+
```bash
66+
claude mcp add cocoindex-code \
67+
-e COCOINDEX_CODE_EMBEDDING_MODEL=voyage/voyage-code-3 \
68+
-e VOYAGE_API_KEY=your-api-key \
69+
-- uvx cocoindex-code
70+
```
71+
72+
### Cohere
73+
74+
```bash
75+
claude mcp add cocoindex-code \
76+
-e COCOINDEX_CODE_EMBEDDING_MODEL=cohere/embed-english-v3.0 \
77+
-e COHERE_API_KEY=your-api-key \
78+
-- uvx cocoindex-code
79+
```
80+
81+
### AWS Bedrock
82+
83+
```bash
84+
claude mcp add cocoindex-code \
85+
-e COCOINDEX_CODE_EMBEDDING_MODEL=bedrock/amazon.titan-embed-text-v2:0 \
86+
-e AWS_ACCESS_KEY_ID=your-access-key \
87+
-e AWS_SECRET_ACCESS_KEY=your-secret-key \
88+
-e AWS_REGION_NAME=us-east-1 \
89+
-- uvx cocoindex-code
90+
```
91+
92+
### Ollama (Local)
93+
94+
```bash
95+
claude mcp add cocoindex-code \
96+
-e COCOINDEX_CODE_EMBEDDING_MODEL=ollama/nomic-embed-text \
97+
-- uvx cocoindex-code
98+
```
99+
100+
Set `OLLAMA_API_BASE` if your Ollama server is not at `http://localhost:11434`.
55101

56-
Environment variables:
102+
### Nebius
103+
104+
```bash
105+
claude mcp add cocoindex-code \
106+
-e COCOINDEX_CODE_EMBEDDING_MODEL=nebius/BAAI/bge-en-icl \
107+
-e NEBIUS_API_KEY=your-api-key \
108+
-- uvx cocoindex-code
109+
```
110+
111+
### Other Providers
112+
113+
Any model supported by LiteLLM works — see the [full list of embedding providers](https://docs.litellm.ai/docs/embedding/supported_embedding).
114+
115+
## Configuration
57116

58117
| Variable | Description | Default |
59118
|----------|-------------|---------|
60119
| `COCOINDEX_CODE_ROOT_PATH` | Root path of the codebase | Auto-discovered (see below) |
61-
| `COCOINDEX_CODE_EMBEDDING_MODEL` | Embedding model to use | `sentence-transformers/all-MiniLM-L6-v2` |
120+
| `COCOINDEX_CODE_EMBEDDING_MODEL` | Embedding model (see below) | `sbert/sentence-transformers/all-MiniLM-L6-v2` |
121+
122+
### Embedding Model
123+
124+
The `COCOINDEX_CODE_EMBEDDING_MODEL` variable uses a prefix to select the embedding backend:
125+
126+
- **`sbert/`** prefix — uses [SentenceTransformers](https://www.sbert.net/) (runs locally, no API key needed). Example: `sbert/sentence-transformers/all-MiniLM-L6-v2`
127+
- **Otherwise** — uses [LiteLLM](https://docs.litellm.ai/docs/embedding/supported_embedding) (supports 100+ providers). Example: `text-embedding-3-small`
62128

63129
### Root Path Discovery
64130

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ classifiers = [
2323

2424
dependencies = [
2525
"mcp>=1.0.0",
26-
"cocoindex==1.0.0a10",
26+
"cocoindex[litellm]>=1.0.0a12",
2727
"sentence-transformers>=2.2.0",
2828
"sqlite-vec>=0.1.0",
2929
"pydantic>=2.0.0",

src/cocoindex_code/config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,10 @@ def from_env(cls) -> "Config":
6262
root = _discover_codebase_root()
6363

6464
# Get embedding model
65+
# Prefix "sbert/" for SentenceTransformers models, otherwise LiteLLM.
6566
embedding_model = os.environ.get(
6667
"COCOINDEX_CODE_EMBEDDING_MODEL",
67-
"sentence-transformers/all-MiniLM-L6-v2",
68+
"sbert/sentence-transformers/all-MiniLM-L6-v2",
6869
)
6970

7071
# Index directory is always under the root

src/cocoindex_code/shared.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,36 @@
11
"""Shared resources for CocoIndex Code."""
22

3+
from __future__ import annotations
4+
35
from collections.abc import Iterator
46
from dataclasses import dataclass
5-
from typing import Annotated
7+
from typing import TYPE_CHECKING, Annotated
68

79
import cocoindex as coco
810
from cocoindex.connectors import sqlite
9-
from cocoindex.ops.sentence_transformers import SentenceTransformerEmbedder
1011
from numpy.typing import NDArray
1112

13+
if TYPE_CHECKING:
14+
from cocoindex.ops.litellm import LiteLLMEmbedder
15+
from cocoindex.ops.sentence_transformers import SentenceTransformerEmbedder
16+
1217
from .config import Config
1318

19+
SBERT_PREFIX = "sbert/"
20+
1421
# Load configuration at module level
1522
config = Config.from_env()
1623

17-
# Initialize embedder at module level
18-
embedder = SentenceTransformerEmbedder(config.embedding_model)
24+
# Initialize embedder at module level based on model prefix
25+
embedder: SentenceTransformerEmbedder | LiteLLMEmbedder
26+
if config.embedding_model.startswith(SBERT_PREFIX):
27+
from cocoindex.ops.sentence_transformers import SentenceTransformerEmbedder
28+
29+
embedder = SentenceTransformerEmbedder(config.embedding_model[len(SBERT_PREFIX) :])
30+
else:
31+
from cocoindex.ops.litellm import LiteLLMEmbedder
32+
33+
embedder = LiteLLMEmbedder(config.embedding_model)
1934

2035
# Context key for SQLite database (connection managed in lifespan)
2136
SQLITE_DB = coco.ContextKey[sqlite.SqliteDatabase]("sqlite_db")

0 commit comments

Comments
 (0)