From edf0d14c95c9869b416d07c9af80ace2bc3691cb Mon Sep 17 00:00:00 2001 From: Jaswanth Karani Date: Thu, 25 Jul 2024 09:42:36 +0530 Subject: [PATCH] added doc sum react-ui (#418) Signed-off-by: Yeoh, Hoong Tee Signed-off-by: jaswanth8888 --- .github/workflows/scripts/build_push.sh | 3 + DocSum/assets/img/docsum-ui-react-error.png | Bin 0 -> 47231 bytes DocSum/assets/img/docsum-ui-react-file.png | Bin 0 -> 45886 bytes DocSum/assets/img/docsum-ui-react.png | Bin 0 -> 35707 bytes DocSum/docker/gaudi/README.md | 19 +- DocSum/docker/gaudi/docker_compose.yaml | 12 + DocSum/docker/ui/docker/Dockerfile.react | 24 ++ DocSum/docker/ui/react/.env | 1 + DocSum/docker/ui/react/.eslintrc.cjs | 11 + DocSum/docker/ui/react/.gitignore | 24 ++ DocSum/docker/ui/react/README.md | 29 ++ DocSum/docker/ui/react/index.html | 18 ++ DocSum/docker/ui/react/nginx.conf | 20 ++ DocSum/docker/ui/react/package.json | 52 ++++ DocSum/docker/ui/react/postcss.config.cjs | 14 + DocSum/docker/ui/react/src/App.scss | 42 +++ DocSum/docker/ui/react/src/App.tsx | 32 ++ .../ui/react/src/__tests__/util.test.ts | 14 + .../ui/react/src/assets/opea-icon-black.svg | 39 +++ .../ui/react/src/assets/opea-icon-color.svg | 40 +++ DocSum/docker/ui/react/src/common/client.ts | 8 + DocSum/docker/ui/react/src/common/util.ts | 12 + .../ui/react/src/components/DocSum/DocSum.tsx | 153 ++++++++++ .../src/components/DocSum/FileUpload.tsx | 67 +++++ .../src/components/DocSum/docSum.module.scss | 44 +++ .../Shared/CodeRender/CodeRender.tsx | 52 ++++ .../Shared/CodeRender/codeRender.module.scss | 23 ++ .../components/Shared/Markdown/Markdown.tsx | 58 ++++ .../Shared/Markdown/markdown.module.scss | 14 + .../components/sidebar/sidebar.module.scss | 84 ++++++ .../react/src/components/sidebar/sidebar.tsx | 58 ++++ DocSum/docker/ui/react/src/config.ts | 4 + DocSum/docker/ui/react/src/index.scss | 20 ++ DocSum/docker/ui/react/src/main.tsx | 13 + .../react/src/styles/components/_sidebar.scss | 8 + .../react/src/styles/components/content.scss | 5 + .../src/styles/components/context.module.scss | 66 ++++ .../ui/react/src/styles/layout/_basics.scss | 7 + .../ui/react/src/styles/layout/_flex.scss | 6 + DocSum/docker/ui/react/src/styles/styles.scss | 5 + DocSum/docker/ui/react/src/vite-env.d.ts | 4 + DocSum/docker/ui/react/tsconfig.json | 23 ++ DocSum/docker/ui/react/tsconfig.node.json | 11 + DocSum/docker/ui/react/vite.config.ts | 27 ++ DocSum/docker/xeon/README.md | 26 +- DocSum/docker/xeon/docker_compose.yaml | 12 + DocSum/kubernetes/manifests/README.md | 2 +- DocSum/kubernetes/manifests/xeon/ui/README.md | 36 +++ .../manifests/xeon/ui/react-docsum.yaml | 281 ++++++++++++++++++ DocSum/tests/test_docsum_on_gaudi.sh | 4 +- DocSum/tests/test_docsum_on_xeon.sh | 4 +- 51 files changed, 1526 insertions(+), 5 deletions(-) create mode 100644 DocSum/assets/img/docsum-ui-react-error.png create mode 100644 DocSum/assets/img/docsum-ui-react-file.png create mode 100644 DocSum/assets/img/docsum-ui-react.png create mode 100644 DocSum/docker/ui/docker/Dockerfile.react create mode 100644 DocSum/docker/ui/react/.env create mode 100644 DocSum/docker/ui/react/.eslintrc.cjs create mode 100644 DocSum/docker/ui/react/.gitignore create mode 100644 DocSum/docker/ui/react/README.md create mode 100644 DocSum/docker/ui/react/index.html create mode 100644 DocSum/docker/ui/react/nginx.conf create mode 100644 DocSum/docker/ui/react/package.json create mode 100644 DocSum/docker/ui/react/postcss.config.cjs create mode 100644 DocSum/docker/ui/react/src/App.scss create mode 100644 DocSum/docker/ui/react/src/App.tsx create mode 100644 DocSum/docker/ui/react/src/__tests__/util.test.ts create mode 100644 DocSum/docker/ui/react/src/assets/opea-icon-black.svg create mode 100644 DocSum/docker/ui/react/src/assets/opea-icon-color.svg create mode 100644 DocSum/docker/ui/react/src/common/client.ts create mode 100644 DocSum/docker/ui/react/src/common/util.ts create mode 100644 DocSum/docker/ui/react/src/components/DocSum/DocSum.tsx create mode 100644 DocSum/docker/ui/react/src/components/DocSum/FileUpload.tsx create mode 100644 DocSum/docker/ui/react/src/components/DocSum/docSum.module.scss create mode 100644 DocSum/docker/ui/react/src/components/Shared/CodeRender/CodeRender.tsx create mode 100644 DocSum/docker/ui/react/src/components/Shared/CodeRender/codeRender.module.scss create mode 100644 DocSum/docker/ui/react/src/components/Shared/Markdown/Markdown.tsx create mode 100644 DocSum/docker/ui/react/src/components/Shared/Markdown/markdown.module.scss create mode 100644 DocSum/docker/ui/react/src/components/sidebar/sidebar.module.scss create mode 100644 DocSum/docker/ui/react/src/components/sidebar/sidebar.tsx create mode 100644 DocSum/docker/ui/react/src/config.ts create mode 100644 DocSum/docker/ui/react/src/index.scss create mode 100644 DocSum/docker/ui/react/src/main.tsx create mode 100644 DocSum/docker/ui/react/src/styles/components/_sidebar.scss create mode 100644 DocSum/docker/ui/react/src/styles/components/content.scss create mode 100644 DocSum/docker/ui/react/src/styles/components/context.module.scss create mode 100644 DocSum/docker/ui/react/src/styles/layout/_basics.scss create mode 100644 DocSum/docker/ui/react/src/styles/layout/_flex.scss create mode 100644 DocSum/docker/ui/react/src/styles/styles.scss create mode 100644 DocSum/docker/ui/react/src/vite-env.d.ts create mode 100644 DocSum/docker/ui/react/tsconfig.json create mode 100644 DocSum/docker/ui/react/tsconfig.node.json create mode 100644 DocSum/docker/ui/react/vite.config.ts create mode 100644 DocSum/kubernetes/manifests/xeon/ui/README.md create mode 100644 DocSum/kubernetes/manifests/xeon/ui/react-docsum.yaml diff --git a/.github/workflows/scripts/build_push.sh b/.github/workflows/scripts/build_push.sh index 58e92a208..cb17027ad 100755 --- a/.github/workflows/scripts/build_push.sh +++ b/.github/workflows/scripts/build_push.sh @@ -55,6 +55,9 @@ for MEGA_SVC in $1; do if [ "$MEGA_SVC" == "ChatQnA" ];then docker_build ${IMAGE_NAME}-conversation-ui docker/Dockerfile.react fi + if [ "$MEGA_SVC" == "DocSum" ];then + docker_build ${IMAGE_NAME}-react-ui docker/Dockerfile.react + fi if [ "$MEGA_SVC" == "CodeGen" ];then docker_build ${IMAGE_NAME}-react-ui docker/Dockerfile.react fi diff --git a/DocSum/assets/img/docsum-ui-react-error.png b/DocSum/assets/img/docsum-ui-react-error.png new file mode 100644 index 0000000000000000000000000000000000000000..de3cfedafddf6a1e09674a8726fe00c2be2f2da9 GIT binary patch literal 47231 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 literal 0 HcmV?d00001 diff --git a/DocSum/docker/gaudi/README.md b/DocSum/docker/gaudi/README.md index ace3c5c0d..290972d8b 100644 --- a/DocSum/docker/gaudi/README.md +++ b/DocSum/docker/gaudi/README.md @@ -44,12 +44,23 @@ cd GenAIExamples/DocSum/docker/ui/ docker build -t opea/docsum-ui:latest --build-arg https_proxy=$https_proxy --build-arg http_proxy=$http_proxy -f ./docker/Dockerfile . ``` +### 5. Build React UI Docker Image + +Build the frontend Docker image via below command: + +```bash +cd GenAIExamples/DocSum/docker/ui/ +export BACKEND_SERVICE_ENDPOINT="http://${host_ip}:8888/v1/docsum" +docker build -t opea/docsum-react-ui:latest --build-arg BACKEND_SERVICE_ENDPOINT=$BACKEND_SERVICE_ENDPOINT -f ./docker/Dockerfile.react . +``` + Then run the command `docker images`, you will have the following Docker Images: 1. `ghcr.io/huggingface/tgi-gaudi:2.0.1` 2. `opea/llm-docsum-tgi:latest` 3. `opea/docsum:latest` 4. `opea/docsum-ui:latest` +5. `opea/docsum-react-ui:latest` ## 🚀 Start Microservices and MegaService @@ -125,7 +136,7 @@ export LANGCHAIN_TRACING_V2=true export LANGCHAIN_API_KEY=ls_... ``` -## 🚀 Launch the UI +## 🚀 Launch the Svelte UI Open this URL `http://{host_ip}:5173` in your browser to access the frontend. @@ -134,3 +145,9 @@ Open this URL `http://{host_ip}:5173` in your browser to access the frontend. Here is an example for summarizing a article. ![image](https://github.com/intel-ai-tce/GenAIExamples/assets/21761437/67ecb2ec-408d-4e81-b124-6ded6b833f55) + +## 🚀 Launch the React UI + +Open this URL `http://{host_ip}:5175` in your browser to access the frontend. + +![project-screenshot](../../assets/img/docsum-ui-react.png) diff --git a/DocSum/docker/gaudi/docker_compose.yaml b/DocSum/docker/gaudi/docker_compose.yaml index d2984a125..a381a9f42 100644 --- a/DocSum/docker/gaudi/docker_compose.yaml +++ b/DocSum/docker/gaudi/docker_compose.yaml @@ -71,6 +71,18 @@ services: - DOC_BASE_URL=${BACKEND_SERVICE_ENDPOINT} ipc: host restart: always + docsum-xeon-react-ui-server: + image: opea/docsum-react-ui:latest + container_name: docsum-gaudi-react-ui-server + depends_on: + - docsum-gaudi-backend-server + build: + args: + - BACKEND_SERVICE_ENDPOINT=${BACKEND_SERVICE_ENDPOINT} + ports: + - "5174:80" + environment: + - DOC_BASE_URL=${BACKEND_SERVICE_ENDPOINT} networks: default: diff --git a/DocSum/docker/ui/docker/Dockerfile.react b/DocSum/docker/ui/docker/Dockerfile.react new file mode 100644 index 000000000..aa8f3fe78 --- /dev/null +++ b/DocSum/docker/ui/docker/Dockerfile.react @@ -0,0 +1,24 @@ +# Copyright (C) 2024 Intel Corporation +# SPDX-License-Identifier: Apache-2.0 + +# Use node 20.11.1 as the base image +FROM node:20.11.1 as vite-app + +COPY . /usr/app +WORKDIR /usr/app/react + +ARG BACKEND_SERVICE_ENDPOINT +ENV VITE_DOC_SUM_URL=$BACKEND_SERVICE_ENDPOINT + +RUN ["npm", "install"] +RUN ["npm", "run", "build"] + + +FROM nginx:alpine +EXPOSE 80 + + +COPY --from=vite-app /usr/app/react/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=vite-app /usr/app/react/dist /usr/share/nginx/html + +ENTRYPOINT ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/DocSum/docker/ui/react/.env b/DocSum/docker/ui/react/.env new file mode 100644 index 000000000..88e4996a2 --- /dev/null +++ b/DocSum/docker/ui/react/.env @@ -0,0 +1 @@ +VITE_DOC_SUM_URL=http://backend_address:8888/v1/docsum \ No newline at end of file diff --git a/DocSum/docker/ui/react/.eslintrc.cjs b/DocSum/docker/ui/react/.eslintrc.cjs new file mode 100644 index 000000000..78174f683 --- /dev/null +++ b/DocSum/docker/ui/react/.eslintrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react-hooks/recommended"], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], + }, +}; diff --git a/DocSum/docker/ui/react/.gitignore b/DocSum/docker/ui/react/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/DocSum/docker/ui/react/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/DocSum/docker/ui/react/README.md b/DocSum/docker/ui/react/README.md new file mode 100644 index 000000000..819469e73 --- /dev/null +++ b/DocSum/docker/ui/react/README.md @@ -0,0 +1,29 @@ +

Doc Summary React

+ +### 📸 Project Screenshots + +![project-screenshot](../../../assets/img/docsum-ui-react.png) +![project-screenshot](../../../assets/img/docsum-ui-react-file.png) +![project-screenshot](../../../assets/img/docsum-ui-react-error.png) + +

🧐 Features

+ +Here're some of the project's features: + +- Summarizing Uploaded Files: Upload files from their local device, then click 'Generate Summary' to summarize the content of the uploaded file. The summary will be displayed on the 'Summary' box. +- Summarizing Text via Pasting: Paste the text to be summarized into the text box, then click 'Generate Summary' to produce a condensed summary of the content, which will be displayed in the 'Summary' box on the right. +- Scroll to Bottom: The summarized content will automatically scroll to the bottom. + +

🛠️ Get it Running:

+ +1. Clone the repo. + +2. cd command to the current folder. + +3. Modify the required .env variables. + ``` + VITE_DOC_SUM_URL = '' + ``` +4. Execute `npm install` to install the corresponding dependencies. + +5. Execute `npm run dev` in both environments diff --git a/DocSum/docker/ui/react/index.html b/DocSum/docker/ui/react/index.html new file mode 100644 index 000000000..bedf57052 --- /dev/null +++ b/DocSum/docker/ui/react/index.html @@ -0,0 +1,18 @@ + + + + + + + + + Opea Doc Sum + + +
+ + + diff --git a/DocSum/docker/ui/react/nginx.conf b/DocSum/docker/ui/react/nginx.conf new file mode 100644 index 000000000..00433fcda --- /dev/null +++ b/DocSum/docker/ui/react/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + + gzip on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types font/woff2 text/css application/javascript application/json application/font-woff application/font-tff image/gif image/png image/svg+xml application/octet-stream; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html =404; + + location ~* \.(gif|jpe?g|png|webp|ico|svg|css|js|mp4|woff2)$ { + expires 1d; + } + } +} \ No newline at end of file diff --git a/DocSum/docker/ui/react/package.json b/DocSum/docker/ui/react/package.json new file mode 100644 index 000000000..1d88b1c6b --- /dev/null +++ b/DocSum/docker/ui/react/package.json @@ -0,0 +1,52 @@ +{ + "name": "ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "test": "vitest" + }, + "dependencies": { + "@mantine/core": "^7.11.1", + "@mantine/dropzone": "^7.11.1", + "@mantine/hooks": "^7.11.1", + "@mantine/notifications": "^7.11.1", + "@microsoft/fetch-event-source": "^2.0.1", + "@reduxjs/toolkit": "^2.2.5", + "@tabler/icons-react": "^3.9.0", + "axios": "^1.7.2", + "luxon": "^3.4.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-markdown": "^9.0.1", + "react-syntax-highlighter": "^15.5.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0" + }, + "devDependencies": { + "@testing-library/react": "^16.0.0", + "@types/luxon": "^3.4.2", + "@types/node": "^20.12.12", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@types/react-syntax-highlighter": "^15.5.13", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "jsdom": "^24.1.0", + "postcss": "^8.4.38", + "postcss-preset-mantine": "^1.15.0", + "postcss-simple-vars": "^7.0.1", + "sass": "1.64.2", + "typescript": "^5.2.2", + "vite": "^5.2.13", + "vitest": "^1.6.0" + } +} diff --git a/DocSum/docker/ui/react/postcss.config.cjs b/DocSum/docker/ui/react/postcss.config.cjs new file mode 100644 index 000000000..e817f567b --- /dev/null +++ b/DocSum/docker/ui/react/postcss.config.cjs @@ -0,0 +1,14 @@ +module.exports = { + plugins: { + "postcss-preset-mantine": {}, + "postcss-simple-vars": { + variables: { + "mantine-breakpoint-xs": "36em", + "mantine-breakpoint-sm": "48em", + "mantine-breakpoint-md": "62em", + "mantine-breakpoint-lg": "75em", + "mantine-breakpoint-xl": "88em", + }, + }, + }, +}; diff --git a/DocSum/docker/ui/react/src/App.scss b/DocSum/docker/ui/react/src/App.scss new file mode 100644 index 000000000..187764a17 --- /dev/null +++ b/DocSum/docker/ui/react/src/App.scss @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +@import "./styles/styles"; + +.root { + @include flex(row, nowrap, flex-start, flex-start); +} + +.layout-wrapper { + @include absolutes; + + display: grid; + + width: 100%; + height: 100%; + + grid-template-columns: 80px auto; + grid-template-rows: 1fr; +} + +/* ===== Scrollbar CSS ===== */ +/* Firefox */ +* { + scrollbar-width: thin; + scrollbar-color: #d6d6d6 #ffffff; +} + +/* Chrome, Edge, and Safari */ +*::-webkit-scrollbar { + width: 8px; +} + +*::-webkit-scrollbar-track { + background: #ffffff; +} + +*::-webkit-scrollbar-thumb { + background-color: #d6d6d6; + border-radius: 16px; + border: 4px double #dedede; +} diff --git a/DocSum/docker/ui/react/src/App.tsx b/DocSum/docker/ui/react/src/App.tsx new file mode 100644 index 000000000..f2fd996bf --- /dev/null +++ b/DocSum/docker/ui/react/src/App.tsx @@ -0,0 +1,32 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +import "./App.scss" +import { MantineProvider } from "@mantine/core" +import '@mantine/notifications/styles.css'; +import { SideNavbar, SidebarNavList } from "./components/sidebar/sidebar" +import { IconFileText } from "@tabler/icons-react" +import { Notifications } from '@mantine/notifications'; +import DocSum from "./components/DocSum/DocSum"; + +const title = "Doc Summary" +const navList: SidebarNavList = [ + { icon: IconFileText, label: title } +] + +function App() { + + return ( + + +
+ +
+ +
+
+
+ ) +} + +export default App diff --git a/DocSum/docker/ui/react/src/__tests__/util.test.ts b/DocSum/docker/ui/react/src/__tests__/util.test.ts new file mode 100644 index 000000000..e67ba2c86 --- /dev/null +++ b/DocSum/docker/ui/react/src/__tests__/util.test.ts @@ -0,0 +1,14 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +import { describe, expect, test } from "vitest"; +import { getCurrentTimeStamp, uuidv4 } from "../common/util"; + +describe("unit tests", () => { + test("check UUID is of length 36", () => { + expect(uuidv4()).toHaveLength(36); + }); + test("check TimeStamp generated is of unix", () => { + expect(getCurrentTimeStamp()).toBe(Math.floor(Date.now() / 1000)); + }); +}); diff --git a/DocSum/docker/ui/react/src/assets/opea-icon-black.svg b/DocSum/docker/ui/react/src/assets/opea-icon-black.svg new file mode 100644 index 000000000..5c96dc762 --- /dev/null +++ b/DocSum/docker/ui/react/src/assets/opea-icon-black.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocSum/docker/ui/react/src/assets/opea-icon-color.svg b/DocSum/docker/ui/react/src/assets/opea-icon-color.svg new file mode 100644 index 000000000..790151171 --- /dev/null +++ b/DocSum/docker/ui/react/src/assets/opea-icon-color.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DocSum/docker/ui/react/src/common/client.ts b/DocSum/docker/ui/react/src/common/client.ts new file mode 100644 index 000000000..7512f73e3 --- /dev/null +++ b/DocSum/docker/ui/react/src/common/client.ts @@ -0,0 +1,8 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +import axios from "axios"; + +//add iterceptors to add any request headers + +export default axios; diff --git a/DocSum/docker/ui/react/src/common/util.ts b/DocSum/docker/ui/react/src/common/util.ts new file mode 100644 index 000000000..df65b2d8e --- /dev/null +++ b/DocSum/docker/ui/react/src/common/util.ts @@ -0,0 +1,12 @@ +// Copyright (C) 2024 Intel Corporation +// SPDX-License-Identifier: Apache-2.0 + +export const getCurrentTimeStamp = () => { + return Math.floor(Date.now() / 1000); +}; + +export const uuidv4 = () => { + return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) => + (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16), + ); +}; diff --git a/DocSum/docker/ui/react/src/components/DocSum/DocSum.tsx b/DocSum/docker/ui/react/src/components/DocSum/DocSum.tsx new file mode 100644 index 000000000..9e7472c65 --- /dev/null +++ b/DocSum/docker/ui/react/src/components/DocSum/DocSum.tsx @@ -0,0 +1,153 @@ +import styleClasses from './docSum.module.scss' +import { Button, Text, Textarea, Title } from '@mantine/core' +import { FileUpload } from './FileUpload' +import { useEffect, useState } from 'react' +import Markdown from '../Shared/Markdown/Markdown' +import { fetchEventSource } from '@microsoft/fetch-event-source' +import { notifications } from '@mantine/notifications' +import { DOC_SUM_URL } from '../../config' +import { FileWithPath } from '@mantine/dropzone' + + +const DocSum = () => { + const [isFile, setIsFile] = useState(false); + const [files, setFiles] = useState([]) + const [isGenerating, setIsGenerating] = useState(false); + const [value, setValue] = useState(''); + const [fileContent, setFileContent] = useState(''); + const [response, setResponse] = useState(''); + + useEffect(() => { + if(isFile){ + setValue('') + } + },[isFile]) + + useEffect(()=>{ + if (files.length) { + const reader = new FileReader() + reader.onload = async () => { + const text = reader.result?.toString() + setFileContent(text || '') + }; + reader.readAsText(files[0]) + } + },[files]) + + + const handleSubmit = async () => { + setResponse("") + if(!isFile && !value){ + notifications.show({ + color: "red", + id: "input", + message: "Please Upload Content", + }) + return + } + + setIsGenerating(true) + const body = { + messages: isFile ? fileContent : value + } + fetchEventSource(DOC_SUM_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + "Accept": "*/*" + }, + body: JSON.stringify(body), + openWhenHidden: true, + async onopen(response) { + if (response.ok) { + return; + } else if (response.status >= 400 && response.status < 500 && response.status !== 429) { + const e = await response.json(); + console.log(e); + throw Error(e.error.message); + } else { + console.log("error", response); + } + }, + onmessage(msg) { + if (msg?.data != "[DONE]") { + try { + const res = JSON.parse(msg.data) + const logs = res.ops; + logs.forEach((log: { op: string; path: string; value: string }) => { + if (log.op === "add") { + if ( + log.value !== "" && log.path.endsWith("/streamed_output/-") && log.path.length > "/streamed_output/-".length + ) { + setResponse(prev=>prev+log.value); + } + } + }); + } catch (e) { + console.log("something wrong in msg", e); + throw e; + } + } + }, + onerror(err) { + console.log("error", err); + setIsGenerating(false) + throw err; + }, + onclose() { + setIsGenerating(false) + }, + }); +} + + + return ( +
+
+
+
+ Doc Summary +
+
+ Please upload file or paste content for summarization. +
+
+ + + + +
+
+ {isFile ? ( +
+ { setFiles(files) }} /> +
+ ) : ( +
+