Spaces:
Running
Running
from typing import List, Dict, Tuple, Optional, Any | |
import gradio as gr | |
from langchain_core.language_models.llms import LLM | |
from langgraph.checkpoint.memory import MemorySaver | |
from ask_candid.utils import get_session_id | |
from ask_candid.graph import build_compute_graph | |
from ask_candid.base.config.constants import START_SYSTEM_PROMPT | |
def run_chat( | |
thread_id: str, | |
user_input: Dict[str, Any], | |
history: List[Dict], | |
llm: LLM, | |
indices: Optional[List[str]] = None, | |
premium_features: Optional[List[str]] = None, | |
) -> Tuple[gr.MultimodalTextbox, List[Dict[str, Any]], str]: | |
if premium_features is None: | |
premium_features = [] | |
if len(history) == 0: | |
history.append({"role": "system", "content": START_SYSTEM_PROMPT}) | |
history.append({"role": "user", "content": user_input["text"]}) | |
inputs = {"messages": history} | |
# thread_id can be an email https://github.com/yurisasc/memory-enhanced-ai-assistant/blob/main/assistant.py | |
thread_id = get_session_id(thread_id) | |
config = {"configurable": {"thread_id": thread_id}} | |
enable_recommendations = "Recommendation" in premium_features | |
workflow = build_compute_graph( | |
llm=llm, | |
indices=indices, | |
user_callback=gr.Info, | |
enable_recommendations=enable_recommendations | |
) | |
memory = MemorySaver() # TODO: don't use for Prod | |
graph = workflow.compile(checkpointer=memory) | |
response = graph.invoke(inputs, config=config) | |
messages = response["messages"] | |
# Return the recommendation if there is any | |
recommendation = response.get("recommendation", None) | |
if recommendation: | |
ai_answer = recommendation | |
else: | |
# Fallback to the chatbot response | |
last_message = messages[-1] | |
ai_answer = last_message.content | |
sources_html = "" | |
for message in messages[-2:]: | |
if message.type == "HTML": | |
sources_html = message.content | |
history.append({"role": "assistant", "content": ai_answer}) | |
if sources_html: | |
history.append({ | |
"role": "assistant", | |
"content": sources_html, | |
"metadata": {"title": "Sources HTML"}, | |
}) | |
return gr.MultimodalTextbox(value=None, interactive=True), history, thread_id | |