|
|
import os |
|
|
from typing import List |
|
|
from dotenv import load_dotenv |
|
|
import gradio as gr |
|
|
from langchain_openai import ChatOpenAI |
|
|
from langchain_core.prompts import PromptTemplate |
|
|
from langchain_core.runnables import RunnableMap, RunnableSequence |
|
|
from langchain_core.runnables.history import RunnableWithMessageHistory |
|
|
from langchain_core.chat_history import BaseChatMessageHistory |
|
|
from langchain_core.messages import BaseMessage |
|
|
from pydantic import BaseModel, Field |
|
|
from config import SYSTEM_INSTRUCTION, TEMPERATURE, MAX_TOKENS |
|
|
|
|
|
|
|
|
load_dotenv() |
|
|
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') |
|
|
|
|
|
|
|
|
USERNAME = os.getenv('USERNAME') |
|
|
PASSWORD = os.getenv('PASSWORD') |
|
|
|
|
|
|
|
|
class InMemoryHistory(BaseChatMessageHistory, BaseModel): |
|
|
"""In-memory implementation of chat message history.""" |
|
|
messages: List[BaseMessage] = Field(default_factory=list) |
|
|
|
|
|
def add_messages(self, messages: List[BaseMessage]) -> None: |
|
|
"""Add a list of messages to the store.""" |
|
|
self.messages.extend(messages) |
|
|
|
|
|
def clear(self) -> None: |
|
|
"""Clear all messages from the store.""" |
|
|
self.messages = [] |
|
|
|
|
|
|
|
|
store = {} |
|
|
|
|
|
def get_session_history(session_id: str) -> InMemoryHistory: |
|
|
if session_id not in store: |
|
|
store[session_id] = InMemoryHistory() |
|
|
return store[session_id] |
|
|
|
|
|
|
|
|
template = f"""{SYSTEM_INSTRUCTION} |
|
|
{{chat_history}} |
|
|
User: {{user_message}} |
|
|
Chatbot:""" |
|
|
|
|
|
prompt = PromptTemplate( |
|
|
input_variables=["chat_history", "user_message"], |
|
|
template=template |
|
|
) |
|
|
|
|
|
|
|
|
llm = ChatOpenAI( |
|
|
temperature=TEMPERATURE, |
|
|
max_tokens=MAX_TOKENS, |
|
|
model_name="gpt-4.1" |
|
|
) |
|
|
|
|
|
|
|
|
chain = prompt | llm |
|
|
|
|
|
|
|
|
with_history = RunnableWithMessageHistory( |
|
|
chain, |
|
|
get_session_history=get_session_history, |
|
|
input_messages_key="user_message", |
|
|
|
|
|
history_messages_key="chat_history" |
|
|
) |
|
|
|
|
|
def get_text_response(user_message, history): |
|
|
|
|
|
response = with_history.invoke( |
|
|
{"user_message": user_message}, |
|
|
config={"configurable": {"session_id": "unique_session_id"}} |
|
|
) |
|
|
|
|
|
return str(response.content) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_demo(): |
|
|
|
|
|
demo = gr.ChatInterface( |
|
|
fn=get_text_response, |
|
|
type='messages', |
|
|
theme="allenai/gradio-theme" |
|
|
) |
|
|
return demo |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo = create_demo() |
|
|
demo.queue().launch( |
|
|
share=True, |
|
|
debug=True, |
|
|
|
|
|
|
|
|
) |
|
|
|