Развёрнутая документация библиотеки GitPrompt с примерами использования.
- Введение
- Установка
- Быстрый старт
- Конфигурация
- Основные сценарии
- Парсер и работа с файлами
- Отслеживание изменений
- Развёртывание
- CLI
- Продвинутые сценарии
- Обработка ошибок
GitPrompt — библиотека для индексации Git-репозиториев и семантического поиска по коду с помощью векторных эмбеддингов.
Основные возможности:
- Парсинг репозиториев (папки, Git, субмодули)
- Генерация эмбеддингов через OpenAI, Cohere, Sentence Transformers
- Хранение в ChromaDB, Pinecone, Weaviate, Qdrant
- Отслеживание изменений и обновление индекса
- Поиск по нескольким репозиториям
- Удалённое развёртывание и синхронизация
Требования: Python 3.9+, Git, API-ключи выбранных провайдеров (при необходимости).
pip install gitpromptgit clone https://github.com/yourusername/gitprompt.git
cd gitprompt
pip install -e .# ChromaDB (локальная БД)
pip install gitprompt[chroma]
# OpenAI
pip install gitprompt[openai]
# Pinecone
pip install gitprompt[pinecone]
# Sentence Transformers (локальные модели)
pip install gitprompt[sentence-transformers]Минимальный пример: индексация репозитория и поиск по нему.
import asyncio
from gitprompt import (
GitIndexer,
Config,
VectorDBConfig,
LLMConfig,
VectorDBType,
LLMProvider,
)
async def main():
config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="my_repo",
),
llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="your-openai-api-key",
model_name="text-embedding-ada-002",
),
)
indexer = GitIndexer(config)
result = await indexer.index_repository("/path/to/your/repository")
print(f"Файлов: {result['total_files']}, чанков: {result['total_chunks']}")
results = await indexer.search_across_repositories(
"как работает аутентификация",
limit=5,
)
for r in results:
print(f"Файл: {r['file_path']}, схожесть: {r['distance']:.3f}")
print(r["content"][:200], "...")
print("---")
if __name__ == "__main__":
asyncio.run(main())Важно: перед поиском репозиторий должен быть проиндексирован (index_repository). Для поиска по нескольким репозиториям каждый из них нужно сначала добавить/проиндексировать через тот же GitIndexer.
Все настройки задаются через класс Config и вложенные конфиги.
from gitprompt import (
Config,
VectorDBConfig,
LLMConfig,
GitConfig,
DeploymentConfig,
VectorDBType,
LLMProvider,
)vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="my_embeddings",
dimension=1536, # опционально, подставляется из модели при инициализации
)vector_db=VectorDBConfig(
type=VectorDBType.PINECONE,
api_key="your-pinecone-api-key",
collection_name="my_embeddings",
dimension=1536,
)vector_db=VectorDBConfig(
type=VectorDBType.QDRANT,
host="localhost",
port=6333,
collection_name="my_embeddings",
dimension=1536,
)vector_db=VectorDBConfig(
type=VectorDBType.WEAVIATE,
host="localhost",
port=8080,
collection_name="MyClass",
dimension=1536,
)llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="your-openai-api-key",
model_name="text-embedding-ada-002", # или text-embedding-3-small / text-embedding-3-large
batch_size=100,
max_tokens=8192,
)llm=LLMConfig(
provider=LLMProvider.SENTENCE_TRANSFORMERS,
model_name="all-MiniLM-L6-v2", # или all-mpnet-base-v2
batch_size=32,
)llm=LLMConfig(
provider=LLMProvider.COHERE,
api_key="your-cohere-api-key",
model_name="embed-english-v2.0", # или embed-multilingual-v2.0
batch_size=96,
)git=GitConfig(
branch="main", # ветка по умолчанию
include_patterns=[
"**/*.py",
"**/*.js",
"**/*.ts",
"**/*.md",
],
exclude_patterns=[
"**/node_modules/**",
"**/.git/**",
"**/__pycache__/**",
"**/venv/**",
],
chunk_size=1000,
chunk_overlap=200,
track_submodules=True,
track_remote=False,
)from gitprompt import (
Config,
VectorDBConfig,
LLMConfig,
GitConfig,
DeploymentConfig,
VectorDBType,
LLMProvider,
)
config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="project_index",
dimension=1536,
),
llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="sk-...",
model_name="text-embedding-ada-002",
batch_size=100,
max_tokens=8192,
),
git=GitConfig(
branch="main",
include_patterns=["**/*.py", "**/*.md"],
exclude_patterns=["**/__pycache__/**", "**/.git/**"],
chunk_size=1000,
chunk_overlap=200,
),
deployment=DeploymentConfig(
enabled=False,
server_url=None,
api_key=None,
sync_interval=300,
auto_deploy=False,
),
cache_dir=".gitprompt_cache",
log_level="INFO",
max_workers=4,
)import asyncio
from gitprompt import (
GitIndexer,
Config,
VectorDBConfig,
LLMConfig,
VectorDBType,
LLMProvider,
)
async def index_one_repo():
config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="single_repo",
),
llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="your-openai-api-key",
model_name="text-embedding-ada-002",
),
)
indexer = GitIndexer(config)
repo_path = "/path/to/repository"
result = await indexer.index_repository(repo_path)
print(f"Файлов: {result['total_files']}")
print(f"Чанков: {result['total_chunks']}")
print(f"Эмбеддингов: {result['total_embeddings']}")
asyncio.run(index_one_repo())result = await indexer.index_repository("/path/to/repo", branch="develop")async def multi_repo():
config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="multi_repo",
),
llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="your-openai-api-key",
),
)
indexer = GitIndexer(config)
repos = [
"/path/to/frontend",
"/path/to/backend",
"/path/to/docs",
]
for path in repos:
await indexer.index_repository(path)
print(f"Проиндексирован: {path}")
results = await indexer.search_across_repositories(
"конфигурация базы данных",
limit=10,
)
for r in results:
print(f"[{r.get('repository_path', '?')}] {r['file_path']}: {r['distance']:.3f}")
asyncio.run(multi_repo())Репозиторий можно добавить один раз и затем вызывать индексацию и поиск по нему:
indexer = GitIndexer(config)
repo = await indexer.add_repository("/path/to/repo")
# Индексация этого репозитория
result = await repo.index_repository()
# или с веткой:
result = await repo.index_repository(branch="feature/auth")
# Поиск только в этом репозитории
results = await repo.search_similar("функция логина", limit=5)Каждый элемент в search_similar / search_across_repositories — словарь, например:
file_path— путь к файлуcontent— текст чанкаdistance— оценка схожести (чем выше, тем релевантнее)repository_path— путь к репозиторию (при поиске через индексер)
Парсер репозитория доступен через repo.parser (тип GitRepositoryParser).
repo = await indexer.add_repository("/path/to/repo")
chunks = await repo.parser.parse_repository(repo.path, branch=None)
print(f"Чанков: {len(chunks)}")
for c in chunks[:3]:
print(c.file_path, c.chunk_id, len(c.content))from gitprompt.interfaces import ChangeType
changes = await repo.parser.get_changes(
repo.path,
"main",
"feature/new-feature",
)
for ch in changes:
print(ch.file_path, ch.change_type)
if ch.change_type == ChangeType.MODIFIED and ch.diff:
print(ch.diff[:300])changes = await repo.parser.get_current_changes(repo.path)changes = await repo.parser.get_changes(repo.path, "main", "develop")
result = await repo.index_changes(changes)
print(result["processed_files"], result["new_chunks"], result["deleted_chunks"])После инициализации репозитория доступен change_tracker. Мониторинг запускается для уже добавленных репозиториев.
# Сначала добавляем репозитории
for path in ["/path/to/repo1", "/path/to/repo2"]:
await indexer.add_repository(path)
# Затем запускаем мониторинг (долгая задача)
await indexer.start_monitoring()
# Остановка: await indexer.stop_monitoring()repo = await indexer.add_repository("/path/to/repo")
await repo.start_change_tracking()
# В консоль будут выводиться сообщения о изменениях.
# Остановка: await repo.stop_change_tracking()При включённом config.deployment.auto_deploy обнаруженные изменения могут автоматически переиндексироваться (зависит от реализации в вашей версии).
Удалённое развёртывание настраивается через DeploymentConfig и класс DeploymentManager.
from gitprompt import (
Config,
VectorDBConfig,
LLMConfig,
DeploymentConfig,
DeploymentManager,
VectorDBType,
LLMProvider,
)
config = Config(
vector_db=VectorDBConfig(type=VectorDBType.CHROMA, collection_name="deploy"),
llm=LLMConfig(provider=LLMProvider.OPENAI, api_key="your-key"),
deployment=DeploymentConfig(
enabled=True,
server_url="https://your-indexing-server.com",
api_key="your-server-api-key",
sync_interval=300,
auto_deploy=True,
),
)
indexer = GitIndexer(config)
await indexer.index_repository("/path/to/repo")
deployment = DeploymentManager(config.deployment, indexer)
await deployment.initialize()
result = await deployment.deploy_repository("/path/to/repo")
print(result)Дальнейшие вызовы (например, start_auto_sync) зависят от API вашего сервера и описаны в DEPLOYMENT.md.
Установка пакета регистрирует команду gitprompt.
gitprompt index /path/to/repository
gitprompt index /path/to/repository --branch develop
gitprompt index /path/to/repository --config config.json --output result.jsongitprompt search "authentication flow" --limit 10
gitprompt search "database config" --config config.json --output results.jsongitprompt monitor /path/to/repository
gitprompt monitor /path/to/repository --config config.jsongitprompt deploy /path/to/repository --server-url https://server.com --api-key KEYgitprompt config --output gitprompt_config.json
gitprompt config --vector-db chroma --llm-provider openai --openai-key sk-...Конфиг сохраняется в JSON; его можно править и передавать в --config при вызовах index, search, monitor, deploy.
code_config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="code",
dimension=1536,
),
llm=LLMConfig(
provider=LLMProvider.OPENAI,
api_key="your-key",
model_name="text-embedding-ada-002",
batch_size=50,
),
git=GitConfig(
include_patterns=["**/*.py", "**/*.js", "**/*.ts"],
exclude_patterns=["**/node_modules/**", "**/__pycache__/**"],
chunk_size=500,
chunk_overlap=100,
),
)
docs_config = Config(
vector_db=VectorDBConfig(
type=VectorDBType.CHROMA,
collection_name="docs",
dimension=1024,
),
llm=LLMConfig(
provider=LLMProvider.SENTENCE_TRANSFORMERS,
model_name="all-MiniLM-L6-v2",
),
git=GitConfig(
include_patterns=["**/*.md", "**/*.rst", "**/docs/**"],
chunk_size=2000,
chunk_overlap=400,
),
)
code_indexer = GitIndexer(code_config)
docs_indexer = GitIndexer(docs_config)
await code_indexer.index_repository("/path/to/code")
await docs_indexer.index_repository("/path/to/docs")search_cache = {}
async def cached_search(indexer, query: str, limit: int = 10):
key = f"{query}:{limit}"
if key not in search_cache:
search_cache[key] = await indexer.search_across_repositories(query, limit=limit)
return search_cache[key]Идея: получить чанки через парсер, генерировать эмбеддинги батчами и писать в векторную БД, выводя прогресс.
repo = await indexer.add_repository("/path/to/repo")
chunks = await repo.parser.parse_repository(repo.path)
total = len(chunks)
batch_size = 100
for i in range(0, total, batch_size):
batch = chunks[i : i + batch_size]
embeddings = await repo._generate_embeddings(batch)
await repo.vector_db.store_embeddings(embeddings)
print(f"Progress: {min(i + batch_size, total)}/{total}")Префикс конфигурации из окружения: GITPROMPT_. Например, можно задать GITPROMPT_LOG_LEVEL, GITPROMPT_CACHE_DIR. API-ключи часто задают через OPENAI_API_KEY, PINECONE_API_KEY и т.д., в зависимости от реализации загрузки конфига в вашем коде.
Библиотека определяет иерархию исключений в gitprompt.exceptions.
from gitprompt import (
GitPromptError,
ConfigurationError,
VectorDatabaseError,
EmbeddingError,
GitParserError,
DeploymentError,
AuthenticationError,
NetworkError,
InvalidRepositoryError,
UnsupportedProviderError,
RateLimitError,
)
async def safe_index():
try:
result = await indexer.index_repository("/path/to/repo")
return result
except ConfigurationError as e:
print("Ошибка конфигурации:", e)
except EmbeddingError as e:
print("Ошибка эмбеддингов (API, лимиты):", e)
except VectorDatabaseError as e:
print("Ошибка векторной БД:", e)
except InvalidRepositoryError as e:
print("Неверный или недоступный репозиторий:", e)
except GitPromptError as e:
print("Общая ошибка GitPrompt:", e)Рекомендуется обрабатывать конкретные типы исключений и при необходимости логировать или повторять запросы (например, при RateLimitError).
- API Reference — описание классов и методов.
- Примеры — больше примеров (в т.ч. CI/CD, Jupyter, аналитика).
- Конфигурация — детали настроек и переменных окружения.
- Развёртывание — сервер, Docker, облако, CI/CD.
Примеры кода из этого руководства можно копировать и запускать, подставив свои пути к репозиториям и API-ключи.