Skip to content

Commit f3b24cc

Browse files
committed
implementing long term memory with sqlite-vec
1 parent 5b2844d commit f3b24cc

File tree

6 files changed

+96
-113
lines changed

6 files changed

+96
-113
lines changed

.DS_Store

6 KB
Binary file not shown.

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,6 @@ dist
128128
.yarn/build-state.yml
129129
.yarn/install-state.gz
130130
.pnp.*
131+
132+
# Database
133+
long-term-memory.db

configs/.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
*
22
!.gitignore
33
!*example
4-
!*template
4+
!*template

configs/config.yaml-template

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,7 @@ plugins:
5656
vector_model: text-embedding-3-small
5757
dimensions: 100
5858
max_query_results: 3
59-
persist_db: true
60-
db_file: configs/long-term-memory.db
59+
persist_db: false
6160
discord:
6261
bot_token: your-discord-bot-token
6362
allowed_channel_ids:

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"scripts": {
1010
"dev": "tsx watch --include ./src src/main.ts configs/config.yaml",
1111
"start": "npm run build && npm run fast-start",
12-
"fast-start": "node dist/main.js configs/config.yaml",
12+
"fast-start": "node --experimental-sqlite dist/main.js configs/config.yaml",
1313
"build": "npm run clean && npm run fast-build",
1414
"fast-build": "swc src -d dist --strip-leading-paths",
1515
"clean": "rm -rf dist",

src/plugins/long-term-memory/init.ts

Lines changed: 90 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -47,134 +47,115 @@ export default class LongTermMemory extends PluginBase {
4747
defaultHeaders: openaiDefaultHeaders,
4848
});
4949

50-
athena.registerTool(
51-
{
52-
name: "ltm/store",
53-
desc: "Store some data to your long-term memory.",
54-
args: {
55-
desc: {
56-
type: "string",
57-
desc: "A description of the data.",
58-
required: true,
59-
},
60-
data: {
61-
type: "object",
62-
desc: "The data to store.",
63-
required: true,
64-
},
50+
athena.registerTool({
51+
name: "ltm/store",
52+
desc: "Store some data to your long-term memory.",
53+
args: {
54+
desc: {
55+
type: "string",
56+
desc: "A description of the data.",
57+
required: true,
6558
},
66-
retvals: {
67-
status: {
68-
type: "string",
69-
desc: "The status of the operation.",
70-
required: true,
71-
},
59+
data: {
60+
type: "object",
61+
desc: "The data to store.",
62+
required: true,
7263
},
7364
},
74-
{
75-
fn: async (args: Dict<any>) => {
76-
const embedding = await this.openai.embeddings.create({
77-
model: this.config.vector_model,
78-
dimensions: this.config.dimensions,
79-
input: args.desc,
80-
encoding_format: "float",
81-
});
82-
insertStmt.run(
83-
Float32Array.from(embedding.data[0].embedding),
84-
args.desc,
85-
JSON.stringify(args.data),
86-
);
87-
return { status: "success" };
65+
retvals: {
66+
status: {
67+
type: "string",
68+
desc: "The status of the operation.",
69+
required: true,
8870
},
8971
},
90-
);
91-
// TODO: Implement remove
92-
athena.registerTool(
93-
{
94-
name: "ltm/list",
95-
desc: "List your long-term memory.",
96-
args: {},
97-
retvals: {
98-
list: {
99-
type: "array",
100-
desc: "The list of metadata of the long-term memory.",
101-
required: true,
72+
fn: async (args: Dict<any>) => {
73+
const embedding = await this.openai.embeddings.create({
74+
model: this.config.vector_model,
75+
dimensions: this.config.dimensions,
76+
input: args.desc,
77+
encoding_format: "float",
78+
});
79+
insertStmt.run(
80+
Float32Array.from(embedding.data[0].embedding),
81+
args.desc,
82+
JSON.stringify(args.data),
83+
);
84+
return { status: "success" };
85+
},
86+
});
87+
athena.registerTool({
88+
name: "ltm/list",
89+
desc: "List your long-term memory.",
90+
args: {},
91+
retvals: {
92+
list: {
93+
type: "array",
94+
desc: "The list of metadata of the long-term memory.",
95+
required: true,
96+
of: {
97+
type: "object",
98+
desc: "The metadata of the long-term memory.",
99+
required: false,
102100
of: {
103-
type: "object",
104-
desc: "The metadata of the long-term memory.",
105-
required: false,
106-
of: {
107-
desc: {
108-
type: "string",
109-
desc: "The description of the data.",
110-
required: true,
111-
},
101+
desc: {
102+
type: "string",
103+
desc: "The description of the data.",
104+
required: true,
112105
},
113106
},
114107
},
115108
},
116109
},
117-
{
118-
fn: async (args: Dict<any>) => {
119-
const list = this.db
120-
.prepare("SELECT desc, data FROM vec_items")
121-
.all();
122-
return {
123-
list: list.map((item) => ({
124-
desc: String(item.desc),
125-
data: JSON.parse(String(item.data)),
126-
})),
127-
};
128-
},
110+
fn: async (args: Dict<any>) => {
111+
const list = this.db.prepare("SELECT desc, data FROM vec_items").all();
112+
return { list: list };
129113
},
130-
);
131-
athena.registerTool(
132-
{
133-
name: "ltm/retrieve",
134-
desc: "Retrieve data from your long-term memory.",
135-
args: {
136-
query: {
137-
type: "string",
138-
desc: "The query to retrieve the data.",
139-
required: true,
140-
},
114+
});
115+
athena.registerTool({
116+
name: "ltm/retrieve",
117+
desc: "Retrieve data from your long-term memory.",
118+
args: {
119+
query: {
120+
type: "string",
121+
desc: "The query to retrieve the data.",
122+
required: true,
141123
},
142-
retvals: {
143-
list: {
144-
type: "array",
145-
desc: "Query results list of metadata of the long-term memory.",
146-
required: true,
124+
},
125+
retvals: {
126+
list: {
127+
type: "array",
128+
desc: "Query results list of metadata of the long-term memory.",
129+
required: true,
130+
of: {
131+
type: "object",
132+
desc: "The desc and data of the long-term memory.",
133+
required: false,
147134
of: {
148-
type: "object",
149-
desc: "The desc and data of the long-term memory.",
150-
required: false,
151-
of: {
152-
desc: {
153-
type: "string",
154-
desc: "The description of the data.",
155-
required: true,
156-
},
157-
data: {
158-
type: "object",
159-
desc: "The data.",
160-
required: true,
161-
},
135+
desc: {
136+
type: "string",
137+
desc: "The description of the data.",
138+
required: true,
139+
},
140+
data: {
141+
type: "object",
142+
desc: "The data.",
143+
required: true,
162144
},
163145
},
164146
},
165147
},
166148
},
167-
{
168-
fn: async (args) => {
169-
const embedding = await this.openai.embeddings.create({
170-
model: this.config.vector_model,
171-
dimensions: this.config.dimensions,
172-
input: args.query,
173-
encoding_format: "float",
174-
});
175-
const results = this.db
176-
.prepare(
177-
`SELECT
149+
fn: async (args: Dict<any>) => {
150+
const embedding = await this.openai.embeddings.create({
151+
model: this.config.vector_model,
152+
dimensions: this.config.dimensions,
153+
input: args.query,
154+
encoding_format: "float",
155+
});
156+
const results = this.db
157+
.prepare(
158+
`SELECT
178159
distance,
179160
desc,
180161
data

0 commit comments

Comments
 (0)