Spaces:
Sleeping
Sleeping
Nagesh Muralidhar
commited on
Commit
·
1734572
1
Parent(s):
acf6e98
Assignment
Browse files- .chainlit/config.toml +84 -0
- .env.sample +1 -0
- .gitattributes copy +35 -0
- .gitignore +182 -0
- Dockerfile +11 -0
- LICENSE +21 -0
- README copy.md +254 -0
- app.py +80 -0
- app/hello_world.ipynb +69 -0
- app/hello_world.py +1 -0
- chainlit.md +3 -0
- requirements.txt +6 -0
.chainlit/config.toml
ADDED
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
[project]
|
2 |
+
# Whether to enable telemetry (default: true). No personal data is collected.
|
3 |
+
enable_telemetry = true
|
4 |
+
|
5 |
+
# List of environment variables to be provided by each user to use the app.
|
6 |
+
user_env = []
|
7 |
+
|
8 |
+
# Duration (in seconds) during which the session is saved when the connection is lost
|
9 |
+
session_timeout = 3600
|
10 |
+
|
11 |
+
# Enable third parties caching (e.g LangChain cache)
|
12 |
+
cache = false
|
13 |
+
|
14 |
+
# Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)
|
15 |
+
# follow_symlink = false
|
16 |
+
|
17 |
+
[features]
|
18 |
+
# Show the prompt playground
|
19 |
+
prompt_playground = true
|
20 |
+
|
21 |
+
# Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)
|
22 |
+
unsafe_allow_html = false
|
23 |
+
|
24 |
+
# Process and display mathematical expressions. This can clash with "$" characters in messages.
|
25 |
+
latex = false
|
26 |
+
|
27 |
+
# Authorize users to upload files with messages
|
28 |
+
multi_modal = true
|
29 |
+
|
30 |
+
# Allows user to use speech to text
|
31 |
+
[features.speech_to_text]
|
32 |
+
enabled = false
|
33 |
+
# See all languages here https://github.com/JamesBrill/react-speech-recognition/blob/HEAD/docs/API.md#language-string
|
34 |
+
# language = "en-US"
|
35 |
+
|
36 |
+
[UI]
|
37 |
+
# Name of the app and chatbot.
|
38 |
+
name = "Chatbot"
|
39 |
+
|
40 |
+
# Show the readme while the conversation is empty.
|
41 |
+
show_readme_as_default = true
|
42 |
+
|
43 |
+
# Description of the app and chatbot. This is used for HTML tags.
|
44 |
+
# description = ""
|
45 |
+
|
46 |
+
# Large size content are by default collapsed for a cleaner ui
|
47 |
+
default_collapse_content = true
|
48 |
+
|
49 |
+
# The default value for the expand messages settings.
|
50 |
+
default_expand_messages = false
|
51 |
+
|
52 |
+
# Hide the chain of thought details from the user in the UI.
|
53 |
+
hide_cot = false
|
54 |
+
|
55 |
+
# Link to your github repo. This will add a github button in the UI's header.
|
56 |
+
# github = ""
|
57 |
+
|
58 |
+
# Specify a CSS file that can be used to customize the user interface.
|
59 |
+
# The CSS file can be served from the public directory or via an external link.
|
60 |
+
# custom_css = "/public/test.css"
|
61 |
+
|
62 |
+
# Override default MUI light theme. (Check theme.ts)
|
63 |
+
[UI.theme.light]
|
64 |
+
#background = "#FAFAFA"
|
65 |
+
#paper = "#FFFFFF"
|
66 |
+
|
67 |
+
[UI.theme.light.primary]
|
68 |
+
#main = "#F80061"
|
69 |
+
#dark = "#980039"
|
70 |
+
#light = "#FFE7EB"
|
71 |
+
|
72 |
+
# Override default MUI dark theme. (Check theme.ts)
|
73 |
+
[UI.theme.dark]
|
74 |
+
#background = "#FAFAFA"
|
75 |
+
#paper = "#FFFFFF"
|
76 |
+
|
77 |
+
[UI.theme.dark.primary]
|
78 |
+
#main = "#F80061"
|
79 |
+
#dark = "#980039"
|
80 |
+
#light = "#FFE7EB"
|
81 |
+
|
82 |
+
|
83 |
+
[meta]
|
84 |
+
generated_by = "0.7.700"
|
.env.sample
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
OPENAI_API_KEY=###
|
.gitattributes copy
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
.gitignore
ADDED
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Byte-compiled / optimized / DLL files
|
2 |
+
__pycache__/
|
3 |
+
*.py[cod]
|
4 |
+
*$py.class
|
5 |
+
|
6 |
+
# C extensions
|
7 |
+
*.so
|
8 |
+
|
9 |
+
# Distribution / packaging
|
10 |
+
.Python
|
11 |
+
build/
|
12 |
+
develop-eggs/
|
13 |
+
dist/
|
14 |
+
downloads/
|
15 |
+
eggs/
|
16 |
+
.eggs/
|
17 |
+
lib/
|
18 |
+
lib64/
|
19 |
+
parts/
|
20 |
+
sdist/
|
21 |
+
var/
|
22 |
+
wheels/
|
23 |
+
share/python-wheels/
|
24 |
+
*.egg-info/
|
25 |
+
.installed.cfg
|
26 |
+
*.egg
|
27 |
+
MANIFEST
|
28 |
+
|
29 |
+
# PyInstaller
|
30 |
+
# Usually these files are written by a python script from a template
|
31 |
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
32 |
+
*.manifest
|
33 |
+
*.spec
|
34 |
+
|
35 |
+
# Installer logs
|
36 |
+
pip-log.txt
|
37 |
+
pip-delete-this-directory.txt
|
38 |
+
|
39 |
+
# Unit test / coverage reports
|
40 |
+
htmlcov/
|
41 |
+
.tox/
|
42 |
+
.nox/
|
43 |
+
.coverage
|
44 |
+
.coverage.*
|
45 |
+
.cache
|
46 |
+
nosetests.xml
|
47 |
+
coverage.xml
|
48 |
+
*.cover
|
49 |
+
*.py,cover
|
50 |
+
.hypothesis/
|
51 |
+
.pytest_cache/
|
52 |
+
cover/
|
53 |
+
|
54 |
+
# Translations
|
55 |
+
*.mo
|
56 |
+
*.pot
|
57 |
+
|
58 |
+
# Django stuff:
|
59 |
+
*.log
|
60 |
+
local_settings.py
|
61 |
+
db.sqlite3
|
62 |
+
db.sqlite3-journal
|
63 |
+
|
64 |
+
# Flask stuff:
|
65 |
+
instance/
|
66 |
+
.webassets-cache
|
67 |
+
|
68 |
+
# Scrapy stuff:
|
69 |
+
.scrapy
|
70 |
+
|
71 |
+
# Sphinx documentation
|
72 |
+
docs/_build/
|
73 |
+
|
74 |
+
# PyBuilder
|
75 |
+
.pybuilder/
|
76 |
+
target/
|
77 |
+
|
78 |
+
# Jupyter Notebook
|
79 |
+
.ipynb_checkpoints
|
80 |
+
|
81 |
+
# IPython
|
82 |
+
profile_default/
|
83 |
+
ipython_config.py
|
84 |
+
|
85 |
+
# pyenv
|
86 |
+
# For a library or package, you might want to ignore these files since the code is
|
87 |
+
# intended to run in multiple environments; otherwise, check them in:
|
88 |
+
# .python-version
|
89 |
+
|
90 |
+
# pipenv
|
91 |
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
92 |
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
93 |
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
94 |
+
# install all needed dependencies.
|
95 |
+
#Pipfile.lock
|
96 |
+
|
97 |
+
<<<<<<< HEAD
|
98 |
+
# UV
|
99 |
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
100 |
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
101 |
+
# commonly ignored for libraries.
|
102 |
+
#uv.lock
|
103 |
+
|
104 |
+
=======
|
105 |
+
>>>>>>> BCBranch
|
106 |
+
# poetry
|
107 |
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
108 |
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
109 |
+
# commonly ignored for libraries.
|
110 |
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
111 |
+
#poetry.lock
|
112 |
+
|
113 |
+
# pdm
|
114 |
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
115 |
+
#pdm.lock
|
116 |
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
117 |
+
# in version control.
|
118 |
+
<<<<<<< HEAD
|
119 |
+
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
120 |
+
.pdm.toml
|
121 |
+
.pdm-python
|
122 |
+
.pdm-build/
|
123 |
+
=======
|
124 |
+
# https://pdm.fming.dev/#use-with-ide
|
125 |
+
.pdm.toml
|
126 |
+
>>>>>>> BCBranch
|
127 |
+
|
128 |
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
129 |
+
__pypackages__/
|
130 |
+
|
131 |
+
# Celery stuff
|
132 |
+
celerybeat-schedule
|
133 |
+
celerybeat.pid
|
134 |
+
|
135 |
+
# SageMath parsed files
|
136 |
+
*.sage.py
|
137 |
+
|
138 |
+
# Environments
|
139 |
+
.env
|
140 |
+
.venv
|
141 |
+
env/
|
142 |
+
venv/
|
143 |
+
ENV/
|
144 |
+
env.bak/
|
145 |
+
venv.bak/
|
146 |
+
|
147 |
+
# Spyder project settings
|
148 |
+
.spyderproject
|
149 |
+
.spyproject
|
150 |
+
|
151 |
+
# Rope project settings
|
152 |
+
.ropeproject
|
153 |
+
|
154 |
+
# mkdocs documentation
|
155 |
+
/site
|
156 |
+
|
157 |
+
# mypy
|
158 |
+
.mypy_cache/
|
159 |
+
.dmypy.json
|
160 |
+
dmypy.json
|
161 |
+
|
162 |
+
# Pyre type checker
|
163 |
+
.pyre/
|
164 |
+
|
165 |
+
# pytype static type analyzer
|
166 |
+
.pytype/
|
167 |
+
|
168 |
+
# Cython debug symbols
|
169 |
+
cython_debug/
|
170 |
+
|
171 |
+
# PyCharm
|
172 |
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
173 |
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
174 |
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
175 |
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
176 |
+
#.idea/
|
177 |
+
<<<<<<< HEAD
|
178 |
+
|
179 |
+
# PyPI configuration file
|
180 |
+
.pypirc
|
181 |
+
=======
|
182 |
+
>>>>>>> BCBranch
|
Dockerfile
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM python:3.9
|
2 |
+
RUN useradd -m -u 1000 user
|
3 |
+
USER user
|
4 |
+
ENV HOME=/home/user \
|
5 |
+
PATH=/home/user/.local/bin:$PATH
|
6 |
+
WORKDIR $HOME/app
|
7 |
+
COPY --chown=user . $HOME/app
|
8 |
+
COPY ./requirements.txt ~/app/requirements.txt
|
9 |
+
RUN pip install -r requirements.txt
|
10 |
+
COPY . .
|
11 |
+
CMD ["chainlit", "run", "app.py", "--port", "7860"]
|
LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
MIT License
|
2 |
+
|
3 |
+
Copyright (c) 2025 NageshMuralidhar
|
4 |
+
|
5 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6 |
+
of this software and associated documentation files (the "Software"), to deal
|
7 |
+
in the Software without restriction, including without limitation the rights
|
8 |
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9 |
+
copies of the Software, and to permit persons to whom the Software is
|
10 |
+
furnished to do so, subject to the following conditions:
|
11 |
+
|
12 |
+
The above copyright notice and this permission notice shall be included in all
|
13 |
+
copies or substantial portions of the Software.
|
14 |
+
|
15 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16 |
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17 |
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18 |
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19 |
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20 |
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21 |
+
SOFTWARE.
|
README copy.md
ADDED
@@ -0,0 +1,254 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# my-awesome-app
|
2 |
+
---
|
3 |
+
## Assignment questions and answers:
|
4 |
+
|
5 |
+
### 1. Explain the concept of object-oriented programming in simple terms to a complete beginner.
|
6 |
+
Aspect Tested:
|
7 |
+
When an LLM is asked this question, it tests the ability to explain concepts clearly and simply to someone without prior knowledge. This evaluates the model's understanding of the topic and its skill in breaking down complex ideas into basic, relatable terms.
|
8 |
+
|
9 |
+
For example:
|
10 |
+
Object-Oriented Programming (OOP) is like organizing things in the real world. Imagine you’re creating a game with cars. Instead of describing each car separately, you create a blueprint (called a class) that says, "A car has wheels, a color, and can move." Then you can make many cars (called objects) using that blueprint. Each car can have different colors or speeds, but they all follow the same basic design. This helps keep things neat, reusable, and easy to manage.
|
11 |
+
|
12 |
+
Here, the LLM's goal is to ensure the explanation is easy to grasp for anyone, even a beginner.
|
13 |
+
|
14 |
+
### 2. Read the following paragraph and provide a concise summary of the key points…
|
15 |
+
Aspect Tested:
|
16 |
+
When an LLM is asked this question, it tests its ability to understand, process, and summarize information. The LLM needs to:
|
17 |
+
|
18 |
+
Identify the main points in the paragraph.
|
19 |
+
Leave out unnecessary details.
|
20 |
+
Present the summary clearly and briefly.
|
21 |
+
The goal is to check how well the LLM can grasp the content and convey it in fewer words without losing the essential meaning.
|
22 |
+
|
23 |
+
### 3. Write a short, imaginative story (100–150 words) about a robot finding friendship in an unexpected place.
|
24 |
+
Aspect Tested:
|
25 |
+
When an LLM is asked this question, it tests its creativity, storytelling skills, and imagination. The LLM needs to:
|
26 |
+
|
27 |
+
Create an engaging and original story that fits the theme.
|
28 |
+
Develop characters and a simple plot within the word limit.
|
29 |
+
Show emotional depth or a meaningful idea, like a robot finding friendship.
|
30 |
+
This evaluates how well the LLM can craft a story that feels interesting and relatable while staying within the constraints.
|
31 |
+
|
32 |
+
### 4. If a store sells apples in packs of 4 and oranges in packs of 3, how many packs of each do I need to buy to get exactly 12 apples and 9 oranges?
|
33 |
+
Aspect Tested:
|
34 |
+
When an LLM is asked this question, it tests its math problem-solving skills and logical reasoning.
|
35 |
+
|
36 |
+
The LLM needs to:
|
37 |
+
|
38 |
+
Understand the question and identify the quantities needed.
|
39 |
+
Apply simple division (12 ÷ 4 for apples, 9 ÷ 3 for oranges).
|
40 |
+
Provide the correct answer in a clear and easy-to-understand way.
|
41 |
+
This checks how well the LLM can solve basic math problems and explain the reasoning behind the solution.
|
42 |
+
|
43 |
+
### 5. Rewrite the following paragraph in a professional, formal tone…
|
44 |
+
Aspect Tested:
|
45 |
+
When an LLM is asked this question, it tests its ability to understand and change writing style or tone.
|
46 |
+
|
47 |
+
The LLM needs to:
|
48 |
+
|
49 |
+
Understand the meaning of the original paragraph.
|
50 |
+
Rewrite it in a formal and professional way, using appropriate words and structure.
|
51 |
+
Keep the original message intact while improving its tone to fit the context.
|
52 |
+
This evaluates the LLM's skill in adapting language to suit specific communication styles.
|
53 |
+
|
54 |
+
---
|
55 |
+
|
56 |
+
Screenshots of the "vibe check:
|
57 |
+
|
58 |
+

