midnight-mcp 0.0.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/LICENSE +21 -0
- package/README.md +136 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +2 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/vectorStore.d.ts +66 -0
- package/dist/db/vectorStore.d.ts.map +1 -0
- package/dist/db/vectorStore.js +196 -0
- package/dist/db/vectorStore.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/pipeline/embeddings.d.ts +25 -0
- package/dist/pipeline/embeddings.d.ts.map +1 -0
- package/dist/pipeline/embeddings.js +103 -0
- package/dist/pipeline/embeddings.js.map +1 -0
- package/dist/pipeline/github.d.ts +67 -0
- package/dist/pipeline/github.d.ts.map +1 -0
- package/dist/pipeline/github.js +287 -0
- package/dist/pipeline/github.js.map +1 -0
- package/dist/pipeline/index.d.ts +11 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +6 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/indexer.d.ts +38 -0
- package/dist/pipeline/indexer.d.ts.map +1 -0
- package/dist/pipeline/indexer.js +222 -0
- package/dist/pipeline/indexer.js.map +1 -0
- package/dist/pipeline/parser.d.ts +46 -0
- package/dist/pipeline/parser.d.ts.map +1 -0
- package/dist/pipeline/parser.js +436 -0
- package/dist/pipeline/parser.js.map +1 -0
- package/dist/pipeline/releases.d.ts +112 -0
- package/dist/pipeline/releases.d.ts.map +1 -0
- package/dist/pipeline/releases.js +298 -0
- package/dist/pipeline/releases.js.map +1 -0
- package/dist/pipeline/repository.d.ts +372 -0
- package/dist/pipeline/repository.d.ts.map +1 -0
- package/dist/pipeline/repository.js +517 -0
- package/dist/pipeline/repository.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/templates.d.ts +26 -0
- package/dist/prompts/templates.d.ts.map +1 -0
- package/dist/prompts/templates.js +353 -0
- package/dist/prompts/templates.js.map +1 -0
- package/dist/resources/code.d.ts +16 -0
- package/dist/resources/code.d.ts.map +1 -0
- package/dist/resources/code.js +630 -0
- package/dist/resources/code.js.map +1 -0
- package/dist/resources/docs.d.ts +16 -0
- package/dist/resources/docs.d.ts.map +1 -0
- package/dist/resources/docs.js +989 -0
- package/dist/resources/docs.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +13 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/schemas.d.ts +16 -0
- package/dist/resources/schemas.d.ts.map +1 -0
- package/dist/resources/schemas.js +407 -0
- package/dist/resources/schemas.js.map +1 -0
- package/dist/scripts/index-repos.d.ts +12 -0
- package/dist/scripts/index-repos.d.ts.map +1 -0
- package/dist/scripts/index-repos.js +53 -0
- package/dist/scripts/index-repos.js.map +1 -0
- package/dist/server.d.ts +14 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +231 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyze.d.ts +140 -0
- package/dist/tools/analyze.d.ts.map +1 -0
- package/dist/tools/analyze.js +270 -0
- package/dist/tools/analyze.js.map +1 -0
- package/dist/tools/index.d.ts +392 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/repository.d.ts +537 -0
- package/dist/tools/repository.d.ts.map +1 -0
- package/dist/tools/repository.js +654 -0
- package/dist/tools/repository.js.map +1 -0
- package/dist/tools/search.d.ts +204 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +210 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/utils/config.d.ts +66 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +161 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Midnight Foundation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Midnight MCP Server
|
|
2
|
+
|
|
3
|
+
MCP server that gives AI assistants access to Midnight blockchain—search contracts, analyze code, and explore documentation.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
Add to your `claude_desktop_config.json`:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"midnight": {
|
|
13
|
+
"command": "npx",
|
|
14
|
+
"args": ["-y", "midnight-mcp"]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Restart Claude Desktop. You can now use analysis tools, prompts, and access resources.
|
|
21
|
+
|
|
22
|
+
> **Note:** Search features won't work well without the full setup below.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Full Setup (for search)
|
|
27
|
+
|
|
28
|
+
To enable semantic search across Midnight contracts and docs:
|
|
29
|
+
|
|
30
|
+
### 1. Start ChromaDB
|
|
31
|
+
|
|
32
|
+
ChromaDB is a local vector database—no account needed, just Docker:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
docker run -d -p 8000:8000 chromadb/chroma
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 2. Get an OpenAI API key
|
|
39
|
+
|
|
40
|
+
Needed for generating embeddings. Get one at [platform.openai.com/api-keys](https://platform.openai.com/api-keys).
|
|
41
|
+
|
|
42
|
+
### 3. Update your config
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"midnight": {
|
|
48
|
+
"command": "npx",
|
|
49
|
+
"args": ["-y", "midnight-mcp"],
|
|
50
|
+
"env": {
|
|
51
|
+
"OPENAI_API_KEY": "sk-...",
|
|
52
|
+
"CHROMA_URL": "http://localhost:8000"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Optional: GitHub token
|
|
60
|
+
|
|
61
|
+
Add `"GITHUB_TOKEN": "ghp_..."` to increase API rate limits from 60 to 5000 requests/hour.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## What's Included
|
|
66
|
+
|
|
67
|
+
### Tools
|
|
68
|
+
|
|
69
|
+
| Tool | Description |
|
|
70
|
+
| ----------------------------- | --------------------------------------- |
|
|
71
|
+
| `midnight:search-compact` | Search Compact contract code |
|
|
72
|
+
| `midnight:search-typescript` | Search TypeScript SDK |
|
|
73
|
+
| `midnight:search-docs` | Search documentation |
|
|
74
|
+
| `midnight:analyze-contract` | Analyze contract structure and security |
|
|
75
|
+
| `midnight:explain-circuit` | Explain circuits in plain language |
|
|
76
|
+
| `midnight:get-file` | Get files from Midnight repos |
|
|
77
|
+
| `midnight:list-examples` | List example contracts |
|
|
78
|
+
| `midnight:get-latest-updates` | Recent repo changes |
|
|
79
|
+
|
|
80
|
+
### Resources
|
|
81
|
+
|
|
82
|
+
- `midnight://docs/*` — Documentation (Compact reference, SDK API, ZK concepts)
|
|
83
|
+
- `midnight://code/*` — Examples, patterns, and templates
|
|
84
|
+
- `midnight://schema/*` — AST, transaction, and proof schemas
|
|
85
|
+
|
|
86
|
+
### Prompts
|
|
87
|
+
|
|
88
|
+
- `midnight:create-contract` — Create new contracts
|
|
89
|
+
- `midnight:review-contract` — Security review
|
|
90
|
+
- `midnight:explain-concept` — Learn Midnight concepts
|
|
91
|
+
- `midnight:debug-contract` — Debug issues
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Developer Setup
|
|
96
|
+
|
|
97
|
+
For contributors who want to modify or extend the MCP server.
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
git clone https://github.com/Olanetsoft/midnight-mcp.git
|
|
101
|
+
cd midnight-mcp
|
|
102
|
+
npm install
|
|
103
|
+
npm run build
|
|
104
|
+
npm test
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Index Midnight repos (for search)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
docker run -d -p 8000:8000 chromadb/chroma
|
|
111
|
+
npm run index
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Project Structure
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
src/
|
|
118
|
+
├── index.ts # Entry point
|
|
119
|
+
├── server.ts # MCP server handlers
|
|
120
|
+
├── tools/ # Search, analysis, repository tools
|
|
121
|
+
├── resources/ # Docs, code, schema providers
|
|
122
|
+
├── prompts/ # Prompt templates
|
|
123
|
+
├── pipeline/ # GitHub sync & parsing
|
|
124
|
+
├── db/ # ChromaDB integration
|
|
125
|
+
└── utils/ # Config & logging
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## License
|
|
129
|
+
|
|
130
|
+
MIT
|
|
131
|
+
|
|
132
|
+
## Links
|
|
133
|
+
|
|
134
|
+
- [Midnight Docs](https://docs.midnight.network)
|
|
135
|
+
- [MCP Spec](https://modelcontextprotocol.io)
|
|
136
|
+
- [Midnight GitHub](https://github.com/midnightntwrk)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface CodeDocument {
|
|
2
|
+
id: string;
|
|
3
|
+
content: string;
|
|
4
|
+
embedding?: number[];
|
|
5
|
+
metadata: {
|
|
6
|
+
repository: string;
|
|
7
|
+
filePath: string;
|
|
8
|
+
language: string;
|
|
9
|
+
startLine: number;
|
|
10
|
+
endLine: number;
|
|
11
|
+
codeType: string;
|
|
12
|
+
codeName: string;
|
|
13
|
+
isPublic: boolean;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface SearchResult {
|
|
17
|
+
id: string;
|
|
18
|
+
content: string;
|
|
19
|
+
score: number;
|
|
20
|
+
metadata: CodeDocument["metadata"];
|
|
21
|
+
}
|
|
22
|
+
export interface SearchFilter {
|
|
23
|
+
repository?: string;
|
|
24
|
+
language?: string;
|
|
25
|
+
codeType?: string;
|
|
26
|
+
isPublic?: boolean;
|
|
27
|
+
}
|
|
28
|
+
declare class VectorStore {
|
|
29
|
+
private client;
|
|
30
|
+
private collection;
|
|
31
|
+
private collectionName;
|
|
32
|
+
private initialized;
|
|
33
|
+
/**
|
|
34
|
+
* Initialize the vector store connection
|
|
35
|
+
*/
|
|
36
|
+
initialize(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Add documents to the vector store
|
|
39
|
+
*/
|
|
40
|
+
addDocuments(documents: CodeDocument[]): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Search for similar documents
|
|
43
|
+
*/
|
|
44
|
+
search(query: string, limit?: number, filter?: SearchFilter): Promise<SearchResult[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete documents by file path
|
|
47
|
+
*/
|
|
48
|
+
deleteByPath(repository: string, filePath: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Delete all documents for a repository
|
|
51
|
+
*/
|
|
52
|
+
deleteRepository(repository: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get collection statistics
|
|
55
|
+
*/
|
|
56
|
+
getStats(): Promise<{
|
|
57
|
+
count: number;
|
|
58
|
+
}>;
|
|
59
|
+
/**
|
|
60
|
+
* Clear all data from the collection
|
|
61
|
+
*/
|
|
62
|
+
clear(): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
export declare const vectorStore: VectorStore;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=vectorStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.d.ts","sourceRoot":"","sources":["../../src/db/vectorStore.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,cAAM,WAAW;IACf,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BjC;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC5D;;OAEG;IACG,MAAM,CACV,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,MAAM,CAAC,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC;IAoD1B;;OAEG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvE;;OAEG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAc5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ChromaClient } from "chromadb";
|
|
2
|
+
import { config, logger } from "../utils/index.js";
|
|
3
|
+
import { embeddingGenerator } from "../pipeline/embeddings.js";
|
|
4
|
+
class VectorStore {
|
|
5
|
+
client = null;
|
|
6
|
+
collection = null;
|
|
7
|
+
collectionName = "midnight-code";
|
|
8
|
+
initialized = false;
|
|
9
|
+
/**
|
|
10
|
+
* Initialize the vector store connection
|
|
11
|
+
*/
|
|
12
|
+
async initialize() {
|
|
13
|
+
if (this.initialized)
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
this.client = new ChromaClient({
|
|
17
|
+
path: config.chromaUrl,
|
|
18
|
+
});
|
|
19
|
+
// Get or create the collection
|
|
20
|
+
this.collection = await this.client.getOrCreateCollection({
|
|
21
|
+
name: this.collectionName,
|
|
22
|
+
metadata: {
|
|
23
|
+
description: "Midnight blockchain code and documentation",
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
this.initialized = true;
|
|
27
|
+
logger.info("Vector store initialized successfully");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
logger.error("Failed to initialize vector store", {
|
|
31
|
+
error: String(error),
|
|
32
|
+
});
|
|
33
|
+
// Continue without vector store - use fallback search
|
|
34
|
+
logger.warn("Vector store unavailable, using in-memory fallback");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Add documents to the vector store
|
|
39
|
+
*/
|
|
40
|
+
async addDocuments(documents) {
|
|
41
|
+
if (!this.collection) {
|
|
42
|
+
logger.warn("Vector store not initialized, skipping document storage");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const ids = documents.map((d) => d.id);
|
|
47
|
+
const embeddings = documents.map((d) => d.embedding);
|
|
48
|
+
const metadatas = documents.map((d) => ({
|
|
49
|
+
repository: d.metadata.repository,
|
|
50
|
+
filePath: d.metadata.filePath,
|
|
51
|
+
language: d.metadata.language,
|
|
52
|
+
startLine: d.metadata.startLine,
|
|
53
|
+
endLine: d.metadata.endLine,
|
|
54
|
+
codeType: d.metadata.codeType,
|
|
55
|
+
codeName: d.metadata.codeName,
|
|
56
|
+
isPublic: d.metadata.isPublic,
|
|
57
|
+
}));
|
|
58
|
+
const documentContents = documents.map((d) => d.content);
|
|
59
|
+
await this.collection.add({
|
|
60
|
+
ids,
|
|
61
|
+
embeddings,
|
|
62
|
+
metadatas,
|
|
63
|
+
documents: documentContents,
|
|
64
|
+
});
|
|
65
|
+
logger.debug(`Added ${documents.length} documents to vector store`);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.error("Failed to add documents to vector store", {
|
|
69
|
+
error: String(error),
|
|
70
|
+
});
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Search for similar documents
|
|
76
|
+
*/
|
|
77
|
+
async search(query, limit = 10, filter) {
|
|
78
|
+
if (!this.collection) {
|
|
79
|
+
logger.warn("Vector store not initialized, returning empty results");
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
// Generate embedding for the query
|
|
84
|
+
const queryEmbedding = await embeddingGenerator.generateEmbedding(query);
|
|
85
|
+
// Build where filter
|
|
86
|
+
const whereFilter = {};
|
|
87
|
+
if (filter?.repository) {
|
|
88
|
+
whereFilter.repository = filter.repository;
|
|
89
|
+
}
|
|
90
|
+
if (filter?.language) {
|
|
91
|
+
whereFilter.language = filter.language;
|
|
92
|
+
}
|
|
93
|
+
if (filter?.codeType) {
|
|
94
|
+
whereFilter.codeType = filter.codeType;
|
|
95
|
+
}
|
|
96
|
+
if (filter?.isPublic !== undefined) {
|
|
97
|
+
whereFilter.isPublic = filter.isPublic;
|
|
98
|
+
}
|
|
99
|
+
const results = await this.collection.query({
|
|
100
|
+
queryEmbeddings: [queryEmbedding.embedding],
|
|
101
|
+
nResults: limit,
|
|
102
|
+
where: Object.keys(whereFilter).length > 0 ? whereFilter : undefined,
|
|
103
|
+
});
|
|
104
|
+
// Format results
|
|
105
|
+
const searchResults = [];
|
|
106
|
+
if (results.ids[0] && results.documents[0] && results.metadatas[0]) {
|
|
107
|
+
for (let i = 0; i < results.ids[0].length; i++) {
|
|
108
|
+
const metadata = results.metadatas[0][i];
|
|
109
|
+
searchResults.push({
|
|
110
|
+
id: results.ids[0][i],
|
|
111
|
+
content: results.documents[0][i] || "",
|
|
112
|
+
score: results.distances ? 1 - (results.distances[0][i] || 0) : 0,
|
|
113
|
+
metadata,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return searchResults;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error("Search failed", { error: String(error) });
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Delete documents by file path
|
|
126
|
+
*/
|
|
127
|
+
async deleteByPath(repository, filePath) {
|
|
128
|
+
if (!this.collection)
|
|
129
|
+
return;
|
|
130
|
+
try {
|
|
131
|
+
await this.collection.delete({
|
|
132
|
+
where: {
|
|
133
|
+
repository,
|
|
134
|
+
filePath,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
logger.debug(`Deleted documents for ${repository}:${filePath}`);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
logger.error("Failed to delete documents", { error: String(error) });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Delete all documents for a repository
|
|
145
|
+
*/
|
|
146
|
+
async deleteRepository(repository) {
|
|
147
|
+
if (!this.collection)
|
|
148
|
+
return;
|
|
149
|
+
try {
|
|
150
|
+
await this.collection.delete({
|
|
151
|
+
where: { repository },
|
|
152
|
+
});
|
|
153
|
+
logger.info(`Deleted all documents for repository ${repository}`);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
logger.error("Failed to delete repository documents", {
|
|
157
|
+
error: String(error),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get collection statistics
|
|
163
|
+
*/
|
|
164
|
+
async getStats() {
|
|
165
|
+
if (!this.collection) {
|
|
166
|
+
return { count: 0 };
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const count = await this.collection.count();
|
|
170
|
+
return { count };
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
logger.error("Failed to get stats", { error: String(error) });
|
|
174
|
+
return { count: 0 };
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Clear all data from the collection
|
|
179
|
+
*/
|
|
180
|
+
async clear() {
|
|
181
|
+
if (!this.client)
|
|
182
|
+
return;
|
|
183
|
+
try {
|
|
184
|
+
await this.client.deleteCollection({ name: this.collectionName });
|
|
185
|
+
this.collection = await this.client.getOrCreateCollection({
|
|
186
|
+
name: this.collectionName,
|
|
187
|
+
});
|
|
188
|
+
logger.info("Vector store cleared");
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
logger.error("Failed to clear vector store", { error: String(error) });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
export const vectorStore = new VectorStore();
|
|
196
|
+
//# sourceMappingURL=vectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorStore.js","sourceRoot":"","sources":["../../src/db/vectorStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAc,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAgC/D,MAAM,WAAW;IACP,MAAM,GAAwB,IAAI,CAAC;IACnC,UAAU,GAAsB,IAAI,CAAC;IACrC,cAAc,GAAG,eAAe,CAAC;IACjC,WAAW,GAAG,KAAK,CAAC;IAE5B;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC;gBAC7B,IAAI,EAAE,MAAM,CAAC,SAAS;aACvB,CAAC,CAAC;YAEH,+BAA+B;YAC/B,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;gBACxD,IAAI,EAAE,IAAI,CAAC,cAAc;gBACzB,QAAQ,EAAE;oBACR,WAAW,EAAE,4CAA4C;iBAC1D;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBAChD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;YACH,sDAAsD;YACtD,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,SAAyB;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU;gBACjC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS;gBAC/B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAC3B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ;aAC9B,CAAC,CAAC,CAAC;YACJ,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAEzD,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBACxB,GAAG;gBACH,UAAU;gBACV,SAAS;gBACT,SAAS,EAAE,gBAAgB;aAC5B,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,SAAS,SAAS,CAAC,MAAM,4BAA4B,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;gBACtD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,KAAK,GAAG,EAAE,EACV,MAAqB;QAErB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEzE,qBAAqB;YACrB,MAAM,WAAW,GAA4B,EAAE,CAAC;YAChD,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;gBACvB,WAAW,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YAC7C,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACrB,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzC,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,EAAE,CAAC;gBACrB,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzC,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACnC,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACzC,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBAC1C,eAAe,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC;gBAC3C,QAAQ,EAAE,KAAK;gBACf,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;aACrE,CAAC,CAAC;YAEH,iBAAiB;YACjB,MAAM,aAAa,GAAmB,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAA6B,CAAC;oBACrE,aAAa,CAAC,IAAI,CAAC;wBACjB,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACrB,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;wBACtC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACjE,QAAQ;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,aAAa,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACxD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,QAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC3B,KAAK,EAAE;oBACL,UAAU;oBACV,QAAQ;iBACT;aACF,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,yBAAyB,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC3B,KAAK,EAAE,EAAE,UAAU,EAAE;aACtB,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;gBACpD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;gBACxD,IAAI,EAAE,IAAI,CAAC,cAAc;aAC1B,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { startServer } from "./server.js";
|
|
3
|
+
// Handle uncaught errors
|
|
4
|
+
process.on("uncaughtException", (error) => {
|
|
5
|
+
console.error("Uncaught exception:", error);
|
|
6
|
+
process.exit(1);
|
|
7
|
+
});
|
|
8
|
+
process.on("unhandledRejection", (reason) => {
|
|
9
|
+
console.error("Unhandled rejection:", reason);
|
|
10
|
+
process.exit(1);
|
|
11
|
+
});
|
|
12
|
+
// Start the server
|
|
13
|
+
startServer().catch((error) => {
|
|
14
|
+
console.error("Failed to start server:", error);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,yBAAyB;AACzB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;IACxC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface EmbeddingResult {
|
|
2
|
+
text: string;
|
|
3
|
+
embedding: number[];
|
|
4
|
+
model: string;
|
|
5
|
+
tokenCount?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class EmbeddingGenerator {
|
|
8
|
+
private openai;
|
|
9
|
+
private model;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Generate embeddings for a single text
|
|
13
|
+
*/
|
|
14
|
+
generateEmbedding(text: string): Promise<EmbeddingResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Generate embeddings for multiple texts in batch
|
|
17
|
+
*/
|
|
18
|
+
generateEmbeddings(texts: string[]): Promise<EmbeddingResult[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Calculate cosine similarity between two embeddings
|
|
21
|
+
*/
|
|
22
|
+
cosineSimilarity(a: number[], b: number[]): number;
|
|
23
|
+
}
|
|
24
|
+
export declare const embeddingGenerator: EmbeddingGenerator;
|
|
25
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/pipeline/embeddings.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAS;;IAWtB;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B/D;;OAEG;IACG,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA0CrE;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM;CAiBnD;AAED,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import { config, logger } from "../utils/index.js";
|
|
3
|
+
export class EmbeddingGenerator {
|
|
4
|
+
openai = null;
|
|
5
|
+
model;
|
|
6
|
+
constructor() {
|
|
7
|
+
this.model = config.embeddingModel;
|
|
8
|
+
if (config.openaiApiKey) {
|
|
9
|
+
this.openai = new OpenAI({
|
|
10
|
+
apiKey: config.openaiApiKey,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate embeddings for a single text
|
|
16
|
+
*/
|
|
17
|
+
async generateEmbedding(text) {
|
|
18
|
+
if (!this.openai) {
|
|
19
|
+
// Return a dummy embedding for testing without API key
|
|
20
|
+
logger.warn("No OpenAI API key configured, using dummy embeddings");
|
|
21
|
+
return {
|
|
22
|
+
text,
|
|
23
|
+
embedding: new Array(1536).fill(0).map(() => Math.random() - 0.5),
|
|
24
|
+
model: "dummy",
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const response = await this.openai.embeddings.create({
|
|
29
|
+
model: this.model,
|
|
30
|
+
input: text,
|
|
31
|
+
});
|
|
32
|
+
return {
|
|
33
|
+
text,
|
|
34
|
+
embedding: response.data[0].embedding,
|
|
35
|
+
model: this.model,
|
|
36
|
+
tokenCount: response.usage?.total_tokens,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
logger.error("Failed to generate embedding", { error: String(error) });
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate embeddings for multiple texts in batch
|
|
46
|
+
*/
|
|
47
|
+
async generateEmbeddings(texts) {
|
|
48
|
+
if (!this.openai) {
|
|
49
|
+
logger.warn("No OpenAI API key configured, using dummy embeddings");
|
|
50
|
+
return texts.map((text) => ({
|
|
51
|
+
text,
|
|
52
|
+
embedding: new Array(1536).fill(0).map(() => Math.random() - 0.5),
|
|
53
|
+
model: "dummy",
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// OpenAI allows up to 2048 inputs per request
|
|
58
|
+
const batchSize = 100;
|
|
59
|
+
const results = [];
|
|
60
|
+
for (let i = 0; i < texts.length; i += batchSize) {
|
|
61
|
+
const batch = texts.slice(i, i + batchSize);
|
|
62
|
+
logger.debug(`Generating embeddings for batch ${i / batchSize + 1}`);
|
|
63
|
+
const response = await this.openai.embeddings.create({
|
|
64
|
+
model: this.model,
|
|
65
|
+
input: batch,
|
|
66
|
+
});
|
|
67
|
+
for (let j = 0; j < batch.length; j++) {
|
|
68
|
+
results.push({
|
|
69
|
+
text: batch[j],
|
|
70
|
+
embedding: response.data[j].embedding,
|
|
71
|
+
model: this.model,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger.error("Failed to generate batch embeddings", {
|
|
79
|
+
error: String(error),
|
|
80
|
+
});
|
|
81
|
+
throw error;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Calculate cosine similarity between two embeddings
|
|
86
|
+
*/
|
|
87
|
+
cosineSimilarity(a, b) {
|
|
88
|
+
if (a.length !== b.length) {
|
|
89
|
+
throw new Error("Embeddings must have the same length");
|
|
90
|
+
}
|
|
91
|
+
let dotProduct = 0;
|
|
92
|
+
let normA = 0;
|
|
93
|
+
let normB = 0;
|
|
94
|
+
for (let i = 0; i < a.length; i++) {
|
|
95
|
+
dotProduct += a[i] * b[i];
|
|
96
|
+
normA += a[i] * a[i];
|
|
97
|
+
normB += b[i] * b[i];
|
|
98
|
+
}
|
|
99
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export const embeddingGenerator = new EmbeddingGenerator();
|
|
103
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/pipeline/embeddings.ts"],"names":[],"mappings":"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"}
|