@eucoder/rag 0.3.0 → 0.3.1

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.
package/dist/index.d.ts CHANGED
@@ -10,6 +10,8 @@ export { ParameterOptimizer } from "./optimizer.js";
10
10
  export { SelfImprovingRag } from "./self-improving.js";
11
11
  export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
12
12
  export type { Neo4jConfig } from "./neo4j-knowledge-graph.js";
13
+ export { QdrantVectorStore } from "./qdrant-store.js";
14
+ export type { QdrantFilter, QdrantSearchResult } from "./qdrant-store.js";
13
15
  export type { LlmProvider } from "./llm-grader.js";
14
16
  export type { Retriever, KeywordRetriever, Grader, GraderResult, QueryRewriter, CorrectiveRagOptions, RagAnswer, RagCitation, HybridSearchOptions, HybridSearchResult, Entity, Relation, KnowledgeGraph, AsyncKnowledgeGraph, EntityExtractor, RelationExtractor, KnowledgeGraphRagOptions, KnowledgeGraphRagResult, ReasoningStep, AgenticRagOptions, AgenticRagResult, } from "./types.js";
15
17
  export type { RagFeedback, RagMetrics, ABTestResult, OptimizationSuggestion, FeedbackStorage, } from "./feedback.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,MAAM,EACN,QAAQ,EACR,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,sBAAsB,EACtB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -11,4 +11,5 @@ export { ParameterOptimizer } from "./optimizer.js";
11
11
  export { SelfImprovingRag } from "./self-improving.js";
12
12
  // Fase 5: Knowledge Graph Persistente
13
13
  export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
