feat(tools): expose retrieval_mode in query-based tool responses
CI / build-and-test (push) Failing after 1m14s
CI / build-and-test (pull_request) Failing after 2m11s

Add a retrieval_mode field ("semantic" or "text") to the output of all
five query-driven tools so callers can distinguish vector search from
Postgres full-text fallback without inspecting server logs.

Tools updated: search_thoughts, recall_context, get_project_context,
summarize_thoughts, and related_thoughts (semantic neighbours only;
omitempty so field is absent when include_semantic is false or no query
is provided for the non-mandatory-query tools).

The shared semanticSearch helper now returns the mode as a third return
value. All callers updated; fixes two compile errors left by the
previous worker (summarize.go and links.go were not capturing the new
return).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 12:44:53 +02:00
parent c179e014ad
commit cfc78e0493
8 changed files with 109 additions and 28 deletions
+13 -5
View File
@@ -11,10 +11,16 @@ import (
thoughttypes "git.warky.dev/wdevs/amcs/internal/types"
)
const (
RetrievalModeSemantic = "semantic"
RetrievalModeText = "text"
)
// semanticSearch runs vector similarity search if embeddings exist for the
// primary embedding model in the given scope, otherwise falls back to Postgres
// full-text search. Search always uses the primary model so query vectors
// match rows stored under the primary model name.
// It returns the results and the retrieval mode used ("semantic" or "text").
func semanticSearch(
ctx context.Context,
db *store.DB,
@@ -25,20 +31,22 @@ func semanticSearch(
threshold float64,
projectID *int64,
excludeID *uuid.UUID,
) ([]thoughttypes.SearchResult, error) {
) ([]thoughttypes.SearchResult, string, error) {
model := embeddings.PrimaryModel()
hasEmbeddings, err := db.HasEmbeddingsForModel(ctx, model, projectID)
if err != nil {
return nil, err
return nil, "", err
}
if hasEmbeddings {
embedding, err := embeddings.EmbedPrimary(ctx, query)
if err != nil {
return nil, err
return nil, "", err
}
return db.SearchSimilarThoughts(ctx, embedding, model, threshold, limit, projectID, excludeID)
results, err := db.SearchSimilarThoughts(ctx, embedding, model, threshold, limit, projectID, excludeID)
return results, RetrievalModeSemantic, err
}
return db.SearchThoughtsText(ctx, query, limit, projectID, excludeID)
results, err := db.SearchThoughtsText(ctx, query, limit, projectID, excludeID)
return results, RetrievalModeText, err
}