modified the env

This commit is contained in:
Gormery Kombo Wanjiru
2024-02-12 21:22:40 +00:00
parent 41f7d73acd
commit 36e41673bf
20 changed files with 585 additions and 581 deletions

View File

@@ -1,44 +1,44 @@
{
"name": "ollama-docker",
"dockerComposeFile": ["../docker-compose.yml"],
"service": "app",
"workspaceFolder": "/code",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.autopep8",
"ms-python.debugpy",
"ms-python.isort",
"donjayamanne.python-environment-manager",
"donjayamanne.python-extension-pack",
"etmoffat.pip-packages",
"aaron-bond.better-comments",
"formulahendry.auto-rename-tag",
"formulahendry.code-runner",
"github.copilot",
"github.vscode-pull-request-github",
"ms-azuretools.vscode-docker",
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.vscode-remote-extensionpack",
"ms-toolsai.jupyter",
"ritwickdey.liveserver",
"visualstudioexptteam.vscodeintellicode",
"vscode-icons-team.vscode-icons",
"esbenp.prettier-vscode",
"jpotterm.simple-vim"
],
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": ["--max-line-length=88"],
"python.formatting.provider": "ms-python.python",
"editor.formatOnSave": true
}
}
},
"postCreateCommand": "pip install -r requirements.txt"
}
{
"name": "ollama-docker",
"dockerComposeFile": ["../docker-compose.yml"],
"service": "app",
"workspaceFolder": "/code",
"customizations": {
"vscode": {
"extensions": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.autopep8",
"ms-python.debugpy",
"ms-python.isort",
"donjayamanne.python-environment-manager",
"donjayamanne.python-extension-pack",
"etmoffat.pip-packages",
"aaron-bond.better-comments",
"formulahendry.auto-rename-tag",
"formulahendry.code-runner",
"github.copilot",
"github.vscode-pull-request-github",
"ms-azuretools.vscode-docker",
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.vscode-remote-extensionpack",
"ms-toolsai.jupyter",
"ritwickdey.liveserver",
"visualstudioexptteam.vscodeintellicode",
"vscode-icons-team.vscode-icons",
"esbenp.prettier-vscode",
"jpotterm.simple-vim"
],
"settings": {
"python.pythonPath": "/usr/local/bin/python",
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.flake8Args": ["--max-line-length=88"],
"python.formatting.provider": "ms-python.python",
"editor.formatOnSave": true
}
}
},
"postCreateCommand": "pip install -r requirements.txt"
}

View File

@@ -1,5 +1,5 @@
# flyctl launch added from .gitignore
**\.dist
**\.vscode
src\__pycache__
fly.toml
# flyctl launch added from .gitignore
**\.dist
**\.vscode
src\__pycache__
fly.toml

6
.gitignore vendored
View File

@@ -1,4 +1,4 @@
.dist
/src/__pycache__
venv/
.dist
/src/__pycache__
venv/
ollama/

View File

@@ -1,28 +1,28 @@
{
"recommendations": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.autopep8",
"ms-python.debugpy",
"ms-python.isort",
"donjayamanne.python-environment-manager",
"donjayamanne.python-extension-pack",
"etmoffat.pip-packages",
"aaron-bond.better-comments",
"formulahendry.auto-rename-tag",
"formulahendry.code-runner",
"github.copilot",
"github.vscode-pull-request-github",
"ms-azuretools.vscode-docker",
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.vscode-remote-extensionpack",
"ms-toolsai.jupyter",
"ritwickdey.liveserver",
"visualstudioexptteam.vscodeintellicode",
"vscode-icons-team.vscode-icons",
"esbenp.prettier-vscode"
]
}
{
"recommendations": [
"ms-python.python",
"ms-python.vscode-pylance",
"ms-python.autopep8",
"ms-python.debugpy",
"ms-python.isort",
"donjayamanne.python-environment-manager",
"donjayamanne.python-extension-pack",
"etmoffat.pip-packages",
"aaron-bond.better-comments",
"formulahendry.auto-rename-tag",
"formulahendry.code-runner",
"github.copilot",
"github.vscode-pull-request-github",
"ms-azuretools.vscode-docker",
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.vscode-remote-extensionpack",
"ms-toolsai.jupyter",
"ritwickdey.liveserver",
"visualstudioexptteam.vscodeintellicode",
"vscode-icons-team.vscode-icons",
"esbenp.prettier-vscode"
]
}

