@theromans/convex-dobty 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledgeSearch.d.ts","sourceRoot":"","sources":["../../src/component/knowledgeSearch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"knowledgeSearch.d.ts","sourceRoot":"","sources":["../../src/component/knowledgeSearch.ts"],"names":[],"mappings":"AAmCA,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uDAAuD;AACvD,eAAO,MAAM,eAAe;;;;;8BA6B1B,CAAC;AAEH,qFAAqF;AACrF,eAAO,MAAM,iBAAiB;;;WAIyB,MAAM;WAAS,MAAM;cAAY,MAAM;YAAU,MAAM;GAkC5G,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledgeSearch.js","sourceRoot":"","sources":["../../src/component/knowledgeSearch.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"knowledgeSearch.js","sourceRoot":"","sources":["../../src/component/knowledgeSearch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client/index.ts
CHANGED
|
@@ -467,6 +467,14 @@ export class DobtAddon {
|
|
|
467
467
|
return await ctx.runAction(this.component.knowledgeSearch.searchKnowledge, args);
|
|
468
468
|
}
|
|
469
469
|
|
|
470
|
+
/** Vector search with pre-computed embedding (no outbound fetch needed) */
|
|
471
|
+
async searchByVector(
|
|
472
|
+
ctx: ActionCtx,
|
|
473
|
+
args: { topic: string; embedding: number[]; limit?: number },
|
|
474
|
+
) {
|
|
475
|
+
return await ctx.runAction(this.component.knowledgeSearch.searchByVector, args);
|
|
476
|
+
}
|
|
477
|
+
|
|
470
478
|
/** Re-embed stale knowledge chunks */
|
|
471
479
|
async refreshEmbeddings(
|
|
472
480
|
ctx: ActionCtx,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
"use node";
|
|
2
|
-
|
|
3
1
|
import { action } from "./_generated/server.js";
|
|
4
2
|
import { internal } from "./_generated/api.js";
|
|
5
3
|
import { v } from "convex/values";
|
|
@@ -9,30 +7,45 @@ const EMBEDDING_ENDPOINT =
|
|
|
9
7
|
const EMBEDDING_MODEL = "BAAI/bge-m3";
|
|
10
8
|
const EMBEDDING_DIMENSIONS = 1024;
|
|
11
9
|
|
|
10
|
+
const EMBEDDING_TIMEOUT_MS = 10_000;
|
|
11
|
+
|
|
12
12
|
async function getEmbedding(
|
|
13
13
|
text: string,
|
|
14
14
|
apiToken: string,
|
|
15
15
|
): Promise<number[]> {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const timer = setTimeout(() => controller.abort(), EMBEDDING_TIMEOUT_MS);
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(EMBEDDING_ENDPOINT, {
|
|
21
|
+
method: "POST",
|
|
22
|
+
headers: {
|
|
23
|
+
Authorization: `Bearer ${apiToken}`,
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
},
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
input: text,
|
|
28
|
+
model: EMBEDDING_MODEL,
|
|
29
|
+
dimensions: EMBEDDING_DIMENSIONS,
|
|
30
|
+
}),
|
|
31
|
+
signal: controller.signal,
|
|
32
|
+
});
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const body = await response.text();
|
|
36
|
+
throw new Error(`Embedding API error ${response.status}: ${body}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const json = await response.json();
|
|
40
|
+
return json.data[0].embedding;
|
|
41
|
+
} catch (e: any) {
|
|
42
|
+
if (e.name === "AbortError") {
|
|
43
|
+
throw new Error(`Embedding API timed out after ${EMBEDDING_TIMEOUT_MS}ms`);
|
|
44
|
+
}
|
|
45
|
+
throw e;
|
|
46
|
+
} finally {
|
|
47
|
+
clearTimeout(timer);
|
|
48
|
+
}
|
|
36
49
|
}
|
|
37
50
|
|
|
38
51
|
interface KnowledgeResult {
|
|
@@ -73,6 +86,35 @@ export const searchKnowledge = action({
|
|
|
73
86
|
},
|
|
74
87
|
});
|
|
75
88
|
|
|
89
|
+
/** Search knowledge chunks by pre-computed embedding vector (no fetch needed). */
|
|
90
|
+
export const searchByVector = action({
|
|
91
|
+
args: {
|
|
92
|
+
topic: v.string(),
|
|
93
|
+
embedding: v.array(v.float64()),
|
|
94
|
+
limit: v.optional(v.number()),
|
|
95
|
+
},
|
|
96
|
+
handler: async (ctx, { topic, embedding, limit = 3 }): Promise<KnowledgeResult[]> => {
|
|
97
|
+
const results = await ctx.vectorSearch("knowledgeChunks", "by_embedding", {
|
|
98
|
+
vector: embedding,
|
|
99
|
+
limit,
|
|
100
|
+
filter: (q) => q.eq("topic", topic),
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
if (results.length === 0) return [];
|
|
104
|
+
|
|
105
|
+
const docs: (KnowledgeResult | null)[] = await Promise.all(
|
|
106
|
+
results.map(async (r): Promise<KnowledgeResult | null> => {
|
|
107
|
+
const doc: any = await ctx.runQuery(internal.knowledge.getChunk, {
|
|
108
|
+
chunkId: r._id,
|
|
109
|
+
});
|
|
110
|
+
return doc ? { title: doc.title, content: doc.content, score: r._score } : null;
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
return docs.filter((d): d is KnowledgeResult => d !== null);
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
76
118
|
/** Re-embed stale chunks (embedding missing or content changed since last embed). */
|
|
77
119
|
export const refreshEmbeddings = action({
|
|
78
120
|
args: {
|