Naucz system swojej bazy. Powiedz, jakich danych potrzebujesz. Otrzymaj SQL.
ASK DATABASE to polski, open-source'owy workspace do pracy z własnym schematem bazy danych. Produkt łączy import DDL, pamięć historycznych SELECT-ów, słownik biznesowy, aliasy, ranking relacji, provider OpenAI po stronie backendu oraz walidację Safe Mode przed pokazaniem SQL.
Demo statyczne: https://milekv.github.io/ask-database/
- Importujesz schemat bazy z DDL.
- Dodajesz oczyszczone historyczne zapytania SELECT i pojęcia biznesowe.
- Zadajesz pytanie zwykłym językiem.
- Sprawdzasz wygenerowany SQL, użyte źródła i wynik walidacji Safe Mode.
Przykładowy workspace potrafi zamienić pytanie "pokaż aktywnych studentów z ich wydziałami" na zapytanie sprawdzone względem tabel students, faculties i znanej relacji między nimi. Publiczne demo korzysta z zapisanych wyników. Generowanie na żywo działa dopiero po lokalnym uruchomieniu API i PostgreSQL.
ASK DATABASE nie jest prostą mapą słów kluczowych na gotowy SQL. Produkcyjny endpoint /api/ask używa asynchronicznego pipeline'u:
- ładuje zapisany workspace z PostgreSQL,
- pobiera pasujące tabele, kolumny, glossary i aliasy,
- wybiera historyczne SELECT-y jako evidence,
- rankinguje ścieżki relacji,
- prosi backendowy provider OpenAI o strukturalną interpretację pytania,
- generuje SQL jako Structured Output,
- waliduje tabele, aliasy, kolumny i Safe Mode,
- przy błędach może wykonać maksymalnie dwie kontrolowane regeneracje,
- zapisuje wersję zapytania i zwraca evidence oraz decision log.
- Workspace per baza: użytkownik może utworzyć własny workspace, wybrać dialekt i wkleić DDL.
- PostgreSQL persistence: workspace, schemat, relacje, glossary, aliasy, pamięć i historia rozmów są zapisywane w bazie.
- Query Memory: historyczne SELECT-y są redagowane i analizowane strukturalnie.
- Business Glossary i aliasy: język zespołu wpływa na retrieval schematu.
- Relationship Path Ranking: joiny są wybierane przez deterministyczny ranking relacji.
- OpenAI Provider Boundary: klucz API istnieje wyłącznie po stronie backendu.
- Structured Outputs + Zod: odpowiedzi providera są walidowane typami.
- Safe Mode: wynik musi być
SELECTalboWITH; destrukcyjne polecenia są blokowane. - Statyczne GitHub Pages bez udawania backendu: publiczna strona pokazuje zapisany przykład demo i jasno mówi, że live generowanie wymaga lokalnego API.
Schema Memory powstaje z DDL. ASK DATABASE zapisuje tabele, kolumny, primary keys, foreign keys i relacje w PostgreSQL. Retrieval nie wysyła automatycznie całego schematu do providera; najpierw wybiera kandydatów i evidence aplikacyjne.
Query Memory powstaje z historycznych SELECT-ów. Import usuwa literały, zapisuje znormalizowany SQL, tabele, kolumny, joiny, filtry, GROUP BY, ORDER BY i strukturę zapytania. Najtrafniejsze historyczne przykłady trafiają do promptu generowania jako sanitized SQL.
Correction Memory to reguły zapisane po korektach użytkownika albo dodane ręcznie przez API. Aktywne reguły workspace mogą wpływać na retrieval i ranking ścieżek relacji. UI ma jeszcze ograniczony ekran zatwierdzania pamięci, więc zaawansowane zarządzanie pamięcią najlepiej testować przez API.
Pełny tryb produktu wymaga PostgreSQL, migracji API i skonfigurowanego providera.
pnpm install
docker compose up -d
pnpm db:migrate
pnpm dev:api
pnpm devWeb:
http://127.0.0.1:5174/
API:
http://127.0.0.1:4310/api/health
GitHub Pages nie hostuje Fastify ani PostgreSQL. Dlatego publiczna strona działa jako statyczne demo:
- pokazuje University Demo,
- pokazuje schemat, relacje, historyczne SELECT-y i glossary,
- może pokazać jawnie oznaczony zapisany przykład,
- nie udaje live generowania dla dowolnego pytania.
Klucz providera ustawiaj tylko w backendzie:
LLM_PROVIDER=openai
OPENAI_API_KEY=<backend-openai-api-key>
OPENAI_MODEL=gpt-4.1-mini
OPENAI_TIMEOUT_MS=45000Frontend nie czyta i nie wysyła OPENAI_API_KEY.
Skopiuj .env.example do .env.
Najważniejsze wartości:
DATABASE_URLAPI_HOSTAPI_PORTLLM_PROVIDEROPENAI_API_KEYOPENAI_MODELOPENAI_TIMEOUT_MS
Workspace:
GET /api/workspacesPOST /api/workspacesGET /api/workspaces/:workspaceIdPATCH /api/workspaces/:workspaceIdDELETE /api/workspaces/:workspaceId
Ask Database:
POST /api/workspaces/:workspaceId/askPOST /api/askPOST /api/workspaces/:workspaceId/conversations/:conversationId/corrections
Wiedza workspace:
POST /api/workspaces/:workspaceId/glossaryPATCH /api/workspaces/:workspaceId/glossary/:termIdDELETE /api/workspaces/:workspaceId/glossary/:termIdPOST /api/workspaces/:workspaceId/aliasesPATCH /api/workspaces/:workspaceId/aliases/:aliasIdDELETE /api/workspaces/:workspaceId/aliases/:aliasIdPOST /api/workspaces/:workspaceId/memoryPATCH /api/workspaces/:workspaceId/memory/:memoryIdDELETE /api/workspaces/:workspaceId/memory/:memoryId
flowchart TD
Web["React / Vite UI"] --> Api["Fastify API"]
Api --> Repo["WorkspaceRepository"]
Repo --> Pg["PostgreSQL"]
Api --> Core["Core Ask Pipeline"]
Core --> Retriever["Schema + History Retrieval"]
Core --> Paths["Relationship Path Ranking"]
Core --> Validator["SQL Validator / Safe Mode"]
Core --> Provider["LLMProvider"]
Provider --> OpenAI["OpenAI Responses API"]
apps/web React, Vite, Tailwind, Monaco, React Flow
apps/api Fastify, Drizzle, migrations, provider factory
packages/shared typy, Zod schemas, SQL helpers
packages/schema-parser parser DDL
packages/sql-memory import i analiza historycznych SELECT-ów
packages/sql-validator Safe Mode i walidacja schematu
packages/core retrieval, prompts, ask pipeline, demo data
packages/ui współdzielone komponenty React
Pytanie:
Pokaż studentów przyjętych od 2022 roku, którzy są obecnie aktywni i uzyskali co najmniej jedną ocenę 5. Posortuj ich według nazwiska.
Pipeline pobiera między innymi:
- glossary:
aktywni studenci,wysokie oceny, - kandydatów schematu:
students,enrollments,grades, - relacje:
students -> enrollments -> grades, - historyczne SELECT-y z podobnymi tabelami i filtrami.
Przykład korekty:
Oceny pobieraj przez zapisy na kurs, nie bezpośrednio ze studenta.
Backendowy endpoint korekty interpretuje poprawkę, regeneruje SQL przez ten sam pipeline i może zaproponować zapis do Workspace Memory. Trwałe zapisywanie pamięci działa przez API; pełny interfejs zatwierdzania tej pamięci w UI jest nadal ograniczony.
pnpm install
pnpm db:migrate
pnpm lint
pnpm typecheck
pnpm test
pnpm build
pnpm auditTesty obejmują parser DDL, import historycznych SELECT-ów, redakcję literałów, walidację Safe Mode, retrieval, ranking relacji i orkiestrację pipeline'u z MockLLMProvider.
- Live generowanie wymaga backendu, PostgreSQL i
OPENAI_API_KEY. - GitHub Pages jest statyczne i nie generuje dowolnego SQL.
- UI ma podstawowe tworzenie workspace; pełny kreator krok po kroku, wersjonowanie rozmów w UI, SQL diff i manual override są jeszcze do rozbudowy.
- Test Commerce acceptance flow nie jest kompletny bez skonfigurowanego providera OpenAI i brakujących elementów manual override w UI.
MIT. Szczegóły w pliku LICENSE.
