@agentskit/memory 0.4.0 → 0.4.2
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 +32 -40
- package/dist/file-vector.d.ts +8 -0
- package/dist/file-vector.d.ts.map +1 -0
- package/dist/index.cjs +14 -38
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -38
- package/dist/index.js.map +1 -1
- package/dist/redis-chat.d.ts +8 -0
- package/dist/redis-chat.d.ts.map +1 -0
- package/dist/redis-client.d.ts +19 -0
- package/dist/redis-client.d.ts.map +1 -0
- package/dist/redis-vector.d.ts +9 -0
- package/dist/redis-vector.d.ts.map +1 -0
- package/dist/sqlite.d.ts +7 -0
- package/dist/sqlite.d.ts.map +1 -0
- package/dist/vector-store.d.ts +16 -0
- package/dist/vector-store.d.ts.map +1 -0
- package/package.json +24 -13
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Emerson Braun
|
|
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
CHANGED
|
@@ -1,63 +1,55 @@
|
|
|
1
1
|
# @agentskit/memory
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Persist conversations and add vector search to your agents — swap backends without changing agent code.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Why
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
- **Conversations that survive restarts** — SQLite for local development, Redis for production; your agent remembers context across sessions with zero code changes
|
|
8
|
+
- **RAG-ready vector search** — store and retrieve embeddings with `fileVectorMemory` (pure JS, no native deps) or Redis vector search for scale
|
|
9
|
+
- **Plug any backend** — the `VectorStore` interface is 3 methods; bring LanceDB, Pinecone, or any custom store in minutes
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
## Install
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
npm install better-sqlite3
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
npm install @agentskit/memory better-sqlite3
|
|
15
|
+
# For production: npm install redis
|
|
16
|
+
# For vectors: npm install vectra
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
-
## Backends
|
|
20
|
-
|
|
21
|
-
| Factory | Contract | Underlying lib | Native? |
|
|
22
|
-
|---------|----------|---------------|---------|
|
|
23
|
-
| `sqliteChatMemory({ path })` | ChatMemory | better-sqlite3 | Yes |
|
|
24
|
-
| `redisChatMemory({ url })` | ChatMemory | redis | No |
|
|
25
|
-
| `redisVectorMemory({ url })` | VectorMemory | redis + RediSearch | No |
|
|
26
|
-
| `fileVectorMemory({ path })` | VectorMemory | vectra | No (pure JS) |
|
|
27
|
-
|
|
28
19
|
## Quick example
|
|
29
20
|
|
|
30
21
|
```ts
|
|
22
|
+
import { createRuntime } from '@agentskit/runtime'
|
|
23
|
+
import { anthropic } from '@agentskit/adapters'
|
|
31
24
|
import { sqliteChatMemory, fileVectorMemory } from '@agentskit/memory'
|
|
32
25
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
embedding: [0.1, 0.2, 0.3, ...],
|
|
42
|
-
}])
|
|
43
|
-
const results = await vectorMemory.search([0.1, 0.2, 0.3, ...], { topK: 5 })
|
|
26
|
+
const runtime = createRuntime({
|
|
27
|
+
adapter: anthropic({ apiKey: process.env.ANTHROPIC_API_KEY, model: 'claude-sonnet-4-6' }),
|
|
28
|
+
memory: sqliteChatMemory({ path: './chat.db' }),
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Agent now remembers previous conversations across process restarts
|
|
32
|
+
const result = await runtime.run('What did we discuss yesterday?')
|
|
33
|
+
console.log(result.content)
|
|
44
34
|
```
|
|
45
35
|
|
|
46
|
-
##
|
|
36
|
+
## With RAG
|
|
47
37
|
|
|
48
|
-
|
|
38
|
+
Use a **vector** backend with [`@agentskit/rag`](https://www.npmjs.com/package/@agentskit/rag) `createRAG({ embed, store })` — `fileVectorMemory` and `redisVectorMemory` implement `VectorMemory` for chunk storage and search.
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
import type { VectorStore } from '@agentskit/memory'
|
|
40
|
+
## Next steps
|
|
52
41
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
async query(vector, topK) { /* your logic */ },
|
|
56
|
-
async delete(ids) { /* your logic */ },
|
|
57
|
-
}
|
|
42
|
+
- Swap `sqliteChatMemory` for **Redis** or **in-memory** variants from the same package for different deployment targets
|
|
43
|
+
- Pair **embedders** from [`@agentskit/adapters`](https://www.npmjs.com/package/@agentskit/adapters) with RAG — see [`@agentskit/rag`](https://www.npmjs.com/package/@agentskit/rag)
|
|
58
44
|
|
|
59
|
-
|
|
60
|
-
|
|
45
|
+
## Ecosystem
|
|
46
|
+
|
|
47
|
+
| Package | Role |
|
|
48
|
+
|---------|------|
|
|
49
|
+
| [@agentskit/core](https://www.npmjs.com/package/@agentskit/core) | `Memory`, `VectorMemory` types |
|
|
50
|
+
| [@agentskit/rag](https://www.npmjs.com/package/@agentskit/rag) | Chunking + retrieval on top of vector memory |
|
|
51
|
+
| [@agentskit/runtime](https://www.npmjs.com/package/@agentskit/runtime) | `memory` / `retriever` options |
|
|
52
|
+
| [@agentskit/adapters](https://www.npmjs.com/package/@agentskit/adapters) | Embeddings for RAG |
|
|
61
53
|
|
|
62
54
|
## Docs
|
|
63
55
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VectorMemory } from '@agentskit/core';
|
|
2
|
+
import type { VectorStore } from './vector-store';
|
|
3
|
+
export interface FileVectorMemoryConfig {
|
|
4
|
+
path: string;
|
|
5
|
+
store?: VectorStore;
|
|
6
|
+
}
|
|
7
|
+
export declare function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory;
|
|
8
|
+
//# sourceMappingURL=file-vector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-vector.d.ts","sourceRoot":"","sources":["../src/file-vector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqC,MAAM,iBAAiB,CAAA;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAkED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,YAAY,CAkC7E"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,32 +1,20 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var core = require('@agentskit/core');
|
|
4
|
+
|
|
3
5
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
4
6
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
5
7
|
}) : x)(function(x) {
|
|
6
8
|
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
7
9
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
8
10
|
});
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function serializeMessages(messages) {
|
|
12
|
-
const record = {
|
|
13
|
-
version: 1,
|
|
14
|
-
messages: messages.map((m) => ({
|
|
15
|
-
...m,
|
|
16
|
-
createdAt: m.createdAt.toISOString()
|
|
17
|
-
}))
|
|
18
|
-
};
|
|
19
|
-
return JSON.stringify(record);
|
|
11
|
+
function encodeMessages(messages) {
|
|
12
|
+
return JSON.stringify(core.serializeMessages(messages));
|
|
20
13
|
}
|
|
21
|
-
function
|
|
14
|
+
function decodeMessages(json) {
|
|
22
15
|
if (!json) return [];
|
|
23
16
|
try {
|
|
24
|
-
|
|
25
|
-
if (!record?.messages) return [];
|
|
26
|
-
return record.messages.map((m) => ({
|
|
27
|
-
...m,
|
|
28
|
-
createdAt: new Date(m.createdAt)
|
|
29
|
-
}));
|
|
17
|
+
return core.deserializeMessages(JSON.parse(json));
|
|
30
18
|
} catch {
|
|
31
19
|
return [];
|
|
32
20
|
}
|
|
@@ -61,11 +49,11 @@ function sqliteChatMemory(config) {
|
|
|
61
49
|
async load() {
|
|
62
50
|
const db = await getDb();
|
|
63
51
|
const row = db.prepare("SELECT messages FROM conversations WHERE id = ?").get(conversationId);
|
|
64
|
-
return
|
|
52
|
+
return decodeMessages(row?.messages);
|
|
65
53
|
},
|
|
66
54
|
async save(messages) {
|
|
67
55
|
const db = await getDb();
|
|
68
|
-
const json =
|
|
56
|
+
const json = encodeMessages(messages);
|
|
69
57
|
db.prepare(`
|
|
70
58
|
INSERT INTO conversations (id, messages) VALUES (?, ?)
|
|
71
59
|
ON CONFLICT(id) DO UPDATE SET messages = ?
|
|
@@ -112,25 +100,13 @@ async function createRedisClientAdapter(url) {
|
|
|
112
100
|
}
|
|
113
101
|
|
|
114
102
|
// src/redis-chat.ts
|
|
115
|
-
function
|
|
116
|
-
|
|
117
|
-
version: 1,
|
|
118
|
-
messages: messages.map((m) => ({
|
|
119
|
-
...m,
|
|
120
|
-
createdAt: m.createdAt.toISOString()
|
|
121
|
-
}))
|
|
122
|
-
};
|
|
123
|
-
return JSON.stringify(record);
|
|
103
|
+
function encodeMessages2(messages) {
|
|
104
|
+
return JSON.stringify(core.serializeMessages(messages));
|
|
124
105
|
}
|
|
125
|
-
function
|
|
106
|
+
function decodeMessages2(json) {
|
|
126
107
|
if (!json) return [];
|
|
127
108
|
try {
|
|
128
|
-
|
|
129
|
-
if (!record?.messages) return [];
|
|
130
|
-
return record.messages.map((m) => ({
|
|
131
|
-
...m,
|
|
132
|
-
createdAt: new Date(m.createdAt)
|
|
133
|
-
}));
|
|
109
|
+
return core.deserializeMessages(JSON.parse(json));
|
|
134
110
|
} catch {
|
|
135
111
|
return [];
|
|
136
112
|
}
|
|
@@ -149,11 +125,11 @@ function redisChatMemory(config) {
|
|
|
149
125
|
async load() {
|
|
150
126
|
const client = await getClient();
|
|
151
127
|
const json = await client.get(key);
|
|
152
|
-
return
|
|
128
|
+
return decodeMessages2(json);
|
|
153
129
|
},
|
|
154
130
|
async save(messages) {
|
|
155
131
|
const client = await getClient();
|
|
156
|
-
await client.set(key,
|
|
132
|
+
await client.set(key, encodeMessages2(messages));
|
|
157
133
|
},
|
|
158
134
|
async clear() {
|
|
159
135
|
const client = await getClient();
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return deserializeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = serializeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return deserializeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, serializeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages","encodeMessages","decodeMessages"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return decodeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = encodeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return decodeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, encodeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC3C,YAAY,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,YAAY,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACzF,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,30 +1,18 @@
|
|
|
1
|
+
import { serializeMessages, deserializeMessages } from '@agentskit/core';
|
|
2
|
+
|
|
1
3
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
4
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
5
|
}) : x)(function(x) {
|
|
4
6
|
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
7
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
8
|
});
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
function serializeMessages(messages) {
|
|
10
|
-
const record = {
|
|
11
|
-
version: 1,
|
|
12
|
-
messages: messages.map((m) => ({
|
|
13
|
-
...m,
|
|
14
|
-
createdAt: m.createdAt.toISOString()
|
|
15
|
-
}))
|
|
16
|
-
};
|
|
17
|
-
return JSON.stringify(record);
|
|
9
|
+
function encodeMessages(messages) {
|
|
10
|
+
return JSON.stringify(serializeMessages(messages));
|
|
18
11
|
}
|
|
19
|
-
function
|
|
12
|
+
function decodeMessages(json) {
|
|
20
13
|
if (!json) return [];
|
|
21
14
|
try {
|
|
22
|
-
|
|
23
|
-
if (!record?.messages) return [];
|
|
24
|
-
return record.messages.map((m) => ({
|
|
25
|
-
...m,
|
|
26
|
-
createdAt: new Date(m.createdAt)
|
|
27
|
-
}));
|
|
15
|
+
return deserializeMessages(JSON.parse(json));
|
|
28
16
|
} catch {
|
|
29
17
|
return [];
|
|
30
18
|
}
|
|
@@ -59,11 +47,11 @@ function sqliteChatMemory(config) {
|
|
|
59
47
|
async load() {
|
|
60
48
|
const db = await getDb();
|
|
61
49
|
const row = db.prepare("SELECT messages FROM conversations WHERE id = ?").get(conversationId);
|
|
62
|
-
return
|
|
50
|
+
return decodeMessages(row?.messages);
|
|
63
51
|
},
|
|
64
52
|
async save(messages) {
|
|
65
53
|
const db = await getDb();
|
|
66
|
-
const json =
|
|
54
|
+
const json = encodeMessages(messages);
|
|
67
55
|
db.prepare(`
|
|
68
56
|
INSERT INTO conversations (id, messages) VALUES (?, ?)
|
|
69
57
|
ON CONFLICT(id) DO UPDATE SET messages = ?
|
|
@@ -110,25 +98,13 @@ async function createRedisClientAdapter(url) {
|
|
|
110
98
|
}
|
|
111
99
|
|
|
112
100
|
// src/redis-chat.ts
|
|
113
|
-
function
|
|
114
|
-
|
|
115
|
-
version: 1,
|
|
116
|
-
messages: messages.map((m) => ({
|
|
117
|
-
...m,
|
|
118
|
-
createdAt: m.createdAt.toISOString()
|
|
119
|
-
}))
|
|
120
|
-
};
|
|
121
|
-
return JSON.stringify(record);
|
|
101
|
+
function encodeMessages2(messages) {
|
|
102
|
+
return JSON.stringify(serializeMessages(messages));
|
|
122
103
|
}
|
|
123
|
-
function
|
|
104
|
+
function decodeMessages2(json) {
|
|
124
105
|
if (!json) return [];
|
|
125
106
|
try {
|
|
126
|
-
|
|
127
|
-
if (!record?.messages) return [];
|
|
128
|
-
return record.messages.map((m) => ({
|
|
129
|
-
...m,
|
|
130
|
-
createdAt: new Date(m.createdAt)
|
|
131
|
-
}));
|
|
107
|
+
return deserializeMessages(JSON.parse(json));
|
|
132
108
|
} catch {
|
|
133
109
|
return [];
|
|
134
110
|
}
|
|
@@ -147,11 +123,11 @@ function redisChatMemory(config) {
|
|
|
147
123
|
async load() {
|
|
148
124
|
const client = await getClient();
|
|
149
125
|
const json = await client.get(key);
|
|
150
|
-
return
|
|
126
|
+
return decodeMessages2(json);
|
|
151
127
|
},
|
|
152
128
|
async save(messages) {
|
|
153
129
|
const client = await getClient();
|
|
154
|
-
await client.set(key,
|
|
130
|
+
await client.set(key, encodeMessages2(messages));
|
|
155
131
|
},
|
|
156
132
|
async clear() {
|
|
157
133
|
const client = await getClient();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["serializeMessages","deserializeMessages"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return deserializeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = serializeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction serializeMessages(messages: Message[]): string {\n const record: MemoryRecord = {\n version: 1,\n messages: messages.map(m => ({\n ...m,\n createdAt: m.createdAt.toISOString(),\n })),\n }\n return JSON.stringify(record)\n}\n\nfunction deserializeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n const record = JSON.parse(json) as MemoryRecord\n if (!record?.messages) return []\n return record.messages.map(m => ({\n ...m,\n createdAt: new Date(m.createdAt),\n }))\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return deserializeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, serializeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/sqlite.ts","../src/redis-client.ts","../src/redis-chat.ts","../src/redis-vector.ts","../src/file-vector.ts"],"names":["encodeMessages","serializeMessages","decodeMessages","deserializeMessages"],"mappings":"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","file":"index.js","sourcesContent":["import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\n\nexport interface SqliteChatMemoryConfig {\n path: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | undefined): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\ninterface SqliteDb {\n prepare(sql: string): {\n run(...args: unknown[]): void\n get(...args: unknown[]): Record<string, unknown> | undefined\n }\n}\n\nasync function openDatabase(path: string): Promise<SqliteDb> {\n try {\n const mod = await import('better-sqlite3')\n const Database = mod.default ?? mod\n return new (Database as new (p: string) => SqliteDb)(path)\n } catch {\n throw new Error('Install better-sqlite3 to use sqliteChatMemory: npm install better-sqlite3')\n }\n}\n\nexport function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory {\n const conversationId = config.conversationId ?? 'default'\n let dbPromise: Promise<SqliteDb> | null = null\n\n const getDb = (): Promise<SqliteDb> => {\n if (!dbPromise) {\n dbPromise = openDatabase(config.path).then(db => {\n db.prepare(`\n CREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n messages TEXT NOT NULL\n )\n `).run()\n return db\n })\n }\n return dbPromise\n }\n\n return {\n async load() {\n const db = await getDb()\n const row = db.prepare('SELECT messages FROM conversations WHERE id = ?').get(conversationId)\n return decodeMessages(row?.messages as string | undefined)\n },\n async save(messages) {\n const db = await getDb()\n const json = encodeMessages(messages)\n db.prepare(`\n INSERT INTO conversations (id, messages) VALUES (?, ?)\n ON CONFLICT(id) DO UPDATE SET messages = ?\n `).run(conversationId, json, json)\n },\n async clear() {\n const db = await getDb()\n db.prepare('DELETE FROM conversations WHERE id = ?').run(conversationId)\n },\n }\n}\n","/**\n * Internal Redis client adapter interface.\n * Abstracts the underlying Redis library so it can be swapped\n * (e.g., from `redis` to `ioredis`) without changing consumers.\n */\nexport interface RedisClientAdapter {\n get(key: string): Promise<string | null>\n set(key: string, value: string): Promise<void>\n del(key: string | string[]): Promise<void>\n keys(pattern: string): Promise<string[]>\n disconnect(): Promise<void>\n call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>\n}\n\nexport interface RedisConnectionConfig {\n url: string\n client?: RedisClientAdapter\n}\n\nexport async function createRedisClientAdapter(url: string): Promise<RedisClientAdapter> {\n let redis: typeof import('redis')\n try {\n redis = await import('redis')\n } catch {\n throw new Error('Install redis to use Redis memory backends: npm install redis')\n }\n\n const client = redis.createClient({ url })\n await client.connect()\n\n return {\n async get(key) {\n return await client.get(key)\n },\n async set(key, value) {\n await client.set(key, value)\n },\n async del(key) {\n const keys = Array.isArray(key) ? key : [key]\n if (keys.length > 0) await client.del(keys)\n },\n async keys(pattern) {\n return await client.keys(pattern)\n },\n async disconnect() {\n await client.disconnect()\n },\n async call(command, ...args) {\n return await client.sendCommand([command, ...args.map(String)])\n },\n }\n}\n","import type { ChatMemory, Message, MemoryRecord } from '@agentskit/core'\nimport { serializeMessages, deserializeMessages } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisChatMemoryConfig extends RedisConnectionConfig {\n keyPrefix?: string\n conversationId?: string\n}\n\nfunction encodeMessages(messages: Message[]): string {\n return JSON.stringify(serializeMessages(messages))\n}\n\nfunction decodeMessages(json: string | null): Message[] {\n if (!json) return []\n try {\n return deserializeMessages(JSON.parse(json) as MemoryRecord)\n } catch {\n return []\n }\n}\n\nexport function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory {\n const prefix = config.keyPrefix ?? 'agentskit:chat'\n const convId = config.conversationId ?? 'default'\n const key = `${prefix}:${convId}`\n let clientPromise: Promise<RedisClientAdapter> | null = null\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n return {\n async load() {\n const client = await getClient()\n const json = await client.get(key)\n return decodeMessages(json)\n },\n async save(messages) {\n const client = await getClient()\n await client.set(key, encodeMessages(messages))\n },\n async clear() {\n const client = await getClient()\n await client.del(key)\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { RedisClientAdapter, RedisConnectionConfig } from './redis-client'\nimport { createRedisClientAdapter } from './redis-client'\n\nexport interface RedisVectorMemoryConfig extends RedisConnectionConfig {\n indexName?: string\n keyPrefix?: string\n dimensions?: number\n}\n\nfunction float32Buffer(vector: number[]): Buffer {\n const buffer = Buffer.alloc(vector.length * 4)\n for (let i = 0; i < vector.length; i++) {\n buffer.writeFloatLE(vector[i], i * 4)\n }\n return buffer\n}\n\nexport function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory {\n const indexName = config.indexName ?? 'agentskit:vectors:idx'\n const prefix = config.keyPrefix ?? 'agentskit:vec'\n const dimensions = config.dimensions ?? 0\n let clientPromise: Promise<RedisClientAdapter> | null = null\n let indexCreated = false\n\n const getClient = (): Promise<RedisClientAdapter> => {\n if (config.client) return Promise.resolve(config.client)\n if (!clientPromise) clientPromise = createRedisClientAdapter(config.url)\n return clientPromise\n }\n\n const ensureIndex = async (client: RedisClientAdapter, dims: number) => {\n if (indexCreated) return\n try {\n await client.call(\n 'FT.CREATE', indexName,\n 'ON', 'HASH',\n 'PREFIX', '1', `${prefix}:`,\n 'SCHEMA',\n 'content', 'TEXT',\n 'metadata', 'TEXT',\n 'embedding', 'VECTOR', 'HNSW', '6',\n 'TYPE', 'FLOAT32',\n 'DIM', dims,\n 'DISTANCE_METRIC', 'COSINE',\n )\n } catch (err: unknown) {\n const msg = String(err)\n if (!msg.includes('Index already exists')) throw err\n }\n indexCreated = true\n }\n\n return {\n async store(docs: VectorDocument[]) {\n const client = await getClient()\n const dims = dimensions || docs[0]?.embedding.length || 0\n if (dims > 0) await ensureIndex(client, dims)\n\n for (const doc of docs) {\n const key = `${prefix}:${doc.id}`\n await client.call(\n 'HSET', key,\n 'content', doc.content,\n 'metadata', JSON.stringify(doc.metadata ?? {}),\n 'embedding', float32Buffer(doc.embedding),\n )\n }\n },\n async search(embedding, options) {\n const client = await getClient()\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n\n const result = await client.call(\n 'FT.SEARCH', indexName,\n `*=>[KNN ${topK} @embedding $vec AS score]`,\n 'PARAMS', '2', 'vec', float32Buffer(embedding),\n 'SORTBY', 'score',\n 'RETURN', '3', 'content', 'metadata', 'score',\n 'DIALECT', '2',\n ) as unknown[]\n\n if (!Array.isArray(result) || result.length < 2) return []\n\n const docs: RetrievedDocument[] = []\n // FT.SEARCH returns [total, key1, [field, val, ...], key2, [field, val, ...], ...]\n for (let i = 1; i < result.length; i += 2) {\n const key = String(result[i])\n const fields = result[i + 1] as string[]\n if (!Array.isArray(fields)) continue\n\n const fieldMap: Record<string, string> = {}\n for (let j = 0; j < fields.length; j += 2) {\n fieldMap[fields[j]] = fields[j + 1]\n }\n\n const score = 1 - parseFloat(fieldMap.score ?? '1') // COSINE distance → similarity\n if (score < threshold) continue\n\n docs.push({\n id: key.replace(`${prefix}:`, ''),\n content: fieldMap.content ?? '',\n score,\n metadata: fieldMap.metadata ? JSON.parse(fieldMap.metadata) : undefined,\n })\n }\n\n return docs\n },\n async delete(ids) {\n const client = await getClient()\n await client.del(ids.map(id => `${prefix}:${id}`))\n },\n }\n}\n","import type { VectorMemory, VectorDocument, RetrievedDocument } from '@agentskit/core'\nimport type { VectorStore } from './vector-store'\n\nexport interface FileVectorMemoryConfig {\n path: string\n store?: VectorStore\n}\n\nfunction requireVectra(): { LocalIndex: new (path: string) => VectraIndex } {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('vectra')\n } catch {\n throw new Error(\n 'Install vectra to use fileVectorMemory: npm install vectra'\n )\n }\n}\n\ninterface VectraIndex {\n isIndexCreated(): Promise<boolean>\n createIndex(): Promise<void>\n insertItem(item: { vector: number[]; metadata: Record<string, unknown> }): Promise<unknown>\n queryItems(vector: number[], topK: number): Promise<Array<{ score: number; item: { metadata: Record<string, unknown> } }>>\n listItems(): Promise<Array<{ id: string; metadata: Record<string, unknown> }>>;\n deleteItem(id: string): Promise<void>\n}\n\nfunction createVectraStore(dirPath: string): VectorStore {\n let index: VectraIndex | null = null\n\n const getIndex = async (): Promise<VectraIndex> => {\n if (index) return index\n const { LocalIndex } = requireVectra()\n index = new LocalIndex(dirPath)\n if (!(await index.isIndexCreated())) {\n await index.createIndex()\n }\n return index\n }\n\n return {\n async upsert(docs) {\n const idx = await getIndex()\n for (const doc of docs) {\n await idx.insertItem({\n vector: doc.vector,\n metadata: { _id: doc.id, ...doc.metadata },\n })\n }\n },\n async query(vector, topK) {\n const idx = await getIndex()\n const results = await idx.queryItems(vector, topK)\n return results.map(r => ({\n id: String(r.item.metadata._id ?? ''),\n score: r.score,\n metadata: r.item.metadata,\n }))\n },\n async delete(ids) {\n const idx = await getIndex()\n const items = await idx.listItems()\n for (const item of items) {\n if (ids.includes(String(item.metadata._id ?? item.id))) {\n await idx.deleteItem(item.id)\n }\n }\n },\n }\n}\n\nexport function fileVectorMemory(config: FileVectorMemoryConfig): VectorMemory {\n const store = config.store ?? createVectraStore(config.path)\n const contentCache = new Map<string, string>()\n\n return {\n async store(docs: VectorDocument[]) {\n for (const doc of docs) {\n contentCache.set(doc.id, doc.content)\n }\n await store.upsert(docs.map(doc => ({\n id: doc.id,\n vector: doc.embedding,\n metadata: { content: doc.content, ...doc.metadata },\n })))\n },\n async search(embedding, options) {\n const topK = options?.topK ?? 5\n const threshold = options?.threshold ?? 0\n const results = await store.query(embedding, topK)\n\n return results\n .filter(r => r.score >= threshold)\n .map((r): RetrievedDocument => ({\n id: r.id,\n content: String(r.metadata.content ?? contentCache.get(r.id) ?? ''),\n score: r.score,\n metadata: r.metadata,\n }))\n },\n async delete(ids) {\n for (const id of ids) contentCache.delete(id)\n await store.delete(ids)\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ChatMemory } from '@agentskit/core';
|
|
2
|
+
import type { RedisConnectionConfig } from './redis-client';
|
|
3
|
+
export interface RedisChatMemoryConfig extends RedisConnectionConfig {
|
|
4
|
+
keyPrefix?: string;
|
|
5
|
+
conversationId?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function redisChatMemory(config: RedisChatMemoryConfig): ChatMemory;
|
|
8
|
+
//# sourceMappingURL=redis-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-chat.d.ts","sourceRoot":"","sources":["../src/redis-chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAA;AACxE,OAAO,KAAK,EAAsB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAG/E,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA2BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,UAAU,CA2BzE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Redis client adapter interface.
|
|
3
|
+
* Abstracts the underlying Redis library so it can be swapped
|
|
4
|
+
* (e.g., from `redis` to `ioredis`) without changing consumers.
|
|
5
|
+
*/
|
|
6
|
+
export interface RedisClientAdapter {
|
|
7
|
+
get(key: string): Promise<string | null>;
|
|
8
|
+
set(key: string, value: string): Promise<void>;
|
|
9
|
+
del(key: string | string[]): Promise<void>;
|
|
10
|
+
keys(pattern: string): Promise<string[]>;
|
|
11
|
+
disconnect(): Promise<void>;
|
|
12
|
+
call(command: string, ...args: (string | number | Buffer)[]): Promise<unknown>;
|
|
13
|
+
}
|
|
14
|
+
export interface RedisConnectionConfig {
|
|
15
|
+
url: string;
|
|
16
|
+
client?: RedisClientAdapter;
|
|
17
|
+
}
|
|
18
|
+
export declare function createRedisClientAdapter(url: string): Promise<RedisClientAdapter>;
|
|
19
|
+
//# sourceMappingURL=redis-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-client.d.ts","sourceRoot":"","sources":["../src/redis-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC/E;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,kBAAkB,CAAA;CAC5B;AAED,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCvF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { VectorMemory } from '@agentskit/core';
|
|
2
|
+
import type { RedisConnectionConfig } from './redis-client';
|
|
3
|
+
export interface RedisVectorMemoryConfig extends RedisConnectionConfig {
|
|
4
|
+
indexName?: string;
|
|
5
|
+
keyPrefix?: string;
|
|
6
|
+
dimensions?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function redisVectorMemory(config: RedisVectorMemoryConfig): VectorMemory;
|
|
9
|
+
//# sourceMappingURL=redis-vector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-vector.d.ts","sourceRoot":"","sources":["../src/redis-vector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqC,MAAM,iBAAiB,CAAA;AACtF,OAAO,KAAK,EAAsB,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAG/E,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAUD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,YAAY,CAiG/E"}
|
package/dist/sqlite.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ChatMemory } from '@agentskit/core';
|
|
2
|
+
export interface SqliteChatMemoryConfig {
|
|
3
|
+
path: string;
|
|
4
|
+
conversationId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function sqliteChatMemory(config: SqliteChatMemoryConfig): ChatMemory;
|
|
7
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyB,MAAM,iBAAiB,CAAA;AAExE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AA4CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,UAAU,CAsC3E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface VectorStoreDocument {
|
|
2
|
+
id: string;
|
|
3
|
+
vector: number[];
|
|
4
|
+
metadata: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface VectorStoreResult {
|
|
7
|
+
id: string;
|
|
8
|
+
score: number;
|
|
9
|
+
metadata: Record<string, unknown>;
|
|
10
|
+
}
|
|
11
|
+
export interface VectorStore {
|
|
12
|
+
upsert(docs: VectorStoreDocument[]): Promise<void>;
|
|
13
|
+
query(vector: number[], topK: number): Promise<VectorStoreResult[]>;
|
|
14
|
+
delete(ids: string[]): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=vector-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vector-store.d.ts","sourceRoot":"","sources":["../src/vector-store.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACnE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentskit/memory",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Persistent and vector memory backends for AgentsKit.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agentskit",
|
|
7
|
+
"ai",
|
|
8
|
+
"agents",
|
|
9
|
+
"llm",
|
|
10
|
+
"chat",
|
|
11
|
+
"typescript",
|
|
12
|
+
"memory",
|
|
13
|
+
"vector",
|
|
14
|
+
"embeddings"
|
|
15
|
+
],
|
|
5
16
|
"type": "module",
|
|
6
17
|
"main": "./dist/index.cjs",
|
|
7
18
|
"module": "./dist/index.js",
|
|
@@ -19,23 +30,23 @@
|
|
|
19
30
|
"publishConfig": {
|
|
20
31
|
"access": "public"
|
|
21
32
|
},
|
|
22
|
-
"scripts": {
|
|
23
|
-
"build": "tsup",
|
|
24
|
-
"test": "vitest run",
|
|
25
|
-
"lint": "tsc --noEmit",
|
|
26
|
-
"dev": "tsup --watch"
|
|
27
|
-
},
|
|
28
33
|
"dependencies": {
|
|
29
|
-
"@agentskit/core": "
|
|
34
|
+
"@agentskit/core": "0.4.2"
|
|
30
35
|
},
|
|
31
36
|
"devDependencies": {
|
|
32
37
|
"@types/better-sqlite3": "^7.6.12",
|
|
33
|
-
"@types/node": "^
|
|
34
|
-
"better-sqlite3": "^
|
|
38
|
+
"@types/node": "^25.5.2",
|
|
39
|
+
"better-sqlite3": "^12.8.0",
|
|
35
40
|
"redis": "^5.11.0",
|
|
36
41
|
"tsup": "^8.5.0",
|
|
37
|
-
"typescript": "^
|
|
38
|
-
"vectra": "^0.
|
|
42
|
+
"typescript": "^6.0.2",
|
|
43
|
+
"vectra": "^0.14.0",
|
|
39
44
|
"vitest": "^4.1.2"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsup",
|
|
48
|
+
"test": "vitest run",
|
|
49
|
+
"lint": "tsc --noEmit",
|
|
50
|
+
"dev": "tsup --watch"
|
|
40
51
|
}
|
|
41
|
-
}
|
|
52
|
+
}
|