├── src ├── vite-env.d.ts ├── compoenets │ ├── Chat │ │ ├── index.tsx │ │ └── Chat.tsx │ └── Menu │ │ ├── index.tsx │ │ ├── ChatHistoryList.tsx │ │ ├── Menu.tsx │ │ └── NewChat.tsx ├── index.css ├── main.tsx ├── App.tsx └── assets │ └── icons │ ├── TickIcon.tsx │ ├── MoonIcon.tsx │ ├── ChatIcon.tsx │ ├── AboutIcon.tsx │ ├── CrossIcon.tsx │ ├── DownArrow.tsx │ ├── EditIcon.tsx │ ├── PersonIcon.tsx │ ├── SendIcon.tsx │ ├── DownChevronArrow.tsx │ ├── HeartIcon.tsx │ ├── CopyIcon.tsx │ ├── EditIcon2.tsx │ ├── ExportIcon.tsx │ ├── PlusIcon.tsx │ ├── CrossIcon2.tsx │ ├── LogoutIcon.tsx │ ├── LinkIcon.tsx │ ├── RefreshIcon.tsx │ ├── DeleteIcon.tsx │ ├── ImageIcon.tsx │ ├── MarkdownIcon.tsx │ ├── SunIcon.tsx │ ├── PdfIcon.tsx │ ├── SpinnerIcon.tsx │ └── SettingIcon.tsx ├── postcss.config.cjs ├── vite.config.ts ├── tsconfig.node.json ├── tailwind.config.cjs ├── index.html ├── package.json ├── tsconfig.json ├── README.md ├── public └── vite.svg └── LICENSE /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /src/compoenets/Chat/index.tsx: -------------------------------------------------------------------------------- 1 | export { default } from './Chat'; 2 | -------------------------------------------------------------------------------- /src/compoenets/Menu/index.tsx: -------------------------------------------------------------------------------- 1 | export { default } from './Menu'; 2 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /src/compoenets/Chat/Chat.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Chat = () => { 4 | return ( 5 |
6 | 7 |
8 | ) 9 | } 10 | 11 | export default Chat 12 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | }) 8 | -------------------------------------------------------------------------------- /src/compoenets/Menu/ChatHistoryList.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const ChatHistoryList = () => { 4 | return ( 5 |
6 | 7 |
8 | ) 9 | } 10 | 11 | export default ChatHistoryList 12 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | import './index.css' 5 | 6 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | // import './App.css' 2 | 3 | import Chat from "./compoenets/Chat/Chat" 4 | import Menu from "./compoenets/Menu/Menu" 5 | 6 | function App() { 7 | 8 | 9 | return ( 10 | <> 11 |
12 | 13 | 14 |
15 | 16 | ) 17 | } 18 | 19 | export default App 20 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/compoenets/Menu/Menu.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import NewChat from './NewChat' 3 | import ChatHistoryList from './ChatHistoryList' 4 | 5 | const Menu = () => { 6 | return ( 7 | <> 8 | 15 | 16 | ) 17 | } 18 | 19 | export default Menu 20 | -------------------------------------------------------------------------------- /src/assets/icons/TickIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const TickIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | ); 20 | }; 21 | 22 | export default TickIcon; 23 | -------------------------------------------------------------------------------- /src/compoenets/Menu/NewChat.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PlusIcon from '../../assets/icons/PlusIcon' 3 | 4 | const NewChat = () => { 5 | return ( 6 | <> 7 | 8 | 9 | {' '} 10 | 11 | New Chat 12 | 13 | 14 | 15 | 16 | ) 17 | } 18 | 19 | export default NewChat 20 | -------------------------------------------------------------------------------- /src/assets/icons/MoonIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const MoonIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | ); 20 | }; 21 | 22 | export default MoonIcon; 23 | -------------------------------------------------------------------------------- /src/assets/icons/ChatIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const ChatIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | ); 20 | }; 21 | 22 | export default ChatIcon; 23 | -------------------------------------------------------------------------------- /src/assets/icons/AboutIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const AboutIcon = () => { 4 | return ( 5 | 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default AboutIcon; 17 | -------------------------------------------------------------------------------- /src/assets/icons/CrossIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const CrossIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default CrossIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/DownArrow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const DownArrow = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default DownArrow; 24 | -------------------------------------------------------------------------------- /src/assets/icons/EditIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const EditIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default EditIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/PersonIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PersonIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default PersonIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/SendIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SendIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default SendIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/DownChevronArrow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const DownChevronArrow = ({ className }: { className?: string }) => { 4 | return ( 5 | 20 | ); 21 | }; 22 | 23 | export default DownChevronArrow; 24 | -------------------------------------------------------------------------------- /src/assets/icons/HeartIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const HeartIcon = () => { 4 | return ( 5 | 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default HeartIcon; 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatgpt", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "react": "^18.2.0", 13 | "react-dom": "^18.2.0" 14 | }, 15 | "devDependencies": { 16 | "@types/react": "^18.0.27", 17 | "@types/react-dom": "^18.0.10", 18 | "@vitejs/plugin-react": "^3.1.0", 19 | "autoprefixer": "^10.4.14", 20 | "postcss": "^8.4.21", 21 | "tailwindcss": "^3.2.7", 22 | "typescript": "^4.9.3", 23 | "vite": "^4.1.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /src/assets/icons/CopyIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const CopyIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default CopyIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/EditIcon2.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const EditIcon2 = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default EditIcon2; 24 | -------------------------------------------------------------------------------- /src/assets/icons/ExportIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const ExportIcon = (props: React.SVGProps) => { 4 | return ( 5 | 16 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default ExportIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/PlusIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PlusIcon = ({ className }: { className?: string }) => { 4 | return ( 5 | 17 | 18 | 19 | 20 | ); 21 | }; 22 | 23 | export default PlusIcon; 24 | -------------------------------------------------------------------------------- /src/assets/icons/CrossIcon2.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const CrossIcon2 = () => { 4 | return ( 5 | 18 | ); 19 | }; 20 | 21 | export default CrossIcon2; 22 | -------------------------------------------------------------------------------- /src/assets/icons/LogoutIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const LogoutIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | 21 | ); 22 | }; 23 | 24 | export default LogoutIcon; 25 | -------------------------------------------------------------------------------- /src/assets/icons/LinkIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const LinkIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | 21 | ); 22 | }; 23 | 24 | export default LinkIcon; 25 | -------------------------------------------------------------------------------- /src/assets/icons/RefreshIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const RefreshIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | 21 | ); 22 | }; 23 | 24 | export default RefreshIcon; 25 | -------------------------------------------------------------------------------- /src/assets/icons/DeleteIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const DeleteIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | }; 24 | 25 | export default DeleteIcon; 26 | -------------------------------------------------------------------------------- /src/assets/icons/ImageIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const ImageIcon = (props: React.SVGProps) => { 4 | return ( 5 | 12 | 13 | 14 | ); 15 | }; 16 | 17 | export default ImageIcon; 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenAi Chatgpt on your own data 2 | 3 | I am currently in the process of developing the chatbot that utilizes your personal data to answer contextually. I am already halfway through the project, and I plan to open-source the code soon. 4 | 5 | 6 | ## Here are the technical stacks that I am utilizing to build this chatbot: 7 | 8 | - Node.js, Python, MongoDB, and React for the web application 9 | - OpenAI ChatGPT Turbo 3.5 for conversation 10 | - OpenAI Ada model for embedding 11 | - Vectorization for long-term and short-term memory 12 | - Pincones Database for embedding 13 | 14 | 15 | ## Features 16 | - User management system 17 | - Long-term, permanent conversations with the bot 18 | - Custom indexes - use your own files, PDFs, TXT files, websites 19 | - Automatic retry on API errors 20 | - Change and view model parameters such as temp, top\_p, etc. directly 21 | -------------------------------------------------------------------------------- /src/assets/icons/MarkdownIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const MarkdownIcon = (props: React.SVGProps) => { 4 | return ( 5 | 12 | 13 | 14 | ); 15 | }; 16 | 17 | export default MarkdownIcon; 18 | -------------------------------------------------------------------------------- /src/assets/icons/SunIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SunIcon = () => { 4 | return ( 5 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ); 28 | }; 29 | 30 | export default SunIcon; 31 | -------------------------------------------------------------------------------- /src/assets/icons/PdfIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const PdfIcon = (props: React.SVGProps) => { 4 | return ( 5 | 12 | 13 | 14 | ); 15 | }; 16 | 17 | export default PdfIcon; 18 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/icons/SpinnerIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SpinnerIcon = (props: React.SVGProps) => { 4 | return ( 5 | 21 | ); 22 | }; 23 | 24 | export default SpinnerIcon; 25 | -------------------------------------------------------------------------------- /src/assets/icons/SettingIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SettingIcon = (props: React.SVGProps) => { 4 | return ( 5 | 11 | 12 | 13 | ); 14 | }; 15 | 16 | export default SettingIcon; 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | --------------------------------------------------------------------------------