Spaces:
Sleeping
Sleeping
Tobias Geisler
commited on
Commit
·
0a440b6
1
Parent(s):
8566571
template init: simple chatbot
Browse files- .gitignore +59 -0
- README_DEV.md +131 -0
- app.py +30 -0
- requirements.txt +111 -0
- utils.py +27 -0
.gitignore
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Virtual environment
|
2 |
+
gradio-env/
|
3 |
+
|
4 |
+
# Python cache files
|
5 |
+
__pycache__/
|
6 |
+
*.py[cod]
|
7 |
+
*$py.class
|
8 |
+
|
9 |
+
# C extensions
|
10 |
+
*.so
|
11 |
+
|
12 |
+
# Distribution / packaging
|
13 |
+
.Python
|
14 |
+
build/
|
15 |
+
develop-eggs/
|
16 |
+
dist/
|
17 |
+
downloads/
|
18 |
+
eggs/
|
19 |
+
.eggs/
|
20 |
+
lib/
|
21 |
+
lib64/
|
22 |
+
parts/
|
23 |
+
sdist/
|
24 |
+
var/
|
25 |
+
wheels/
|
26 |
+
*.egg-info/
|
27 |
+
.installed.cfg
|
28 |
+
*.egg
|
29 |
+
|
30 |
+
# PyInstaller
|
31 |
+
*.manifest
|
32 |
+
*.spec
|
33 |
+
|
34 |
+
# Jupyter Notebook
|
35 |
+
.ipynb_checkpoints
|
36 |
+
|
37 |
+
# PyCharm
|
38 |
+
.idea/
|
39 |
+
|
40 |
+
# VS Code
|
41 |
+
.vscode/
|
42 |
+
|
43 |
+
# Environment variables
|
44 |
+
.env
|
45 |
+
|
46 |
+
# OS generated files
|
47 |
+
.DS_Store
|
48 |
+
.DS_Store?
|
49 |
+
._*
|
50 |
+
.Spotlight-V100
|
51 |
+
.Trashes
|
52 |
+
ehthumbs.db
|
53 |
+
Thumbs.db
|
54 |
+
|
55 |
+
# Gradio specific
|
56 |
+
flagged/
|
57 |
+
|
58 |
+
# Logs
|
59 |
+
*.log
|
README_DEV.md
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
To run Gradio apps locally using Windows Subsystem for Linux (WSL) and Visual Studio Code (VSCode), follow these steps:
|
2 |
+
|
3 |
+
## **1. Set Up WSL**
|
4 |
+
|
5 |
+
### **Enable WSL**
|
6 |
+
1. **Windows Features Dialog:**
|
7 |
+
- Open the Windows search bar, type "features," and select *Turn Windows Features on or off*.
|
8 |
+
- Scroll down and check *Windows Subsystem for Linux*.
|
9 |
+
- Click *OK* and restart your computer.
|
10 |
+
|
11 |
+
2. **PowerShell:**
|
12 |
+
- Open PowerShell as an Administrator and run:
|
13 |
+
```powershell
|
14 |
+
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
|
15 |
+
```
|
16 |
+
- Restart your computer when prompted.
|
17 |
+
|
18 |
+
### **Install a Linux Distro**
|
19 |
+
1. Open the Microsoft Store and search for a Linux distribution (e.g., Ubuntu).
|
20 |
+
2. Install and launch the distribution.
|
21 |
+
3. Follow the prompts to complete the installation and create a user ID and password.
|
22 |
+
|
23 |
+
## **2. Set Up Visual Studio Code with WSL**
|
24 |
+
|
25 |
+
### **Install VSCode and WSL Extension**
|
26 |
+
1. Download and install [Visual Studio Code](https://code.visualstudio.com/).
|
27 |
+
2. Install the *Remote - WSL* extension from the VSCode marketplace.
|
28 |
+
|
29 |
+
### **Open a WSL Terminal in VSCode**
|
30 |
+
1. Open your WSL terminal (e.g., Ubuntu).
|
31 |
+
2. Navigate to your project directory.
|
32 |
+
3. Type `code .` to open the current directory in VSCode.
|
33 |
+
|
34 |
+
## **3. Install and Run Gradio in a Virtual Environment**
|
35 |
+
|
36 |
+
### **Create a Virtual Environment**
|
37 |
+
1. In your WSL terminal, navigate to your project directory:
|
38 |
+
```bash
|
39 |
+
cd /path/to/your/project
|
40 |
+
```
|
41 |
+
2. Create a virtual environment:
|
42 |
+
```bash
|
43 |
+
python3 -m venv gradio-env
|
44 |
+
```
|
45 |
+
3. Activate the virtual environment:
|
46 |
+
```bash
|
47 |
+
source gradio-env/bin/activate
|
48 |
+
```
|
49 |
+
|
50 |
+
### **Install Gradio**
|
51 |
+
1. With the virtual environment activated, install Gradio:
|
52 |
+
```bash
|
53 |
+
pip install gradio
|
54 |
+
```
|
55 |
+
|
56 |
+
### **Run the App**
|
57 |
+
|
58 |
+
```
|
59 |
+
2. Run the Gradio app:
|
60 |
+
```bash
|
61 |
+
python app.py
|
62 |
+
```
|
63 |
+
3. The app will open in a browser at `http://localhost:7860`.
|
64 |
+
|
65 |
+
### **Hot Reload Mode (Optional)**
|
66 |
+
For development convenience, you can use Gradio's hot reload mode:
|
67 |
+
```bash
|
68 |
+
gradio app.py
|
69 |
+
```
|
70 |
+
|
71 |
+
This setup allows you to develop and run Gradio apps efficiently using WSL and VSCode, leveraging the power of a Linux environment on a Windows machine[1][3][4][5].
|
72 |
+
|
73 |
+
Citations:
|
74 |
+
[1] https://code.visualstudio.com/docs/remote/wsl-tutorial
|
75 |
+
[2] https://learn.microsoft.com/en-us/windows/ai/toolkit/toolkit-fine-tune
|
76 |
+
[3] https://www.gradio.app/guides/quickstart
|
77 |
+
[4] https://code.visualstudio.com/docs/remote/wsl
|
78 |
+
[5] https://www.gradio.app/guides/installing-gradio-in-a-virtual-environment
|
79 |
+
|
80 |
+
To automatically create and update a requirements.txt file for your Python application, you have several options. Here are the most effective methods:
|
81 |
+
|
82 |
+
# Updating the requirements.txt
|
83 |
+
|
84 |
+
## **Using pipreqs (Recommended)**
|
85 |
+
|
86 |
+
Pipreqs is a third-party tool that analyzes your project's imports and generates a more accurate requirements.txt file[4][8].
|
87 |
+
|
88 |
+
1. Install pipreqs:
|
89 |
+
```bash
|
90 |
+
pip install pipreqs
|
91 |
+
```
|
92 |
+
2. Navigate to your project directory.
|
93 |
+
3. Run pipreqs:
|
94 |
+
```bash
|
95 |
+
pipreqs .
|
96 |
+
```
|
97 |
+
|
98 |
+
Pipreqs will scan your project, identify the imports, and create a requirements.txt file with only the packages your project actually uses[4][8].
|
99 |
+
|
100 |
+
## **TODO Automating with GitHub Actions**
|
101 |
+
|
102 |
+
For projects hosted on GitHub, you can automate the process using GitHub Actions:
|
103 |
+
|
104 |
+
1. Create a workflow file (e.g., `.github/workflows/update-requirements.yml`).
|
105 |
+
2. Use an action like `timmypidashev/auto-pipreqs-cpy@master` to automatically generate the requirements.txt file[5].
|
106 |
+
|
107 |
+
## **Best Practices**
|
108 |
+
|
109 |
+
1. **Use virtual environments**: This ensures your requirements.txt only includes project-specific dependencies[4].
|
110 |
+
2. **Specify versions**: Use `==` to pin exact versions for reproducibility[4].
|
111 |
+
3. **Update regularly**: Keep your requirements.txt up to date as you add or remove dependencies[4].
|
112 |
+
4. **Review generated files**: Always review automatically generated requirements.txt files to ensure they're accurate and complete[6].
|
113 |
+
|
114 |
+
By following these methods and best practices, you can efficiently manage your Python project's dependencies and ensure consistency across different environments.
|
115 |
+
|
116 |
+
Citations:
|
117 |
+
[1] https://stackoverflow.com/questions/31684375/automatically-create-file-requirements-txt
|
118 |
+
[2] https://www.mend.io/free-developer-tools/a/community/software-dependencies/how-can-i-automatically-generate-and-update-a-requirements-txt-file-from-a-pipfile-using-pipenv/
|
119 |
+
[3] https://stackoverflow.com/questions/24764549/upgrade-python-packages-from-requirements-txt-using-pip-command
|
120 |
+
[4] https://www.squash.io/how-to-automatically-create-requirementstxt-in-python/
|
121 |
+
[5] https://github.com/marketplace/actions/automatic-requirements-txt-generation-for-python-projects
|
122 |
+
[6] https://pynwb.readthedocs.io/en/stable/update_requirements.html
|
123 |
+
[7] https://www.geeksforgeeks.org/how-to-create-requirements-txt-file-in-python/
|
124 |
+
[8] https://www.youtube.com/watch?v=0ZeoruSobc4
|
125 |
+
[9] https://www.paleblueapps.com/rockandnull/python-update-requirements-txt/
|
126 |
+
[10] https://www.scaler.com/topics/how-to-create-requirements-txt-python/
|
127 |
+
[11] https://learn.microsoft.com/en-us/visualstudio/python/managing-required-packages-with-requirements-txt?view=vs-2022
|
128 |
+
[12] https://www.jetbrains.com/help/pycharm/managing-dependencies.html
|
129 |
+
[13] https://note.nkmk.me/en/python-pip-install-requirements/
|
130 |
+
[14] https://www.freecodecamp.org/news/python-requirementstxt-explained/
|
131 |
+
[15] https://learnpython.com/blog/python-requirements-file/
|
app.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from openai import OpenAI
|
3 |
+
from utils import get_secret
|
4 |
+
|
5 |
+
# Initialize the OpenAI client
|
6 |
+
client = OpenAI(api_key=get_secret('OPENAI_API_KEY'))
|
7 |
+
|
8 |
+
def generate_response(prompt):
|
9 |
+
try:
|
10 |
+
response = client.chat.completions.create(
|
11 |
+
model="gpt-3.5-turbo",
|
12 |
+
messages=[
|
13 |
+
{"role": "system", "content": "You are a helpful assistant."},
|
14 |
+
{"role": "user", "content": prompt}
|
15 |
+
]
|
16 |
+
)
|
17 |
+
return response.choices[0].message.content
|
18 |
+
except Exception as e:
|
19 |
+
return str(e)
|
20 |
+
|
21 |
+
demo = gr.Interface(
|
22 |
+
fn=generate_response,
|
23 |
+
inputs="text",
|
24 |
+
outputs="text",
|
25 |
+
title="OpenAI GPT-3.5 Turbo Chatbot",
|
26 |
+
description="Enter a prompt to get a response from OpenAI's GPT-3.5 Turbo model."
|
27 |
+
)
|
28 |
+
|
29 |
+
if __name__ == "__main__":
|
30 |
+
demo.launch()
|
requirements.txt
ADDED
@@ -0,0 +1,111 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
aiofiles==23.2.1
|
2 |
+
altair==5.3.0
|
3 |
+
annotated-types==0.7.0
|
4 |
+
anyio==4.4.0
|
5 |
+
asttokens==2.4.1
|
6 |
+
attrs==23.2.0
|
7 |
+
backcall==0.2.0
|
8 |
+
beautifulsoup4==4.12.3
|
9 |
+
bleach==6.1.0
|
10 |
+
build==1.2.1
|
11 |
+
certifi==2024.7.4
|
12 |
+
charset-normalizer==3.3.2
|
13 |
+
click==8.1.7
|
14 |
+
contourpy==1.2.1
|
15 |
+
cycler==0.12.1
|
16 |
+
decorator==5.1.1
|
17 |
+
defusedxml==0.7.1
|
18 |
+
distro==1.9.0
|
19 |
+
dnspython==2.6.1
|
20 |
+
docopt==0.6.2
|
21 |
+
email_validator==2.2.0
|
22 |
+
executing==2.0.1
|
23 |
+
fastapi==0.111.1
|
24 |
+
fastapi-cli==0.0.4
|
25 |
+
fastjsonschema==2.20.0
|
26 |
+
ffmpy==0.3.2
|
27 |
+
filelock==3.15.4
|
28 |
+
fonttools==4.53.1
|
29 |
+
fsspec==2024.6.1
|
30 |
+
gradio==4.38.1
|
31 |
+
gradio_client==1.1.0
|
32 |
+
h11==0.14.0
|
33 |
+
httpcore==1.0.5
|
34 |
+
httptools==0.6.1
|
35 |
+
httpx==0.27.0
|
36 |
+
huggingface-hub==0.23.5
|
37 |
+
idna==3.7
|
38 |
+
importlib_resources==6.4.0
|
39 |
+
ipython==8.12.3
|
40 |
+
jedi==0.19.1
|
41 |
+
Jinja2==3.1.4
|
42 |
+
jsonschema==4.23.0
|
43 |
+
jsonschema-specifications==2023.12.1
|
44 |
+
jupyter_client==8.6.2
|
45 |
+
jupyter_core==5.7.2
|
46 |
+
jupyterlab_pygments==0.3.0
|
47 |
+
kiwisolver==1.4.5
|
48 |
+
markdown-it-py==3.0.0
|
49 |
+
MarkupSafe==2.1.5
|
50 |
+
matplotlib==3.9.1
|
51 |
+
matplotlib-inline==0.1.7
|
52 |
+
mdurl==0.1.2
|
53 |
+
mistune==3.0.2
|
54 |
+
nbclient==0.10.0
|
55 |
+
nbconvert==7.16.4
|
56 |
+
nbformat==5.10.4
|
57 |
+
numpy==2.0.0
|
58 |
+
openai==1.35.14
|
59 |
+
orjson==3.10.6
|
60 |
+
packaging==24.1
|
61 |
+
pandas==2.2.2
|
62 |
+
pandocfilters==1.5.1
|
63 |
+
parso==0.8.4
|
64 |
+
pexpect==4.9.0
|
65 |
+
pickleshare==0.7.5
|
66 |
+
pillow==10.4.0
|
67 |
+
platformdirs==4.2.2
|
68 |
+
prompt_toolkit==3.0.47
|
69 |
+
ptyprocess==0.7.0
|
70 |
+
pure-eval==0.2.2
|
71 |
+
pydantic==2.8.2
|
72 |
+
pydantic_core==2.20.1
|
73 |
+
pydub==0.25.1
|
74 |
+
Pygments==2.18.0
|
75 |
+
pyparsing==3.1.2
|
76 |
+
pyproject_hooks==1.1.0
|
77 |
+
python-dateutil==2.9.0.post0
|
78 |
+
python-dotenv==1.0.1
|
79 |
+
python-multipart==0.0.9
|
80 |
+
pytz==2024.1
|
81 |
+
PyYAML==6.0.1
|
82 |
+
pyzmq==26.0.3
|
83 |
+
referencing==0.35.1
|
84 |
+
requests==2.32.3
|
85 |
+
rich==13.7.1
|
86 |
+
rpds-py==0.19.0
|
87 |
+
ruff==0.5.2
|
88 |
+
semantic-version==2.10.0
|
89 |
+
shellingham==1.5.4
|
90 |
+
six==1.16.0
|
91 |
+
sniffio==1.3.1
|
92 |
+
soupsieve==2.5
|
93 |
+
stack-data==0.6.3
|
94 |
+
starlette==0.37.2
|
95 |
+
tinycss2==1.3.0
|
96 |
+
tomlkit==0.12.0
|
97 |
+
toolz==0.12.1
|
98 |
+
tornado==6.4.1
|
99 |
+
tqdm==4.66.4
|
100 |
+
traitlets==5.14.3
|
101 |
+
typer==0.12.3
|
102 |
+
typing_extensions==4.12.2
|
103 |
+
tzdata==2024.1
|
104 |
+
urllib3==2.2.2
|
105 |
+
uvicorn==0.30.1
|
106 |
+
uvloop==0.19.0
|
107 |
+
watchfiles==0.22.0
|
108 |
+
wcwidth==0.2.13
|
109 |
+
webencodings==0.5.1
|
110 |
+
websockets==11.0.3
|
111 |
+
yarg==0.1.9
|
utils.py
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
from dotenv import load_dotenv
|
3 |
+
|
4 |
+
def get_secret(key: str, default: str = None) -> str:
|
5 |
+
"""
|
6 |
+
Retrieve a secret from environment variables or .env file.
|
7 |
+
|
8 |
+
Args:
|
9 |
+
key (str): The name of the secret/environment variable.
|
10 |
+
default (str, optional): A default value if the secret is not found.
|
11 |
+
|
12 |
+
Returns:
|
13 |
+
str: The value of the secret, or the default value if not found.
|
14 |
+
"""
|
15 |
+
# Load .env file if it exists (for local development)
|
16 |
+
load_dotenv()
|
17 |
+
|
18 |
+
# Try to get the secret from environment variables
|
19 |
+
secret = os.getenv(key)
|
20 |
+
|
21 |
+
if secret is None:
|
22 |
+
if default is not None:
|
23 |
+
return default
|
24 |
+
else:
|
25 |
+
raise ValueError(f"Secret '{key}' not found in environment variables and no default provided.")
|
26 |
+
|
27 |
+
return secret
|