Changelog
All notable changes to the pgEdge RAG Server will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
-
Configurable
request_timeoutandper_attempt_timeoutfor LLM providers. Both accept a duration string such as90sor2mand can be set per-pipeline or in defaults. The per-attempt timeout makes a slow upstream (for example a heavy embedding batch) retryable rather than consuming the whole request budget in one attempt. -
GET /v1/healthnow pings every pipeline's embedding and completion providers and reports per-pipeline connectivity in the response body. All providers for all pipelines are checked concurrently, so the check takes roughly one provider timeout regardless of how many pipelines are configured. An unreachable provider degrades the reportedstatusto"degraded"but does not change the HTTP status code, so existing uptime checks that only look at HTTP 200 keep working (#23). -
GET /v1/liveliveness endpoint: a cheap, dependency-free check that returns immediately and never contacts the LLM providers, so its latency is unaffected by provider health. Use it for a latency-sensitive Kubernetes liveness probe, and/v1/healthfor a readiness probe or monitoring (#23).
Fixed
- Vector search now selects the configured
id_column, so vector results carry an id. Previously the vector arm returned empty ids, which prevented Reciprocal Rank Fusion from merging the vector and BM25 arms (a document found by both was scored as two separate half-weight entries) and made vector results unusable for id-based source resolution (citations). When noid_columnis configured, both search arms now fall back to keying on content for fusion, so a document found by both arms fuses into one result instead of appearing twice (and unstableROW_NUMBER()ids no longer cause false merges) (#27).
[1.0.0] - 2026-04-04
Added
-
Multi-host database connection support for HA deployments. Configure multiple database hosts for automatic failover (#13).
-
Minimum similarity threshold to avoid sending irrelevant documents to the LLM. Set
minimum_similarityper-pipeline to filter out low-quality search results. -
Configurable
base_urlfor LLM providers (Anthropic, OpenAI, Voyage AI). This allows routing requests through API gateways such as Portkey or custom proxies. Thebase_urlcan be set per-pipeline or in defaults and follows the same inheritance rules asproviderandmodel(#7). -
vector_weightparameter for tuning Reciprocal Rank Fusion (RRF) scoring between vector and text search results. -
View support for database sources, allowing pipelines to query from database views in addition to tables.
-
Hybrid search control options for fine-tuning search behavior.
Improved
- OpenAPI specification: added
enumconstraints forFilter.logic(AND,OR) andFilterCondition.operator(all 12 valid operators), andmaxItems: 50onFilter.conditionsto limit payload size and improve client-side validation and code generation.
Fixed
- Guard against nil dereference when vector weight is unset.
- Skip zero-weight loops in RRF scoring to avoid unnecessary computation.
Security
- Pinned GitHub Actions to commit SHAs to prevent supply chain attacks.
- Upgraded Go to 1.25.8 and updated dependencies to resolve security findings.
[1.0.0-beta3] - 2026-01-26
Added
-
CORS (Cross-Origin Resource Sharing) support for browser-based API access. Configure with
server.cors.enabledandserver.cors.allowed_originsto allow web applications to make requests from different origins. -
Configurable system prompt per pipeline. Use the
system_promptfield in pipeline configuration to customize LLM instructions for generating responses.
Fixed
- Docker image now includes CA certificates for HTTPS connections to LLM APIs.
Documentation
- Added quickstart demo guide with step-by-step instructions.
- Fixed typos and incorrect version references in installation documentation.
[1.0.0-beta2] - 2025-12-17
Added
- Docker workflow for building and publishing container images
- Release badge added to README
- Manual trigger support for Docker builds from specific tags
[1.0.0-beta1] - 2025-12-15
Changed
- Documentation restructured for web publishing at docs.pgedge.com
- New documentation pages: installation guide, quickstart tutorial, usage reference, API keys management, and sample configurations
- Improved navigation and organization of documentation
[1.0.0-alpha5] - 2025-12-03
Fixed
- Fixed filter parameter indexing bug where API filters would cause
"operator does not exist: text = vector" errors. The filter clause
was generating SQL placeholders starting at
$1, butVectorSearchalready uses$1for the vector and$2for LIMIT.
[1.0.0-alpha4] - 2025-12-03
Breaking Changes
-
Security Fix: API filter parameters now require structured filter format to eliminate SQL injection vulnerabilities. API filters must use conditions, operators, and values (parameterized queries prevent injection).
-
Config Rename: The
column_pairsfield in pipeline configuration has been renamed totablesfor clarity. The internal typeColumnPairis nowTableSource.
Changed
- Filter system now uses parameterized queries for API request filters
- API
filterparameter changed from string to structured object - Config
filterfield now accepts either raw SQL strings (for complex queries like subqueries) or structured filter objects
Added
- Config filters support raw SQL strings for complex expressions (subqueries, JOINs, functions) that cannot be expressed with structured format. Since config files are admin-controlled, raw SQL is safe here.
Migration Guide
API filters (JSON) - must use structured format:
Old (removed):
{"filter": "product = 'pgAdmin'"}
New:
{
"filter": {
"conditions": [
{"column": "product", "operator": "=", "value": "pgAdmin"}
]
}
}
Config filters (YAML) - both formats supported:
Raw SQL (for complex queries):
filter: "source_id IN (SELECT id FROM sources WHERE product='pgEdge')"
Structured:
filter:
conditions:
- column: "product"
operator: "="
value: "pgAdmin"
- column: "status"
operator: "="
value: "published"
logic: "AND"
Supported operators (for structured filters): =, !=, <, >, <=,
>=, LIKE, ILIKE, IN, NOT IN, IS NULL, IS NOT NULL
Config field rename:
Old:
column_pairs:
- table: "documents"
text_column: "content"
vector_column: "embedding"
New:
tables:
- table: "documents"
text_column: "content"
vector_column: "embedding"
[1.0.0-alpha3] - 2025-12-01
Added
- GitHub Actions workflow to generate builds when repository is tagged, producing binaries for multiple platforms (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64).
[1.0.0-alpha2] - 2025-12-01
Added
-
Per-pipeline LLM configuration: Pipelines can override
embedding_llmandrag_llmsettings, allowing different pipelines to use different providers or models. -
Per-pipeline API keys: API keys can be configured at three levels with cascade priority (pipeline > defaults > global), enabling different pipelines to use separate API keys or accounts.
-
SQL filter support: Tables can include a
filterfield with a SQL WHERE clause fragment applied to all queries. Filters can also be specified per-request via the API. -
Extended defaults section: The
defaultsconfiguration now supportsembedding_llm,rag_llm, andapi_keysin addition totoken_budgetandtop_n.
[1.0.0-alpha1] - 2025-11-28
Added
- Initial RAG server implementation with REST API
- Multiple pipeline support for different data sources
- Hybrid search combining vector similarity (pgvector) and BM25 text matching
- Reciprocal Rank Fusion (RRF) for combining search results
-
Support for multiple LLM providers:
- OpenAI (embeddings and completions)
- Anthropic (completions)
- Voyage AI (embeddings)
- Ollama (embeddings and completions)
-
Token budget management to control LLM costs
- Streaming responses via Server-Sent Events (SSE)
- TLS/HTTPS support for production deployments
- OpenAPI v3 specification with RFC 8631 Link headers
- Flexible API key configuration (files, environment variables, defaults)
- Comprehensive test coverage for core modules