by FalkorDB (open source) Linux, PostgreSQL, MySQL, SQLite, Python
Open-source Text2SQL инструмент: превращает вопросы на естественном языке в SQL через graph-powered понимание схемы базы данных.
Продвинутый MCP-сервер для PostgreSQL: индексные рекомендации, анализ query plans, health check, connection pool tuning — AI-DBA …
Официальный MCP-сервер Supabase: управление проектами, таблицами, Edge Functions, storage и auth прямо из Claude или любого …
MCP-сервер для MySQL: позволяет AI-агентам выполнять запросы, просматривать схему таблиц, исследовать данные и вносить изменения в …
Неофициальный MCP-сервер для Notion с расширенными возможностями. Запросы к базам данных, создание и редактирование страниц, управление …
# Docker (быстрый старт) docker run -p 5000:5000 -it falkordb/queryweaver # Docker с файлом .env cp .env.example .env docker run -p 5000:5000 --env-file .env falkordb/queryweaver # Python SDK pip install queryweaver # Разработка из исходников git clone https://github.com/FalkorDB/QueryWeaver.git cd QueryWeaver make install make run-dev
REST API · MCP · Graph-powered
QueryWeaver — это open-source Text2SQL инструмент, который преобразует вопросы на простом английском языке в SQL с помощью понимания схемы на основе графов. Он позволяет задавать базам данных вопросы на естественном языке и возвращает SQL и результаты.
Подключайтесь и задавайте вопросы:
💡 Рекомендуется для целей оценки (локальные Python или Node не требуются)
docker run -p 5000:5000 -it falkordb/queryweaver
Запуск: http://localhost:5000
Создайте локальный файл .env, скопировав .env.example и передав его в Docker. Это самый простой способ предоставить всю необходимую конфигурацию:
cp .env.example .env
# edit .env to set your values, then:
docker run -p 5000:5000 --env-file .env falkordb/queryweaver
Если вы предпочитаете передавать переменные через командную строку, используйте флаги -e (менее удобно для многих переменных):
docker run -p 5000:5000 -it \
-e APP_ENV=production \
-e FASTAPI_SECRET_KEY=your_super_secret_key_here \
-e GOOGLE_CLIENT_ID=your_google_client_id \
-e GOOGLE_CLIENT_SECRET=your_google_client_secret \
-e GITHUB_CLIENT_ID=your_github_client_id \
-e GITHUB_CLIENT_SECRET=your_github_client_secret \
-e AZURE_API_KEY=your_azure_api_key \
falkordb/queryweaver
Примечание: QueryWeaver поддерживает несколько AI-провайдеров. Вы можете использовать
OPENAI_API_KEY,GEMINI_API_KEY,ANTHROPIC_API_KEYилиAZURE_API_KEY. Подробности см. в разделе конфигурация AI/LLM.Полный список параметров конфигурации см. в
.env.example.
QueryWeaver хранит память разговоров для каждого пользователя в FalkorDB. По умолчанию эти графы хранятся бессрочно. Установите MEMORY_TTL_SECONDS, чтобы применить Redis TTL (в секундах) для автоматической очистки неактивных графов памяти.
# Expire memory graphs after 1 week of inactivity
MEMORY_TTL_SECONDS=604800
TTL обновляется при каждом взаимодействии пользователя, так что активные пользователи сохраняют свою память.
QueryWeaver включает необязательную поддержку Model Context Protocol (MCP). Вы можете либо позволить QueryWeaver предоставлять MCP-совместимый HTTP-интерфейс (чтобы другие сервисы могли вызывать QueryWeaver как MCP-сервер), либо настроить QueryWeaver для вызова внешнего MCP-сервера для моделей/контекстных сервисов.
Что предоставляет QueryWeaver
- Приложение регистрирует MCP-операции, ориентированные на Text2SQL-процессы:
- list_databases
- connect_database
- database_schema
- query_database
DISABLE_MCP=true в вашем .env или окружении (по умолчанию: MCP включён).DISABLE_MCP — отключает встроенный MCP HTTP-интерфейс QueryWeaver. Установите true, чтобы отключить. По умолчанию: false (MCP включён).Примеры
Отключение встроенного MCP при запуске с Docker:
docker run -p 5000:5000 -it --env DISABLE_MCP=true falkordb/queryweaver
Вызов встроенных MCP-эндпоинтов (пример) - MCP-интерфейс предоставляется как HTTP-эндпоинты.
Ниже приведён минимальный пример конфигурации клиента mcp.json, который нацелен на локальный экземпляр QueryWeaver, предоставляющий MCP HTTP-интерфейс на /mcp.
{
"servers": {
"queryweaver": {
"type": "http",
"url": "http://127.0.0.1:5000/mcp",
"headers": {
"Authorization": "Bearer your_token_here"
}
}
},
"inputs": []
}
Swagger UI: https://app.queryweaver.ai/docs
OpenAPI JSON: https://app.queryweaver.ai/openapi.json
QueryWeaver предоставляет небольшой REST API для управления графами (схемами базы данных) и выполнения Text2SQL-запросов. Все эндпоинты, которые изменяют или получают доступ к данным в области пользователя, требуют аутентификации через bearer-токен. В браузере приложение использует сессионные cookie и OAuth-потоки; для CLI и скриптов вы можете использовать API-токен (см. маршруты tokens или веб-интерфейс для его создания).
Основные эндпоинты - GET /graphs — список доступных графов для аутентифицированного пользователя - GET /graphs/{graph_id}/data — возвращает узлы/связи (таблицы, колонки, внешние ключи) для графа - POST /graphs — загрузка или создание графа (JSON-полезная нагрузка или загрузка файла) - POST /graphs/{graph_id} — выполнение Text2SQL чат-запроса к указанному графу (потоковый ответ)
Аутентификация
- Добавьте заголовок авторизации: Authorization: Bearer <API_TOKEN>
Примеры
1) Получение списка графов (GET)
Пример с curl:
curl -s -H "Authorization: Bearer $TOKEN" \
https://app.queryweaver.ai/graphs
Пример на Python:
import requests
resp = requests.get('https://app.queryweaver.ai/graphs', headers={'Authorization': f'Bearer {TOKEN}'})
print(resp.json())
2) Получение схемы графа (GET)
Пример с curl:
curl -s -H "Authorization: Bearer $TOKEN" \
https://app.queryweaver.ai/graphs/my_database/data
Пример на Python:
resp = requests.get('https://app.queryweaver.ai/graphs/my_database/data', headers={'Authorization': f'Bearer {TOKEN}'})
print(resp.json())
3) Загрузка графа (POST) — JSON-полезная нагрузка
curl -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"database": "my_database", "tables": [...]}' \
https://app.queryweaver.ai/graphs
Или загрузка файла (multipart/form-data):
curl -H "Authorization: Bearer $TOKEN" -F "file=@schema.json" \
https://app.queryweaver.ai/graphs
4) Запрос к графу (POST) — выполнение чат-запросов Text2SQL
Конечная точка POST /graphs/{graph_id} принимает JSON-тело с как минимум полем chat (массив сообщений). Конечная точка передаёт этапы обработки и итоговый SQL обратно в виде фрагментов сообщений, отправляемых сервером, разделённых специальной границей, используемой фронтендом. Для простых сценариев можно вызвать её и прочитать итоговый JSON-объект из потоковых сообщений.
Пример полезлой нагрузки:
{
"chat": ["How many users signed up last month?"],
"result": [],
"instructions": "Prefer PostgreSQL compatible SQL"
}
Пример с curl (простой, собирает весь ответ):
curl -s -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"chat": ["Count orders last week"]}' \
https://app.queryweaver.ai/graphs/my_database
Пример на Python (с учётом потока):
import requests
import json
url = 'https://app.queryweaver.ai/graphs/my_database'
headers = {'Authorization': f'Bearer {TOKEN}', 'Content-Type': 'application/json'}
with requests.post(url, headers=headers, json={"chat": ["Count orders last week"]}, stream=True) as r:
# The server yields JSON objects delimited by a message boundary string
boundary = '|||FALKORDB_MESSAGE_BOUNDARY|||'
buffer = ''
for chunk in r.iter_content(decode_unicode=True, chunk_size=1024):
buffer += chunk
while boundary in buffer:
part, buffer = buffer.split(boundary, 1)
if not part.strip():
continue
obj = json.loads(part)
print('STREAM:', obj)
Примечания и советы
- Идентификаторы графов имеют пространство имён для каждого пользователя. При прямом вызове API используйте обычный идентификатор графа (сервер сам назначит пространство имён по аутентифицированному пользователю). Для загруженных файлов поле database определяет сохранённый идентификатор графа.
- Потоковый ответ включает промежуточные этапы рассуждений, уточняющие вопросы (если запрос неоднозначен или не по теме) и итоговый SQL. Фронтенд ожидает строку границы |||FALKORDB_MESSAGE_BOUNDARY||| между сообщениями.
- Для разрушительных SQL-запросов (INSERT/UPDATE/DELETE и т. д.) сервис включает этап подтверждения в потоке; фронтенд обрабатывает этот процесс. Если вы автоматизируете разрушительные операции, убедитесь, что правильно обрабатываете подтверждение (см. модель ConfirmRequest в коде).
Python SDK QueryWeaver позволяет использовать функциональность Text2SQL непосредственно в ваших Python-приложениях без запуска веб-сервера.
# SDK only (minimal dependencies)
pip install queryweaver
# With server dependencies (FastAPI, etc.)
pip install queryweaver[server]
# Development (includes testing tools)
pip install queryweaver[dev]
import asyncio
from queryweaver import QueryWeaver
async def main():
# Initialize with FalkorDB connection
qw = QueryWeaver(falkordb_url="redis://localhost:6379")
# Connect a PostgreSQL or MySQL database
conn = await qw.connect_database("postgresql://user:pass@host:5432/mydb")
print(f"Connected: {conn.database_id}") # "mydb"
# Convert natural language to SQL and execute — pass the database_id
# returned by connect_database (un-prefixed; namespacing is internal).
result = await qw.query(conn.database_id, "Show me all customers from NYC")
print(result.sql_query) # SELECT * FROM customers WHERE city = 'NYC'
print(result.results) # [{"id": 1, "name": "Alice", "city": "NYC"}, ...]
print(result.ai_response) # "Found 42 customers from NYC..."
await qw.close()
asyncio.run(main())
async with QueryWeaver(falkordb_url="redis://localhost:6379") as qw:
conn = await qw.connect_database("postgresql://user:pass@host/mydb")
result = await qw.query(conn.database_id, "Count orders by status")
# close() runs automatically, awaiting any in-flight background memory writes.
Несколько экземпляров QueryWeaver могут работать параллельно в одном процессе.
Каждый из них поддерживает собственное подключение к FalkorDB и явно передаёт его при каждом вызове, поэтому нет общего глобального состояния, которое мог бы конфликтовать.
async with QueryWeaver(falkordb_url="redis://host-a:6379", user_id="tenant_a") as a, \
QueryWeaver(falkordb_url="redis://host-b:6379", user_id="tenant_b") as b:
sales = await a.connect_database("postgresql://user:pass@host-a/sales")
ops = await b.connect_database("postgresql://user:pass@host-b/ops")
await a.query(sales.database_id, "Show top customers")
await b.query(ops.database_id, "Count open tickets")
| Метод | Описание |
|---|---|
connect_database(db_url) |
Подключение к PostgreSQL/MySQL и загруз схемы |
query(database, question) |
Преобразование естественного языка в SQL и выполнение |
get_schema(database) |
Получение схемы базы данных (таблиц и связей) |
list_databases() |
Список всех подключённых баз данных |
delete_database(database) |
Удаление базы данных из FalkorDB |
refresh_schema(database) |
Повторная синхронизация схемы после изменений в базе данных |
execute_confirmed(database, sql) |
Выполнение подтверждённых разрушительных операций |
Для многоходовых бесед, пользовательских инструкций или переопределений LL на каждый запрос:
from queryweaver import QueryWeaver, QueryRequest
request = QueryRequest(
question="Show their recent orders",
chat_history=["Show all customers from NYC"],
result_history=["Found 42 customers..."],
instructions="Use created_at for date filtering",
# Optional per-request LLM overrides — bypass env-based config
custom_api_key="sk-...",
custom_model="openai/gpt-4.1",
)
result = await qw.query("mydb", request)
Операции INSERT, UPDATE, DELETE требуют подтверждения:
result = await qw.query("mydb", "Delete inactive users")
if result.requires_confirmation:
print(f"Destructive SQL: {result.sql_query}")
# Execute after user confirms
confirmed = await qw.execute_confirmed("mydb", result.sql_query)
Выполните следующие шаги, чтобы запустить и разрабатывать QueryWeaver из исходного кода.
Быстрый старт (рекомендуется для разработки):
# Clone the repo
git clone https://github.com/FalkorDB/QueryWeaver.git
cd QueryWeaver
# Install dependencies (backend + frontend) and start the dev server
make install
make run-dev
Если вы предпочитаете настроить вручную или нуждаетесь в пользовательском окружении, используйте uv:
# Install Python (backend) and frontend dependencies
uv sync
# Create a local environment file
cp .env.example .env
# Edit .env with your values (set APP_ENV=development for local development)
uv run uvicorn api.index:app --host 0.0.0.0 --port 5000 --reload
Сервер будет доступен по адресу http://localhost:5000
Кроме того, в репозитории есть Make-цели для запуска приложения:
make run-dev # development server (reload, debug-friendly)
make run-prod # production mode (ensure frontend build if needed)
Фронтенд — современное приложение React + Vite в app/. Соберите перед производственным запуском или после изменений фронтенда:
make install # installs backend and frontend deps
make build-prod # builds the frontend into app/dist/
# or manually
cd app
npm ci
npm run build
QueryWeaver поддерживает Google и GitHub OAuth. Создайте учётные данные OAuth для каждого провайдера и вставьте идентификаторы клиентов/секреты в ваш файл .env.
http://localhost:5000/login/google/authorizedhttp://localhost:5000/login/github/authorizedДля production/staging развертываний установите APP_ENV=production или APP_ENV=staging в вашем окружении, чтобы включить безопасные сессионные cookie (только HTTPS). Это предотвращает ошибки несоответствия состояния OAuth CSRF.
# For production/staging (enables HTTPS-only session cookies)
APP_ENV=production
# For development (allows HTTP session cookies)
APP_ENV=development
Важно: Если вы получаете ошибки "mismatching_state: CSRF Warning!" на staging/production, убедитесь, что APP_ENV установлен в production или staging, чтобы включить безопасную обработку сессий.
QueryWeaver поддерживает несколько AI-провайдеров. Установите один API-ключ, и QueryWeaver автоматически определит, какого провайдера использовать.
Порядок приоритета: Ollama > OpenAI > Gemini > Anthropic > Cohere > Azure (по умолчанию)
| Провайдер | API-ключ | Модели по умолчанию |
|---|---|---|
| Ollama | OLLAMA_MODEL |
ollama/<ваша-модель>, ollama/nomic-embed-text |
| OpenAI | OPENAI_API_KEY |
openai/gpt-4.1, openai/text-embedding-ada-002 |
| Google Gemini | GEMINI_API_KEY |
gemini/gemini-3-pro-preview, gemini/gemini-embedding-001 |
| Anthropic | ANTHROPIC_API_KEY |
anthropic/claude-sonnet-4-5-20250929, voyage/voyage-3* |
| Cohere | COHERE_API_KEY |
cohere/command-a-03-2025, cohere/embed-v4.0 |
| Azure OpenAI | AZURE_API_KEY |
azure/gpt-4.1, azure/text-embedding-ada-002 |
* Anthropic не имеет собственных эмбеддингов. Вы должны установить VOYAGE_API_KEY или EMBEDDING_MODEL для эмбеддингов, иначе запуск завершится с ошибкой.
Необязательно: переопределить модели по умолчанию
COMPLETION_MODEL=gemini/gemini-3-pro-preview
EMBEDDING_MODEL=gemini/gemini-embedding-001
Обе должны соответствовать провайдеру вашего API-ключа.
Использование OpenAI:
docker run -p 5000:5000 -it \
-e FASTAPI_SECRET_KEY=your_secret_key \
-e OPENAI_API_KEY=your_openai_api_key \
falkordb/queryweaver
Использование Google Gemini:
docker run -p 5000:5000 -it \
-e FASTAPI_SECRET_KEY=your_secret_key \
-e GEMINI_API_KEY=your_gemini_api_key \
falkordb/queryweaver
Использование Anthropic:
docker run -p 5000:5000 -it \
-e FASTAPI_SECRET_KEY=your_secret_key \
-e ANTHROPIC_API_KEY=your_anthropic_api_key \
falkordb/queryweaver
Использование Azure OpenAI:
docker run -p 5000:5000 -it \
-e FASTAPI_SECRET_KEY=your_secret_key \
-e AZURE_API_KEY=your_azure_api_key \
-e AZURE_API_BASE=https://your-resource.openai.azure.com/ \
-e AZURE_API_VERSION=2024-12-01-preview \
falkordb/queryweaver
Краткое примечание: многие тесты требуют доступности FalkorDB. Используйте включённый помощник для запуска тестовой БД в Docker, если необходимо.
uv syncmake docker-falkordb)uv run playwright installРекомендуется: подготовьте среду разработки/тестирования с помощью Make-помощника (устанавливает зависимости и браузеры Playwright):
# Prepare development/test environment (installs deps and Playwright browsers)
make setup-dev
В качестве альтерality, вы можете запустить сценарий настройки для E2E, а затем запустить тесты вручную:
# Prepare E2E test environment (installs browsers and other setup)
./setup_e2e_tests.sh
# Run all tests
make test
# Run unit tests only (faster)
make test-unit
# Run E2E tests (headless)
make test-e2e
# Run E2E tests with a visible browser for debugging
make test-e2e-headed
make test-unit или uv run python -m pytest tests/ -k "not e2e".make test-e2e.См. tests/e2e/README.md для полных инструкций по E2E-тестам.
GitHub Actions запускают модульные и E2E-тесты при пушах и pull request'ах. При сбоях сохраняются скриншоты и артефакты для отладки.
make docker-falkordb или проверьте сетевые/хост-настройки.uv run playwright install и убедитесь, что присутствуют системные зависимости..env.example и заполните требуемые значения.APP_ENV=production (или staging) в вашем окружении для HTTPS-развертываний, или APP_ENV=development для HTTP-среды разработки. Это гарантирует правильную настройку сессионных cookie для вашего типа развертывания.api/ – бэкенд FastAPIapp/ – фронтенд React + Vitetests/ – модульные и E2E тестыЛицензировано под GNU Affero General Public License (AGPL). См. LICENSE.
Copyright FalkorDB Ltd. 2025