Skip to content

Commit

Permalink
Python langchain (#32)
Browse files Browse the repository at this point in the history
* fast api testing successful

* hot reload with uvicorn working

* read me for instructions

* gitignore

* organized folders

* conversation file for langchain, main for api

* langchain agent file defined

* fastapi route for conversation

* conversation function

* changed import

* shortened template

* succesfful interacton with openai api

* Ignore .pyc files

* cleaned up fastapi file

* added route for calling fastapi from backend

* skeleteon for langchain call

* added langchaincall route to server file

* langchaincallroute finished

* successful commincation from express to fastapi

* able to send data to api from body

* successfull call to api from front end

* front end prints out response from api

* created requirements file

* Upgrades packages and makde import changes. Initial docker file for langchain.

Ref #25

* Set up dockerfile for langchain

Fin #25

---------

Co-authored-by: Arturo <[email protected]>
Co-authored-by: John Tran <[email protected]>
  • Loading branch information
3 people authored Nov 15, 2023
1 parent f52305d commit 4ab300c
Show file tree
Hide file tree
Showing 13 changed files with 398 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ node_modules/
data/

## ignore OS turds
.env
.DS_Store
.vscode
29 changes: 29 additions & 0 deletions backend/routes/langchainCallRoute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import express from "express";
const langchainCallRoute = express.Router();
import axios from "axios";

langchainCallRoute.post("/ask", async (req, res) => {
//call fastapi from this endpoint
try {
//get user input
const userInput = req.body.data;

//make request to fastapi server
const fastResponse = await axios.post(
"http://fastapi:8000/process-lang",
{
human_input: userInput,
}
);

//response from fastapi
const dataFromFastapi = fastResponse.data;

res.json({ message: "Successful call to FastAPI", dataFromFastapi });
} catch (error) {
console.error("Error calling FastAPI", error);
res.status(500).json({ error: "Failed to call FastAPI" });
}
});

export default langchainCallRoute;
6 changes: 5 additions & 1 deletion backend/server.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import express from "express";
import cors from "cors";
import serverHealthRoutes from "./routes/serverHealthRoutes.js";
import langchainCallRoute from "./routes/langchainCallRoute.js";

const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Allow CORS only for specific origins (recommended for production)
const corsOptions = {
Expand All @@ -13,7 +16,8 @@ app.use(cors(corsOptions));
const port = process.env.PORT || 5050;
const mongoURI = process.env.MONGO_URI || 'mongodb://localhost:27017/lp-toolkit'
console.log("MONGO URI" , mongoURI)
app.use('/serverHealthRoutes', serverHealthRoutes);
app.use("/serverHealthRoutes", serverHealthRoutes);
app.use("/langchainCallRoute", langchainCallRoute);

// This displays a message indicating that the server is running and listening to the specified port
app.listen(port, () => console.log(`Listening on port ${port}`));
32 changes: 24 additions & 8 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
version: '3.8'

services:
frontend:
container_name: lp-toolkit-frontend
build:
context: frontend
ports:
- 3000:3000
- "3000:3000"
volumes:
- ./frontend:/usr/src/app
restart: unless-stopped
Expand All @@ -15,31 +17,45 @@ services:

backend:
container_name: lp-toolkit-backend
restart: unless-stopped
build:
context: backend
ports:
- 5050:5050
- "5050:5050"
volumes:
- ./backend:/usr/src/app
depends_on:
- mongo
environment:
- MONGO_URI='mongodb://mongo:27017/lp-toolkit'
- MONGO_URI=mongodb://mongo:27017/lp-toolkit
restart: unless-stopped
networks:
- express-mongo
- react-express
depends_on:
- mongo

fastapi:
container_name: lp-toolkit-fastapi
build: ./langchain
ports:
- "8000:8000"
volumes:
- ./langchain/app:/usr/src/app
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
restart: unless-stopped
networks:
- express-mongo # Include if FastAPI needs to communicate with MongoDB
- react-express # For communication with the frontend

mongo:
container_name: lp-toolkit-mongo
restart: unless-stopped
image: mongo:4.2.0
volumes:
- ./data:/data/db
restart: unless-stopped
networks:
- express-mongo
expose:
- 27017
- "27017"

networks:
react-express:
Expand Down
36 changes: 28 additions & 8 deletions frontend/src/components/Chat.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,37 @@ export function Chat() {
}
};

// Define function for sendingUserMessage with input data
const sendUserMessage = (message) => {
return axios.post("http://localhost:5050/langchainCallRoute/ask", {
data: message,
});
};

const sendMessage = async () => {
if (currentMessage) {
//timestamp
let timestamp = await fetchTimestamp();
setMessages([
...messages,
{ type: "user", content: currentMessage },
{
type: "response",
content: timestamp,
},
]);
//add user message to chat
setMessages([...messages, { type: "user", content: currentMessage }]);
//try to send user message to express route
try {
const response = await sendUserMessage(currentMessage);
//add response from express route to chat
setMessages([
...messages,
{ type: "user", content: currentMessage },
{ type: "response", content: response.data.dataFromFastapi.output },
{
type: "response",
content: timestamp,
},
]);
} catch (error) {
console.log("Failed to send user message: ", error);
}

//clear message input
setCurrentMessage("");
}
};
Expand Down
176 changes: 176 additions & 0 deletions langchain/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
# Created by https://www.toptal.com/developers/gitignore/api/python
# Edit at https://www.toptal.com/developers/gitignore?templates=python

### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml

# ruff
.ruff_cache/

# LSP config files
pyrightconfig.json

# End of https://www.toptal.com/developers/gitignore/api/python
21 changes: 21 additions & 0 deletions langchain/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Use an official Python runtime as a parent image
FROM python:3.10

# Set the working directory in the container
WORKDIR /usr/src/app

# Copy the current directory contents into the container at /usr/src/app
COPY ./app /usr/src/app

# Install any needed packages specified in requirements.txt
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Make port 8000 available to the world outside this container
EXPOSE 8000

# Define environment variable
ENV UVICORN_HOST=0.0.0.0 UVICORN_PORT=8000

# Run uvicorn when the container launches
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
1 change: 1 addition & 0 deletions langchain/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Run Server with command: "uvicorn main:app --reload"
Empty file added langchain/__init__.py
Empty file.
Empty file added langchain/app/__init__.py
Empty file.
Loading

0 comments on commit 4ab300c

Please sign in to comment.