42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package tools
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"git.warky.dev/wdevs/amcs/internal/ai"
|
|
"git.warky.dev/wdevs/amcs/internal/config"
|
|
"git.warky.dev/wdevs/amcs/internal/store"
|
|
thoughttypes "git.warky.dev/wdevs/amcs/internal/types"
|
|
)
|
|
|
|
// semanticSearch runs vector similarity search if embeddings exist for the active model
|
|
// in the given scope, otherwise falls back to Postgres full-text search.
|
|
func semanticSearch(
|
|
ctx context.Context,
|
|
db *store.DB,
|
|
provider ai.Provider,
|
|
search config.SearchConfig,
|
|
query string,
|
|
limit int,
|
|
threshold float64,
|
|
projectID *uuid.UUID,
|
|
excludeID *uuid.UUID,
|
|
) ([]thoughttypes.SearchResult, error) {
|
|
hasEmbeddings, err := db.HasEmbeddingsForModel(ctx, provider.EmbeddingModel(), projectID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if hasEmbeddings {
|
|
embedding, err := provider.Embed(ctx, query)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return db.SearchSimilarThoughts(ctx, embedding, provider.EmbeddingModel(), threshold, limit, projectID, excludeID)
|
|
}
|
|
|
|
return db.SearchThoughtsText(ctx, query, limit, projectID, excludeID)
|
|
}
|