mem0ai 2.1.0 → 2.1.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.
@@ -73,14 +73,17 @@ import OpenAI2 from "openai";
73
73
  var OpenAILLM = class {
74
74
  constructor(config) {
75
75
  this.openai = new OpenAI2({ apiKey: config.apiKey });
76
- this.model = config.model || "gpt-4-turbo-preview";
76
+ this.model = config.model || "gpt-4o-mini";
77
77
  }
78
78
  async generateResponse(messages, responseFormat, tools) {
79
79
  const completion = await this.openai.chat.completions.create({
80
- messages: messages.map((msg) => ({
81
- role: msg.role,
82
- content: msg.content
83
- })),
80
+ messages: messages.map((msg) => {
81
+ const role = msg.role;
82
+ return {
83
+ role,
84
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
85
+ };
86
+ }),
84
87
  model: this.model,
85
88
  response_format: responseFormat,
86
89
  ...tools && { tools, tool_choice: "auto" }
@@ -100,10 +103,13 @@ var OpenAILLM = class {
100
103
  }
101
104
  async generateChat(messages) {
102
105
  const completion = await this.openai.chat.completions.create({
103
- messages: messages.map((msg) => ({
104
- role: msg.role,
105
- content: msg.content
106
- })),
106
+ messages: messages.map((msg) => {
107
+ const role = msg.role;
108
+ return {
109
+ role,
110
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
111
+ };
112
+ }),
107
113
  model: this.model
108
114
  });
109
115
  const response = completion.choices[0].message;
@@ -125,7 +131,7 @@ var OpenAIStructuredLLM = class {
125
131
  const completion = await this.openai.chat.completions.create({
126
132
  messages: messages.map((msg) => ({
127
133
  role: msg.role,
128
- content: msg.content
134
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
129
135
  })),
130
136
  model: this.model,
131
137
  ...tools ? {
@@ -161,7 +167,7 @@ var OpenAIStructuredLLM = class {
161
167
  const completion = await this.openai.chat.completions.create({
162
168
  messages: messages.map((msg) => ({
163
169
  role: msg.role,
164
- content: msg.content
170
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
165
171
  })),
166
172
  model: this.model
167
173
  });
@@ -191,9 +197,9 @@ var AnthropicLLM = class {
191
197
  model: this.model,
192
198
  messages: otherMessages.map((msg) => ({
193
199
  role: msg.role,
194
- content: msg.content
200
+ content: typeof msg.content === "string" ? msg.content : msg.content.image_url.url
195
201
  })),
196
- system: systemMessage == null ? void 0 : systemMessage.content,
202
+ system: typeof (systemMessage == null ? void 0 : systemMessage.content) === "string" ? systemMessage.content : void 0,
197
203
  max_tokens: 4096
198
204
  });
199
205
  return response.content[0].text;
@@ -223,7 +229,7 @@ var GroqLLM = class {
223
229
  model: this.model,
224
230
  messages: messages.map((msg) => ({
225
231
  role: msg.role,
226
- content: msg.content
232
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
227
233
  })),
228
234
  response_format: responseFormat
229
235
  });
@@ -234,7 +240,7 @@ var GroqLLM = class {
234
240
  model: this.model,
235
241
  messages: messages.map((msg) => ({
236
242
  role: msg.role,
237
- content: msg.content
243
+ content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
238
244
  }))
239
245
  });
240
246
  const message = response.choices[0].message;
@@ -2147,6 +2153,43 @@ Text: ${data}`
2147
2153
  }
2148
2154
  };
2149
2155
 
2156
+ // src/oss/src/utils/memory.ts
2157
+ var get_image_description = async (image_url) => {
2158
+ const llm = new OpenAILLM({
2159
+ apiKey: process.env.OPENAI_API_KEY
2160
+ });
2161
+ const response = await llm.generateResponse([
2162
+ {
2163
+ role: "user",
2164
+ content: "Provide a description of the image and do not include any additional text."
2165
+ },
2166
+ {
2167
+ role: "user",
2168
+ content: { type: "image_url", image_url: { url: image_url } }
2169
+ }
2170
+ ]);
2171
+ return response;
2172
+ };
2173
+ var parse_vision_messages = async (messages) => {
2174
+ const parsed_messages = [];
2175
+ for (const message of messages) {
2176
+ let new_message = {
2177
+ role: message.role,
2178
+ content: ""
2179
+ };
2180
+ if (message.role !== "system") {
2181
+ if (typeof message.content === "object" && message.content.type === "image_url") {
2182
+ const description = await get_image_description(
2183
+ message.content.image_url.url
2184
+ );
2185
+ new_message.content = typeof description === "string" ? description : JSON.stringify(description);
2186
+ parsed_messages.push(new_message);
2187
+ } else parsed_messages.push(message);
2188
+ }
2189
+ }
2190
+ return parsed_messages;
2191
+ };
2192
+
2150
2193
  // src/oss/src/memory/index.ts
2151
2194
  var Memory = class _Memory {
2152
2195
  constructor(config = {}) {
@@ -2199,8 +2242,9 @@ var Memory = class _Memory {
2199
2242
  );
2200
2243
  }
2201
2244
  const parsedMessages = Array.isArray(messages) ? messages : [{ role: "user", content: messages }];
2245
+ const final_parsedMessages = await parse_vision_messages(parsedMessages);
2202
2246
  const vectorStoreResult = await this.addToVectorStore(
2203
- parsedMessages,
2247
+ final_parsedMessages,
2204
2248
  metadata,
2205
2249
  filters
2206
2250
  );
@@ -2208,7 +2252,7 @@ var Memory = class _Memory {
2208
2252
  if (this.graphMemory) {
2209
2253
  try {
2210
2254
  graphResult = await this.graphMemory.add(
2211
- parsedMessages.map((m) => m.content).join("\n"),
2255
+ final_parsedMessages.map((m) => m.content).join("\n"),
2212
2256
  filters
2213
2257
  );
2214
2258
  } catch (error) {