14
+ export { QdrantVectorStore } from "./qdrant-store.js";
14
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,yBAAyB;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,sCAAsC;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface QdrantFilter {
2
+ [key: string]: unknown;
3
+ }
4
+ export interface QdrantSearchResult {
5
+ id: string;
6
+ score: number;
7
+ payload?: Record<string, unknown>;
8
+ }
9
+ export declare class QdrantVectorStore {
10
+ private baseUrl;
11
+ private apiKey?;
12
+ connect(url: string, apiKey?: string): void;
13
+ private headers;
14
+ private request;
15
+ addVectors(ids: string[], vectors: number[][], payloads: Record<string, unknown>[]): Promise<void>;
16
+ search(vector: number[], topK: number, filter?: QdrantFilter): Promise<QdrantSearchResult[]>;
17
+ deleteCollection(name: string): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=qdrant-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-store.d.ts","sourceRoot":"","sources":["../src/qdrant-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,MAAM,CAAC,CAAS;IAExB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAK3C,OAAO,CAAC,OAAO;YAMD,OAAO;IAaf,UAAU,CACd,GAAG,EAAE,MAAM,EAAE,EACb,OAAO,EAAE,MAAM,EAAE,EAAE,EACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IAmCV,MAAM,CACV,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA6B1B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGpD"}
@@ -0,0 +1,84 @@
1
+ export class QdrantVectorStore {
2
+ baseUrl = "";
3
+ apiKey;
4
+ connect(url, apiKey) {
5
+ this.baseUrl = url.replace(/\/$/, "");
6
+ this.apiKey = apiKey;
7
+ }
8
+ headers() {
9
+ const h = { "Content-Type": "application/json" };
10
+ if (this.apiKey)
11
+ h["api-key"] = this.apiKey;
12
+ return h;
13
+ }
14
+ async request(path, init) {
15
+ const res = await fetch(`${this.baseUrl}${path}`, {
16
+ ...init,
17
+ headers: { ...this.headers(), ...(init?.headers || {}) },
18
+ });
19
+ if (!res.ok) {
20
+ const text = await res.text().catch(() => "unknown error");
21
+ throw new Error(`Qdrant error ${res.status}: ${text}`);
22
+ }
23
+ if (res.status === 204)
24
+ return undefined;
25
+ return res.json();
26
+ }
27
+ async addVectors(ids, vectors, payloads) {
28
+ const dims = vectors[0]?.length ?? 0;
29
+ if (!dims || ids.length !== vectors.length || vectors.length !== payloads.length) {
30
+ throw new Error("Invalid addVectors arguments: mismatched lengths or empty vectors");
31
+ }
32
+ const collection = "eucode_chunks";
33
+ try {
34
+ await this.request(`/collections/${collection}`);
35
+ }
36
+ catch (e) {
37
+ if (e.message?.includes("404") || e.message?.includes("Not found")) {
38
+ await this.request(`/collections/${collection}`, {
39
+ method: "PUT",
40
+ body: JSON.stringify({
41
+ vectors: { size: dims, distance: "Cosine" },
42
+ }),
43
+ });
44
+ }
45
+ else {
46
+ throw e;
47
+ }
48
+ }
49
+ await this.request(`/collections/${collection}/points?wait=true`, {
50
+ method: "PUT",
51
+ body: JSON.stringify({
52
+ points: ids.map((id, i) => ({
53
+ id,
54
+ vector: vectors[i],
55
+ payload: payloads[i],
56
+ })),
57
+ }),
58
+ });
59
+ }
60
+ async search(vector, topK, filter) {
61
+ const collection = "eucode_chunks";
62
+ const body = {
63
+ vector,
64
+ limit: topK,
65
+ with_payload: true,
66
+ };
67
+ if (filter) {
68
+ body.filter = filter;
69
+ }
70
+ const result = (await this.request(`/collections/${collection}/points/search`, {
71
+ method: "POST",
72
+ body: JSON.stringify(body),
73
+ }));
74
+ return (result.result ?? []).map((r) => ({
75
+ id: String(r.id),
76
+ score: r.score,
77
+ payload: r.payload,
78
+ }));
79
+ }
80
+ async deleteCollection(name) {
81
+ await this.request(`/collections/${name}`, { method: "DELETE" });
82
+ }
83
+ }
84
+ //# sourceMappingURL=qdrant-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-store.js","sourceRoot":"","sources":["../src/qdrant-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eucoder/rag",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Advanced RAG module with Corrective RAG, Hybrid Search, Knowledge Graph, Agentic RAG, and Self-Improving capabilities",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/index.ts CHANGED
@@ -15,6 +15,9 @@ export { SelfImprovingRag } from "./self-improving.js";
15
15
  export { Neo4jKnowledgeGraph } from "./neo4j-knowledge-graph.js";
16
16
  export type { Neo4jConfig } from "./neo4j-knowledge-graph.js";
17
17
 
18
+ export { QdrantVectorStore } from "./qdrant-store.js";
19
+ export type { QdrantFilter, QdrantSearchResult } from "./qdrant-store.js";
20
+
18
21
  export type { LlmProvider } from "./llm-grader.js";
19
22
  export type {
20
23
  Retriever,
@@ -0,0 +1,114 @@
1
+ export interface QdrantFilter {
2
+ [key: string]: unknown;
3
+ }
4
+
5
+ export interface QdrantSearchResult {
6
+ id: string;
7
+ score: number;
8
+ payload?: Record<string, unknown>;
9
+ }
10
+
11
+ export class QdrantVectorStore {
12
+ private baseUrl: string = "";
13
+ private apiKey?: string;
14
+
15
+ connect(url: string, apiKey?: string): void {
16
+ this.baseUrl = url.replace(/\/$/, "");
17
+ this.apiKey = apiKey;
18
+ }
19
+
20
+ private headers(): Record<string, string> {
21
+ const h: Record<string, string> = { "Content-Type": "application/json" };
22
+ if (this.apiKey) h["api-key"] = this.apiKey;
23
+ return h;
24
+ }
25
+
26
+ private async request(path: string, init?: RequestInit): Promise<unknown> {
27
+ const res = await fetch(`${this.baseUrl}${path}`, {
28
+ ...init,
29
+ headers: { ...this.headers(), ...((init?.headers as Record<string, string>) || {}) },
30
+ });
31
+ if (!res.ok) {
32
+ const text = await res.text().catch(() => "unknown error");
33
+ throw new Error(`Qdrant error ${res.status}: ${text}`);
34
+ }
35
+ if (res.status === 204) return undefined;
36
+ return res.json();
37
+ }
38
+
39
+ async addVectors(
40
+ ids: string[],
41
+ vectors: number[][],
42
+ payloads: Record<string, unknown>[]
43
+ ): Promise<void> {
44
+ const dims = vectors[0]?.length ?? 0;
45
+ if (!dims || ids.length !== vectors.length || vectors.length !== payloads.length) {
46
+ throw new Error("Invalid addVectors arguments: mismatched lengths or empty vectors");
47
+ }
48
+
49
+ const collection = "eucode_chunks";
50
+
51
+ try {
52
+ await this.request(`/collections/${collection}`);
53
+ } catch (e: any) {
54
+ if (e.message?.includes("404") || e.message?.includes("Not found")) {
55
+ await this.request(`/collections/${collection}`, {
56
+ method: "PUT",
57
+ body: JSON.stringify({
58
+ vectors: { size: dims, distance: "Cosine" },
59
+ }),
60
+ });
61
+ } else {
62
+ throw e;
63
+ }
64
+ }
65
+
66
+ await this.request(`/collections/${collection}/points?wait=true`, {
67
+ method: "PUT",
68
+ body: JSON.stringify({
69
+ points: ids.map((id, i) => ({
70
+ id,
71
+ vector: vectors[i],
72
+ payload: payloads[i],
73
+ })),
74
+ }),
75
+ });
76
+ }
77
+
78
+ async search(
79
+ vector: number[],
80
+ topK: number,
81
+ filter?: QdrantFilter
82
+ ): Promise<QdrantSearchResult[]> {
83
+ const collection = "eucode_chunks";
84
+ const body: Record<string, unknown> = {
85
+ vector,
86
+ limit: topK,
87
+ with_payload: true,
88
+ };
89
+ if (filter) {
90
+ body.filter = filter;
91
+ }
92
+
93
+ const result = (await this.request(`/collections/${collection}/points/search`, {
94
+ method: "POST",
95
+ body: JSON.stringify(body),
96
+ })) as {
97
+ result?: Array<{
98
+ id: string | number;
99
+ score: number;
100
+ payload?: Record<string, unknown>;
101
+ }>;
102
+ };
103
+
104
+ return (result.result ?? []).map((r) => ({
105
+ id: String(r.id),
106
+ score: r.score,
107
+ payload: r.payload,
108
+ }));
109
+ }
110
+
111
+ async deleteCollection(name: string): Promise<void> {
112
+ await this.request(`/collections/${name}`, { method: "DELETE" });
113
+ }
114
+ }