Support for DragonflyDB (#598)

This commit is contained in:
Juan Calderon-Perez
2023-08-06 22:54:42 -04:00
committed by GitHub
parent f8f687a9fb
commit 12ec7b7f42
8 changed files with 52 additions and 64 deletions

View File

@@ -1,30 +1,10 @@
# ---------------------------------------
# Base image for node
FROM node:19-bullseye-slim as node_base
# ---------------------------------------
# Base image for runtime
FROM python:3.11-slim-bullseye as base
ENV TZ=Etc/UTC
WORKDIR /usr/src/app
# Install Redis
RUN apt-get update \
&& apt-get install -y curl wget gnupg cmake lsb-release build-essential dumb-init \
&& curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list \
&& apt-get update \
&& apt-get install -y redis \
&& apt-get clean \
&& mkdir -p /etc/redis /var/redis \
&& pip install --upgrade pip \
&& echo "appendonly yes" >> /etc/redis/redis.conf \
&& echo "dir /data/db/" >> /etc/redis/redis.conf
# Base image for dragonflydb
FROM ghcr.io/dragonflydb/dragonfly:v1.7.1 as dragonfly
# ---------------------------------------
# Build frontend
FROM node_base as frontend_builder
FROM node:19-bullseye-slim as frontend
WORKDIR /usr/src/app
COPY ./web/package.json ./web/package-lock.json ./
@@ -36,20 +16,26 @@ RUN npm run build
# ---------------------------------------
# Runtime environment
FROM base as release
FROM python:3.11-slim-bullseye as release
# Set ENV
ENV NODE_ENV='production'
ENV TZ=Etc/UTC
WORKDIR /usr/src/app
# Copy artifacts
COPY --from=frontend_builder /usr/src/app/web/build /usr/src/app/api/static/
COPY --from=dragonfly /usr/local/bin/dragonfly /usr/local/bin/dragonfly
COPY --from=frontend /usr/src/app/web/build /usr/src/app/api/static/
COPY ./api /usr/src/app/api
COPY scripts/deploy.sh /usr/src/app/deploy.sh
# Install api dependencies
RUN pip install --no-cache-dir ./api \
&& chmod 755 /usr/src/app/deploy.sh
RUN apt-get update && apt-get install -y cmake build-essential dumb-init \
&& pip install --upgrade pip \
&& pip install --no-cache-dir ./api \
&& apt-get clean \
&& rm -rf /tmp/* \
&& chmod 755 /usr/src/app/deploy.sh /usr/local/bin/dragonfly
EXPOSE 8008
ENTRYPOINT ["/usr/bin/dumb-init", "--"]

View File

@@ -3,40 +3,31 @@
FROM node:19-bullseye-slim as node_base
# ---------------------------------------
# Base image for runtime
FROM python:3.11-slim-bullseye as base
ENV TZ=Etc/UTC
WORKDIR /usr/src/app
# Install Redis
RUN apt-get update \
&& apt-get install -y curl wget gnupg cmake lsb-release build-essential dumb-init \
&& curl -fsSL https://packages.redis.io/gpg | gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg \
&& echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/redis.list \
&& apt-get update \
&& apt-get install -y redis \
&& apt-get clean \
&& mkdir -p /etc/redis /var/redis \
&& pip install --upgrade pip \
&& echo "appendonly yes" >> /etc/redis/redis.conf \
&& echo "dir /data/db/" >> /etc/redis/redis.conf
# Base image for dragonflydb
FROM ghcr.io/dragonflydb/dragonfly:v1.7.1 as dragonfly
# ---------------------------------------
# Dev environment
FROM base as dev
FROM python:3.11-slim-bullseye as dev
# Set ENV
WORKDIR /usr/src/app
ENV TZ=Etc/UTC
ENV NODE_ENV='development'
# Install node.js and npm packages
# Install dependencies
RUN apt-get update && apt-get install -y cmake build-essential dumb-init \
&& pip install --upgrade pip
# Copy database, source code, and scripts
COPY --from=dragonfly /usr/local/bin/dragonfly /usr/local/bin/dragonfly
COPY --from=node_base /usr/local /usr/local
COPY scripts/dev.sh /usr/src/app/dev.sh
COPY ./web/package.json ./web/package-lock.json ./
RUN npm ci \
&& chmod 755 /usr/src/app/dev.sh
&& chmod 755 /usr/src/app/dev.sh \
&& chmod 755 /usr/local/bin/dragonfly
EXPOSE 8008
EXPOSE 9124

View File

@@ -6,7 +6,7 @@
Serge is a chat interface crafted with [llama.cpp](https://github.com/ggerganov/llama.cpp) for running Alpaca models. No API keys, entirely self-hosted!
- 🌐 **SvelteKit** frontend
- 💾 **Redis** for storing chat history & parameters
- 💾 **[Dragonfly](https://github.com/dragonflydb/dragonfly)** for storing chat history & parameters
- ⚙️ **FastAPI + LangChain** for the API, wrapping calls to [llama.cpp](https://github.com/ggerganov/llama.cpp) using the [python bindings](https://github.com/abetlen/llama-cpp-python)
🎥 Demo:

View File

@@ -36,7 +36,8 @@ async def create_new_chat(
except Exception as exc:
raise ValueError(f"Model can't be found: {exc}")
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
params = ChatParameters(
model_path=model,
@@ -69,7 +70,8 @@ async def create_new_chat(
@chat_router.get("/")
async def get_all_chats():
res = []
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
ids = client.smembers("chats")
@@ -98,7 +100,8 @@ async def get_all_chats():
@chat_router.get("/{chat_id}")
async def get_specific_chat(chat_id: str):
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")
@@ -115,7 +118,8 @@ async def get_specific_chat(chat_id: str):
@chat_router.get("/{chat_id}/history")
async def get_chat_history(chat_id: str):
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")
@@ -126,7 +130,8 @@ async def get_chat_history(chat_id: str):
@chat_router.delete("/{chat_id}/prompt")
async def delete_prompt(chat_id: str, idx: int):
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")
@@ -147,7 +152,8 @@ async def delete_prompt(chat_id: str, idx: int):
@chat_router.delete("/{chat_id}")
async def delete_chat(chat_id: str):
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")
@@ -162,8 +168,9 @@ async def delete_chat(chat_id: str):
@chat_router.get("/{chat_id}/question")
def stream_ask_a_question(chat_id: str, prompt: str):
logger.debug("Starting redis client")
client = Redis()
logger.info("Starting redis client")
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")
@@ -235,7 +242,8 @@ def stream_ask_a_question(chat_id: str, prompt: str):
@chat_router.post("/{chat_id}/question")
async def ask_a_question(chat_id: str, prompt: str):
client = Redis()
client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {client.ping()}")
if not client.sismember("chats", chat_id):
raise ValueError("Chat does not exist")

View File

@@ -17,7 +17,8 @@ class ChainRedisHandler(StreamingStdOutCallbackHandler):
logger.debug(f"Setting up ChainRedisHandler with id {id}")
super().__init__()
self.id = id
self.client = Redis()
self.client = Redis(host="localhost", port=6379, decode_responses=False)
logger.info(f"Connected to Redis? {self.client.ping()}")
logger.info(f"Stream key : {self.stream_key}")
@property

View File

@@ -11,4 +11,4 @@ services:
volumes:
weights:
datadb:
datadb:

View File

@@ -8,8 +8,9 @@ pip install llama-cpp-python==0.1.77 || {
exit 1
}
# Start Redis instance
redis-server /etc/redis/redis.conf &
# Start Dragonfly instance
mkdir -p /data/db
/usr/local/bin/dragonfly --noversion_check --logtostderr --dbnum 0 --bind localhost --port 6379 --save_schedule "*:*" --dbfilename dragonfly --dir /data/db &
# Start the API
cd /usr/src/app/api || exit 1

View File

@@ -14,8 +14,9 @@ pip install llama-cpp-python==0.1.77 || {
exit 1
}
# Start Redis instance
redis-server /etc/redis/redis.conf &
# Start Dragonfly instance
mkdir -p /data/db
/usr/local/bin/dragonfly --noversion_check --logtostderr --dbnum 0 --bind localhost --port 6379 --save_schedule "*:*" --dbfilename dragonfly --dir /data/db &
# Start the web server
cd /usr/src/app/web || exit 1