Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merging in release ROOT to staging branch #174

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3e64a96
Merge pull request #121 from mit-submit/main
julius-heitkoetter Oct 25, 2023
a89c6ab
Update prod-root-install.sh
julius-heitkoetter Oct 25, 2023
c3f7414
Update prod-root-install.sh
julius-heitkoetter Oct 25, 2023
e5ac57d
Update prod-root-install.sh
julius-heitkoetter Oct 25, 2023
10dca6c
Merge pull request #131 from mit-submit/main
ludomori99 Oct 27, 2023
d719667
Merge pull request #136 from mit-submit/main
ludomori99 Oct 30, 2023
a7fd114
Merge pull request #138 from mit-submit/main
ludomori99 Oct 31, 2023
ffcd921
Merge pull request #142 from mit-submit/main
ludomori99 Nov 7, 2023
d2e769c
Merge pull request #144 from mit-submit/main
ludomori99 Nov 7, 2023
c14ab32
Merge pull request #146 from mit-submit/main
ludomori99 Nov 7, 2023
a51d76d
Merge branch 'release-ROOT' into main
ludomori99 Nov 24, 2023
4535ba5
Merge pull request #154 from mit-submit/main
ludomori99 Nov 25, 2023
0a77be3
Update prod-root-compose.yaml
cpausmit Jul 17, 2024
e9f96b6
Merge pull request #160 from mit-submit/cpausmit-patch-1
cpausmit Jul 17, 2024
9253aae
root a2rchi to t3desk018, plus port change
Jul 26, 2024
a1624ba
deploy_test
Jul 26, 2024
dfdc5d4
deploy test TWO!
Jul 26, 2024
b64a041
test deploy again
Jul 26, 2024
91aaf55
reverting port change
Jul 26, 2024
26635a4
adding Anthropic LLM
Aug 29, 2024
194687d
Anthropic LLM temperature fix
Aug 29, 2024
148c6b5
Merge pull request #161 from mit-submit/development/anthropic_claude
pmlugato Aug 29, 2024
b25c4d3
fix claude model
kuangfei-long Sep 24, 2024
3d06683
change back config
kuangfei-long Sep 25, 2024
6612dfc
messing with package dependencies
Oct 23, 2024
ccb9203
Merge pull request #171 from mit-submit/development/anthropic_claude
pmlugato Oct 23, 2024
1c83ee5
updated package imports
Oct 24, 2024
601ba56
Merge pull request #172 from mit-submit/development/anthropic_claude
pmlugato Oct 24, 2024
df84fff
missing package oops
Oct 24, 2024
8b81a2a
everything's great
Oct 24, 2024
e0ad8c6
langchain-openai breaks things
Oct 24, 2024
4fafef7
worked in the venv :)
Oct 24, 2024
0531844
chroma issues
Oct 24, 2024
c9a0fab
client vs service version disagreement
Oct 24, 2024
a2687ba
oldest version that supports pydantic v2
Oct 24, 2024
2353c6a
moving chat service
Oct 24, 2024
672e6c9
redeploy with new anthropic api secret
Oct 25, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .github/workflows/prod-root-ci-cd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ jobs:
/bin/bash ${workspace}/deploy/create_secret.sh flask_uploader_app_secret_key.txt ${{ secrets.PROD_FLASK_UPLOADER_APP_SECRET_KEY }}
/bin/bash ${workspace}/deploy/create_secret.sh uploader_salt.txt ${{ secrets.PROD_UPLOADER_SALT }}
/bin/bash ${workspace}/deploy/create_secret.sh openai_api_key.txt ${{ secrets.OPENAI_API_KEY }}
/bin/bash ${workspace}/deploy/create_secret.sh anthropic_api_key.txt ${{ secrets.ANTHROPIC_API_KEY }}
/bin/bash ${workspace}/deploy/create_secret.sh hf_token.txt ${{ secrets.HF_TOKEN }}
/bin/bash ${workspace}/deploy/create_secret.sh pg_password.txt ${{ secrets.PROD_ROOT_PG_PASSWORD }}
/bin/bash ${workspace}/deploy/create_secret.sh grafana_password.txt ${{ secrets.PROD_ROOT_GRAFANA_PG_PASSWORD }}
Expand All @@ -52,30 +53,30 @@ jobs:
# create deployment directory if it doesn't already exist
- name: Create Directory
run: |
ssh submit06 "mkdir -p ~/A2rchi-prod-root/"
ssh submit-t3desk018 "mkdir -p ~/A2rchi-prod-root/"

