From 95a737c9c7d62b0aa660ed73170c4396f121a430 Mon Sep 17 00:00:00 2001 From: jonasgabriel18 Date: Tue, 11 Jun 2024 11:11:14 -0300 Subject: [PATCH 01/19] header improvement --- src/pages/layout/header.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/layout/header.tsx b/src/pages/layout/header.tsx index d1a90c7a..38d02887 100644 --- a/src/pages/layout/header.tsx +++ b/src/pages/layout/header.tsx @@ -8,14 +8,14 @@ interface HeaderProps { const Header: React.FC = ({ title }) => { return ( -
+
-
- Logo da LinguifAI -

+
+ Logo da LinguifAI +

LinguifAI

-

+
); }; From c779c556f606162b61b6eba55a7c98538aeb09fe Mon Sep 17 00:00:00 2001 From: jonasgabriel18 Date: Tue, 11 Jun 2024 11:46:19 -0300 Subject: [PATCH 02/19] csv pagination --- src/components/resultTable/resultTable.tsx | 121 +++++++++++++++- .../selectFileCard/selectFileCard.tsx | 133 ++++++++++++++---- 2 files changed, 226 insertions(+), 28 deletions(-) diff --git a/src/components/resultTable/resultTable.tsx b/src/components/resultTable/resultTable.tsx index b54326a4..1d66294c 100644 --- a/src/components/resultTable/resultTable.tsx +++ b/src/components/resultTable/resultTable.tsx @@ -1,5 +1,6 @@ -import React from "react"; +import React, { useState } from "react"; import CsvTable from "../csvTable/csvTable"; +import { Button } from "@mui/material"; interface TableData { Coluna: string; @@ -11,13 +12,125 @@ interface Props { classifierName: string; } +const ITEMS_PER_PAGE = 6; + export default function ResultTable({ data, classifierName }: Props) { + const [currentPage, setCurrentPage] = useState(0); + const tableData: TableData[] = Object.entries(data).map(([key, value]) => ({ Coluna: key, Valor: value, })); - const convertedTableData: any[][] = tableData.slice(0, 4).map((item) => [item.Coluna, item.Valor]); + const convertedTableData: any[][] = tableData.map((item) => [ + item.Coluna, + item.Valor, + ]); - return ; -} + const displayedData = convertedTableData.slice( + currentPage * ITEMS_PER_PAGE, + (currentPage + 1) * ITEMS_PER_PAGE + ); + + const totalPages = Math.ceil(convertedTableData.length / ITEMS_PER_PAGE); + + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const handlePreviousPage = () => { + if (currentPage > 0) { + setCurrentPage(currentPage - 1); + } + }; + + const handleNextPage = () => { + if ((currentPage + 1) * ITEMS_PER_PAGE < convertedTableData.length) { + setCurrentPage(currentPage + 1); + } + }; + + const renderPageNumbers = (): JSX.Element[] => { + const pageNumbers: JSX.Element[] = []; + + if (totalPages <= 1) return pageNumbers; + + pageNumbers.push( + + ); + + if (currentPage > 3) { + pageNumbers.push(...); + } + + const startPage = Math.max(1, currentPage - 1); + const endPage = Math.min(totalPages - 2, currentPage + 1); + + for (let i = startPage; i <= endPage; i++) { + pageNumbers.push( + + ); + } + + if (currentPage < totalPages - 4) { + pageNumbers.push(...); + } + + if (totalPages > 1) { + pageNumbers.push( + + ); + } + + return pageNumbers; + }; + + return ( +
+ +
+ +
+ {renderPageNumbers()} +
+ +
+
+ ); +} \ No newline at end of file diff --git a/src/components/selectFileCard/selectFileCard.tsx b/src/components/selectFileCard/selectFileCard.tsx index fbd6468c..627151c1 100644 --- a/src/components/selectFileCard/selectFileCard.tsx +++ b/src/components/selectFileCard/selectFileCard.tsx @@ -2,7 +2,7 @@ import { Icon } from "@iconify/react"; import { ChangeEvent, useState } from "react"; import Papa from "papaparse"; import CsvTable from "../csvTable/csvTable"; -import { Link } from "@mui/material"; +import { Button } from "@mui/material"; interface props { selectedFile: File | null; @@ -13,6 +13,8 @@ interface props { setHeader: (header: string[]) => void; } +const ITEMS_PER_PAGE = 6; + export default function SelectFileCard({ selectedFile, setSelectedFile, @@ -22,8 +24,8 @@ export default function SelectFileCard({ setHeader, }: props) { const [isDragging, setIsDragging] = useState(false); + const [currentPage, setCurrentPage] = useState(0); - // Selecionar arquivo const handleFileChange = async (event: ChangeEvent) => { const file = event.target.files?.[0]; if (file && file.name.endsWith(".csv")) { @@ -33,7 +35,7 @@ export default function SelectFileCard({ header: true, dynamicTyping: true, skipEmptyLines: true, - complete(results, file) { + complete(results) { let chaves = Object.keys(results.data[0] || []); let data: any[][] = results.data.map((row: any) => { @@ -46,6 +48,7 @@ export default function SelectFileCard({ setData(data); setHeader(chaves); + setCurrentPage(0); // Reset to first page }, }); } else { @@ -74,6 +77,70 @@ export default function SelectFileCard({ setIsDragging(false); }; + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const displayedData = data.slice( + currentPage * ITEMS_PER_PAGE, + (currentPage + 1) * ITEMS_PER_PAGE + ); + + const totalPages = Math.ceil(data.length / ITEMS_PER_PAGE); + + const renderPageNumbers = (): JSX.Element[] => { + const pageNumbers: JSX.Element[] = []; + + if (totalPages <= 1) return pageNumbers; + + pageNumbers.push( + + ); + + if (currentPage > 3) { + pageNumbers.push(...); + } + + const startPage = Math.max(1, currentPage - 1); + const endPage = Math.min(totalPages - 2, currentPage + 1); + + for (let i = startPage; i <= endPage; i++) { + pageNumbers.push( + + ); + } + + if (currentPage < totalPages - 4) { + pageNumbers.push(...); + } + + if (totalPages > 1) { + pageNumbers.push( + + ); + } + + return pageNumbers; + }; + return !selectedFile ? (
0 ? `w-4/5` : `w-2/5` @@ -83,25 +150,24 @@ export default function SelectFileCard({ onDragOver={handleDragOver} onDragLeave={handleDragLeave} > - - - -

Arraste e solte ou { - const fileInput = document.getElementById("fileInput"); - if (fileInput) { - fileInput.click(); - } - }} - > - selecione do Computador - +

+ Arraste e solte ou{" "} + { + const fileInput = document.getElementById("fileInput"); + if (fileInput) { + fileInput.click(); + } + }} + > + selecione do Computador +

+ /> +
) : ( -
0 ? `w-4/5` : `w-2/5` } min-h-[170px] relative mx-auto flex flex-col items-center justify-center ${isDragging ? "blur-sm" : "" @@ -121,11 +187,30 @@ export default function SelectFileCard({ onDragOver={handleDragOver} onDragLeave={handleDragLeave} > - - {data.length > 0 && ( - + <> + +
+ +
+ {renderPageNumbers()} +
+ +
+ )}
- ) -} + ); +} \ No newline at end of file From 1dedc5b66e7c58ec155b49d71c45427ab01b02a2 Mon Sep 17 00:00:00 2001 From: jonasgabriel18 Date: Tue, 11 Jun 2024 11:52:02 -0300 Subject: [PATCH 03/19] button hovers fixed --- src/pages/views/homeView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/views/homeView.tsx b/src/pages/views/homeView.tsx index ad60840d..4e1abb23 100644 --- a/src/pages/views/homeView.tsx +++ b/src/pages/views/homeView.tsx @@ -163,7 +163,7 @@ export default function HomeView() {
-
+
{Object.keys(result).length > 0 && ( From e264aa0ce39efa72740da3cfdf06acaad3a24aec Mon Sep 17 00:00:00 2001 From: Automated Version Bump Date: Mon, 17 Jun 2024 18:12:02 +0000 Subject: [PATCH 09/19] CI: bumps version to 0.3.0 [skip ci] --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e355bde..caea9c67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "LinguifAI", - "version": "0.2.4", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "LinguifAI", - "version": "0.2.4", + "version": "0.3.0", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/package.json b/package.json index 426c27b0..b8ed98e7 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.2.4", + "version": "0.3.0", "main": "./public/electron.js", "homepage": "./", "private": true, From 72f520b52738bb216c4ac33069649e4d8dd88aaf Mon Sep 17 00:00:00 2001 From: Automated Version Bump Date: Mon, 17 Jun 2024 18:38:50 +0000 Subject: [PATCH 10/19] CI: bumps version to 0.3.1 [skip ci] --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6e513d49..581e1559 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "LinguifAI", - "version": "0.3.0", + "version": "0.3.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "LinguifAI", - "version": "0.3.0", + "version": "0.3.1", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/package.json b/package.json index d02eb411..151d1aee 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.3.0", + "version": "0.3.1", "main": "./public/electron.js", "homepage": "./", "private": true, From 456436b0a1c86b3613628eed2b205eedafa9fb99 Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 17 Jun 2024 12:40:49 -0600 Subject: [PATCH 11/19] Add app.spec --- .github/workflows/develop.yml | 4 ++-- .github/workflows/main.yml | 2 +- api/app.spec | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 6b2ab824..4686134d 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -82,8 +82,8 @@ jobs: run: pip install -r api/requirements.txt pyinstaller==6.6.0 - name: Build flask exe - run: pyinstaller --name app --onefile --console api/app.py --hidden-import=tiktoken_ext.openai_public --hidden-import=tiktoken_ext - + run: pyinstaller app.spec + - name: Install dependencies run: npm install diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1a7a4092..dbf49572 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -82,7 +82,7 @@ jobs: run: pip install -r api/requirements.txt pyinstaller==6.6.0 - name: Build flask exe - run: pyinstaller --name app --onefile --console api/app.py --hidden-import=tiktoken_ext.openai_public --hidden-import=tiktoken_ext + run: pyinstaller app.spec - name: Install dependencies run: npm install diff --git a/api/app.spec b/api/app.spec index d5abf94e..46b741c0 100644 --- a/api/app.spec +++ b/api/app.spec @@ -1,3 +1,4 @@ + # -*- mode: python ; coding: utf-8 -*- entry_point = 'app.py' @@ -9,7 +10,7 @@ a = Analysis( pathex=[], binaries=[], datas=[], - hiddenimports=[], + hiddenimports=['tiktoken_ext.openai_public', 'tiktoken_ext'], hookspath=[], hooksconfig={}, runtime_hooks=[], @@ -48,4 +49,4 @@ coll = COLLECT( upx=True, upx_exclude=[], name='app', -) +) \ No newline at end of file From 7cc0407f05faea7ad2a004369c15d7ff96277a4b Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 17 Jun 2024 12:41:08 -0600 Subject: [PATCH 12/19] Change package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 151d1aee..098d47a5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.3.1", + "version": "0.2.4", "main": "./public/electron.js", "homepage": "./", "private": true, From 3338489fec7d3ca55cdb473e2e34784dc6222a15 Mon Sep 17 00:00:00 2001 From: Automated Version Bump Date: Mon, 17 Jun 2024 18:41:51 +0000 Subject: [PATCH 13/19] CI: bumps version to 0.2.5 [skip ci] --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 581e1559..a36015e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "LinguifAI", - "version": "0.3.1", + "version": "0.2.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "LinguifAI", - "version": "0.3.1", + "version": "0.2.5", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/package.json b/package.json index 098d47a5..aec97bf5 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.2.4", + "version": "0.2.5", "main": "./public/electron.js", "homepage": "./", "private": true, From 26b7f5892e33adc0eb7d96993aa5f964c1e1bcfa Mon Sep 17 00:00:00 2001 From: jonasgabriel18 Date: Mon, 17 Jun 2024 15:51:50 -0300 Subject: [PATCH 14/19] corrections --- src/components/chatbot/chatbot.tsx | 6 +++--- src/components/selectFileCard/selectFileCard.tsx | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/chatbot/chatbot.tsx b/src/components/chatbot/chatbot.tsx index b7113369..c3ab198e 100644 --- a/src/components/chatbot/chatbot.tsx +++ b/src/components/chatbot/chatbot.tsx @@ -57,14 +57,14 @@ const ChatBot: React.FC = () => { const sendAPIKeyMessage = () => { setChatHistory(prevHistory => [ ...prevHistory, - { text: "Olá! Eu sou o (LinguiTalk ou LinguaBot). Coloca a sua chave:", origin: 'bot' } + { text: "Olá! Eu sou o LinguiTalk, um chatbot para lhe auxiliar na exploração dos seus dados! Primeiro, insira uma chave API válida do ChatGPT:", origin: 'bot' } ]); }; const sendInitialMessage = () => { setChatHistory(prevHistory => [ ...prevHistory, - { text: "Olá! Eu sou o (LinguiTalk ou LinguaBot). Como posso ajudar?", origin: 'bot' } + { text: "Olá! Eu sou o LinguiTalk. Como posso ajudar?", origin: 'bot' } ]); }; @@ -98,7 +98,7 @@ const ChatBot: React.FC = () => { {isOpen && (
-

LinguiTalk ou LinguaBot

+

LinguiTalk

); -} +} \ No newline at end of file From 546070a8c83f8b54aa75d1776de98653f40c6847 Mon Sep 17 00:00:00 2001 From: Automated Version Bump Date: Mon, 17 Jun 2024 18:53:35 +0000 Subject: [PATCH 15/19] CI: bumps version to 0.2.6 [skip ci] --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a36015e7..52382296 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "LinguifAI", - "version": "0.2.5", + "version": "0.2.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "LinguifAI", - "version": "0.2.5", + "version": "0.2.6", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/package.json b/package.json index aec97bf5..79dca255 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.2.5", + "version": "0.2.6", "main": "./public/electron.js", "homepage": "./", "private": true, From ffbd3d8c5e1db6b298e3a5de89091dd600f4f118 Mon Sep 17 00:00:00 2001 From: Cameron Maloney Date: Mon, 17 Jun 2024 13:04:06 -0600 Subject: [PATCH 16/19] Update develop.yml --- .github/workflows/develop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/develop.yml b/.github/workflows/develop.yml index 4686134d..925cf137 100644 --- a/.github/workflows/develop.yml +++ b/.github/workflows/develop.yml @@ -82,7 +82,7 @@ jobs: run: pip install -r api/requirements.txt pyinstaller==6.6.0 - name: Build flask exe - run: pyinstaller app.spec + run: pyinstaller api/app.spec - name: Install dependencies run: npm install From 52bb393ad43bfd9d16b23b6a72a2d364c6fc2fa5 Mon Sep 17 00:00:00 2001 From: Automated Version Bump Date: Mon, 17 Jun 2024 19:04:26 +0000 Subject: [PATCH 17/19] CI: bumps version to 0.2.7 [skip ci] --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 52382296..466330b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "LinguifAI", - "version": "0.2.6", + "version": "0.2.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "LinguifAI", - "version": "0.2.6", + "version": "0.2.7", "dependencies": { "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", diff --git a/package.json b/package.json index 79dca255..fd53ede9 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "name": "Cameron", "email": "cameron.maloney@warriorlife.net" }, - "version": "0.2.6", + "version": "0.2.7", "main": "./public/electron.js", "homepage": "./", "private": true, From 8c7423fa0c7142d8780552b43b9d5a805e540e7d Mon Sep 17 00:00:00 2001 From: Cameron Date: Mon, 17 Jun 2024 14:32:22 -0600 Subject: [PATCH 18/19] Final fixes to chatbot and toast --- api/app.py | 78 +++++++++--------------------- src/components/chatbot/chatbot.tsx | 5 +- src/pages/views/trainView.tsx | 8 ++- yarn.lock | 9 +++- 4 files changed, 38 insertions(+), 62 deletions(-) diff --git a/api/app.py b/api/app.py index c315844e..c1ceb7a3 100644 --- a/api/app.py +++ b/api/app.py @@ -58,7 +58,10 @@ def chat(): chat_history = data.get('history', []) api_key = data.get('apikey') + if df is not None: + + print(df.head(1)) documents = split_dataframe_into_documents(df) embeddings = OpenAIEmbeddings(api_key=api_key) @@ -74,27 +77,24 @@ def chat(): return jsonify(reply=bot_reply) else: - print("No df") - return jsonify(reply="No data available."), 400 - - # messages = [{"role": "system", "content": "You are a helpful assistant."}] - # for msg in chat_history: - # messages.append({"role": "user" if msg['origin'] == 'user' else "assistant", "content": msg['text']}) - # messages.append({"role": "user", "content": user_message}) - - # try: - # client = openai.OpenAI(api_key = api_key) - # response = client.chat.completions.create( - # model="gpt-3.5-turbo", - # messages=messages, - # max_tokens=200 - # ) - # bot_reply = response.choices[0].message.content.strip() - - # return jsonify(reply=bot_reply) - # except Exception as e: - # print(f"Error: {e}") - # return jsonify(reply="Desculpe, ocorreu um erro ao processar sua mensagem."), 500 + messages = [{"role": "system", "content": "You are a helpful assistant."}] + for msg in chat_history: + messages.append({"role": "user" if msg['origin'] == 'user' else "assistant", "content": msg['text']}) + messages.append({"role": "user", "content": user_message}) + + try: + client = openai.OpenAI(api_key = api_key) + response = client.chat.completions.create( + model="gpt-3.5-turbo", + messages=messages, + max_tokens=200 + ) + bot_reply = response.choices[0].message.content.strip() + + return jsonify(reply=bot_reply) + except Exception as e: + print(f"Error: {e}") + return jsonify(reply="Desculpe, ocorreu um erro ao processar sua mensagem."), 500 def shutdown_server(): @@ -116,7 +116,7 @@ def receive_file(): if file.filename == '': return jsonify({'error': 'No selected file'}), 400 if file: - df = pd.read_csv(file) + df = pd.read_csv(file, on_bad_lines='skip') return jsonify({'message': 'File uploaded successfully'}), 200 @@ -282,40 +282,6 @@ def apikey(): return jsonify(reply="Desculpe, ocorreu um erro ao processar sua mensagem."), 500 -# @app.route('/chat', methods=['POST']) -# def chat(): -# global df -# if df is not None: -# # run rag -# print(df.head(1)) -# else: -# print("No df") -# data = request.get_json() -# user_message = data.get('message') -# chat_history = data.get('history', []) -# api_key = data.get('apikey') - -# messages = [{"role": "system", "content": "You are a helpful assistant."}] -# for msg in chat_history: -# messages.append({"role": "user" if msg['origin'] == 'user' else "assistant", "content": msg['text']}) -# messages.append({"role": "user", "content": user_message}) - -# try: -# client = openai.OpenAI(api_key = api_key) -# response = client.chat.completions.create( -# model="gpt-3.5-turbo", # ou a gente poderia ver com gpt 4 mas por enquanto coloquei 3.5 -# messages=messages, -# max_tokens=200 -# ) -# bot_reply = response.choices[0].message.content.strip() - -# return jsonify(reply=bot_reply) -# except Exception as e: -# print(f"Error: {e}") -# return jsonify(reply="Desculpe, ocorreu um erro ao processar sua mensagem."), 500 - - - if __name__ == '__main__': training_progress = { 'training_progress': 0, diff --git a/src/components/chatbot/chatbot.tsx b/src/components/chatbot/chatbot.tsx index c3ab198e..52ac255f 100644 --- a/src/components/chatbot/chatbot.tsx +++ b/src/components/chatbot/chatbot.tsx @@ -50,8 +50,9 @@ const ChatBot: React.FC = () => { const errorMessage: Message = { text: "Desculpe, ocorreu um erro. Tente novamente.", origin: 'bot' }; setChatHistory(prevHistory => [...prevHistory, errorMessage]); } - + console.log(message) setMessage(""); + console.log(message) }; const sendAPIKeyMessage = () => { @@ -130,7 +131,7 @@ const ChatBot: React.FC = () => { value={message} onChange={(e) => setMessage(e.target.value)} onKeyPress={(e) => { - if (e.key === 'Enter') sendMessage(); + if (e.key === 'Enter') sendMessage() }} />