View File

@@ -1,5 +1,5 @@
{
"python.languageServer": "Pylance",
"python.analysis.extraPaths": ["../"],
"python.formatting.provider": "prettier",
{
"python.languageServer": "Pylance",
"python.analysis.extraPaths": ["../"],
"python.formatting.provider": "prettier",
}

View File

@@ -1,13 +1,17 @@
FROM python:3.11-slim
WORKDIR /code
COPY ./requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY ./src ./src
EXPOSE 8000
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
FROM python:3.11-slim
WORKDIR /code
COPY ./requirements.txt ./
RUN apt-get update && apt-get install git -y && apt-get install curl -y
RUN curl -fsSL https://ollama.com/install.sh | sh
RUN pip install --no-cache-dir -r requirements.txt
COPY ./src ./src
EXPOSE 8000
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]

190
README.md
View File

@@ -1,96 +1,96 @@
# Ollama Docker Compose Setup
Welcome to the Ollama Docker Compose Setup! This project simplifies the deployment of Ollama using Docker Compose, making it easy to run Ollama with all its dependencies in a containerized environment.
## Getting Started
### Prerequisites
Make sure you have the following prerequisites installed on your machine:
- Docker
- Docker Compose
#### GPU Support (Optional)
If you have a GPU and want to leverage its power within a Docker container, follow these steps to install the NVIDIA Container Toolkit:
```bash
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# Configure NVIDIA Container Toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# Test GPU integration
docker run --gpus all nvidia/cuda:11.5.2-base-ubuntu20.04 nvidia-smi
```
### Configuration
1. Clone the Docker Compose repository:
```bash
git clone https://github.com/valiantlynx/ollama-docker.git
```
2. Change to the project directory:
```bash
cd ollama-docker
```
## Usage
Start Ollama and its dependencies using Docker Compose:
if gpu is configured
```bash
docker-compose -f docker-compose-ollama-gpu.yaml up -d
```
else
```bash
docker-compose up -d
```
Visit [http://localhost:3000](http://localhost:3000) in your browser to access Ollama-webui.
### Model Installation
Navigate to settings -> model and install a model (e.g., llama2). This may take a couple of minutes, but afterward, you can use it just like ChatGPT.
### Explore Langchain and Ollama
You can explore Langchain and Ollama within the project. A third container named **app** has been created for this purpose. Inside, you'll find some examples.
### Devcontainer and Virtual Environment
The **app** container serves as a devcontainer, allowing you to boot into it for experimentation. Additionally, the run.sh file contains code to set up a virtual environment if you prefer not to use Docker for your development environment.
## Stop and Cleanup
To stop the containers and remove the network:
```bash
docker-compose down
```
## Contributing
We welcome contributions! If you'd like to contribute to the Ollama Docker Compose Setup, please follow our [Contribution Guidelines](CONTRIBUTING.md).
## License
This project is licensed under the [MIT License](LICENSE). Feel free to use, modify, and distribute it according to the terms of the license. Just give me a mention and some credit
## Contact
If you have any questions or concerns, please contact us at [vantlynxz@gmail.com](mailto:vantlynxz@gmail.com).
# Ollama Docker Compose Setup
Welcome to the Ollama Docker Compose Setup! This project simplifies the deployment of Ollama using Docker Compose, making it easy to run Ollama with all its dependencies in a containerized environment.
## Getting Started
### Prerequisites
Make sure you have the following prerequisites installed on your machine:
- Docker
- Docker Compose
#### GPU Support (Optional)
If you have a GPU and want to leverage its power within a Docker container, follow these steps to install the NVIDIA Container Toolkit:
```bash
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# Configure NVIDIA Container Toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# Test GPU integration
docker run --gpus all nvidia/cuda:11.5.2-base-ubuntu20.04 nvidia-smi
```
### Configuration
1. Clone the Docker Compose repository:
```bash
git clone https://github.com/valiantlynx/ollama-docker.git
```
2. Change to the project directory:
```bash
cd ollama-docker
```
## Usage
Start Ollama and its dependencies using Docker Compose:
if gpu is configured
```bash
docker-compose -f docker-compose-ollama-gpu.yaml up -d
```
else
```bash
docker-compose up -d
```
Visit [http://localhost:3000](http://localhost:3000) in your browser to access Ollama-webui.
### Model Installation
Navigate to settings -> model and install a model (e.g., llama2). This may take a couple of minutes, but afterward, you can use it just like ChatGPT.
### Explore Langchain and Ollama
You can explore Langchain and Ollama within the project. A third container named **app** has been created for this purpose. Inside, you'll find some examples.
### Devcontainer and Virtual Environment
The **app** container serves as a devcontainer, allowing you to boot into it for experimentation. Additionally, the run.sh file contains code to set up a virtual environment if you prefer not to use Docker for your development environment.
## Stop and Cleanup
To stop the containers and remove the network:
```bash
docker-compose down
```
## Contributing
We welcome contributions! If you'd like to contribute to the Ollama Docker Compose Setup, please follow our [Contribution Guidelines](CONTRIBUTING.md).
## License
This project is licensed under the [MIT License](LICENSE). Feel free to use, modify, and distribute it according to the terms of the license. Just give me a mention and some credit
## Contact
If you have any questions or concerns, please contact us at [vantlynxz@gmail.com](mailto:vantlynxz@gmail.com).
Enjoy using Ollama with Docker Compose! 🐳🚀

View File

@@ -1,35 +1,35 @@
version: '3.8'
services:
ollama:
volumes:
- ./ollama/ollama:/root/.ollama
container_name: ollama
pull_policy: always
tty: true
restart: unless-stopped
image: ollama/ollama:latest
ports:
- 11434:11434
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ollama-webui:
image: ghcr.io/ollama-webui/ollama-webui:main
container_name: ollama-webui
volumes:
- ./ollama/ollama-webui:/app/backend/data
depends_on:
- ollama
ports:
- 3000:8080
environment:
- '/ollama/api=http://ollama:11434/api'
extra_hosts:
- host.docker.internal:host-gateway
version: '3.8'
services:
ollama:
volumes:
- ./ollama/ollama:/root/.ollama
container_name: ollama
pull_policy: always
tty: true
restart: unless-stopped
image: ollama/ollama:latest
ports:
- 11434:11434
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ollama-webui:
image: ghcr.io/ollama-webui/ollama-webui:main
container_name: ollama-webui
volumes:
- ./ollama/ollama-webui:/app/backend/data
depends_on:
- ollama
ports:
- 3000:8080
environment:
- '/ollama/api=http://ollama:11434/api'
extra_hosts:
- host.docker.internal:host-gateway
restart: unless-stopped

View File

@@ -1,52 +1,52 @@
version: '3.8'
services:
app:
build: .
ports:
- 8000:8000
- 5678:5678
volumes:
- .:/code
command: uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload
restart: always
depends_on:
- ollama
- llama-webui
networks:
- ollama-docker
ollama:
image: ollama/ollama:latest
ports:
- 11434:11434
volumes:
- .:/code
- ./ollama/ollama:/root/.ollama
container_name: ollama
pull_policy: always
tty: true
restart: always
networks:
- ollama-docker
llama-webui:
image: ghcr.io/ollama-webui/ollama-webui:main
container_name: ollama-webui
volumes:
- ./ollama/ollama-webui:/app/backend/data
depends_on:
- ollama
ports:
- 3000:8080
environment:
- '/ollama/api=http://ollama:11434/api'
extra_hosts:
- host.docker.internal:host-gateway
restart: unless-stopped
networks:
- ollama-docker
networks:
ollama-docker:
external: false
version: '3.8'
services:
app:
build: .
ports:
- 8000:8000
- 5678:5678
volumes:
- .:/code
command: uvicorn src.main:app --host 0.0.0.0 --port 8000 --reload
restart: always
depends_on:
- ollama
- llama-webui
networks:
- ollama-docker
ollama:
image: ollama/ollama:latest
ports:
- 11434:11434
volumes:
- .:/code
- ./ollama/ollama:/root/.ollama
container_name: ollama
pull_policy: always
tty: true
restart: always
networks:
- ollama-docker
llama-webui:
image: ghcr.io/ollama-webui/ollama-webui:main
container_name: ollama-webui
volumes:
- ./ollama/ollama-webui:/app/backend/data
depends_on:
- ollama
ports:
- 3000:8080
environment:
- '/ollama/api=http://ollama:11434/api'
extra_hosts:
- host.docker.internal:host-gateway
restart: unless-stopped
networks:
- ollama-docker
networks:
ollama-docker:
external: false

View File

@@ -1,17 +1,17 @@
# fly.toml app configuration file generated for breath-first-search on 2023-10-17T03:52:02+02:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = "ollama-docker"
primary_region = "arn"
[env]
PORT = "8000"
[http_service]
internal_port = 8000
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
# fly.toml app configuration file generated for breath-first-search on 2023-10-17T03:52:02+02:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = "ollama-docker"
primary_region = "arn"
[env]
PORT = "8000"
[http_service]
internal_port = 8000
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0

View File

@@ -1,6 +1,6 @@
FROM llama2
PARAMETER temperature 0.8
SYSTEM You are a financial assistant, you help classify expenses
and income from bank transactions
FROM llama2
PARAMETER temperature 0.8
SYSTEM You are a financial assistant, you help classify expenses
and income from bank transactions

View File

@@ -1,10 +1,10 @@
fastapi
uvicorn
debugpy
langchain-community
langchain
langchainhub
gpt4all
chromadb
requests
fastapi
uvicorn
debugpy
langchain-community
langchain
langchainhub
gpt4all
chromadb
requests
beautifulsoup4

14
run.bat
View File

@@ -1,7 +1,7 @@
call python -m venv venv
call venv\Scripts\activate
call python -m pip install --upgrade pip
call pip install -r requirements.txt
call python signal-processing.py
call python -m venv venv
call venv\Scripts\activate
call python -m pip install --upgrade pip
call pip install -r requirements.txt
call python signal-processing.py

10
run.sh
View File

@@ -1,5 +1,5 @@
python -m venv venv
source venv/Scripts/activate
pip install -r requirements.txt
python src/test.py
python -m venv venv
source venv/Scripts/activate
pip install -r requirements.txt
python src/test.py

View File

@@ -1,8 +1,8 @@
# run using docker
docker build -t ollama-docker-image .
docker run --name ollama-docker-container -d -p 11434:11434 -p 8000:8000 -v $(pwd):/code ollama-docker-image
#connect to turborepo
git subtree add --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main --squash
git subtree pull --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main --squash
git subtree push --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main
# run using docker
docker build -t ollama-docker-image .
docker run --name ollama-docker-container -d -p 11434:11434 -p 8000:8000 -v $(pwd):/code ollama-docker-image
#connect to turborepo
git subtree add --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main --squash
git subtree pull --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main --squash
git subtree push --prefix=apps/ollama-docker https://github.com/valiantlynx/ollama-docker.git main

View File

@@ -1,23 +1,23 @@
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(model="llama2-uncensored",
# callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]),
temperature=0.9,
)
from langchain.prompts import PromptTemplate
prompt = PromptTemplate(
input_variables=["topic"],
template="Give me 5 interesting facts about {topic}?",
)
from langchain.chains import LLMChain
chain = LLMChain(llm=llm,
prompt=prompt,
verbose=False)
# Run the chain only specifying the input variable.
print(chain.run("the moon"))
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(model="llama2-uncensored",
# callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]),
temperature=0.9,
)
from langchain.prompts import PromptTemplate
prompt = PromptTemplate(
input_variables=["topic"],
template="Give me 5 interesting facts about {topic}?",
)
from langchain.chains import LLMChain
chain = LLMChain(llm=llm,
prompt=prompt,
verbose=False)
# Run the chain only specifying the input variable.
print(chain.run("the moon"))

View File

@@ -1,123 +1,123 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/daisyui@3.7.3/dist/full.css" rel="stylesheet" type="text/css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/htmx.org"></script>
<script src="https://unpkg.com/htmx.org/dist/ext/client-side-templates.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nunjucks@3.2.4/browser/nunjucks.min.js"></script>
<script>
// CORS workaround
document.addEventListener("htmx:configRequest", (evt) => {
evt.detail.headers = [];
});
</script>
<title>Whisper Magic Chat</title>
</head>
<body class="bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 font-sans">
<header class="bg-opacity-90 backdrop-filter backdrop-blur-lg py-6">
<div class="container mx-auto flex justify-between items-center">
<h1 class="text-3xl md:text-4xl lg:text-5xl font-extrabold text-white">Whisper Magic Chat</h1>
<nav>
<ul class="flex space-x-4">
<li><a href="/" class="hover:text-gray-300 text-white">Home</a></li>
<li><a href="#features" class="hover:text-gray-300 text-white">Features</a></li>
<li><a href="/docs" class="hover:text-gray-300 text-white">Docs</a></li>
</ul>
</nav>
</div>
</header>
<section id="hero" class="bg-gray-900 text-white py-16">
<div class="container mx-auto text-center">
<h2 class="text-4xl lg:text-5xl font-semibold mb-4">Unleash the Magic of Your Voice</h2>
<p class="text-lg lg:text-xl text-gray-300 leading-7 mb-8">Transform your voice into something enchanting with
Whisper Magic API. Experience the future of automatic speech recognition with unparalleled accuracy and speed.</p>
<a href="#transcribe"
class="bg-blue-500 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition duration-300">Get
Started</a>
</div>
</section>
<section id="transcribe" class="bg-gray-100 py-16" hx-ext="client-side-templates">
<div class="container mx-auto text-center">
<h2 class="text-3xl lg:text-4xl font-semibold mb-6 text-gray-800">Whisper Magic Transcription</h2>
<p class="text-lg lg:text-xl text-gray-700 mb-6">Upload an audio file to transcribe and experience the magic of
Whisper.</p>
<form hx-post="/transcribe" hx-trigger="submit" hx-swap="outerHTML" enctype="multipart/form-data"
class="flex flex-col items-center space-y-4" nunjucks-template="chat" _='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'>
<input type="file" name="files" class="p-4 border border-gray-300 rounded">
<button type="submit"
class="bg-blue-500 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition duration-300">Transcribe</button>
<progress id='progress' value='0' max='100' class="w-full h-4 bg-blue-200 rounded-full"></progress>
<!-- HTMX and Nunjucks templates -->
<template id="chat">
<!-- totalItems -->
{% if results == 1 %}
<i class="text-gray-500 mb-4"> Found {{ results.length }} files.</i>
{% endif %}
<!-- items -->
{% for chat in results %}
<div class="block mb-8 mx-auto max-w-md bg-white rounded-lg p-4 shadow-md hover:shadow-lg">
<div class="flex items-center">
<div class="w-10 h-10 rounded-full overflow-hidden mr-4">
<img alt="Whisper Magic transcription icon"
src="https://api.dicebear.com/7.x/adventurer/svg?seed={{ chat.filename }}"
class="object-cover w-full h-full">
</div>
<div>
<span class="text-blue-500 font-bold">Whisper:</span>
<time class="text-xs opacity-50 block">{{ chat.filename | truncate(10, true, "")}}</time>
</div>
</div>
<div class="mt-4">{{ chat.transcript }}</div>
<div class="mt-4 text-blue-500 hover:underline">
<a href="javascript:location.reload(true);" rel="noopener noreferrer">Retry?</a>
</div>
</div>
{% endfor %}
</template>
</form>
</div>
</section>
<section id="features" class="bg-gray-800 text-white py-16">
<div class="container mx-auto text-center">
<h2 class="text-3xl lg:text-4xl font-semibold mb-12">Enchanting Features</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Feature 1 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Voice Transformation</h3>
<p class="text-gray-700">Turn your voice into a symphony of magical sounds. Choose from a variety of
enchanting transformations.</p>
</div>
<!-- Feature 2 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Whisper Recognition</h3>
<p class="text-gray-700">Whisper Magic recognizes whispers with unparalleled precision, making it perfect for
ASMR applications.</p>
</div>
<!-- Feature 3 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Real-time Spell Casting</h3>
<p class="text-gray-700">Cast spells using your voice in real-time. Experience the magic as your words come to
life.</p>
</div>
</div>
</div>
</section>
<footer class="bg-gray-900 text-white py-6">
<div class="container mx-auto text-center">
<p>&copy; 2024 Whisper Magic. All Rights Reserved.</p>
</div>
</footer>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/daisyui@3.7.3/dist/full.css" rel="stylesheet" type="text/css">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/htmx.org"></script>
<script src="https://unpkg.com/htmx.org/dist/ext/client-side-templates.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nunjucks@3.2.4/browser/nunjucks.min.js"></script>
<script>
// CORS workaround
document.addEventListener("htmx:configRequest", (evt) => {
evt.detail.headers = [];
});
</script>
<title>Whisper Magic Chat</title>
</head>
<body class="bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 font-sans">
<header class="bg-opacity-90 backdrop-filter backdrop-blur-lg py-6">
<div class="container mx-auto flex justify-between items-center">
<h1 class="text-3xl md:text-4xl lg:text-5xl font-extrabold text-white">Whisper Magic Chat</h1>
<nav>
<ul class="flex space-x-4">
<li><a href="/" class="hover:text-gray-300 text-white">Home</a></li>
<li><a href="#features" class="hover:text-gray-300 text-white">Features</a></li>
<li><a href="/docs" class="hover:text-gray-300 text-white">Docs</a></li>
</ul>
</nav>
</div>
</header>
<section id="hero" class="bg-gray-900 text-white py-16">
<div class="container mx-auto text-center">
<h2 class="text-4xl lg:text-5xl font-semibold mb-4">Unleash the Magic of Your Voice</h2>
<p class="text-lg lg:text-xl text-gray-300 leading-7 mb-8">Transform your voice into something enchanting with
Whisper Magic API. Experience the future of automatic speech recognition with unparalleled accuracy and speed.</p>
<a href="#transcribe"
class="bg-blue-500 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition duration-300">Get
Started</a>
</div>
</section>
<section id="transcribe" class="bg-gray-100 py-16" hx-ext="client-side-templates">
<div class="container mx-auto text-center">
<h2 class="text-3xl lg:text-4xl font-semibold mb-6 text-gray-800">Whisper Magic Transcription</h2>
<p class="text-lg lg:text-xl text-gray-700 mb-6">Upload an audio file to transcribe and experience the magic of
Whisper.</p>
<form hx-post="/transcribe" hx-trigger="submit" hx-swap="outerHTML" enctype="multipart/form-data"
class="flex flex-col items-center space-y-4" nunjucks-template="chat" _='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'>
<input type="file" name="files" class="p-4 border border-gray-300 rounded">
<button type="submit"
class="bg-blue-500 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition duration-300">Transcribe</button>
<progress id='progress' value='0' max='100' class="w-full h-4 bg-blue-200 rounded-full"></progress>
<!-- HTMX and Nunjucks templates -->
<template id="chat">
<!-- totalItems -->
{% if results == 1 %}
<i class="text-gray-500 mb-4"> Found {{ results.length }} files.</i>
{% endif %}
<!-- items -->
{% for chat in results %}
<div class="block mb-8 mx-auto max-w-md bg-white rounded-lg p-4 shadow-md hover:shadow-lg">
<div class="flex items-center">
<div class="w-10 h-10 rounded-full overflow-hidden mr-4">
<img alt="Whisper Magic transcription icon"
src="https://api.dicebear.com/7.x/adventurer/svg?seed={{ chat.filename }}"
class="object-cover w-full h-full">
</div>
<div>
<span class="text-blue-500 font-bold">Whisper:</span>
<time class="text-xs opacity-50 block">{{ chat.filename | truncate(10, true, "")}}</time>
</div>
</div>
<div class="mt-4">{{ chat.transcript }}</div>
<div class="mt-4 text-blue-500 hover:underline">
<a href="javascript:location.reload(true);" rel="noopener noreferrer">Retry?</a>
</div>
</div>
{% endfor %}
</template>
</form>
</div>
</section>
<section id="features" class="bg-gray-800 text-white py-16">
<div class="container mx-auto text-center">
<h2 class="text-3xl lg:text-4xl font-semibold mb-12">Enchanting Features</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Feature 1 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Voice Transformation</h3>
<p class="text-gray-700">Turn your voice into a symphony of magical sounds. Choose from a variety of
enchanting transformations.</p>
</div>
<!-- Feature 2 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Whisper Recognition</h3>
<p class="text-gray-700">Whisper Magic recognizes whispers with unparalleled precision, making it perfect for
ASMR applications.</p>
</div>
<!-- Feature 3 -->
<div class="p-8 bg-white bg-opacity-70 rounded-lg shadow-md">
<h3 class="text-2xl font-semibold mb-4 text-gray-800">Real-time Spell Casting</h3>
<p class="text-gray-700">Cast spells using your voice in real-time. Experience the magic as your words come to
life.</p>
</div>
</div>
</div>
</section>
<footer class="bg-gray-900 text-white py-6">
<div class="container mx-auto text-center">
<p>&copy; 2024 Whisper Magic. All Rights Reserved.</p>
</div>
</footer>
</body>
</html>

View File

@@ -1,28 +1,28 @@
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.middleware.cors import CORSMiddleware
import debugpy
from typing import List
app = FastAPI()
# Allow all origins for CORS (you can customize this based on your requirements)
origins = ["*"]
# Configure CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
debugpy.listen(("0.0.0.0", 5678))
@app.get("/", response_class=HTMLResponse)
async def read_root():
# Read the content of your HTML file
with open("./src/index.html", "r") as file:
html_content = file.read()
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.middleware.cors import CORSMiddleware
import debugpy
from typing import List
app = FastAPI()
# Allow all origins for CORS (you can customize this based on your requirements)
origins = ["*"]
# Configure CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
debugpy.listen(("0.0.0.0", 5678))
@app.get("/", response_class=HTMLResponse)
async def read_root():
# Read the content of your HTML file
with open("./src/index.html", "r") as file:
html_content = file.read()
return HTMLResponse(content=html_content)

View File

@@ -1,71 +1,71 @@
# Load web page
import argparse
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Embed and store
from langchain.vectorstores import Chroma
from langchain.embeddings import GPT4AllEmbeddings
from langchain.embeddings import OllamaEmbeddings # We can also try Ollama embeddings
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
def main():
parser = argparse.ArgumentParser(description='Filter out URL argument.')
parser.add_argument('--url', type=str, default='https://valiantlynx.com', required=True, help='The URL to filter out.')
args = parser.parse_args()
url = args.url
print(f"using URL: {url}")
loader = WebBaseLoader(url)
data = loader.load()
# Split into chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=100)
all_splits = text_splitter.split_documents(data)
print(f"Split into {len(all_splits)} chunks")
vectorstore = Chroma.from_documents(documents=all_splits,
embedding=GPT4AllEmbeddings())
# Retrieve
# question = "What are the latest headlines on {url}?"
# docs = vectorstore.similarity_search(question)
print(f"Loaded {len(data)} documents")
# print(f"Retrieved {len(docs)} documents")
# RAG prompt
from langchain import hub
QA_CHAIN_PROMPT = hub.pull("rlm/rag-prompt-llama")
# LLM
llm = Ollama(model="llama2-uncensored",
verbose=True,
callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))
print(f"Loaded LLM model {llm.model}")
# QA chain
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vectorstore.as_retriever(),
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT},
)
# Ask a question
question = f"summarize what this blog is trying to say? {url}?"
result = qa_chain({"query": question})
# print(result)
if __name__ == "__main__":
# Load web page
import argparse
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Embed and store
from langchain.vectorstores import Chroma
from langchain.embeddings import GPT4AllEmbeddings
from langchain.embeddings import OllamaEmbeddings # We can also try Ollama embeddings
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
def main():
parser = argparse.ArgumentParser(description='Filter out URL argument.')
parser.add_argument('--url', type=str, default='https://valiantlynx.com', required=True, help='The URL to filter out.')
args = parser.parse_args()
url = args.url
print(f"using URL: {url}")
loader = WebBaseLoader(url)
data = loader.load()
# Split into chunks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=100)
all_splits = text_splitter.split_documents(data)
print(f"Split into {len(all_splits)} chunks")
vectorstore = Chroma.from_documents(documents=all_splits,
embedding=GPT4AllEmbeddings())
# Retrieve
# question = "What are the latest headlines on {url}?"
# docs = vectorstore.similarity_search(question)
print(f"Loaded {len(data)} documents")
# print(f"Retrieved {len(docs)} documents")
# RAG prompt
from langchain import hub
QA_CHAIN_PROMPT = hub.pull("rlm/rag-prompt-llama")
# LLM
llm = Ollama(model="llama2-uncensored",
verbose=True,
callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))
print(f"Loaded LLM model {llm.model}")
# QA chain
from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm,
retriever=vectorstore.as_retriever(),
chain_type_kwargs={"prompt": QA_CHAIN_PROMPT},
)
# Ask a question
question = f"summarize what this blog is trying to say? {url}?"
result = qa_chain({"query": question})
# print(result)
if __name__ == "__main__":
main()

View File

@@ -1,10 +1,10 @@
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
base_url="http://localhost:11434",
model="llama2-uncensored",
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]))
from langchain.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
llm = Ollama(
base_url="http://localhost:11434",
model="llama2-uncensored",
callback_manager = CallbackManager([StreamingStdOutCallbackHandler()]))
llm("hello:")