| import os |
| import gradio as gr |
| from langchain_openai import ChatOpenAI |
| from langchain_core.output_parsers import StrOutputParser |
| from langchain_core.prompts import ChatPromptTemplate |
| from langchain_core.runnables import RunnablePassthrough, chain |
|
|
| def create_dynamic_chain(api_key): |
| llm = ChatOpenAI(model="gpt-4o-mini", api_key=api_key) |
| |
| |
| general_prompt = ChatPromptTemplate.from_messages([ |
| ("system", "You are a helpful assistant that provides direct answers."), |
| ("human", "{question}") |
| ]) |
| |
| |
| math_prompt = ChatPromptTemplate.from_messages([ |
| ("system", "You are a mathematical assistant. Solve the problem and show your work."), |
| ("human", "{question}") |
| ]) |
| |
| |
| code_prompt = ChatPromptTemplate.from_messages([ |
| ("system", "You are a coding assistant. Provide code examples and explanations."), |
| ("human", "{question}") |
| ]) |
| |
| general_chain = general_prompt | llm | StrOutputParser() |
| math_chain = math_prompt | llm | StrOutputParser() |
| code_chain = code_prompt | llm | StrOutputParser() |
| |
| @chain |
| def dynamic_chain(input_dict): |
| question = input_dict["question"].lower() |
| |
| |
| if any(word in question for word in ["calculate", "solve", "compute", "sum", "multiply"]): |
| return math_chain |
| elif any(word in question for word in ["code", "program", "function", "python", "javascript"]): |
| return code_chain |
| return general_chain |
|
|
| return dynamic_chain |
|
|
| def process_message(message, history, api_key, example_select): |
| if not api_key: |
| return "", [{"role": "assistant", "content": "Please enter your OpenAI API key."}] |
| |
| try: |
| |
| if example_select != "Custom Input": |
| message = EXAMPLES[example_select] |
| |
| chain = create_dynamic_chain(api_key) |
| response = chain.invoke({"question": message}) |
| |
| history.append({"role": "user", "content": message}) |
| history.append({"role": "assistant", "content": response}) |
| |
| return "", history |
| except Exception as e: |
| return "", history + [{"role": "assistant", "content": f"Error: {str(e)}"}] |
|
|
| |
| EXAMPLES = { |
| "General Question": "What are the main features of renewable energy?", |
| "Math Problem": "Calculate the area of a circle with radius 5 units.", |
| "Coding Question": "Write a Python function to find the factorial of a number.", |
| "Custom Input": "" |
| } |
|
|
| |
| with gr.Blocks() as demo: |
| gr.Markdown("# Dynamic Chain Demo with Examples") |
| |
| with gr.Row(): |
| api_key = gr.Textbox( |
| label="OpenAI API Key", |
| placeholder="Enter your OpenAI API key", |
| type="password" |
| ) |
| example_select = gr.Dropdown( |
| choices=list(EXAMPLES.keys()), |
| value="Custom Input", |
| label="Select Example" |
| ) |
| |
| chatbot = gr.Chatbot(type="messages") |
| msg = gr.Textbox(label="Message", placeholder="Type your message or select an example above") |
| clear = gr.ClearButton([msg, chatbot]) |
| |
| |
| gr.Markdown(""" |
| ## Example Types: |
| 1. **General Questions**: Regular queries that don't require special processing |
| 2. **Math Problems**: Questions involving calculations and mathematical operations |
| 3. **Coding Questions**: Programming-related queries that return code examples |
| |
| ## Try these patterns: |
| - Math: "Calculate...", "Solve...", "Compute..." |
| - Code: "Write a function...", "Program...", "Code..." |
| - General: Any other type of question |
| """) |
| |
| msg.submit( |
| process_message, |
| inputs=[msg, chatbot, api_key, example_select], |
| outputs=[msg, chatbot] |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |