aboutsummaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorDhravya <[email protected]>2024-04-10 22:02:32 -0700
committerDhravya <[email protected]>2024-04-10 22:02:32 -0700
commitf8068a6e01241e06398e893f31a8bf9cfc6342b2 (patch)
treeb8344549031cff1fd2a357fb0070160dea8375ce /apps
parentMerge pull request #5 from Dhravya/new-ui (diff)
downloadsupermemory-f8068a6e01241e06398e893f31a8bf9cfc6342b2.tar.xz
supermemory-f8068a6e01241e06398e893f31a8bf9cfc6342b2.zip
changes in how we save vectors
Diffstat (limited to 'apps')
-rw-r--r--apps/web/src/components/Main.tsx4
-rw-r--r--apps/web/src/components/QueryAI.tsx139
-rw-r--r--apps/web/src/lib/utils.ts5
3 files changed, 7 insertions, 141 deletions
diff --git a/apps/web/src/components/Main.tsx b/apps/web/src/components/Main.tsx
index b34755f9..1ef89e2d 100644
--- a/apps/web/src/components/Main.tsx
+++ b/apps/web/src/components/Main.tsx
@@ -6,7 +6,7 @@ import { ArrowRight, ArrowUp } from "lucide-react";
import { MemoryDrawer } from "./MemoryDrawer";
import useViewport from "@/hooks/useViewport";
import { AnimatePresence, motion } from "framer-motion";
-import { cn, countLines } from "@/lib/utils";
+import { cn, countLines, getIdsFromSource } from "@/lib/utils";
import { ChatHistory } from "../../types/memory";
import { ChatAnswer, ChatMessage, ChatQuestion } from "./ChatMessage";
import { useRouter, useSearchParams } from "next/navigation";
@@ -221,7 +221,7 @@ export default function Main({ sidebarOpen }: { sidebarOpen: boolean }) {
...lastMessage,
answer: {
parts: lastMessage.answer.parts,
- sources: sourcesInJson.ids ?? [],
+ sources: getIdsFromSource(sourcesInJson.ids) ?? [],
},
},
];
diff --git a/apps/web/src/components/QueryAI.tsx b/apps/web/src/components/QueryAI.tsx
deleted file mode 100644
index 894b5d2d..00000000
--- a/apps/web/src/components/QueryAI.tsx
+++ /dev/null
@@ -1,139 +0,0 @@
-"use client";
-
-import { Label } from "./ui/label";
-import React, { useEffect, useState } from "react";
-import { Input } from "./ui/input";
-import { Button } from "./ui/button";
-import SearchResults from "./SearchResults";
-
-function QueryAI() {
- const [searchResults, setSearchResults] = useState<string[]>([]);
- const [isAiLoading, setIsAiLoading] = useState(false);
-
- const [aiResponse, setAIResponse] = useState("");
- const [input, setInput] = useState("");
- const [toBeParsed, setToBeParsed] = useState("");
-
- const handleStreamData = (newChunk: string) => {
- // Append the new chunk to the existing data to be parsed
- setToBeParsed((prev) => prev + newChunk);
- };
-
- useEffect(() => {
- // Define a function to try parsing the accumulated data
- const tryParseAccumulatedData = () => {
- // Attempt to parse the "toBeParsed" state as JSON
- try {
- // Split the accumulated data by the known delimiter "\n\n"
- const parts = toBeParsed.split("\n\n");
- let remainingData = "";
-
- // Process each part to extract JSON objects
- parts.forEach((part, index) => {
- try {
- const parsedPart = JSON.parse(part.replace("data: ", "")); // Try to parse the part as JSON
-
- // If the part is the last one and couldn't be parsed, keep it to accumulate more data
- if (index === parts.length - 1 && !parsedPart) {
- remainingData = part;
- } else if (parsedPart && parsedPart.response) {
- // If the part is parsable and has the "response" field, update the AI response state
- setAIResponse((prev) => prev + parsedPart.response);
- }
- } catch (error) {
- // If parsing fails and it's not the last part, it's a malformed JSON
- if (index !== parts.length - 1) {
- console.error("Malformed JSON part: ", part);
- } else {
- // If it's the last part, it may be incomplete, so keep it
- remainingData = part;
- }
- }
- });
-
- // Update the toBeParsed state to only contain the unparsed remainder
- if (remainingData !== toBeParsed) {
- setToBeParsed(remainingData);
- }
- } catch (error) {
- console.error("Error parsing accumulated data: ", error);
- }
- };
-
- // Call the parsing function if there's data to be parsed
- if (toBeParsed) {
- tryParseAccumulatedData();
- }
- }, [toBeParsed]);
-
- const getSearchResults = async (e: React.FormEvent<HTMLFormElement>) => {
- e.preventDefault();
- setIsAiLoading(true);
-
- const sourcesResponse = await fetch(
- `/api/query?sourcesOnly=true&q=${input}`,
- );
-
- const sourcesInJson = (await sourcesResponse.json()) as {
- ids: string[];
- };
-
- setSearchResults(sourcesInJson.ids);
-
- const response = await fetch(`/api/query?q=${input}`);
-
- if (response.status !== 200) {
- setIsAiLoading(false);
- return;
- }
-
- if (response.body) {
- let reader = response.body.getReader();
- let decoder = new TextDecoder("utf-8");
- let result = "";
-
- // @ts-ignore
- reader.read().then(function processText({ done, value }) {
- if (done) {
- // setSearchResults(JSON.parse(result.replace('data: ', '')));
- // setIsAiLoading(false);
- return;
- }
-
- handleStreamData(decoder.decode(value));
-
- return reader.read().then(processText);
- });
- }
- };
-
- return (
- <div className="mx-auto w-full max-w-2xl">
- <form onSubmit={async (e) => await getSearchResults(e)} className="mt-8">
- <Label htmlFor="searchInput">Ask your SuperMemory</Label>
- <div className="flex flex-col space-y-2 md:w-full md:flex-row md:items-center md:space-x-2 md:space-y-0">
- <Input
- value={input}
- onChange={(e) => setInput(e.target.value)}
- placeholder="Search using AI... ✨"
- id="searchInput"
- />
- <Button
- disabled={isAiLoading}
- className="max-w-min md:w-full"
- type="submit"
- variant="default"
- >
- Ask AI
- </Button>
- </div>
- </form>
-
- {searchResults && (
- <SearchResults aiResponse={aiResponse} sources={searchResults} />
- )}
- </div>
- );
-}
-
-export default QueryAI;
diff --git a/apps/web/src/lib/utils.ts b/apps/web/src/lib/utils.ts
index 5eca08cc..4f34e990 100644
--- a/apps/web/src/lib/utils.ts
+++ b/apps/web/src/lib/utils.ts
@@ -18,6 +18,11 @@ export function cleanUrl(url: string) {
: url;
}
+export function getIdsFromSource(sourceIds: string[]) {
+ // This function converts an id from a form of `websiteURL-userID` to just the websiteURL
+ return sourceIds.map((id) => id.split("-").slice(0, -1).join("-"));
+}
+
export function generateId() {
return Math.random().toString(36).slice(2, 9);
}