mirror of
https://github.com/mudler/LocalAI.git
synced 2025-05-04 09:42:53 +00:00
1038 - Streamlit bot with LocalAI (#1072)
**Description** This PR fixes #1038 Added Streamlit example and also updated readme for examples. **[Signed commits](../CONTRIBUTING.md#signing-off-on-commits-developer-certificate-of-origin)** - [X] Yes, I signed my commits. <!-- Thank you for contributing to LocalAI! Contributing Conventions: 1. Include descriptive PR titles with [<component-name>] prepended. 2. Build and test your changes before submitting a PR. 3. Sign your commits By following the community's contribution conventions upfront, the review process will be accelerated and your PR merged more quickly. -->
This commit is contained in:
parent
31ed13094b
commit
f37a4ec9c8
@ -159,14 +159,24 @@ Allows to run any LocalAI-compatible model as a backend on the servers of https:
|
|||||||
|
|
||||||
### Continue
|
### Continue
|
||||||
|
|
||||||
<img src="continue/img/screen.png" width="600" height="200" alt="Screenshot">
|
|
||||||
|
|
||||||
_by [@gruberdev](https://github.com/gruberdev)_
|
_by [@gruberdev](https://github.com/gruberdev)_
|
||||||
|
|
||||||
|
<img src="continue/img/screen.png" width="600" height="200" alt="Screenshot">
|
||||||
|
|
||||||
Demonstrates how to integrate an open-source copilot alternative that enhances code analysis, completion, and improvements. This approach seamlessly integrates with any LocalAI model, offering a more user-friendly experience.
|
Demonstrates how to integrate an open-source copilot alternative that enhances code analysis, completion, and improvements. This approach seamlessly integrates with any LocalAI model, offering a more user-friendly experience.
|
||||||
|
|
||||||
[Check it out here](https://github.com/go-skynet/LocalAI/tree/master/examples/continue/)
|
[Check it out here](https://github.com/go-skynet/LocalAI/tree/master/examples/continue/)
|
||||||
|
|
||||||
|
### Streamlit bot
|
||||||
|
|
||||||
|
_by [@majoshi1](https://github.com/majoshi1)_
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
A chat bot made using `Streamlit` & LocalAI.
|
||||||
|
|
||||||
|
[Check it out here](https://github.com/go-skynet/LocalAI/tree/master/examples/streamlit-bot/)
|
||||||
|
|
||||||
## Want to contribute?
|
## Want to contribute?
|
||||||
|
|
||||||
Create an issue, and put `Example: <description>` in the title! We will post your examples here.
|
Create an issue, and put `Example: <description>` in the title! We will post your examples here.
|
||||||
|
1
examples/streamlit-bot/.gitignore
vendored
Normal file
1
examples/streamlit-bot/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
installer_files
|
21
examples/streamlit-bot/LICENSE
Normal file
21
examples/streamlit-bot/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2023 Manohar Joshi
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
70
examples/streamlit-bot/Main.py
Normal file
70
examples/streamlit-bot/Main.py
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
import streamlit as st
|
||||||
|
import time
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
|
def ask(prompt):
|
||||||
|
url = 'http://localhost:8080/v1/chat/completions'
|
||||||
|
myobj = {
|
||||||
|
"model": "ggml-gpt4all-j.bin",
|
||||||
|
"messages": [{"role": "user", "content": prompt}],
|
||||||
|
"temperature": 0.9
|
||||||
|
}
|
||||||
|
myheaders = { "Content-Type" : "application/json" }
|
||||||
|
|
||||||
|
x = requests.post(url, json = myobj, headers=myheaders)
|
||||||
|
|
||||||
|
print(x.text)
|
||||||
|
|
||||||
|
json_data = json.loads(x.text)
|
||||||
|
|
||||||
|
return json_data["choices"][0]["message"]["content"]
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Page setup
|
||||||
|
st.set_page_config(page_title="Ask your LLM")
|
||||||
|
st.header("Ask your Question 💬")
|
||||||
|
|
||||||
|
# Initialize chat history
|
||||||
|
if "messages" not in st.session_state:
|
||||||
|
st.session_state.messages = []
|
||||||
|
|
||||||
|
# Display chat messages from history on app rerun
|
||||||
|
for message in st.session_state.messages:
|
||||||
|
with st.chat_message(message["role"]):
|
||||||
|
st.markdown(message["content"])
|
||||||
|
|
||||||
|
# Scroll to bottom
|
||||||
|
st.markdown(
|
||||||
|
"""
|
||||||
|
<script>
|
||||||
|
var element = document.getElementById("end-of-chat");
|
||||||
|
element.scrollIntoView({behavior: "smooth"});
|
||||||
|
</script>
|
||||||
|
""",
|
||||||
|
unsafe_allow_html=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# React to user input
|
||||||
|
if prompt := st.chat_input("What is up?"):
|
||||||
|
# Display user message in chat message container
|
||||||
|
st.chat_message("user").markdown(prompt)
|
||||||
|
# Add user message to chat history
|
||||||
|
st.session_state.messages.append({"role": "user", "content": prompt})
|
||||||
|
print(f"User has asked the following question: {prompt}")
|
||||||
|
|
||||||
|
# Process
|
||||||
|
response = ""
|
||||||
|
with st.spinner('Processing...'):
|
||||||
|
response = ask(prompt)
|
||||||
|
|
||||||
|
#response = f"Echo: {prompt}"
|
||||||
|
# Display assistant response in chat message container
|
||||||
|
with st.chat_message("assistant"):
|
||||||
|
st.markdown(response)
|
||||||
|
# Add assistant response to chat history
|
||||||
|
st.session_state.messages.append({"role": "assistant", "content": response})
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
54
examples/streamlit-bot/README.md
Normal file
54
examples/streamlit-bot/README.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
## Streamlit bot
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
This is an example to deploy a Streamlit bot with LocalAI instead of OpenAI. Instructions are for Windows.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install & run Git Bash
|
||||||
|
|
||||||
|
# Clone LocalAI
|
||||||
|
git clone https://github.com/go-skynet/LocalAI.git
|
||||||
|
cd LocalAI
|
||||||
|
|
||||||
|
# (optional) Checkout a specific LocalAI tag
|
||||||
|
# git checkout -b build <TAG>
|
||||||
|
|
||||||
|
# Use a template from the examples
|
||||||
|
cp -rf prompt-templates/ggml-gpt4all-j.tmpl models/
|
||||||
|
|
||||||
|
# (optional) Edit the .env file to set things like context size and threads
|
||||||
|
# vim .env
|
||||||
|
# Download model
|
||||||
|
curl --progress-bar -C - -O https://gpt4all.io/models/ggml-gpt4all-j.bin > models/ggml-gpt4all-j.bin
|
||||||
|
|
||||||
|
# Install & Run Docker Desktop for Windows
|
||||||
|
https://www.docker.com/products/docker-desktop/
|
||||||
|
|
||||||
|
# start with docker-compose
|
||||||
|
docker-compose up -d --pull always
|
||||||
|
# or you can build the images with:
|
||||||
|
# docker-compose up -d --build
|
||||||
|
# Now API is accessible at localhost:8080
|
||||||
|
curl http://localhost:8080/v1/models
|
||||||
|
# {"object":"list","data":[{"id":"ggml-gpt4all-j","object":"model"}]}
|
||||||
|
|
||||||
|
curl http://localhost:8080/v1/chat/completions -H "Content-Type: application/json" -d '{
|
||||||
|
"model": "ggml-gpt4all-j",
|
||||||
|
"messages": [{"role": "user", "content": "How are you?"}],
|
||||||
|
"temperature": 0.9
|
||||||
|
}'
|
||||||
|
|
||||||
|
# {"model":"ggml-gpt4all-j","choices":[{"message":{"role":"assistant","content":"I'm doing well, thanks. How about you?"}}]}
|
||||||
|
|
||||||
|
cd examples/streamlit-bot
|
||||||
|
|
||||||
|
install_requirements.bat
|
||||||
|
|
||||||
|
# run the bot
|
||||||
|
start_windows.bat
|
||||||
|
|
||||||
|
# UI will be launched automatically (http://localhost:8501/) in browser.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
31
examples/streamlit-bot/cmd_windows.bat
Normal file
31
examples/streamlit-bot/cmd_windows.bat
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /D "%~dp0"
|
||||||
|
|
||||||
|
set PATH=%PATH%;%SystemRoot%\system32
|
||||||
|
|
||||||
|
echo "%CD%"| findstr /C:" " >nul && echo This script relies on Miniconda which can not be silently installed under a path with spaces. && goto end
|
||||||
|
|
||||||
|
@rem fix failed install when installing to a separate drive
|
||||||
|
set TMP=%cd%\installer_files
|
||||||
|
set TEMP=%cd%\installer_files
|
||||||
|
|
||||||
|
@rem config
|
||||||
|
set CONDA_ROOT_PREFIX=%cd%\installer_files\conda
|
||||||
|
set INSTALL_ENV_DIR=%cd%\installer_files\env
|
||||||
|
|
||||||
|
@rem environment isolation
|
||||||
|
set PYTHONNOUSERSITE=1
|
||||||
|
set PYTHONPATH=
|
||||||
|
set PYTHONHOME=
|
||||||
|
set "CUDA_PATH=%INSTALL_ENV_DIR%"
|
||||||
|
set "CUDA_HOME=%CUDA_PATH%"
|
||||||
|
|
||||||
|
@rem activate installer env
|
||||||
|
call "%CONDA_ROOT_PREFIX%\condabin\conda.bat" activate "%INSTALL_ENV_DIR%" || ( echo. && echo Miniconda hook not found. && goto end )
|
||||||
|
|
||||||
|
@rem enter commands
|
||||||
|
cmd /k "%*"
|
||||||
|
|
||||||
|
:end
|
||||||
|
pause
|
81
examples/streamlit-bot/install_requirements.bat
Normal file
81
examples/streamlit-bot/install_requirements.bat
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /D "%~dp0"
|
||||||
|
|
||||||
|
set PATH=%PATH%;%SystemRoot%\system32
|
||||||
|
|
||||||
|
echo "%CD%"| findstr /C:" " >nul && echo This script relies on Miniconda which can not be silently installed under a path with spaces. && goto end
|
||||||
|
|
||||||
|
@rem Check for special characters in installation path
|
||||||
|
set "SPCHARMESSAGE="WARNING: Special characters were detected in the installation path!" " This can cause the installation to fail!""
|
||||||
|
echo "%CD%"| findstr /R /C:"[!#\$%&()\*+,;<=>?@\[\]\^`{|}~]" >nul && (
|
||||||
|
call :PrintBigMessage %SPCHARMESSAGE%
|
||||||
|
)
|
||||||
|
set SPCHARMESSAGE=
|
||||||
|
|
||||||
|
@rem fix failed install when installing to a separate drive
|
||||||
|
set TMP=%cd%\installer_files
|
||||||
|
set TEMP=%cd%\installer_files
|
||||||
|
|
||||||
|
@rem config
|
||||||
|
set INSTALL_DIR=%cd%\installer_files
|
||||||
|
set CONDA_ROOT_PREFIX=%cd%\installer_files\conda
|
||||||
|
set INSTALL_ENV_DIR=%cd%\installer_files\env
|
||||||
|
set MINICONDA_DOWNLOAD_URL=https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Windows-x86_64.exe
|
||||||
|
set conda_exists=F
|
||||||
|
|
||||||
|
@rem figure out whether git and conda needs to be installed
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" --version >nul 2>&1
|
||||||
|
if "%ERRORLEVEL%" EQU "0" set conda_exists=T
|
||||||
|
|
||||||
|
@rem (if necessary) install git and conda into a contained environment
|
||||||
|
@rem download conda
|
||||||
|
if "%conda_exists%" == "F" (
|
||||||
|
echo Downloading Miniconda from %MINICONDA_DOWNLOAD_URL% to %INSTALL_DIR%\miniconda_installer.exe
|
||||||
|
|
||||||
|
mkdir "%INSTALL_DIR%"
|
||||||
|
call curl -Lk "%MINICONDA_DOWNLOAD_URL%" > "%INSTALL_DIR%\miniconda_installer.exe" || ( echo. && echo Miniconda failed to download. && goto end )
|
||||||
|
|
||||||
|
echo Installing Miniconda to %CONDA_ROOT_PREFIX%
|
||||||
|
start /wait "" "%INSTALL_DIR%\miniconda_installer.exe" /InstallationType=JustMe /NoShortcuts=1 /AddToPath=0 /RegisterPython=0 /NoRegistry=1 /S /D=%CONDA_ROOT_PREFIX%
|
||||||
|
|
||||||
|
@rem test the conda binary
|
||||||
|
echo Miniconda version:
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" --version || ( echo. && echo Miniconda not found. && goto end )
|
||||||
|
)
|
||||||
|
|
||||||
|
@rem create the installer env
|
||||||
|
if not exist "%INSTALL_ENV_DIR%" (
|
||||||
|
echo Packages to install: %PACKAGES_TO_INSTALL%
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" create --no-shortcuts -y -k --prefix "%INSTALL_ENV_DIR%" python=3.10 || ( echo. && echo Conda environment creation failed. && goto end )
|
||||||
|
)
|
||||||
|
|
||||||
|
@rem check if conda environment was actually created
|
||||||
|
if not exist "%INSTALL_ENV_DIR%\python.exe" ( echo. && echo Conda environment is empty. && goto end )
|
||||||
|
|
||||||
|
@rem environment isolation
|
||||||
|
set PYTHONNOUSERSITE=1
|
||||||
|
set PYTHONPATH=
|
||||||
|
set PYTHONHOME=
|
||||||
|
set "CUDA_PATH=%INSTALL_ENV_DIR%"
|
||||||
|
set "CUDA_HOME=%CUDA_PATH%"
|
||||||
|
|
||||||
|
@rem activate installer env
|
||||||
|
call "%CONDA_ROOT_PREFIX%\condabin\conda.bat" activate "%INSTALL_ENV_DIR%" || ( echo. && echo Miniconda hook not found. && goto end )
|
||||||
|
|
||||||
|
@rem setup installer env
|
||||||
|
call pip install -r requirements.txt
|
||||||
|
|
||||||
|
@rem below are functions for the script next line skips these during normal execution
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:PrintBigMessage
|
||||||
|
echo. && echo.
|
||||||
|
echo *******************************************************************
|
||||||
|
for %%M in (%*) do echo * %%~M
|
||||||
|
echo *******************************************************************
|
||||||
|
echo. && echo.
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:end
|
||||||
|
pause
|
2
examples/streamlit-bot/requirements.txt
Normal file
2
examples/streamlit-bot/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
streamlit==1.26.0
|
||||||
|
requests
|
81
examples/streamlit-bot/start_windows.bat
Normal file
81
examples/streamlit-bot/start_windows.bat
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
cd /D "%~dp0"
|
||||||
|
|
||||||
|
set PATH=%PATH%;%SystemRoot%\system32
|
||||||
|
|
||||||
|
echo "%CD%"| findstr /C:" " >nul && echo This script relies on Miniconda which can not be silently installed under a path with spaces. && goto end
|
||||||
|
|
||||||
|
@rem Check for special characters in installation path
|
||||||
|
set "SPCHARMESSAGE="WARNING: Special characters were detected in the installation path!" " This can cause the installation to fail!""
|
||||||
|
echo "%CD%"| findstr /R /C:"[!#\$%&()\*+,;<=>?@\[\]\^`{|}~]" >nul && (
|
||||||
|
call :PrintBigMessage %SPCHARMESSAGE%
|
||||||
|
)
|
||||||
|
set SPCHARMESSAGE=
|
||||||
|
|
||||||
|
@rem fix failed install when installing to a separate drive
|
||||||
|
set TMP=%cd%\installer_files
|
||||||
|
set TEMP=%cd%\installer_files
|
||||||
|
|
||||||
|
@rem config
|
||||||
|
set INSTALL_DIR=%cd%\installer_files
|
||||||
|
set CONDA_ROOT_PREFIX=%cd%\installer_files\conda
|
||||||
|
set INSTALL_ENV_DIR=%cd%\installer_files\env
|
||||||
|
set MINICONDA_DOWNLOAD_URL=https://repo.anaconda.com/miniconda/Miniconda3-py310_23.3.1-0-Windows-x86_64.exe
|
||||||
|
set conda_exists=F
|
||||||
|
|
||||||
|
@rem figure out whether git and conda needs to be installed
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" --version >nul 2>&1
|
||||||
|
if "%ERRORLEVEL%" EQU "0" set conda_exists=T
|
||||||
|
|
||||||
|
@rem (if necessary) install git and conda into a contained environment
|
||||||
|
@rem download conda
|
||||||
|
if "%conda_exists%" == "F" (
|
||||||
|
echo Downloading Miniconda from %MINICONDA_DOWNLOAD_URL% to %INSTALL_DIR%\miniconda_installer.exe
|
||||||
|
|
||||||
|
mkdir "%INSTALL_DIR%"
|
||||||
|
call curl -Lk "%MINICONDA_DOWNLOAD_URL%" > "%INSTALL_DIR%\miniconda_installer.exe" || ( echo. && echo Miniconda failed to download. && goto end )
|
||||||
|
|
||||||
|
echo Installing Miniconda to %CONDA_ROOT_PREFIX%
|
||||||
|
start /wait "" "%INSTALL_DIR%\miniconda_installer.exe" /InstallationType=JustMe /NoShortcuts=1 /AddToPath=0 /RegisterPython=0 /NoRegistry=1 /S /D=%CONDA_ROOT_PREFIX%
|
||||||
|
|
||||||
|
@rem test the conda binary
|
||||||
|
echo Miniconda version:
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" --version || ( echo. && echo Miniconda not found. && goto end )
|
||||||
|
)
|
||||||
|
|
||||||
|
@rem create the installer env
|
||||||
|
if not exist "%INSTALL_ENV_DIR%" (
|
||||||
|
echo Packages to install: %PACKAGES_TO_INSTALL%
|
||||||
|
call "%CONDA_ROOT_PREFIX%\_conda.exe" create --no-shortcuts -y -k --prefix "%INSTALL_ENV_DIR%" python=3.10 || ( echo. && echo Conda environment creation failed. && goto end )
|
||||||
|
)
|
||||||
|
|
||||||
|
@rem check if conda environment was actually created
|
||||||
|
if not exist "%INSTALL_ENV_DIR%\python.exe" ( echo. && echo Conda environment is empty. && goto end )
|
||||||
|
|
||||||
|
@rem environment isolation
|
||||||
|
set PYTHONNOUSERSITE=1
|
||||||
|
set PYTHONPATH=
|
||||||
|
set PYTHONHOME=
|
||||||
|
set "CUDA_PATH=%INSTALL_ENV_DIR%"
|
||||||
|
set "CUDA_HOME=%CUDA_PATH%"
|
||||||
|
|
||||||
|
@rem activate installer env
|
||||||
|
call "%CONDA_ROOT_PREFIX%\condabin\conda.bat" activate "%INSTALL_ENV_DIR%" || ( echo. && echo Miniconda hook not found. && goto end )
|
||||||
|
|
||||||
|
@rem setup installer env
|
||||||
|
streamlit run Main.py
|
||||||
|
|
||||||
|
@rem below are functions for the script next line skips these during normal execution
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:PrintBigMessage
|
||||||
|
echo. && echo.
|
||||||
|
echo *******************************************************************
|
||||||
|
for %%M in (%*) do echo * %%~M
|
||||||
|
echo *******************************************************************
|
||||||
|
echo. && echo.
|
||||||
|
exit /b
|
||||||
|
|
||||||
|
:end
|
||||||
|
pause
|
BIN
examples/streamlit-bot/streamlit-bot.png
Normal file
BIN
examples/streamlit-bot/streamlit-bot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
Loading…
x
Reference in New Issue
Block a user