@letta-ai/letta-react 0.0.4 → 0.0.6

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/README.md CHANGED
@@ -8,12 +8,14 @@ npm install @letta-ai/letta-react
8
8
 
9
9
  ## Documentation
10
10
 
11
- 📚[Letta React Documentation](https://docs.letta.com/guides/letta-react)
12
-
13
11
  ### Minimal Example
14
12
 
15
13
  #### Server-side configuration
16
14
 
15
+ #### Next.js
16
+
17
+ Try out [`@letta-ai/letta-nextjs`](https://www.npmjs.com/package/@letta-ai/letta-nextjs) for a more streamlined setup.
18
+
17
19
  ##### Local Letta Instance
18
20
 
19
21
  First setup Letta server, [instructions here](https://docs.letta.com/quickstart)
@@ -35,6 +35,17 @@ function extendContent(content, nextContent) {
35
35
  }
36
36
  }
37
37
  }
38
+ function dedupeMessages(messages) {
39
+ const messageIndex = new Set(messages.map((message) => `${message.id}${message.messageType}`));
40
+ return messages.filter((message) => {
41
+ // if we have seen this message before, return false
42
+ if (messageIndex.has(`${message.id}${message.messageType}`)) {
43
+ messageIndex.delete(`${message.id}${message.messageType}`);
44
+ return true;
45
+ }
46
+ return false;
47
+ }, []);
48
+ }
38
49
  export function useAgentMessages(options) {
39
50
  const { client = {}, method = 'stream', messageOptions = {}, limit = 20, agentId, } = options;
40
51
  const localClient = useLettaClient(client);
@@ -175,7 +186,7 @@ export function useAgentMessages(options) {
175
186
  const messages = yield localClient.agents.messages.list(agentId, Object.assign({ before, limit: limit + 1 }, messageOptions));
176
187
  const messagesToAdd = messages.slice(1, messages.length);
177
188
  const nextCursor = messages.length > limit ? messages[0] : undefined;
178
- setLocalMessages((prevState) => (Object.assign(Object.assign({}, prevState), { messages: [...messagesToAdd, ...prevState.messages], nextCursor: nextCursor === null || nextCursor === void 0 ? void 0 : nextCursor.id })));
189
+ setLocalMessages((prevState) => (Object.assign(Object.assign({}, prevState), { messages: dedupeMessages([...messagesToAdd, ...prevState.messages]), nextCursor: nextCursor === null || nextCursor === void 0 ? void 0 : nextCursor.id })));
179
190
  }
180
191
  catch (e) {
181
192
  setLoadingError(e);
@@ -35,6 +35,17 @@ function extendContent(content, nextContent) {
35
35
  }
36
36
  }
37
37
  }
38
+ function dedupeMessages(messages) {
39
+ const messageIndex = new Set(messages.map((message) => `${message.id}${message.messageType}`));
40
+ return messages.filter((message) => {
41
+ // if we have seen this message before, return false
42
+ if (messageIndex.has(`${message.id}${message.messageType}`)) {
43
+ messageIndex.delete(`${message.id}${message.messageType}`);
44
+ return true;
45
+ }
46
+ return false;
47
+ }, []);
48
+ }
38
49
  export function useAgentMessages(options) {
39
50
  const { client = {}, method = 'stream', messageOptions = {}, limit = 20, agentId, } = options;
40
51
  const localClient = useLettaClient(client);
@@ -175,7 +186,7 @@ export function useAgentMessages(options) {
175
186
  const messages = yield localClient.agents.messages.list(agentId, Object.assign({ before, limit: limit + 1 }, messageOptions));
176
187
  const messagesToAdd = messages.slice(1, messages.length);
177
188
  const nextCursor = messages.length > limit ? messages[0] : undefined;
178
- setLocalMessages((prevState) => (Object.assign(Object.assign({}, prevState), { messages: [...messagesToAdd, ...prevState.messages], nextCursor: nextCursor === null || nextCursor === void 0 ? void 0 : nextCursor.id })));
189
+ setLocalMessages((prevState) => (Object.assign(Object.assign({}, prevState), { messages: dedupeMessages([...messagesToAdd, ...prevState.messages]), nextCursor: nextCursor === null || nextCursor === void 0 ? void 0 : nextCursor.id })));
179
190
  }
180
191
  catch (e) {
181
192
  setLoadingError(e);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letta-ai/letta-react",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Letta's react library",
5
5
  "private": false,
6
6
  "main": "./index.js",
@@ -34,6 +34,24 @@ function extendContent(
34
34
  }
35
35
  }
36
36
 
37
+ function dedupeMessages(
38
+ messages: LocalMessagesState['messages']
39
+ ): LocalMessagesState['messages'] {
40
+ const messageIndex = new Set(
41
+ messages.map((message) => `${message.id}${message.messageType}`)
42
+ );
43
+
44
+ return messages.filter((message) => {
45
+ // if we have seen this message before, return false
46
+ if (messageIndex.has(`${message.id}${message.messageType}`)) {
47
+ messageIndex.delete(`${message.id}${message.messageType}`);
48
+ return true;
49
+ }
50
+
51
+ return false;
52
+ }, []);
53
+ }
54
+
37
55
  interface SendMessagePayload {
38
56
  messages: LettaRequest['messages'];
39
57
  }
@@ -278,7 +296,7 @@ export function useAgentMessages(options: UseAgentOptions) {
278
296
 
279
297
  setLocalMessages((prevState) => ({
280
298
  ...prevState,
281
- messages: [...messagesToAdd, ...prevState.messages],
299
+ messages: dedupeMessages([...messagesToAdd, ...prevState.messages]),
282
300
  nextCursor: nextCursor?.id,
283
301
  }));
284
302
  } catch (e) {