Spaces:
Running
Running
Upload 6 files
Browse files- README.md +55 -55
- package-lock.json +0 -0
- package.json +60 -60
- vite.config.ts +59 -58
README.md
CHANGED
|
@@ -1,55 +1,55 @@
|
|
| 1 |
-
---
|
| 2 |
-
title: UnivAI Chatbot
|
| 3 |
-
emoji: π€
|
| 4 |
-
colorFrom: purple
|
| 5 |
-
colorTo: blue
|
| 6 |
-
sdk: docker
|
| 7 |
-
sdk_version: "1.0.0"
|
| 8 |
-
app_file: app.py
|
| 9 |
-
pinned: false
|
| 10 |
-
---
|
| 11 |
-
|
| 12 |
-
# UnivAI Chatbot Interface & AI Backend
|
| 13 |
-
|
| 14 |
-
This project merges a React UI (Vite) and a Flask AI backend into a single Hugging Face Space using Docker.
|
| 15 |
-
|
| 16 |
-
## Features
|
| 17 |
-
|
| 18 |
-
- Conversational UI for university handbook queries
|
| 19 |
-
- AI backend (Sentence Transformers + LLM) for semantic search and natural responses
|
| 20 |
-
- Feedback API for upvote/downvote tuning
|
| 21 |
-
|
| 22 |
-
## Running Locally
|
| 23 |
-
|
| 24 |
-
```bash
|
| 25 |
-
docker build -t univai-chatbot .
|
| 26 |
-
docker run -p 7860:7860 univai-chatbot
|
| 27 |
-
```
|
| 28 |
-
|
| 29 |
-
- UI available at `http://localhost:7860`
|
| 30 |
-
- API available at `http://localhost:7860/api/chat` and `/api/feedback`
|
| 31 |
-
|
| 32 |
-
## Endpoints
|
| 33 |
-
|
| 34 |
-
- **POST /api/chat**
|
| 35 |
-
`{ "query": "your question", "dev_mode": false }` β `{ "response": "answer" }`
|
| 36 |
-
- **POST /api/feedback**
|
| 37 |
-
`{ "query": "...", "response": "...", "feedback": "positive"|"negative" }` β `{ "status": "success" }`
|
| 38 |
-
|
| 39 |
-
## Hugging Face Spaces
|
| 40 |
-
|
| 41 |
-
- Push this repo and select Docker SDK.
|
| 42 |
-
- The UI and AI will run together, with Nginx proxying `/api/` to the backend.
|
| 43 |
-
|
| 44 |
-
## File Structure
|
| 45 |
-
|
| 46 |
-
- `src/` β React UI
|
| 47 |
-
- `app.py` β Flask AI backend
|
| 48 |
-
- `Dockerfile` β unified build
|
| 49 |
-
- `nginx.conf` β reverse proxy config
|
| 50 |
-
- `requirements.txt` β Python dependencies
|
| 51 |
-
- `dataset.json` β university Q&A set
|
| 52 |
-
|
| 53 |
-
## Connecting UI to AI
|
| 54 |
-
|
| 55 |
-
- The UI should send requests to `/api/chat` and `/api/feedback`.
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: UnivAI Chatbot
|
| 3 |
+
emoji: π€
|
| 4 |
+
colorFrom: purple
|
| 5 |
+
colorTo: blue
|
| 6 |
+
sdk: docker
|
| 7 |
+
sdk_version: "1.0.0"
|
| 8 |
+
app_file: app.py
|
| 9 |
+
pinned: false
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# UnivAI Chatbot Interface & AI Backend
|
| 13 |
+
|
| 14 |
+
This project merges a React UI (Vite) and a Flask AI backend into a single Hugging Face Space using Docker.
|
| 15 |
+
|
| 16 |
+
## Features
|
| 17 |
+
|
| 18 |
+
- Conversational UI for university handbook queries
|
| 19 |
+
- AI backend (Sentence Transformers + LLM) for semantic search and natural responses
|
| 20 |
+
- Feedback API for upvote/downvote tuning
|
| 21 |
+
|
| 22 |
+
## Running Locally
|
| 23 |
+
|
| 24 |
+
```bash
|
| 25 |
+
docker build -t univai-chatbot .
|
| 26 |
+
docker run -p 7860:7860 univai-chatbot
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
- UI available at `http://localhost:7860`
|
| 30 |
+
- API available at `http://localhost:7860/api/chat` and `/api/feedback`
|
| 31 |
+
|
| 32 |
+
## Endpoints
|
| 33 |
+
|
| 34 |
+
- **POST /api/chat**
|
| 35 |
+
`{ "query": "your question", "dev_mode": false }` β `{ "response": "answer" }`
|
| 36 |
+
- **POST /api/feedback**
|
| 37 |
+
`{ "query": "...", "response": "...", "feedback": "positive"|"negative" }` β `{ "status": "success" }`
|
| 38 |
+
|
| 39 |
+
## Hugging Face Spaces
|
| 40 |
+
|
| 41 |
+
- Push this repo and select Docker SDK.
|
| 42 |
+
- The UI and AI will run together, with Nginx proxying `/api/` to the backend.
|
| 43 |
+
|
| 44 |
+
## File Structure
|
| 45 |
+
|
| 46 |
+
- `src/` β React UI
|
| 47 |
+
- `app.py` β Flask AI backend
|
| 48 |
+
- `Dockerfile` β unified build
|
| 49 |
+
- `nginx.conf` β reverse proxy config
|
| 50 |
+
- `requirements.txt` β Python dependencies
|
| 51 |
+
- `dataset.json` β university Q&A set
|
| 52 |
+
|
| 53 |
+
## Connecting UI to AI
|
| 54 |
+
|
| 55 |
+
- The UI should send requests to `/api/chat` and `/api/feedback`.
|
package-lock.json
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|
package.json
CHANGED
|
@@ -1,60 +1,60 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
"
|
| 4 |
-
"
|
| 5 |
-
"
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
},
|
| 56 |
-
"scripts": {
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
}
|
| 60 |
-
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "univai_chatbot_interface",
|
| 3 |
+
"version": "0.1.0",
|
| 4 |
+
"private": true,
|
| 5 |
+
"dependencies": {
|
| 6 |
+
"@radix-ui/react-accordion": "^1.2.3",
|
| 7 |
+
"@radix-ui/react-alert-dialog": "^1.1.6",
|
| 8 |
+
"@radix-ui/react-aspect-ratio": "^1.1.2",
|
| 9 |
+
"@radix-ui/react-avatar": "^1.1.3",
|
| 10 |
+
"@radix-ui/react-checkbox": "^1.1.4",
|
| 11 |
+
"@radix-ui/react-collapsible": "^1.1.3",
|
| 12 |
+
"@radix-ui/react-context-menu": "^2.2.6",
|
| 13 |
+
"@radix-ui/react-dialog": "^1.1.6",
|
| 14 |
+
"@radix-ui/react-dropdown-menu": "^2.1.6",
|
| 15 |
+
"@radix-ui/react-hover-card": "^1.1.6",
|
| 16 |
+
"@radix-ui/react-label": "^2.1.2",
|
| 17 |
+
"@radix-ui/react-menubar": "^1.1.6",
|
| 18 |
+
"@radix-ui/react-navigation-menu": "^1.2.5",
|
| 19 |
+
"@radix-ui/react-popover": "^1.1.6",
|
| 20 |
+
"@radix-ui/react-progress": "^1.1.2",
|
| 21 |
+
"@radix-ui/react-radio-group": "^1.2.3",
|
| 22 |
+
"@radix-ui/react-scroll-area": "^1.2.3",
|
| 23 |
+
"@radix-ui/react-select": "^2.1.6",
|
| 24 |
+
"@radix-ui/react-separator": "^1.1.2",
|
| 25 |
+
"@radix-ui/react-slider": "^1.2.3",
|
| 26 |
+
"@radix-ui/react-slot": "^1.1.2",
|
| 27 |
+
"@radix-ui/react-switch": "^1.1.3",
|
| 28 |
+
"@radix-ui/react-tabs": "^1.1.3",
|
| 29 |
+
"@radix-ui/react-toggle": "^1.1.2",
|
| 30 |
+
"@radix-ui/react-toggle-group": "^1.1.2",
|
| 31 |
+
"@radix-ui/react-tooltip": "^1.1.8",
|
| 32 |
+
"class-variance-authority": "^0.7.1",
|
| 33 |
+
"clsx": "*",
|
| 34 |
+
"cmdk": "^1.1.1",
|
| 35 |
+
"embla-carousel-react": "^8.6.0",
|
| 36 |
+
"input-otp": "^1.4.2",
|
| 37 |
+
"lucide-react": "^0.487.0",
|
| 38 |
+
"motion": "*",
|
| 39 |
+
"next-themes": "^0.4.6",
|
| 40 |
+
"react": "^18.3.1",
|
| 41 |
+
"react-day-picker": "^8.10.1",
|
| 42 |
+
"react-dom": "^18.3.1",
|
| 43 |
+
"react-hook-form": "^7.55.0",
|
| 44 |
+
"react-resizable-panels": "^2.1.7",
|
| 45 |
+
"recharts": "^2.15.2",
|
| 46 |
+
"sonner": "^2.0.3",
|
| 47 |
+
"tailwind-merge": "*",
|
| 48 |
+
"vaul": "^1.1.2"
|
| 49 |
+
},
|
| 50 |
+
"devDependencies": {
|
| 51 |
+
"@types/node": "^20.10.0",
|
| 52 |
+
"@types/react": "^19.2.2",
|
| 53 |
+
"@vitejs/plugin-react-swc": "^3.10.2",
|
| 54 |
+
"vite": "^5.4.19"
|
| 55 |
+
},
|
| 56 |
+
"scripts": {
|
| 57 |
+
"dev": "vite",
|
| 58 |
+
"build": "vite build"
|
| 59 |
+
}
|
| 60 |
+
}
|
vite.config.ts
CHANGED
|
@@ -1,59 +1,60 @@
|
|
| 1 |
-
|
| 2 |
-
import
|
| 3 |
-
import
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
'
|
| 12 |
-
'
|
| 13 |
-
'
|
| 14 |
-
'react-
|
| 15 |
-
'react-
|
| 16 |
-
'
|
| 17 |
-
'
|
| 18 |
-
'
|
| 19 |
-
'
|
| 20 |
-
'
|
| 21 |
-
'
|
| 22 |
-
'
|
| 23 |
-
'@radix-ui/react-
|
| 24 |
-
'@radix-ui/react-toggle
|
| 25 |
-
'@radix-ui/react-
|
| 26 |
-
'@radix-ui/react-
|
| 27 |
-
'@radix-ui/react-
|
| 28 |
-
'@radix-ui/react-
|
| 29 |
-
'@radix-ui/react-
|
| 30 |
-
'@radix-ui/react-
|
| 31 |
-
'@radix-ui/react-
|
| 32 |
-
'@radix-ui/react-
|
| 33 |
-
'@radix-ui/react-
|
| 34 |
-
'@radix-ui/react-
|
| 35 |
-
'@radix-ui/react-
|
| 36 |
-
'@radix-ui/react-
|
| 37 |
-
'@radix-ui/react-
|
| 38 |
-
'@radix-ui/react-
|
| 39 |
-
'@radix-ui/react-
|
| 40 |
-
'@radix-ui/react-
|
| 41 |
-
'@radix-ui/react-
|
| 42 |
-
'@radix-ui/react-
|
| 43 |
-
'@radix-ui/react-
|
| 44 |
-
'@radix-ui/react-
|
| 45 |
-
'@radix-ui/react-
|
| 46 |
-
'@radix-ui/react-
|
| 47 |
-
'@radix-ui/react-
|
| 48 |
-
'@':
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
|
|
|
| 59 |
});
|
|
|
|
| 1 |
+
|
| 2 |
+
import { defineConfig } from 'vite';
|
| 3 |
+
import react from '@vitejs/plugin-react-swc';
|
| 4 |
+
import path from 'path';
|
| 5 |
+
|
| 6 |
+
export default defineConfig({
|
| 7 |
+
plugins: [react()],
|
| 8 |
+
resolve: {
|
| 9 |
+
extensions: ['.js', '.jsx', '.ts', '.tsx', '.json'],
|
| 10 |
+
alias: {
|
| 11 |
+
'vaul@1.1.2': 'vaul',
|
| 12 |
+
'sonner@2.0.3': 'sonner',
|
| 13 |
+
'recharts@2.15.2': 'recharts',
|
| 14 |
+
'react-resizable-panels@2.1.7': 'react-resizable-panels',
|
| 15 |
+
'react-hook-form@7.55.0': 'react-hook-form',
|
| 16 |
+
'react-day-picker@8.10.1': 'react-day-picker',
|
| 17 |
+
'next-themes@0.4.6': 'next-themes',
|
| 18 |
+
'lucide-react@0.487.0': 'lucide-react',
|
| 19 |
+
'input-otp@1.4.2': 'input-otp',
|
| 20 |
+
'embla-carousel-react@8.6.0': 'embla-carousel-react',
|
| 21 |
+
'cmdk@1.1.1': 'cmdk',
|
| 22 |
+
'class-variance-authority@0.7.1': 'class-variance-authority',
|
| 23 |
+
'@radix-ui/react-tooltip@1.1.8': '@radix-ui/react-tooltip',
|
| 24 |
+
'@radix-ui/react-toggle@1.1.2': '@radix-ui/react-toggle',
|
| 25 |
+
'@radix-ui/react-toggle-group@1.1.2': '@radix-ui/react-toggle-group',
|
| 26 |
+
'@radix-ui/react-tabs@1.1.3': '@radix-ui/react-tabs',
|
| 27 |
+
'@radix-ui/react-switch@1.1.3': '@radix-ui/react-switch',
|
| 28 |
+
'@radix-ui/react-slot@1.1.2': '@radix-ui/react-slot',
|
| 29 |
+
'@radix-ui/react-slider@1.2.3': '@radix-ui/react-slider',
|
| 30 |
+
'@radix-ui/react-separator@1.1.2': '@radix-ui/react-separator',
|
| 31 |
+
'@radix-ui/react-select@2.1.6': '@radix-ui/react-select',
|
| 32 |
+
'@radix-ui/react-scroll-area@1.2.3': '@radix-ui/react-scroll-area',
|
| 33 |
+
'@radix-ui/react-radio-group@1.2.3': '@radix-ui/react-radio-group',
|
| 34 |
+
'@radix-ui/react-progress@1.1.2': '@radix-ui/react-progress',
|
| 35 |
+
'@radix-ui/react-popover@1.1.6': '@radix-ui/react-popover',
|
| 36 |
+
'@radix-ui/react-navigation-menu@1.2.5': '@radix-ui/react-navigation-menu',
|
| 37 |
+
'@radix-ui/react-menubar@1.1.6': '@radix-ui/react-menubar',
|
| 38 |
+
'@radix-ui/react-label@2.1.2': '@radix-ui/react-label',
|
| 39 |
+
'@radix-ui/react-hover-card@1.1.6': '@radix-ui/react-hover-card',
|
| 40 |
+
'@radix-ui/react-dropdown-menu@2.1.6': '@radix-ui/react-dropdown-menu',
|
| 41 |
+
'@radix-ui/react-dialog@1.1.6': '@radix-ui/react-dialog',
|
| 42 |
+
'@radix-ui/react-context-menu@2.2.6': '@radix-ui/react-context-menu',
|
| 43 |
+
'@radix-ui/react-collapsible@1.1.3': '@radix-ui/react-collapsible',
|
| 44 |
+
'@radix-ui/react-checkbox@1.1.4': '@radix-ui/react-checkbox',
|
| 45 |
+
'@radix-ui/react-avatar@1.1.3': '@radix-ui/react-avatar',
|
| 46 |
+
'@radix-ui/react-aspect-ratio@1.1.2': '@radix-ui/react-aspect-ratio',
|
| 47 |
+
'@radix-ui/react-alert-dialog@1.1.6': '@radix-ui/react-alert-dialog',
|
| 48 |
+
'@radix-ui/react-accordion@1.2.3': '@radix-ui/react-accordion',
|
| 49 |
+
'@': path.resolve(__dirname, './src'),
|
| 50 |
+
},
|
| 51 |
+
},
|
| 52 |
+
build: {
|
| 53 |
+
target: 'esnext',
|
| 54 |
+
outDir: 'build',
|
| 55 |
+
},
|
| 56 |
+
server: {
|
| 57 |
+
port: 3000,
|
| 58 |
+
open: true,
|
| 59 |
+
},
|
| 60 |
});
|