# stop any existing docker compose that's running
- name: Stop Docker Compose
run: |
ssh submit06 'bash -s' < ${{ github.workspace }}/deploy/prod-root/prod-root-stop.sh
ssh submit-t3desk018 'bash -s' < ${{ github.workspace }}/deploy/prod-root/prod-root-stop.sh

# copy repository to machine
- name: Copy Repository
run: |
rsync -e ssh -r ${{ github.workspace}}/* --exclude .git/ --delete submit06:~/A2rchi-prod-root/
rsync -e ssh -r ${{ github.workspace}}/* --exclude .git/ --delete submit-t3desk018:~/A2rchi-prod-root/

# run deploy script
- name: Run Deploy Script
run: |
export tag="${GITHUB_REF#refs/heads/}"
export tag="${tag//\//-}.${GITHUB_SHA}"
sed -i "s/BASE_TAG/${tag}/" ${{ github.workspace }}/deploy/prod-root/prod-root-install.sh
ssh submit06 'bash -s' < ${{ github.workspace }}/deploy/prod-root/prod-root-install.sh
ssh submit-t3desk018 'bash -s' < ${{ github.workspace }}/deploy/prod-root/prod-root-install.sh

# clean up secret files
- name: Remove Secrets from Runner
run: |
rm ${{ github.workspace }}/deploy/prod-root/secrets/*.txt

# print job status
- run: echo "🍏 This job's status is ${{ job.status }}."
- run: echo "🍏 This job's status is ${{ job.status }}."
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# A2rchi
# A2rchi

An AI Augmented Research Chat Intelligence for MIT's subMIT project in the physics department

Expand Down
1 change: 1 addition & 0 deletions a2rchi/bin/service_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import os

# set openai
os.environ['ANTHROPIC_API_KEY'] = read_secret("ANTHROPIC_API_KEY")
os.environ['OPENAI_API_KEY'] = read_secret("OPENAI_API_KEY")
os.environ['HUGGING_FACE_HUB_TOKEN'] = read_secret("HUGGING_FACE_HUB_TOKEN")
config = Config_Loader().config["interfaces"]["chat_app"]
Expand Down
2 changes: 2 additions & 0 deletions a2rchi/bin/service_uploader.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@


# set openai

os.environ['ANTHROPIC_API_KEY'] = read_secret("ANTHROPIC_API_KEY")
os.environ['OPENAI_API_KEY'] = read_secret("OPENAI_API_KEY")
os.environ['HUGGING_FACE_HUB_TOKEN'] = read_secret("HUGGING_FACE_HUB_TOKEN")

Expand Down
45 changes: 37 additions & 8 deletions a2rchi/chains/base.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
"""Chain for chatting with a vector database."""
from __future__ import annotations
from pydantic import BaseModel
from loguru import logger
from langchain.callbacks import FileCallbackHandler
from langchain_core.callbacks.file import FileCallbackHandler

from a2rchi.chains.prompts import CONDENSE_QUESTION_PROMPT, QA_PROMPT
from a2rchi.utils.config_loader import Config_Loader

from langchain.base_language import BaseLanguageModel
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain_core.language_models.base import BaseLanguageModel
from langchain.chains.combine_documents.stuff import StuffDocumentsChain #################### ****************
from langchain.chains.conversational_retrieval.base import BaseConversationalRetrievalChain
from langchain.chains.llm import LLMChain
from langchain.schema import BaseRetriever, Document
from langchain.schema.prompt_template import BasePromptTemplate
from langchain.chains.llm import LLMChain #################### ****************
from langchain_core.retrievers import BaseRetriever
from langchain_core.documents import Document
from langchain_core.prompts.base import BasePromptTemplate
from langchain_core.runnables import RunnableSequence, RunnablePassthrough
from typing import Any, Dict, List, Optional, Tuple
from typing import Callable
# from pydantic import model_rebuild
import os


Expand Down Expand Up @@ -46,7 +51,20 @@ class BaseSubMITChain(BaseConversationalRetrievalChain):
"""
retriever: BaseRetriever # Index to connect to
max_tokens_limit: Optional[int] = None # restrict doc length to return from store, enforced only for StuffDocumentChain
get_chat_history: Optional[function] = _get_chat_history
get_chat_history: Optional[Callable[[List[Tuple[str, str]]], str]] = _get_chat_history

# kuangfei: the rebuild logic is default or rewrite
# @classmethod
# def model_rebuild(
# cls,
# *,
# force: bool = False,
# raise_errors: bool = True,
# _parent_namespace_depth: int = 2,
# _types_namespace: dict[str, Any] | None = None,
# ) -> bool | None:
# return False


def _reduce_tokens_below_limit(self, docs: List[Document]) -> List[Document]:
num_docs = len(docs)
Expand Down Expand Up @@ -104,6 +122,17 @@ def from_llm(
callbacks = [handler],
verbose=verbose,
)

# llm_chain = RunnableSequence(
# {
# "sentence": RunnablePassthrough(),
# "language": RunnablePassthrough()
# }
# | _prompt
# | llm
# # | output_parser
# )

doc_chain = StuffDocumentsChain(
llm_chain=llm_chain,
document_variable_name=document_variable_name,
Expand All @@ -114,7 +143,7 @@ def from_llm(
condense_question_chain = LLMChain(
llm=_llm, prompt=condense_question_prompt, callbacks = [handler], verbose=verbose
)

return cls(
retriever=retriever,
combine_docs_chain=doc_chain,
Expand Down
2 changes: 1 addition & 1 deletion a2rchi/chains/chain.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from a2rchi.chains.base import BaseSubMITChain as BaseChain

from chromadb.config import Settings
from langchain.vectorstores import Chroma
from langchain_chroma.vectorstores import Chroma

import chromadb
import time
Expand Down
103 changes: 99 additions & 4 deletions a2rchi/chains/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@
import torch
import time

from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
from langchain.chat_models import ChatOpenAI
from langchain.llms import LlamaCpp
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic


import requests
from typing import Optional, List



class BaseCustomLLM(LLM):
"""
Expand Down Expand Up @@ -46,6 +52,21 @@ def _call(
time.sleep(sleep_time)
return "I am just a dumb LLM, I will give you a number: " + str(np.random.randint(10000, 99999))


class AnthropicLLM(ChatAnthropic):
"""
Loading Anthropic model from langchain package and specifying version. Options include:
model: str = "claude-3-opus-20240229"
model: str = "claude-3-sonnet-20240229"

Model comparison: https://docs.anthropic.com/en/docs/about-claude/models#model-comparison
"""

model: str = "claude-3-opus-20240229"
temp: int = 1



class LlamaLLM(BaseCustomLLM):
"""
Loading the Llama LLM from facebook. Make sure that the model
Expand Down Expand Up @@ -217,3 +238,77 @@ def __call__(self, output_text):
report += "|" + "|".join(f"{n:^10}" for n in scores.keys()) + "|\n"
report += "|" + "|".join(f"{n:^10}" for n in scores.values()) + "|\n"
return "Salesforce Content Safety Flan T5 Base", is_safe, report

class BaseCustomLLM(LLM):
"""
Abstract class used to load a custom LLM
"""
n_tokens: int = 100 # this has to be here for parent LLM class

@property
def _llm_type(self) -> str:
return "custom"

@abstractmethod
def _call(
self,
prompt: str,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
) -> str:
pass


class ClaudeLLM(BaseCustomLLM):
"""
An LLM class that uses Anthropic's Claude model.
"""
#TODO: obscure api key in final production version
api_key: str = "INSERT KEY HERE!!!" # Claude API key
base_url: str = "https://api.anthropic.com/v1/messages" # Anthropic API endpoint
model_name: str = "claude-3-5-sonnet-20240620" # Specify the model version to use

verbose: bool = False

def _call(
self,
prompt: str = None,
stop: Optional[List[str]] = None,
run_manager: Optional[CallbackManagerForLLMRun] = None,
max_tokens: int = 1024,
) -> str:

if stop is not None:
print("WARNING : currently this model does not support stop tokens")

if self.verbose:
print(f"INFO : Starting call to Claude with prompt: {prompt}")

headers = {
"x-api-key": self.api_key, # Use the API key for the x-api-key header
"anthropic-version": "2023-06-01", # Add the required version header
"Content-Type": "application/json"
}

# Modify the payload to match the required structure
payload = {
"model": self.model_name, # You can keep this dynamic based on your code
"max_tokens": max_tokens, # Update to match the required max_tokens
"messages": [ # Use a list of messages where each message has a role and content
{"role": "user", "content": prompt} # Prompt becomes part of the message content
]
}

if self.verbose:
print("INFO: Sending request to Claude API")

# Send request to Claude API
response = requests.post(self.base_url, headers=headers, json=payload)

if response.status_code == 200:
completion = response.json()["content"][0]["text"]
if self.verbose:
print(f"INFO : received response from Claude API: {completion}")
return completion
else:
raise Exception(f"API request to Claude failed with status {response.status_code}, {response.text}")
2 changes: 1 addition & 1 deletion a2rchi/chains/prompts.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# flake8: noqa
from langchain.prompts.prompt import PromptTemplate
from langchain_core.prompts import PromptTemplate
from a2rchi.utils.config_loader import Config_Loader

config = Config_Loader().config["chains"]["prompts"]
Expand Down
7 changes: 4 additions & 3 deletions a2rchi/utils/config_loader.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from a2rchi.chains.models import OpenAILLM, DumbLLM, LlamaLLM
from a2rchi.chains.models import OpenAILLM, DumbLLM, LlamaLLM, AnthropicLLM

from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.embeddings import HuggingFaceEmbeddings
from langchain_openai import OpenAIEmbeddings
from langchain_huggingface import HuggingFaceEmbeddings

import os
import yaml
Expand All @@ -23,6 +23,7 @@ def load_config(self):

# change the model class parameter from a string to an actual class
MODEL_MAPPING = {
"AnthropicLLM": AnthropicLLM,
"OpenAILLM": OpenAILLM,
"DumbLLM": DumbLLM,
"LlamaLLM": LlamaLLM
Expand Down
13 changes: 6 additions & 7 deletions a2rchi/utils/data_manager.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
from a2rchi.utils.scraper import Scraper

from chromadb.config import Settings
from langchain.document_loaders import TextLoader
from langchain.document_loaders import PyPDFLoader
from langchain.memory import ConversationBufferMemory
from langchain.document_loaders import BSHTMLLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.document_loaders.text import TextLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders import BSHTMLLoader
from langchain_openai import OpenAIEmbeddings
from langchain_chroma.vectorstores import Chroma
from langchain_text_splitters.character import CharacterTextSplitter

import chromadb
import hashlib
Expand Down
1 change: 0 additions & 1 deletion a2rchi/utils/scraper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from piazza_api import Piazza

import hashlib
import os
Expand Down
15 changes: 10 additions & 5 deletions config/prod-root-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ interfaces:
PORT: 7861
EXTERNAL_PORT: 7684
HOST: "0.0.0.0" # either "0.0.0.0" (for public) or "127.0.0.1" (for internal)
HOSTNAME: "submit06.mit.edu" # careful, this is used for the chat service
HOSTNAME: "t3desk018.mit.edu" # careful, this is used for the chat service
template_folder: "/root/A2rchi/a2rchi/interfaces/chat_app/templates"
static_folder: "/root/A2rchi/a2rchi/interfaces/chat_app/static"
num_responses_until_feedback: 3 #the number of responses given by A2rchi until she asks for feedback.
Expand All @@ -28,7 +28,7 @@ chains:
- empty.list
- miscellanea.list
- root-docs.list
- root-tutorial.list
# - root-tutorial.list
# - root-forum.list
base:
# roles that A2rchi knows about
Expand All @@ -47,13 +47,18 @@ chains:
MAIN_PROMPT: config/prompts/root.prompt
chain:
# pick one of the models listed in the model class map below
MODEL_NAME: OpenAILLM
MODEL_NAME: AnthropicLLM
# map of all the class models and their keyword arguments
MODEL_CLASS_MAP:
AnthropicLLM:
class: AnthropicLLM
kwargs:
model: claude-3-opus-20240229
temperature: 1 # not sure if 1 is best value? for now keeping consistent with prior settings.
OpenAILLM:
class: OpenAILLM
kwargs:
model_name: gpt-4
model_name: gpt-4o-mini
temperature: 1
DumbLLM:
class: DumbLLM
Expand Down Expand Up @@ -120,4 +125,4 @@ utils:
scraper:
reset_data: True # delete websites and sources.yml in data folder
verify_urls: False # should be true when possible
enable_warnings: False # keeps output clean if verify == False
enable_warnings: False # keeps output clean if verify == False
Loading
Loading