Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from langchain_openai import ChatOpenAI | |
| from langchain_core.messages import HumanMessage, AIMessage, trim_messages | |
| from langgraph.checkpoint.memory import MemorySaver | |
| from langgraph.graph import START, MessagesState, StateGraph | |
| from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| def get_model(): | |
| model = ChatOpenAI(model="gpt-4o", temperature=0, base_url="https://models.inference.ai.azure.com") | |
| return model | |
| model = get_model() | |
| system_prompt = """You are an intelligent and versatile AI assistant, capable of engaging in natural, helpful, and coherent conversations. Your primary role is to assist users with a wide range of topics, including answering questions, providing recommendations, solving problems, generating creative content, and offering technical guidance. | |
| Key Guidelines: | |
| 1. Clarity and Precision: Provide clear, concise, and accurate responses. Tailor your tone and style to match the user’s needs and preferences. | |
| 2. Helpfulness: Strive to be as useful as possible. Clarify ambiguous queries and ask for more details when needed. | |
| 3. Adaptability: Adjust your responses based on the context and complexity of the user's request, from casual to professional interactions. | |
| 4. Ethical and Safe: Ensure your responses are ethical, unbiased, and do not promote harm, misinformation, or illegal activities. | |
| 5. Context Awareness: Leverage the context of the conversation to provide relevant and coherent replies, maintaining continuity throughout. | |
| 6. Creative Problem-Solving: When asked for creative or technical solutions, provide innovative, practical, and actionable ideas. | |
| 7. Limitations: Be transparent about your capabilities and limitations. If you cannot answer a question or perform a task, communicate this clearly and, when possible, suggest alternative resources. | |
| """ | |
| prompt_template = ChatPromptTemplate.from_messages( | |
| [ | |
| ( | |
| "system", | |
| system_prompt, | |
| ), | |
| MessagesPlaceholder(variable_name="messages"), | |
| ] | |
| ) | |
| trimmer = trim_messages( | |
| max_tokens=65, | |
| strategy="last", | |
| token_counter=model, | |
| include_system=True, | |
| allow_partial=False, | |
| start_on="human", | |
| ) | |
| def call_model(state: MessagesState): | |
| trimmed_messages = trimmer.invoke(state["messages"]) | |
| prompt = prompt_template.invoke({"messages" : trimmed_messages}) | |
| response = model.invoke(prompt) | |
| return {"messages": response} | |
| def get_app(state=MessagesState): | |
| workflow = StateGraph(state_schema=MessagesState) | |
| workflow.add_edge(START, "model") | |
| workflow.add_node("model", call_model) | |
| memory = MemorySaver() | |
| app = workflow.compile(checkpointer=memory) | |
| return app | |
| config = {"configurable": {"thread_id": "111"}} | |
| app = get_app() | |
| if query:=st.chat_input("Ask anything"): | |
| msg= [HumanMessage(query)] | |
| def gen(): | |
| for chunk, metadata in app.stream({"messages": msg}, config=config, stream_mode="messages"): | |
| if isinstance(chunk, AIMessage): | |
| yield chunk.content | |
| st.write_stream(gen) | |