Skip to content

Commit 0aed277

Browse files
authored
Merge pull request #63 from ks6088ts-labs/feature/issue-62_chat-app
add chat apps
2 parents 5d62fab + 064c30c commit 0aed277

File tree

10 files changed

+707
-10
lines changed

10 files changed

+707
-10
lines changed

compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ services:
2525
ports:
2626
- 8501:8501
2727
volumes:
28-
- ./frontend_transcription.env:/app/frontend_transcription.env
28+
- ./frontend.env:/app/frontend.env
2929
environment:
3030
- PYTHONUNBUFFERED=1

docs/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
- [How to exclude multiple directories in pre-commit](https://stackoverflow.com/a/75560858)
88
- [Docker Compose Quickstart](https://docs.docker.com/compose/gettingstarted/)
99
- [Validating docker-compose yml file](https://stackoverflow.com/a/40158753)
10+
- [LangChain > Azure OpenAI](https://python.langchain.com/v0.1/docs/integrations/llms/azure_openai/)
11+
- [Get started with LangSmith](https://docs.smith.langchain.com/)
12+
- [Add message history (memory) > In-memory](https://python.langchain.com/v0.1/docs/expression_language/how_to/message_history/#in-memory)
1013

1114
## Backend
1215

frontend_transcription.env.sample renamed to frontend.env.sample

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@ AZURE_OPENAI_API_KEY = "<aoai-api-key>"
33
AZURE_OPENAI_API_VERSION = "2024-05-01-preview"
44
AZURE_OPENAI_WHISPER_MODEL = "whisper"
55
AZURE_OPENAI_GPT_MODEL = "gpt-4o"
6+
7+
LANGCHAIN_TRACING_V2 = "true"
8+
LANGCHAIN_API_KEY = "<your-api-key>"

frontend/entrypoint.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import logging
22

3-
from frontend.solutions import azure_ai_vision, azure_storage, document_intelligence, sandbox, transcription
3+
from frontend.solutions import (
4+
azure_ai_vision,
5+
azure_storage,
6+
chat,
7+
chat_langchain,
8+
document_intelligence,
9+
sandbox,
10+
transcription,
11+
)
412
from frontend.solutions.types import SolutionType
513

614
logger = logging.getLogger(__name__)
@@ -14,6 +22,8 @@ def start(
1422
try:
1523
solutions = {
1624
SolutionType.SANDBOX.value: sandbox.start,
25+
SolutionType.CHAT.value: chat.start,
26+
SolutionType.CHAT_LANGCHAIN.value: chat_langchain.start,
1727
SolutionType.TRANSCRIPTION.value: transcription.start,
1828
SolutionType.DOCUMENT_INTELLIGENCE.value: document_intelligence.start,
1929
SolutionType.AZURE_STORAGE.value: azure_storage.start,

frontend/solutions/chat.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import logging
2+
from os import getenv
3+
4+
import streamlit as st
5+
from dotenv import load_dotenv
6+
from openai import AzureOpenAI
7+
8+
logger = logging.getLogger(__name__)
9+
load_dotenv("frontend.env")
10+
11+
12+
def start(
13+
backend_url: str,
14+
log_level: int,
15+
):
16+
logger.setLevel(log_level)
17+
logger.debug(f"set log level to {log_level}")
18+
19+
st.title("ChatGPT-like clone")
20+
21+
client = AzureOpenAI(
22+
api_key=getenv("AZURE_OPENAI_API_KEY"),
23+
api_version=getenv("AZURE_OPENAI_API_VERSION"),
24+
azure_endpoint=getenv("AZURE_OPENAI_ENDPOINT"),
25+
)
26+
27+
if "messages" not in st.session_state:
28+
st.session_state.messages = []
29+
30+
for message in st.session_state.messages:
31+
with st.chat_message(message["role"]):
32+
st.markdown(message["content"])
33+
34+
if prompt := st.chat_input("What is up?"):
35+
st.session_state.messages.append({"role": "user", "content": prompt})
36+
with st.chat_message("user"):
37+
st.markdown(prompt)
38+
39+
with st.chat_message("assistant"):
40+
stream = client.chat.completions.create(
41+
model=getenv("AZURE_OPENAI_GPT_MODEL"),
42+
messages=[{"role": m["role"], "content": m["content"]} for m in st.session_state.messages],
43+
stream=True,
44+
)
45+
response = st.write_stream(stream)
46+
st.session_state.messages.append({"role": "assistant", "content": response})
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import logging
2+
from os import getenv
3+
from uuid import uuid4
4+
5+
import streamlit as st
6+
from dotenv import load_dotenv
7+
from langchain_community.chat_message_histories import ChatMessageHistory
8+
from langchain_core.chat_history import BaseChatMessageHistory
9+
from langchain_core.messages import HumanMessage
10+
from langchain_core.runnables.history import RunnableWithMessageHistory
11+
from langchain_openai import AzureChatOpenAI
12+
13+
logger = logging.getLogger(__name__)
14+
load_dotenv("frontend.env")
15+
store = {}
16+
config = {"configurable": {"session_id": str(uuid4())}}
17+
18+
19+
def get_session_history(session_id: str) -> BaseChatMessageHistory:
20+
if session_id not in store:
21+
store[session_id] = ChatMessageHistory()
22+
return store[session_id]
23+
24+
25+
def start(
26+
backend_url: str,
27+
log_level: int,
28+
):
29+
logger.setLevel(log_level)
30+
logger.debug(f"set log level to {log_level}")
31+
32+
st.title("ChatGPT-like clone implemented with LangChain")
33+
34+
model = AzureChatOpenAI(
35+
api_key=getenv("AZURE_OPENAI_API_KEY"),
36+
api_version=getenv("AZURE_OPENAI_API_VERSION"),
37+
azure_endpoint=getenv("AZURE_OPENAI_ENDPOINT"),
38+
azure_deployment=getenv("AZURE_OPENAI_GPT_MODEL"),
39+
)
40+
41+
with_message_history = RunnableWithMessageHistory(
42+
runnable=model,
43+
get_session_history=get_session_history,
44+
# input_messages_key="input",
45+
# history_messages_key="history",
46+
)
47+
48+
chat_message_history = with_message_history.get_session_history(
49+
session_id=config["configurable"]["session_id"],
50+
)
51+
for message in chat_message_history.messages:
52+
with st.chat_message(message.type):
53+
st.markdown(message.content)
54+
55+
if prompt := st.chat_input("What is up?"):
56+
with st.chat_message("user"):
57+
st.markdown(prompt)
58+
59+
with st.chat_message("assistant"):
60+
response = with_message_history.invoke(
61+
[HumanMessage(content=prompt)],
62+
config=config,
63+
)
64+
65+
st.markdown(response.content)

frontend/solutions/transcription.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from openai import AzureOpenAI
88
from openai.types.audio import Transcription
99

10-
load_dotenv("frontend_transcription.env")
10+
load_dotenv("frontend.env")
1111
logger = logging.getLogger(__name__)
1212

1313

frontend/solutions/types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
class SolutionType(Enum):
55
SANDBOX = "SANDBOX"
6+
CHAT = "CHAT"
7+
CHAT_LANGCHAIN = "CHAT_LANGCHAIN"
68
TRANSCRIPTION = "TRANSCRIPTION"
79
DOCUMENT_INTELLIGENCE = "DOCUMENT_INTELLIGENCE"
810
AZURE_STORAGE = "AZURE_STORAGE"

0 commit comments

Comments
 (0)