Skip to content

Commit 1ee8771

Browse files
author
Your Name
committed
feat(pipeline): auto-generate embeddings during full indexing
When CBM_EMBEDDING_URL is configured, the full indexing pipeline now automatically generates semantic embeddings after process and channel detection. Uses force=false so existing embeddings are preserved — only new/missing nodes get embedded. This makes semantic search zero-friction: repos indexed while the embedding server is running get embeddings automatically. No manual generate_embeddings call needed. Pipeline order: FTS5 backfill → processes → channels → embeddings
1 parent 224355e commit 1ee8771

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

src/pipeline/pipeline.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
*/
1313
#include "pipeline/pipeline.h"
1414
#include "pipeline/pipeline_internal.h"
15-
// NOLINTNEXTLINE(misc-include-cleaner) — worker_pool.h included for interface contract
1615
#include "pipeline/worker_pool.h"
16+
#include "pipeline/embedding.h"
1717
#include "graph_buffer/graph_buffer.h"
1818
#include "store/store.h"
1919
#include "discover/discover.h"
@@ -856,6 +856,24 @@ int cbm_pipeline_run(cbm_pipeline_t *p) {
856856
cbm_store_close(ch_store);
857857
}
858858
}
859+
860+
/* ── Embedding generation: semantic vectors for hybrid search ── */
861+
if (cbm_embedding_is_configured()) {
862+
cbm_store_t *emb_store = cbm_store_open_path(db_path);
863+
if (emb_store) {
864+
int nemb = cbm_embedding_generate_for_project(
865+
emb_store, p->project_name, false /* don't force — skip existing */);
866+
if (nemb > 0) {
867+
cbm_log_info("pass.done", "pass", "embeddings",
868+
"generated", itoa_buf(nemb));
869+
} else if (nemb == 0) {
870+
cbm_log_info("pass.skip", "pass", "embeddings",
871+
"reason", "all_exist");
872+
}
873+
/* nemb < 0 means error — already logged inside */
874+
cbm_store_close(emb_store);
875+
}
876+
}
859877
}
860878
}
861879

0 commit comments

Comments
 (0)