|
59 |
+

|
60 |
+

|
61 |
+

|
62 |
+

|
63 |
+
|
64 |
+
|
65 |
+
---
|
66 |
+
title: BeyondChatGPT Demo
|
67 |
+
emoji: 📉
|
68 |
+
colorFrom: pink
|
69 |
+
colorTo: yellow
|
70 |
+
sdk: docker
|
71 |
+
pinned: false
|
72 |
+
app_port: 7860
|
73 |
+
---
|
74 |
+
|
75 |
+
<p align = "center" draggable=”false” ><img src="https://github.com/AI-Maker-Space/LLM-Dev-101/assets/37101144/d1343317-fa2f-41e1-8af1-1dbb18399719"
|
76 |
+
width="200px"
|
77 |
+
height="auto"/>
|
78 |
+
</p>
|
79 |
+
|
80 |
+
|
81 |
+
## <h1 align="center" id="heading">:wave: Welcome to Beyond ChatGPT!!</h1>
|
82 |
+
|
83 |
+
For a step-by-step YouTube video walkthrough, watch this! [Deploying Chainlit app on Hugging Face](https://www.youtube.com/live/pRbbZcL0NMI?si=NAYhMZ_suAY84f06&t=2119)
|
84 |
+
|
85 |
+

|
86 |
+
|
87 |
+
## 🤖 Your First LLM App
|
88 |
+
|
89 |
+
> If you need an introduction to `git`, or information on how to set up API keys for the tools we'll be using in this repository - check out our [Interactive Dev Environment for LLM Development](https://github.com/AI-Maker-Space/Interactive-Dev-Environment-for-LLM-Development/tree/main) which has everything you'd need to get started in this repository!
|
90 |
+
|
91 |
+
In this repository, we'll walk you through the steps to create a Large Language Model (LLM) application using Chainlit, then containerize it using Docker, and finally deploy it on Huggingface Spaces.
|
92 |
+
|
93 |
+
Are you ready? Let's get started!
|
94 |
+
|
95 |
+
<details>
|
96 |
+
<summary>🖥️ Accessing "gpt-3.5-turbo" (ChatGPT) like a developer</summary>
|
97 |
+
|
98 |
+
1. Head to [this notebook](https://colab.research.google.com/drive/1mOzbgf4a2SP5qQj33ZxTz2a01-5eXqk2?usp=sharing) and follow along with the instructions!
|
99 |
+
|
100 |
+
2. Complete the notebook and try out your own system/assistant messages!
|
101 |
+
|
102 |
+
That's it! Head to the next step and start building your application!
|
103 |
+
|
104 |
+
</details>
|
105 |
+
|
106 |
+
|
107 |
+
<details>
|
108 |
+
<summary>🏗️ Building Your First LLM App</summary>
|
109 |
+
|
110 |
+
1. Clone [this](https://github.com/AI-Maker-Space/Beyond-ChatGPT/tree/main) repo.
|
111 |
+
|
112 |
+
``` bash
|
113 |
+
git clone https://github.com/AI-Maker-Space/Beyond-ChatGPT.git
|
114 |
+
```
|
115 |
+
|
116 |
+
2. Navigate inside this repo
|
117 |
+
``` bash
|
118 |
+
cd Beyond-ChatGPT
|
119 |
+
```
|
120 |
+
|
121 |
+
3. Install the packages required for this python envirnoment in `requirements.txt`.
|
122 |
+
``` bash
|
123 |
+
pip install -r requirements.txt
|
124 |
+
```
|
125 |
+
|
126 |
+
4. Open your `.env` file. Replace the `###` in your `.env` file with your OpenAI Key and save the file.
|
127 |
+
``` bash
|
128 |
+
OPENAI_API_KEY=sk-###
|
129 |
+
```
|
130 |
+
|
131 |
+
5. Let's try deploying it locally. Make sure you're in the python environment where you installed Chainlit and OpenAI. Run the app using Chainlit. This may take a minute to run.
|
132 |
+
``` bash
|
133 |
+
chainlit run app.py -w
|
134 |
+
```
|
135 |
+
|
136 |
+
<p align = "center" draggable=”false”>
|
137 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/54bcccf9-12e2-4cef-ab53-585c1e2b0fb5">
|
138 |
+
</p>
|
139 |
+
|
140 |
+
Great work! Let's see if we can interact with our chatbot.
|
141 |
+
|
142 |
+
<p align = "center" draggable=”false”>
|
143 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/854e4435-1dee-438a-9146-7174b39f7c61">
|
144 |
+
</p>
|
145 |
+
|
146 |
+
Awesome! Time to throw it into a docker container and prepare it for shipping!
|
147 |
+
</details>
|
148 |
+
|
149 |
+
|
150 |
+
|
151 |
+
<details>
|
152 |
+
<summary>🐳 Containerizing our App</summary>
|
153 |
+
|
154 |
+
1. Let's build the Docker image. We'll tag our image as `llm-app` using the `-t` parameter. The `.` at the end means we want all of the files in our current directory to be added to our image.
|
155 |
+
|
156 |
+
``` bash
|
157 |
+
docker build -t llm-app .
|
158 |
+
```
|
159 |
+
|
160 |
+
2. Run and test the Docker image locally using the `run` command. The `-p`parameter connects our **host port #** to the left of the `:` to our **container port #** on the right.
|
161 |
+
|
162 |
+
``` bash
|
163 |
+
docker run -p 7860:7860 llm-app
|
164 |
+
```
|
165 |
+
|
166 |
+
3. Visit http://localhost:7860 in your browser to see if the app runs correctly.
|
167 |
+
|
168 |
+
<p align = "center" draggable=”false”>
|
169 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/2c764f25-09a0-431b-8d28-32246e0ca1b7">
|
170 |
+
</p>
|
171 |
+
|
172 |
+
Great! Time to ship!
|
173 |
+
</details>
|
174 |
+
|
175 |
+
|
176 |
+
<details>
|
177 |
+
<summary>🚀 Deploying Your First LLM App</summary>
|
178 |
+
|
179 |
+
1. Let's create a new Huggingface Space. Navigate to [Huggingface](https://huggingface.co) and click on your profile picture on the top right. Then click on `New Space`.
|
180 |
+
|
181 |
+
<p align = "center" draggable=”false”>
|
182 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/f0656408-28b8-4876-9887-8f0c4b882bae">
|
183 |
+
</p>
|
184 |
+
|
185 |
+
2. Setup your space as shown below:
|
186 |
+
|
187 |
+
- Owner: Your username
|
188 |
+
- Space Name: `llm-app`
|
189 |
+
- License: `Openrail`
|
190 |
+
- Select the Space SDK: `Docker`
|
191 |
+
- Docker Template: `Blank`
|
192 |
+
- Space Hardware: `CPU basic - 2 vCPU - 16 GB - Free`
|
193 |
+
- Repo type: `Public`
|
194 |
+
|
195 |
+
<p align = "center" draggable=”false”>
|
196 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/8f16afd1-6b46-4d9f-b642-8fefe355c5c9">
|
197 |
+
</p>
|
198 |
+
|
199 |
+
3. You should see something like this. We're now ready to send our files to our Huggingface Space. After cloning, move your files to this repo and push it along with your docker file. You DO NOT need to create a Dockerfile. Make sure NOT TO push your `.env` file. This should automatically be ignored.
|
200 |
+
|
201 |
+
<p align = "center" draggable=”false”>
|
202 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/cbf366e2-7613-4223-932a-72c67a73f9c6">
|
203 |
+
</p>
|
204 |
+
|
205 |
+
4. After pushing all files, navigate to the settings in the top right to add your OpenAI API key.
|
206 |
+
|
207 |
+
<p align = "center" draggable=”false”>
|
208 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/a1123a6f-abdd-4f76-bea4-39acf9928762">
|
209 |
+
</p>
|
210 |
+
|
211 |
+
5. Scroll down to `Variables and secrets` and click on `New secret` on the top right.
|
212 |
+
|
213 |
+
<p align = "center" draggable=”false”>
|
214 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/a8a4a25d-752b-4036-b572-93381370c2db">
|
215 |
+
</p>
|
216 |
+
|
217 |
+
6. Set the name to `OPENAI_API_KEY` and add your OpenAI key under `Value`. Click save.
|
218 |
+
|
219 |
+
<p align = "center" draggable=”false”>
|
220 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/0a897538-1779-48ff-bcb4-486af30f7a14">
|
221 |
+
</p>
|
222 |
+
|
223 |
+
7. To ensure your key is being used, we recommend you `Restart this Space`.
|
224 |
+
|
225 |
+
<p align = "center" draggable=”false”>
|
226 |
+
<img src="https://github.com/AI-Maker-Space/LLMOps-Dev-101/assets/37101144/fb1d83af-6ebe-4676-8bf5-b6d88f07c583">
|
227 |
+
</p>
|
228 |
+
|
229 |
+
8. Congratulations! You just deployed your first LLM! 🚀🚀🚀 Get on linkedin and post your results and experience! Make sure to tag us at #AIMakerspace !
|
230 |
+
|
231 |
+
Here's a template to get your post started!
|
232 |
+
|
233 |
+
```
|
234 |
+
🚀🎉 Exciting News! 🎉🚀
|
235 |
+
|
236 |
+
🏗️ Today, I'm thrilled to announce that I've successfully built and shipped my first-ever LLM using the powerful combination of Chainlit, Docker, and the OpenAI API! 🖥️
|
237 |
+
|
238 |
+
Check it out 👇
|
239 |
+
[LINK TO APP]
|
240 |
+
|
241 |
+
A big shoutout to the @**AI Makerspace** for all making this possible. Couldn't have done it without the incredible community there. 🤗🙏
|
242 |
+
|
243 |
+
Looking forward to building with the community! 🙌✨ Here's to many more creations ahead! 🥂🎉
|
244 |
+
|
245 |
+
Who else is diving into the world of AI? Let's connect! 🌐💡
|
246 |
+
|
247 |
+
#FirstLLM #Chainlit #Docker #OpenAI #AIMakerspace
|
248 |
+
```
|
249 |
+
|
250 |
+
</details>
|
251 |
+
|
252 |
+
<p></p>
|
253 |
+
|
254 |
+
### That's it for now! And so it begins.... :)
|
app.py
ADDED
@@ -0,0 +1,80 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# You can find this code for Chainlit python streaming here (https://docs.chainlit.io/concepts/streaming/python)
|
2 |
+
|
3 |
+
# OpenAI Chat completion
|
4 |
+
import os
|
5 |
+
from openai import AsyncOpenAI # importing openai for API usage
|
6 |
+
import chainlit as cl # importing chainlit for our app
|
7 |
+
from chainlit.prompt import Prompt, PromptMessage # importing prompt tools
|
8 |
+
from chainlit.playground.providers import ChatOpenAI # importing ChatOpenAI tools
|
9 |
+
from dotenv import load_dotenv
|
10 |
+
|
11 |
+
load_dotenv()
|
12 |
+
|
13 |
+
# ChatOpenAI Templates
|
14 |
+
system_template = """You are a helpful assistant who always speaks in a pleasant tone!
|
15 |
+
"""
|
16 |
+
|
17 |
+
user_template = """{input}
|
18 |
+
Think through your response step by step.
|
19 |
+
"""
|
20 |
+
|
21 |
+
|
22 |
+
@cl.on_chat_start # marks a function that will be executed at the start of a user session
|
23 |
+
async def start_chat():
|
24 |
+
settings = {
|
25 |
+
"model": "chatgpt-4o-latest",
|
26 |
+
"temperature": 0,
|
27 |
+
"max_tokens": 500,
|
28 |
+
"top_p": 1,
|
29 |
+
"frequency_penalty": 0,
|
30 |
+
"presence_penalty": 0,
|
31 |
+
}
|
32 |
+
|
33 |
+
cl.user_session.set("settings", settings)
|
34 |
+
|
35 |
+
|
36 |
+
@cl.on_message # marks a function that should be run each time the chatbot receives a message from a user
|
37 |
+
async def main(message: cl.Message):
|
38 |
+
settings = cl.user_session.get("settings")
|
39 |
+
|
40 |
+
client = AsyncOpenAI()
|
41 |
+
|
42 |
+
print(message.content)
|
43 |
+
|
44 |
+
prompt = Prompt(
|
45 |
+
provider=ChatOpenAI.id,
|
46 |
+
messages=[
|
47 |
+
PromptMessage(
|
48 |
+
role="system",
|
49 |
+
template=system_template,
|
50 |
+
formatted=system_template,
|
51 |
+
),
|
52 |
+
PromptMessage(
|
53 |
+
role="user",
|
54 |
+
template=user_template,
|
55 |
+
formatted=user_template.format(input=message.content),
|
56 |
+
),
|
57 |
+
],
|
58 |
+
inputs={"input": message.content},
|
59 |
+
settings=settings,
|
60 |
+
)
|
61 |
+
|
62 |
+
print([m.to_openai() for m in prompt.messages])
|
63 |
+
|
64 |
+
msg = cl.Message(content="")
|
65 |
+
|
66 |
+
# Call OpenAI
|
67 |
+
async for stream_resp in await client.chat.completions.create(
|
68 |
+
messages=[m.to_openai() for m in prompt.messages], stream=True, **settings
|
69 |
+
):
|
70 |
+
token = stream_resp.choices[0].delta.content
|
71 |
+
if not token:
|
72 |
+
token = ""
|
73 |
+
await msg.stream_token(token)
|
74 |
+
|
75 |
+
# Update the prompt object with the completion
|
76 |
+
prompt.completion = msg.content
|
77 |
+
msg.prompt = prompt
|
78 |
+
|
79 |
+
# Send and close the message stream
|
80 |
+
await msg.send()
|
app/hello_world.ipynb
ADDED
@@ -0,0 +1,69 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"name": "stderr",
|
10 |
+
"output_type": "stream",
|
11 |
+
"text": [
|
12 |
+
"Matplotlib is building the font cache; this may take a moment.\n"
|
13 |
+
]
|
14 |
+
}
|
15 |
+
],
|
16 |
+
"source": [
|
17 |
+
"import pandas as pd\n",
|
18 |
+
"import numpy as np\n",
|
19 |
+
"import matplotlib.pyplot as plt"
|
20 |
+
]
|
21 |
+
},
|
22 |
+
{
|
23 |
+
"cell_type": "code",
|
24 |
+
"execution_count": 2,
|
25 |
+
"metadata": {},
|
26 |
+
"outputs": [
|
27 |
+
{
|
28 |
+
"data": {
|
29 |
+
"image/png": "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",
|
30 |
+
"text/plain": [
|
31 |
+
"<Figure size 640x480 with 1 Axes>"
|
32 |
+
]
|
33 |
+
},
|
34 |
+
"metadata": {},
|
35 |
+
"output_type": "display_data"
|
36 |
+
}
|
37 |
+
],
|
38 |
+
"source": [
|
39 |
+
"np.random.seed(0)\n",
|
40 |
+
"\n",
|
41 |
+
"values = np.random.randn(100) # array of normally distributed random numbers\n",
|
42 |
+
"s = pd.Series(values) # generate a pandas series\n",
|
43 |
+
"s.plot(kind='hist', title='Normally distributed random values') # hist computes distribution\n",
|
44 |
+
"plt.show() "
|
45 |
+
]
|
46 |
+
}
|
47 |
+
],
|
48 |
+
"metadata": {
|
49 |
+
"kernelspec": {
|
50 |
+
"display_name": "Python 3",
|
51 |
+
"language": "python",
|
52 |
+
"name": "python3"
|
53 |
+
},
|
54 |
+
"language_info": {
|
55 |
+
"codemirror_mode": {
|
56 |
+
"name": "ipython",
|
57 |
+
"version": 3
|
58 |
+
},
|
59 |
+
"file_extension": ".py",
|
60 |
+
"mimetype": "text/x-python",
|
61 |
+
"name": "python",
|
62 |
+
"nbconvert_exporter": "python",
|
63 |
+
"pygments_lexer": "ipython3",
|
64 |
+
"version": "3.11.11"
|
65 |
+
}
|
66 |
+
},
|
67 |
+
"nbformat": 4,
|
68 |
+
"nbformat_minor": 2
|
69 |
+
}
|
app/hello_world.py
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
print("hello world! let's do some ml ops!")
|
chainlit.md
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
# Beyond ChatGPT
|
2 |
+
|
3 |
+
This Chainlit app was created following instructions from [this repository!](https://github.com/AI-Maker-Space/Beyond-ChatGPT)
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
chainlit==0.7.700
|
2 |
+
cohere==4.37
|
3 |
+
openai==1.3.5
|
4 |
+
tiktoken==0.5.1
|
5 |
+
python-dotenv==1.0.0
|
6 |
+
pydantic==2.10.1
|