diff --git a/app.dockerfile b/app.dockerfile index 488e64b..ba22a33 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,15 +1,25 @@ -FROM node:20.18.0-alpine +FROM node:20.18.0-alpine as base +WORKDIR /home/perplexica +# Development stage +FROM base as development +ENV NODE_ENV=development ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL} ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} +COPY ui/package.json ui/yarn.lock ./ +RUN yarn install +EXPOSE 3000 +CMD ["yarn", "dev"] -WORKDIR /home/perplexica - +# Production stage +FROM base as production +ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 +ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api +ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL} +ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} COPY ui /home/perplexica/ - RUN yarn install --frozen-lockfile RUN yarn build - CMD ["yarn", "start"] \ No newline at end of file diff --git a/backend.dockerfile b/backend.dockerfile index b6ab95a..6727df2 100644 --- a/backend.dockerfile +++ b/backend.dockerfile @@ -1,17 +1,22 @@ -FROM node:18-slim - +FROM node:18-slim as base WORKDIR /home/perplexica +RUN mkdir -p /home/perplexica/data /home/perplexica/uploads +# Development stage +FROM base as development +ENV NODE_ENV=development +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile --network-timeout 600000 +EXPOSE 3001 +CMD ["yarn", "dev"] + +# Production stage +FROM base as production COPY src /home/perplexica/src COPY tsconfig.json /home/perplexica/ COPY drizzle.config.ts /home/perplexica/ COPY package.json /home/perplexica/ COPY yarn.lock /home/perplexica/ - -RUN mkdir /home/perplexica/data -RUN mkdir /home/perplexica/uploads - RUN yarn install --frozen-lockfile --network-timeout 600000 RUN yarn build - CMD ["yarn", "start"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index a0e1d73..27233dd 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -13,9 +13,11 @@ services: build: context: . dockerfile: backend.dockerfile + target: development image: itzcrazykns1337/perplexica-backend:main environment: - SEARXNG_API_URL=http://searxng:8080 + - NODE_ENV=development depends_on: - searxng ports: @@ -24,27 +26,41 @@ services: - backend-dbstore:/home/perplexica/data - uploads:/home/perplexica/uploads - ./config.toml:/home/perplexica/config.toml + - ./src:/home/perplexica/src + - ./package.json:/home/perplexica/package.json + - ./yarn.lock:/home/perplexica/yarn.lock + - ./tsconfig.json:/home/perplexica/tsconfig.json + - ./drizzle.config.ts:/home/perplexica/drizzle.config.ts extra_hosts: - 'host.docker.internal:host-gateway' networks: - perplexica-network restart: unless-stopped + command: yarn dev perplexica-frontend: build: context: . dockerfile: app.dockerfile + target: development args: - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 image: itzcrazykns1337/perplexica-frontend:main depends_on: - perplexica-backend + environment: + - NODE_ENV=development ports: - 3000:3000 + volumes: + - ./ui:/home/perplexica + - /home/perplexica/node_modules + - /home/perplexica/.next networks: - perplexica-network restart: unless-stopped + command: yarn dev networks: perplexica-network: diff --git a/src/utils/documents.ts b/src/utils/documents.ts index 5cd0366..25c90e2 100644 --- a/src/utils/documents.ts +++ b/src/utils/documents.ts @@ -40,6 +40,7 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { metadata: { title: title, url: link, + type: 'pdf', // Add this type indicator }, }); }); diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index 61f4f05..7adc929 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -19,6 +19,7 @@ import MessageSources from './MessageSources'; import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; +import { SearchPDFs } from './SearchPDFs'; const MessageBox = ({ message, @@ -63,6 +64,7 @@ const MessageBox = ({ setParsedMessage(message.content); }, [message.content, message.sources, message.role]); + const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); return ( @@ -119,6 +121,7 @@ const MessageBox = ({ > {parsedMessage} + {loading && isLast ? null : (
No PDF documents found related to your query.
+