Skip to content

Commit 0d94b41

Browse files
committed
feat(singlestore): implement semantic vector search via json params
1 parent 9c3a748 commit 0d94b41

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

.ci/integration.cloudbuild.yaml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,7 @@ steps:
13371337
- "SINGLESTORE_USER=$_SINGLESTORE_USER"
13381338
- "SINGLESTORE_DATABASE=$_SINGLESTORE_DATABASE"
13391339
- "SERVICE_ACCOUNT_EMAIL=$SERVICE_ACCOUNT_EMAIL"
1340-
secretEnv: ["SINGLESTORE_PASSWORD", "SINGLESTORE_HOST", "CLIENT_ID"]
1340+
secretEnv: ["SINGLESTORE_PASSWORD", "SINGLESTORE_HOST", "CLIENT_ID", "API_KEY"]
13411341
volumes:
13421342
- name: "go"
13431343
path: "/gopath"
@@ -1351,7 +1351,9 @@ steps:
13511351
.ci/test_with_coverage.sh \
13521352
"SingleStore" \
13531353
singlestore \
1354-
singlestore
1354+
singlestore \
1355+
"" \
1356+
"API_KEY"
13551357
else
13561358
echo "No relevant changes for SingleStore. Skipping shard."
13571359
exit 0

internal/tools/singlestore/singlestoreexecutesql/singlestoreexecutesql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para
126126
}
127127

128128
func (t Tool) EmbedParams(ctx context.Context, paramValues parameters.ParamValues, embeddingModelsMap map[string]embeddingmodels.EmbeddingModel) (parameters.ParamValues, error) {
129-
return parameters.EmbedParams(ctx, t.Parameters, paramValues, embeddingModelsMap, nil)
129+
return parameters.EmbedParams(ctx, t.Parameters, paramValues, embeddingModelsMap, embeddingmodels.FormatVectorForPgvector)
130130
}
131131

132132
func (t Tool) Manifest() tools.Manifest {

internal/tools/singlestore/singlestoresql/singlestoresql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func (t Tool) Invoke(ctx context.Context, resourceMgr tools.SourceProvider, para
154154
}
155155

156156
func (t Tool) EmbedParams(ctx context.Context, paramValues parameters.ParamValues, embeddingModelsMap map[string]embeddingmodels.EmbeddingModel) (parameters.ParamValues, error) {
157-
return parameters.EmbedParams(ctx, t.AllParams, paramValues, embeddingModelsMap, nil)
157+
return parameters.EmbedParams(ctx, t.AllParams, paramValues, embeddingModelsMap, embeddingmodels.FormatVectorForPgvector)
158158
}
159159

160160
func (t Tool) Manifest() tools.Manifest {

tests/singlestore/singlestore_integration_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,14 @@ func TestSingleStoreToolEndpoints(t *testing.T) {
212212
tmplSelectCombined, tmplSelectFilterCombined := getSingleStoreTmplToolStatement()
213213
toolsFile = tests.AddTemplateParamConfig(t, toolsFile, SingleStoreToolType, tmplSelectCombined, tmplSelectFilterCombined, "")
214214

215+
insertStmt := `INSERT INTO senseai_docs (content, embedding) VALUES (?, ?)`
216+
searchStmt := `
217+
SELECT content
218+
FROM senseai_docs
219+
ORDER BY DOT_PRODUCT(embedding, JSON_ARRAY_UNPACK(?)) DESC
220+
LIMIT 1`
221+
toolsFile = tests.AddSemanticSearchConfig(t, toolsFile, SingleStoreToolType, insertStmt, searchStmt)
222+
215223
cmd, cleanup, err := tests.StartCmd(ctx, toolsFile, args...)
216224
if err != nil {
217225
t.Fatalf("command initialization returned an error: %s", err)
@@ -235,4 +243,18 @@ func TestSingleStoreToolEndpoints(t *testing.T) {
235243
tests.RunMCPToolCallMethod(t, mcpMyFailToolWant, mcpSelect1Want)
236244
tests.RunExecuteSqlToolInvokeTest(t, createTableStatement, select1Want)
237245
tests.RunToolInvokeWithTemplateParameters(t, tableNameTemplateParam)
246+
247+
// Create table for semantic search
248+
_, err = pool.ExecContext(ctx, "CREATE TABLE IF NOT EXISTS senseai_docs (id INT AUTO_INCREMENT PRIMARY KEY, content TEXT, embedding JSON);")
249+
if err != nil {
250+
t.Fatalf("unable to create semantic search table: %s", err)
251+
}
252+
defer func() {
253+
pool.ExecContext(ctx, "DROP TABLE IF EXISTS senseai_docs;")
254+
}()
255+
256+
// Semantic search tests
257+
semanticInsertWant := `[{"":""}]`
258+
semanticSearchWant := `[{"content":"The quick brown fox jumps over the lazy dog"}]`
259+
tests.RunSemanticSearchToolInvokeTest(t, semanticInsertWant, semanticInsertWant, semanticSearchWant)
238260
}

0 commit comments

Comments
 (0)