Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
40181cb
CAMEL-21540: Add PGVector component for PostgreSQL vector database
gnodet Mar 23, 2026
2c810f2
CAMEL-21540: Add generated files for PGVector component
gnodet Mar 23, 2026
2193ff7
CAMEL-21540: Add generated files and fix docs for PGVector component
gnodet Mar 23, 2026
7a601c4
CAMEL-21540: Fix docs symlinks and nav ordering for pgvector component
gnodet Mar 23, 2026
d8e0eaa
CAMEL-21540: Fix generated files - restore missing components from ma…
gnodet Mar 23, 2026
2faec4b
CAMEL-21540: Fix generated files to match CI expectations
gnodet Mar 23, 2026
0f8ee2a
CAMEL-21540: Fix springEvent to use EventEndpointBuilderFactory
gnodet Mar 23, 2026
bb64e10
CAMEL-21540: Add HNSW index creation and similarity search filtering
gnodet Mar 24, 2026
3d78b1d
CAMEL-21540: Update generated files for new filter header and create …
gnodet Mar 24, 2026
3d5e6b4
CAMEL-21540: Fix docs gulp race condition with dsl target directories
gnodet Mar 24, 2026
b8ee61a
CAMEL-21540: Include dsl/src/main/docs in gulpfile source pattern
gnodet Mar 24, 2026
b0260b9
CAMEL-21540: Update openai docs to use pgvector component
gnodet Mar 25, 2026
5d8f0d7
CAMEL-21540: Mention raw SQL alternative for custom schemas
gnodet Mar 25, 2026
4b028ff
CAMEL-21540: Add cross-documentation for pgvector component
gnodet Mar 25, 2026
379ac92
Review fixes: improve test coverage and robustness
gnodet Mar 26, 2026
dfccad6
Add test logging config and fix redundant doc reference
gnodet Mar 26, 2026
315ca00
CAMEL-21540: Fix docs gulp race by excluding target dirs from dsl glob
gnodet Mar 26, 2026
5eb34a8
Review fixes: parameterized filters, distanceType enum, safety improv…
gnodet Mar 28, 2026
b5d18c8
Fix docs gulp race: also ignore target directory entries during glob …
gnodet Mar 28, 2026
43e5b2e
Fix docs gulp race: replace !(target) extglob with split patterns
gnodet Mar 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions bom/camel-bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1902,6 +1902,11 @@
<artifactId>camel-pgevent</artifactId>
<version>4.19.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pgvector</artifactId>
<version>4.19.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pinecone</artifactId>
Expand Down
5 changes: 5 additions & 0 deletions catalog/camel-allcomponents/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1692,6 +1692,11 @@
<artifactId>camel-pgevent</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pgvector</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pinecone</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ paho-mqtt5
pdf
pg-replication-slot
pgevent
pgvector
pinecone
platform-http
plc4x
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"component": {
"kind": "component",
"name": "pgvector",
"title": "PGVector",
"description": "Perform operations on the PostgreSQL pgvector Vector Database.",
"deprecated": false,
"firstVersion": "4.19.0",
"label": "database,ai",
"javaType": "org.apache.camel.component.pgvector.PgVectorComponent",
"supportLevel": "Preview",
"groupId": "org.apache.camel",
"artifactId": "camel-pgvector",
"version": "4.19.0-SNAPSHOT",
"scheme": "pgvector",
"extendsScheme": "",
"syntax": "pgvector:collection",
"async": false,
"api": false,
"consumerOnly": false,
"producerOnly": true,
"lenientProperties": false,
"browsable": false,
"remote": true
},
"componentProperties": {
"configuration": { "index": 0, "kind": "property", "displayName": "Configuration", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.pgvector.PgVectorConfiguration", "deprecated": false, "autowired": false, "secret": false, "description": "The configuration;" },
"dataSource": { "index": 1, "kind": "property", "displayName": "Data Source", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "javax.sql.DataSource", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The DataSource to use for connecting to the PostgreSQL database with pgvector extension." },
"dimension": { "index": 2, "kind": "property", "displayName": "Dimension", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 384, "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The dimension of the vectors to store." },
"distanceType": { "index": 3, "kind": "property", "displayName": "Distance Type", "group": "producer", "label": "producer", "required": false, "type": "enum", "javaType": "org.apache.camel.component.pgvector.PgVectorDistanceType", "enum": [ "COSINE", "EUCLIDEAN", "INNER_PRODUCT" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "COSINE", "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The distance type to use for similarity search." },
"lazyStartProducer": { "index": 4, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." },
"autowiredEnabled": { "index": 5, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc." }
},
"headers": {
"CamelPgVectorAction": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "enum": [ "CREATE_TABLE", "CREATE_INDEX", "DROP_TABLE", "UPSERT", "DELETE", "SIMILARITY_SEARCH" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The action to be performed.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#ACTION" },
"CamelPgVectorRecordId": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The id of the vector record.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#RECORD_ID" },
"CamelPgVectorQueryTopK": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "3", "description": "The maximum number of results to return for similarity search.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#QUERY_TOP_K" },
"CamelPgVectorTextContent": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The text content to store alongside the vector embedding.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#TEXT_CONTENT" },
"CamelPgVectorMetadata": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The metadata associated with the vector record, stored as JSON.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#METADATA" },
"CamelPgVectorFilter": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Filter condition for similarity search. Applied as a SQL WHERE clause on the text_content and metadata columns. Supports parameterized queries using placeholders with values provided via the CamelPgVectorFilterParams header. WARNING: When not using parameterized queries, the filter value is appended directly as SQL. Never use untrusted input as the filter value without parameterization, as this could lead to SQL injection.", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#FILTER" },
"CamelPgVectorFilterParams": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "java.util.List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Parameter values for parameterized filter queries. Use with placeholders in the CamelPgVectorFilter header. Example: filter = 'text_content LIKE AND metadata::jsonb-'category' = ' with filterParams = List.of(%hello%, science).", "constantName": "org.apache.camel.component.pgvector.PgVectorHeaders#FILTER_PARAMS" }
},
"properties": {
"collection": { "index": 0, "kind": "path", "displayName": "Collection", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The collection (table) name" },
"dataSource": { "index": 1, "kind": "parameter", "displayName": "Data Source", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "javax.sql.DataSource", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The DataSource to use for connecting to the PostgreSQL database with pgvector extension." },
"dimension": { "index": 2, "kind": "parameter", "displayName": "Dimension", "group": "producer", "label": "producer", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": 384, "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The dimension of the vectors to store." },
"distanceType": { "index": 3, "kind": "parameter", "displayName": "Distance Type", "group": "producer", "label": "producer", "required": false, "type": "enum", "javaType": "org.apache.camel.component.pgvector.PgVectorDistanceType", "enum": [ "COSINE", "EUCLIDEAN", "INNER_PRODUCT" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "defaultValue": "COSINE", "configurationClass": "org.apache.camel.component.pgvector.PgVectorConfiguration", "configurationField": "configuration", "description": "The distance type to use for similarity search." },
"lazyStartProducer": { "index": 4, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing." }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ infinispan-embeddings
milvus-embeddings
neo4j-embeddings
neo4j-rag
pgvector-embeddings
pgvector-rag
pinecone-embeddings
pinecone-rag
protobuf-binary
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"transformer": {
"kind": "transformer",
"name": "pgvector:embeddings",
"title": "Pgvector (Embeddings)",
"description": "Prepares the message to become an object writable by PgVector component",
"deprecated": false,
"javaType": "org.apache.camel.component.pgvector.transform.PgVectorEmbeddingsDataTypeTransformer",
"groupId": "org.apache.camel",
"artifactId": "camel-pgvector",
"version": "4.19.0-SNAPSHOT"
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"transformer": {
"kind": "transformer",
"name": "pgvector:rag",
"title": "Pgvector (Rag)",
"description": "Prepares the PgVector similarity search results to become a List of String for LangChain4j RAG",
"deprecated": false,
"javaType": "org.apache.camel.component.pgvector.transform.PgVectorReverseEmbeddingsDataTypeTransformer",
"groupId": "org.apache.camel",
"artifactId": "camel-pgvector",
"version": "4.19.0-SNAPSHOT"
}
}

11 changes: 11 additions & 0 deletions components/camel-ai/camel-langchain4j-embeddings/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@
<artifactId>camel-milvus</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pgvector</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-pinecone</artifactId>
Expand Down Expand Up @@ -156,6 +161,12 @@
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-infra-postgres</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-infra-weaviate</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,77 @@ YAML::
----
====

==== Using with PGVector

This example shows how to embed text and store it in PostgreSQL with pgvector:

[tabs]
====
Java::
+
[source,java]
----
from("direct:store")
.to("langchain4j-embeddings:embed")
.setHeader(PgVectorHeaders.ACTION).constant(PgVectorAction.UPSERT)
.transformDataType(new DataType("pgvector:embeddings"))
.to("pgvector:myCollection");
----

YAML::
+
[source,yaml]
----
- route:
from:
uri: "direct:store"
steps:
- to: "langchain4j-embeddings:embed"
- setHeader:
name: CamelPgVectorAction
constant: UPSERT
- transform:
dataType: "pgvector:embeddings"
- to: "pgvector:myCollection"
----
====

Similarity search with PGVector and RAG:

[tabs]
====
Java::
+
[source,java]
----
from("direct:search")
.to("langchain4j-embeddings:embed")
.transformDataType(new DataType("pgvector:embeddings"))
.setHeader(PgVectorHeaders.ACTION, constant(PgVectorAction.SIMILARITY_SEARCH))
.to("pgvector:myCollection")
.transformDataType(new DataType("pgvector:rag"));
----

YAML::
+
[source,yaml]
----
- route:
from:
uri: "direct:search"
steps:
- to: "langchain4j-embeddings:embed"
- transform:
dataType: "pgvector:embeddings"
- setHeader:
name: CamelPgVectorAction
constant: SIMILARITY_SEARCH
- to: "pgvector:myCollection"
- transform:
dataType: "pgvector:rag"
----
====

==== Using with LangChain4j Embedding Store Component

For a simpler integration, use the `langchain4j-embeddingstore` component which provides a unified interface:
Expand Down
Loading
Loading