cortex-engine 0.1.0
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 +154 -0
- package/dist/bin/cli.d.ts +13 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +92 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/config-cmd.d.ts +12 -0
- package/dist/bin/config-cmd.d.ts.map +1 -0
- package/dist/bin/config-cmd.js +184 -0
- package/dist/bin/config-cmd.js.map +1 -0
- package/dist/bin/config-loader.d.ts +12 -0
- package/dist/bin/config-loader.d.ts.map +1 -0
- package/dist/bin/config-loader.js +42 -0
- package/dist/bin/config-loader.js.map +1 -0
- package/dist/bin/digest-cmd.d.ts +13 -0
- package/dist/bin/digest-cmd.d.ts.map +1 -0
- package/dist/bin/digest-cmd.js +286 -0
- package/dist/bin/digest-cmd.js.map +1 -0
- package/dist/bin/init.d.ts +33 -0
- package/dist/bin/init.d.ts.map +1 -0
- package/dist/bin/init.js +355 -0
- package/dist/bin/init.js.map +1 -0
- package/dist/bin/serve.d.ts +15 -0
- package/dist/bin/serve.d.ts.map +1 -0
- package/dist/bin/serve.js +21 -0
- package/dist/bin/serve.js.map +1 -0
- package/dist/bridges/bridge.d.ts +46 -0
- package/dist/bridges/bridge.d.ts.map +1 -0
- package/dist/bridges/bridge.js +128 -0
- package/dist/bridges/bridge.js.map +1 -0
- package/dist/bridges/registry.d.ts +19 -0
- package/dist/bridges/registry.d.ts.map +1 -0
- package/dist/bridges/registry.js +36 -0
- package/dist/bridges/registry.js.map +1 -0
- package/dist/core/config.d.ts +108 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +29 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/embed.d.ts +16 -0
- package/dist/core/embed.d.ts.map +1 -0
- package/dist/core/embed.js +7 -0
- package/dist/core/embed.js.map +1 -0
- package/dist/core/llm.d.ts +31 -0
- package/dist/core/llm.d.ts.map +1 -0
- package/dist/core/llm.js +13 -0
- package/dist/core/llm.js.map +1 -0
- package/dist/core/nli.d.ts +26 -0
- package/dist/core/nli.d.ts.map +1 -0
- package/dist/core/nli.js +11 -0
- package/dist/core/nli.js.map +1 -0
- package/dist/core/session.d.ts +26 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +71 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/store.d.ts +58 -0
- package/dist/core/store.d.ts.map +1 -0
- package/dist/core/store.js +8 -0
- package/dist/core/store.js.map +1 -0
- package/dist/core/types.d.ts +148 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +8 -0
- package/dist/core/types.js.map +1 -0
- package/dist/engines/cognition.d.ts +76 -0
- package/dist/engines/cognition.d.ts.map +1 -0
- package/dist/engines/cognition.js +441 -0
- package/dist/engines/cognition.js.map +1 -0
- package/dist/engines/digest.d.ts +52 -0
- package/dist/engines/digest.d.ts.map +1 -0
- package/dist/engines/digest.js +351 -0
- package/dist/engines/digest.js.map +1 -0
- package/dist/engines/fsrs.d.ts +44 -0
- package/dist/engines/fsrs.d.ts.map +1 -0
- package/dist/engines/fsrs.js +122 -0
- package/dist/engines/fsrs.js.map +1 -0
- package/dist/engines/keywords.d.ts +12 -0
- package/dist/engines/keywords.d.ts.map +1 -0
- package/dist/engines/keywords.js +45 -0
- package/dist/engines/keywords.js.map +1 -0
- package/dist/engines/memory.d.ts +55 -0
- package/dist/engines/memory.d.ts.map +1 -0
- package/dist/engines/memory.js +147 -0
- package/dist/engines/memory.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +12 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +173 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +45 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +814 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/namespace/manager.d.ts +28 -0
- package/dist/namespace/manager.d.ts.map +1 -0
- package/dist/namespace/manager.js +73 -0
- package/dist/namespace/manager.js.map +1 -0
- package/dist/namespace/scoped-store.d.ts +43 -0
- package/dist/namespace/scoped-store.d.ts.map +1 -0
- package/dist/namespace/scoped-store.js +91 -0
- package/dist/namespace/scoped-store.js.map +1 -0
- package/dist/plugins/loader.d.ts +18 -0
- package/dist/plugins/loader.d.ts.map +1 -0
- package/dist/plugins/loader.js +71 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/providers/nli-http.d.ts +34 -0
- package/dist/providers/nli-http.d.ts.map +1 -0
- package/dist/providers/nli-http.js +83 -0
- package/dist/providers/nli-http.js.map +1 -0
- package/dist/providers/ollama.d.ts +37 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +103 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/vertex-embed.d.ts +38 -0
- package/dist/providers/vertex-embed.d.ts.map +1 -0
- package/dist/providers/vertex-embed.js +69 -0
- package/dist/providers/vertex-embed.js.map +1 -0
- package/dist/providers/vertex-llm.d.ts +25 -0
- package/dist/providers/vertex-llm.d.ts.map +1 -0
- package/dist/providers/vertex-llm.js +75 -0
- package/dist/providers/vertex-llm.js.map +1 -0
- package/dist/stores/firestore.d.ts +59 -0
- package/dist/stores/firestore.d.ts.map +1 -0
- package/dist/stores/firestore.js +530 -0
- package/dist/stores/firestore.js.map +1 -0
- package/dist/stores/sqlite.d.ts +43 -0
- package/dist/stores/sqlite.d.ts.map +1 -0
- package/dist/stores/sqlite.js +593 -0
- package/dist/stores/sqlite.js.map +1 -0
- package/dist/triggers/pipeline.d.ts +21 -0
- package/dist/triggers/pipeline.d.ts.map +1 -0
- package/dist/triggers/pipeline.js +30 -0
- package/dist/triggers/pipeline.js.map +1 -0
- package/dist/triggers/registry.d.ts +17 -0
- package/dist/triggers/registry.d.ts.map +1 -0
- package/dist/triggers/registry.js +32 -0
- package/dist/triggers/registry.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OllamaEmbedProvider and OllamaLLMProvider — Ollama REST API implementations.
|
|
3
|
+
*
|
|
4
|
+
* Talks to a local Ollama instance (default: http://localhost:11434).
|
|
5
|
+
* Uses Node.js built-in fetch — no extra HTTP dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Defaults:
|
|
8
|
+
* embed model — qwen3-embedding:0.6b (1024 dimensions, MRL to 32)
|
|
9
|
+
* LLM model — qwen2.5:14b
|
|
10
|
+
*/
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Internal helpers
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
async function ollamaPost(baseUrl, path, body) {
|
|
15
|
+
let response;
|
|
16
|
+
try {
|
|
17
|
+
response = await fetch(`${baseUrl}${path}`, {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers: { 'Content-Type': 'application/json' },
|
|
20
|
+
body: JSON.stringify(body),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (cause) {
|
|
24
|
+
throw new Error(`Ollama not reachable at ${baseUrl}. Is Ollama running?`, { cause });
|
|
25
|
+
}
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const text = await response.text().catch(() => '(no body)');
|
|
28
|
+
throw new Error(`Ollama request to ${path} failed: HTTP ${response.status} — ${text}`);
|
|
29
|
+
}
|
|
30
|
+
return response.json();
|
|
31
|
+
}
|
|
32
|
+
export class OllamaEmbedProvider {
|
|
33
|
+
name = 'ollama';
|
|
34
|
+
dimensions;
|
|
35
|
+
model;
|
|
36
|
+
baseUrl;
|
|
37
|
+
constructor(options) {
|
|
38
|
+
this.model = options?.model ?? 'qwen3-embedding:0.6b';
|
|
39
|
+
this.baseUrl = options?.baseUrl ?? 'http://localhost:11434';
|
|
40
|
+
this.dimensions = options?.dimensions ?? 1024;
|
|
41
|
+
}
|
|
42
|
+
async embed(text) {
|
|
43
|
+
const data = await ollamaPost(this.baseUrl, '/api/embed', { model: this.model, input: text });
|
|
44
|
+
return data.embeddings[0];
|
|
45
|
+
}
|
|
46
|
+
async embedBatch(texts) {
|
|
47
|
+
const data = await ollamaPost(this.baseUrl, '/api/embed', { model: this.model, input: texts });
|
|
48
|
+
return data.embeddings;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export class OllamaLLMProvider {
|
|
52
|
+
name = 'ollama';
|
|
53
|
+
modelId;
|
|
54
|
+
baseUrl;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.modelId = options?.model ?? 'qwen2.5:14b';
|
|
57
|
+
this.baseUrl = options?.baseUrl ?? 'http://localhost:11434';
|
|
58
|
+
}
|
|
59
|
+
async generate(prompt, options) {
|
|
60
|
+
const body = {
|
|
61
|
+
model: this.modelId,
|
|
62
|
+
prompt,
|
|
63
|
+
stream: false,
|
|
64
|
+
options: {
|
|
65
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
66
|
+
...(options?.maxTokens !== undefined && { num_predict: options.maxTokens }),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
if (options?.systemPrompt) {
|
|
70
|
+
body['system'] = options.systemPrompt;
|
|
71
|
+
}
|
|
72
|
+
const data = await ollamaPost(this.baseUrl, '/api/generate', body);
|
|
73
|
+
return data.response;
|
|
74
|
+
}
|
|
75
|
+
async generateJSON(prompt, options) {
|
|
76
|
+
let systemPrompt = options?.systemPrompt ?? '';
|
|
77
|
+
if (options?.schema) {
|
|
78
|
+
const schemaInstruction = `Respond with JSON matching this schema: ${JSON.stringify(options.schema)}`;
|
|
79
|
+
systemPrompt = systemPrompt ? `${systemPrompt}\n\n${schemaInstruction}` : schemaInstruction;
|
|
80
|
+
}
|
|
81
|
+
const body = {
|
|
82
|
+
model: this.modelId,
|
|
83
|
+
prompt,
|
|
84
|
+
stream: false,
|
|
85
|
+
format: 'json',
|
|
86
|
+
options: {
|
|
87
|
+
...(options?.temperature !== undefined && { temperature: options.temperature }),
|
|
88
|
+
...(options?.maxTokens !== undefined && { num_predict: options.maxTokens }),
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
if (systemPrompt) {
|
|
92
|
+
body['system'] = systemPrompt;
|
|
93
|
+
}
|
|
94
|
+
const data = await ollamaPost(this.baseUrl, '/api/generate', body);
|
|
95
|
+
try {
|
|
96
|
+
return JSON.parse(data.response);
|
|
97
|
+
}
|
|
98
|
+
catch (cause) {
|
|
99
|
+
throw new Error(`OllamaLLMProvider.generateJSON: failed to parse JSON response.\nRaw response: ${data.response}`, { cause });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VertexEmbedProvider — Vertex AI text-embedding-004 via @google-cloud/aiplatform.
|
|
3
|
+
*
|
|
4
|
+
* Uses PredictionServiceClient (NOT @google-cloud/vertexai, which only supports
|
|
5
|
+
* generative models). Returns 768-dimension vectors by default.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbedProvider } from '../core/embed.js';
|
|
8
|
+
export type VertexEmbedTaskType = 'RETRIEVAL_DOCUMENT' | 'RETRIEVAL_QUERY' | 'SEMANTIC_SIMILARITY' | 'CLASSIFICATION' | 'CLUSTERING';
|
|
9
|
+
export interface VertexEmbedOptions {
|
|
10
|
+
/** GCP project ID. Falls back to GOOGLE_CLOUD_PROJECT env var. */
|
|
11
|
+
projectId?: string;
|
|
12
|
+
/** GCP region (default: us-central1). */
|
|
13
|
+
location?: string;
|
|
14
|
+
/** Embedding model name (default: text-embedding-004). */
|
|
15
|
+
model?: string;
|
|
16
|
+
/** Output dimensionality (default: 768). */
|
|
17
|
+
dimensions?: number;
|
|
18
|
+
/** Max concurrent requests per batch (default: 5). */
|
|
19
|
+
batchConcurrency?: number;
|
|
20
|
+
/** Default task type for embeddings (default: SEMANTIC_SIMILARITY). */
|
|
21
|
+
taskType?: VertexEmbedTaskType;
|
|
22
|
+
}
|
|
23
|
+
export declare class VertexEmbedProvider implements EmbedProvider {
|
|
24
|
+
readonly name = "vertex";
|
|
25
|
+
readonly dimensions: number;
|
|
26
|
+
private readonly projectId;
|
|
27
|
+
private readonly location;
|
|
28
|
+
private readonly model;
|
|
29
|
+
private readonly batchConcurrency;
|
|
30
|
+
private readonly taskType;
|
|
31
|
+
private readonly client;
|
|
32
|
+
private readonly helpers;
|
|
33
|
+
constructor(options: VertexEmbedOptions, client: import('@google-cloud/aiplatform').PredictionServiceClient, helpersModule: typeof import('@google-cloud/aiplatform').helpers);
|
|
34
|
+
private get endpoint();
|
|
35
|
+
embed(text: string): Promise<number[]>;
|
|
36
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=vertex-embed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-embed.d.ts","sourceRoot":"","sources":["../../src/providers/vertex-embed.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,MAAM,mBAAmB,GAC3B,oBAAoB,GACpB,iBAAiB,GACjB,qBAAqB,GACrB,gBAAgB,GAChB,YAAY,CAAC;AAEjB,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,qBAAa,mBAAoB,YAAW,aAAa;IACvD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6D;IACpF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;gBAG1E,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,OAAO,0BAA0B,EAAE,uBAAuB,EAClE,aAAa,EAAE,cAAc,0BAA0B,EAAE,OAAO;IAiBlE,OAAO,KAAK,QAAQ,GAEnB;IAEK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA+BtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAgBvD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VertexEmbedProvider — Vertex AI text-embedding-004 via @google-cloud/aiplatform.
|
|
3
|
+
*
|
|
4
|
+
* Uses PredictionServiceClient (NOT @google-cloud/vertexai, which only supports
|
|
5
|
+
* generative models). Returns 768-dimension vectors by default.
|
|
6
|
+
*/
|
|
7
|
+
export class VertexEmbedProvider {
|
|
8
|
+
name = 'vertex';
|
|
9
|
+
dimensions;
|
|
10
|
+
projectId;
|
|
11
|
+
location;
|
|
12
|
+
model;
|
|
13
|
+
batchConcurrency;
|
|
14
|
+
taskType;
|
|
15
|
+
client;
|
|
16
|
+
helpers;
|
|
17
|
+
constructor(options, client, helpersModule) {
|
|
18
|
+
this.projectId = options.projectId ?? process.env['GOOGLE_CLOUD_PROJECT'] ?? '';
|
|
19
|
+
this.location = options.location ?? 'us-central1';
|
|
20
|
+
this.model = options.model ?? 'text-embedding-004';
|
|
21
|
+
this.dimensions = options.dimensions ?? 768;
|
|
22
|
+
this.batchConcurrency = options.batchConcurrency ?? 5;
|
|
23
|
+
this.taskType = options.taskType ?? 'SEMANTIC_SIMILARITY';
|
|
24
|
+
if (!this.projectId) {
|
|
25
|
+
throw new Error('VertexEmbedProvider: projectId is required (config or GOOGLE_CLOUD_PROJECT env)');
|
|
26
|
+
}
|
|
27
|
+
this.client = client;
|
|
28
|
+
this.helpers = helpersModule;
|
|
29
|
+
}
|
|
30
|
+
get endpoint() {
|
|
31
|
+
return `projects/${this.projectId}/locations/${this.location}/publishers/google/models/${this.model}`;
|
|
32
|
+
}
|
|
33
|
+
async embed(text) {
|
|
34
|
+
const instance = this.helpers.toValue({
|
|
35
|
+
content: text,
|
|
36
|
+
task_type: this.taskType,
|
|
37
|
+
});
|
|
38
|
+
const parameters = this.helpers.toValue({
|
|
39
|
+
outputDimensionality: this.dimensions,
|
|
40
|
+
});
|
|
41
|
+
const [response] = await this.client.predict({
|
|
42
|
+
endpoint: this.endpoint,
|
|
43
|
+
instances: [instance],
|
|
44
|
+
parameters,
|
|
45
|
+
});
|
|
46
|
+
const prediction = response.predictions?.[0];
|
|
47
|
+
if (!prediction)
|
|
48
|
+
throw new Error(`VertexEmbedProvider: no prediction returned for: "${text.slice(0, 50)}"`);
|
|
49
|
+
const values = prediction.structValue?.fields?.embeddings?.structValue?.fields?.values?.listValue?.values?.map((v) => v.numberValue ?? 0);
|
|
50
|
+
if (!values || values.length === 0) {
|
|
51
|
+
throw new Error(`VertexEmbedProvider: empty embedding for: "${text.slice(0, 50)}"`);
|
|
52
|
+
}
|
|
53
|
+
return values;
|
|
54
|
+
}
|
|
55
|
+
async embedBatch(texts) {
|
|
56
|
+
const results = [];
|
|
57
|
+
for (let i = 0; i < texts.length; i += this.batchConcurrency) {
|
|
58
|
+
const chunk = texts.slice(i, i + this.batchConcurrency);
|
|
59
|
+
const embeddings = await Promise.all(chunk.map((t) => this.embed(t)));
|
|
60
|
+
results.push(...embeddings);
|
|
61
|
+
// Brief pause between batches to respect rate limits
|
|
62
|
+
if (i + this.batchConcurrency < texts.length) {
|
|
63
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=vertex-embed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-embed.js","sourceRoot":"","sources":["../../src/providers/vertex-embed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VertexLLMProvider — Vertex AI Gemini via @google-cloud/vertexai.
|
|
3
|
+
*
|
|
4
|
+
* Generalized provider with no idapixl-specific dependencies.
|
|
5
|
+
* Supports systemPrompt, schema instructions, and JSON fence stripping.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMProvider, GenerateOptions, GenerateJSONOptions } from '../core/llm.js';
|
|
8
|
+
export interface VertexLLMOptions {
|
|
9
|
+
/** GCP project ID. Falls back to GOOGLE_CLOUD_PROJECT env var. */
|
|
10
|
+
projectId?: string;
|
|
11
|
+
/** GCP region (default: us-central1). */
|
|
12
|
+
location?: string;
|
|
13
|
+
/** Gemini model ID (default: gemini-2.5-flash). */
|
|
14
|
+
model?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class VertexLLMProvider implements LLMProvider {
|
|
17
|
+
readonly name = "vertex-gemini";
|
|
18
|
+
readonly modelId: string;
|
|
19
|
+
private readonly projectId;
|
|
20
|
+
private readonly vertexAI;
|
|
21
|
+
constructor(options: VertexLLMOptions, vertexAI: import('@google-cloud/vertexai').VertexAI);
|
|
22
|
+
generate(prompt: string, options?: GenerateOptions): Promise<string>;
|
|
23
|
+
generateJSON<T>(prompt: string, options?: GenerateJSONOptions): Promise<T>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=vertex-llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-llm.d.ts","sourceRoot":"","sources":["../../src/providers/vertex-llm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAExF,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAaD,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4C;gBAGnE,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,OAAO,wBAAwB,EAAE,QAAQ;IAY/C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBpE,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;CAiCjF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VertexLLMProvider — Vertex AI Gemini via @google-cloud/vertexai.
|
|
3
|
+
*
|
|
4
|
+
* Generalized provider with no idapixl-specific dependencies.
|
|
5
|
+
* Supports systemPrompt, schema instructions, and JSON fence stripping.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Strip common code fence wrappers from LLM JSON output.
|
|
9
|
+
* Models often return ```json ... ``` or ``` ... ``` around JSON.
|
|
10
|
+
*/
|
|
11
|
+
function stripJsonFences(text) {
|
|
12
|
+
const trimmed = text.trim();
|
|
13
|
+
// Match ```json ... ``` or ``` ... ```
|
|
14
|
+
const fenceMatch = trimmed.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?\s*```$/);
|
|
15
|
+
return fenceMatch ? fenceMatch[1].trim() : trimmed;
|
|
16
|
+
}
|
|
17
|
+
export class VertexLLMProvider {
|
|
18
|
+
name = 'vertex-gemini';
|
|
19
|
+
modelId;
|
|
20
|
+
projectId;
|
|
21
|
+
vertexAI;
|
|
22
|
+
constructor(options, vertexAI) {
|
|
23
|
+
this.projectId = options.projectId ?? process.env['GOOGLE_CLOUD_PROJECT'] ?? '';
|
|
24
|
+
this.modelId = options.model ?? 'gemini-2.5-flash';
|
|
25
|
+
if (!this.projectId) {
|
|
26
|
+
throw new Error('VertexLLMProvider: projectId is required (config or GOOGLE_CLOUD_PROJECT env)');
|
|
27
|
+
}
|
|
28
|
+
this.vertexAI = vertexAI;
|
|
29
|
+
}
|
|
30
|
+
async generate(prompt, options) {
|
|
31
|
+
const model = this.vertexAI.preview.getGenerativeModel({
|
|
32
|
+
model: this.modelId,
|
|
33
|
+
generationConfig: {
|
|
34
|
+
temperature: options?.temperature ?? 0.2,
|
|
35
|
+
maxOutputTokens: options?.maxTokens ?? 1024,
|
|
36
|
+
},
|
|
37
|
+
...(options?.systemPrompt ? { systemInstruction: options.systemPrompt } : {}),
|
|
38
|
+
});
|
|
39
|
+
const result = await model.generateContent(prompt);
|
|
40
|
+
const text = result.response.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
41
|
+
if (!text)
|
|
42
|
+
throw new Error('VertexLLMProvider: empty response');
|
|
43
|
+
return text.trim();
|
|
44
|
+
}
|
|
45
|
+
async generateJSON(prompt, options) {
|
|
46
|
+
// Build system prompt with optional schema instruction
|
|
47
|
+
let systemPrompt = options?.systemPrompt ?? '';
|
|
48
|
+
if (options?.schema) {
|
|
49
|
+
const schemaInstruction = `Respond with JSON matching this schema: ${JSON.stringify(options.schema)}`;
|
|
50
|
+
systemPrompt = systemPrompt ? `${systemPrompt}\n\n${schemaInstruction}` : schemaInstruction;
|
|
51
|
+
}
|
|
52
|
+
const model = this.vertexAI.preview.getGenerativeModel({
|
|
53
|
+
model: this.modelId,
|
|
54
|
+
generationConfig: {
|
|
55
|
+
temperature: options?.temperature ?? 0.2,
|
|
56
|
+
maxOutputTokens: options?.maxTokens ?? 2048,
|
|
57
|
+
responseMimeType: 'application/json',
|
|
58
|
+
},
|
|
59
|
+
...(systemPrompt ? { systemInstruction: systemPrompt } : {}),
|
|
60
|
+
});
|
|
61
|
+
const result = await model.generateContent(prompt);
|
|
62
|
+
const text = result.response.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
63
|
+
if (!text)
|
|
64
|
+
throw new Error('VertexLLMProvider: empty response');
|
|
65
|
+
const cleaned = stripJsonFences(text);
|
|
66
|
+
try {
|
|
67
|
+
return JSON.parse(cleaned);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const parseError = err instanceof Error ? err.message : String(err);
|
|
71
|
+
throw new Error(`VertexLLMProvider: failed to parse JSON response: ${parseError}\nRaw output (first 500 chars): ${text.slice(0, 500)}`, { cause: err });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=vertex-llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertex-llm.js","sourceRoot":"","sources":["../../src/providers/vertex-llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FirestoreCortexStore — cloud Firestore-backed implementation of CortexStore.
|
|
3
|
+
*
|
|
4
|
+
* Uses firebase-admin for Firestore access. Vector search uses Firestore native
|
|
5
|
+
* findNearest() for production-grade similarity search.
|
|
6
|
+
* Dates stored as Firestore Timestamps. Embeddings stored as VectorValue.
|
|
7
|
+
*
|
|
8
|
+
* This is the cloud counterpart to SqliteCortexStore. Both implement the same
|
|
9
|
+
* CortexStore interface, so engines work identically on either backend.
|
|
10
|
+
*/
|
|
11
|
+
import type { Firestore, FieldValue as FieldValueType } from '@google-cloud/firestore';
|
|
12
|
+
import type { CortexStore } from '../core/store.js';
|
|
13
|
+
import type { Memory, Observation, Edge, OpsEntry, OpsFilters, Signal, BeliefEntry, SearchResult, FSRSData, QueryFilter } from '../core/types.js';
|
|
14
|
+
export interface FirestoreStoreOptions {
|
|
15
|
+
/** GCP project ID (required if not using Application Default Credentials) */
|
|
16
|
+
projectId?: string;
|
|
17
|
+
/** Firestore database ID (default: '(default)') */
|
|
18
|
+
databaseId?: string;
|
|
19
|
+
/** Namespace prefix for collection names (for multi-tenant isolation) */
|
|
20
|
+
namespace?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare class FirestoreCortexStore implements CortexStore {
|
|
23
|
+
private db;
|
|
24
|
+
private ns;
|
|
25
|
+
constructor(db: Firestore, namespace?: string, fieldValue?: typeof FieldValueType);
|
|
26
|
+
/** Inject the host's FieldValue to avoid ESM dual-package class identity issues. */
|
|
27
|
+
static setFieldValue(fv: typeof FieldValueType): void;
|
|
28
|
+
/** Create a FirestoreCortexStore from firebase-admin Firestore instance. */
|
|
29
|
+
static fromFirestore(db: Firestore, namespace?: string, fieldValue?: typeof FieldValueType): FirestoreCortexStore;
|
|
30
|
+
/** Get the prefixed collection name. */
|
|
31
|
+
private col;
|
|
32
|
+
putMemory(memory: Omit<Memory, 'id'>): Promise<string>;
|
|
33
|
+
getMemory(id: string): Promise<Memory | null>;
|
|
34
|
+
updateMemory(id: string, updates: Partial<Omit<Memory, 'id'>>): Promise<void>;
|
|
35
|
+
findNearest(embedding: number[], limit: number): Promise<SearchResult[]>;
|
|
36
|
+
touchMemory(id: string, fsrsUpdates: Partial<FSRSData>): Promise<void>;
|
|
37
|
+
getAllMemories(): Promise<Memory[]>;
|
|
38
|
+
putObservation(obs: Omit<Observation, 'id'>): Promise<string>;
|
|
39
|
+
getUnprocessedObservations(limit: number): Promise<Observation[]>;
|
|
40
|
+
markObservationProcessed(id: string): Promise<void>;
|
|
41
|
+
putEdge(edge: Omit<Edge, 'id'>): Promise<string>;
|
|
42
|
+
getEdgesFrom(memoryId: string): Promise<Edge[]>;
|
|
43
|
+
getEdgesForMemories(memoryIds: string[]): Promise<Edge[]>;
|
|
44
|
+
appendOps(entry: Omit<OpsEntry, 'id'>): Promise<string>;
|
|
45
|
+
queryOps(filters: OpsFilters): Promise<OpsEntry[]>;
|
|
46
|
+
updateOps(id: string, updates: Partial<Omit<OpsEntry, 'id'>>): Promise<void>;
|
|
47
|
+
putSignal(signal: Omit<Signal, 'id'>): Promise<string>;
|
|
48
|
+
putBelief(entry: Omit<BeliefEntry, 'id'>): Promise<string>;
|
|
49
|
+
getBeliefHistory(conceptId: string): Promise<BeliefEntry[]>;
|
|
50
|
+
put(collection: string, doc: Record<string, unknown>): Promise<string>;
|
|
51
|
+
get(collection: string, id: string): Promise<Record<string, unknown> | null>;
|
|
52
|
+
update(collection: string, id: string, updates: Record<string, unknown>): Promise<void>;
|
|
53
|
+
query(collection: string, filters: QueryFilter[], options?: {
|
|
54
|
+
limit?: number;
|
|
55
|
+
orderBy?: string;
|
|
56
|
+
orderDir?: 'asc' | 'desc';
|
|
57
|
+
}): Promise<Record<string, unknown>[]>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=firestore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.d.ts","sourceRoot":"","sources":["../../src/stores/firestore.ts"],"names":[],"mappings":"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"}
|