Spaces:
Runtime error
Runtime error
from typing import List, Dict, Optional | |
from langchain_ollama import ChatOllama | |
from langchain_core.messages import HumanMessage, AIMessage | |
from langchain_core.prompts import ChatPromptTemplate | |
class LLMChat: | |
def __init__(self, model_name: str = "llama3.2", temperature: float = 0): | |
""" | |
Initialize LLMChat with LangChain ChatOllama | |
Args: | |
model_name (str): Name of the model to use | |
temperature (float): Temperature parameter for response generation | |
""" | |
self.model_name = model_name | |
self.llm = ChatOllama( | |
model=model_name, | |
temperature=temperature | |
) | |
self.history: List[Dict[str, str]] = [] | |
def chat_once(self, message: str): | |
""" | |
Single chat interaction without maintaining history | |
Args: | |
message (str): User input message | |
Returns: | |
str: Model's response | |
""" | |
try: | |
# Create a simple prompt template for single messages | |
prompt = ChatPromptTemplate.from_messages([ | |
("human", "{input}") | |
]) | |
# Create and invoke the chain | |
chain = prompt | self.llm | |
response = chain.invoke({"input": message}) | |
return response.content | |
except Exception as e: | |
print(f"Error in chat: {e}") | |
return "" | |
def chat_with_history(self, message: str): | |
""" | |
Chat interaction maintaining conversation history | |
Args: | |
message (str): User input message | |
Returns: | |
str: Model's response | |
""" | |
try: | |
# Add user message to history | |
self.history.append({'role': 'human', 'content': message}) | |
# Convert history to LangChain message format | |
messages = [ | |
HumanMessage(content=msg['content']) if msg['role'] == 'human' | |
else AIMessage(content=msg['content']) | |
for msg in self.history | |
] | |
# Get response using chat method | |
response = self.llm.invoke(messages) | |
assistant_message = response.content | |
# Add assistant response to history | |
self.history.append({'role': 'assistant', 'content': assistant_message}) | |
return assistant_message | |
except Exception as e: | |
print(f"Error in chat with history: {e}") | |
return "" | |
def chat_with_template(self, template_messages: List[Dict[str, str]], | |
input_variables: Dict[str, str]): | |
""" | |
Chat using a custom template | |
Args: | |
template_messages (List[Dict[str, str]]): List of template messages | |
input_variables (Dict[str, str]): Variables to fill in the template | |
Returns: | |
str: Model's response | |
""" | |
try: | |
# Create prompt template from messages | |
prompt = ChatPromptTemplate.from_messages([ | |
(msg['role'], msg['content']) | |
for msg in template_messages | |
]) | |
# Create and invoke the chain | |
chain = prompt | self.llm | |
response = chain.invoke(input_variables) | |
return response.content | |
except Exception as e: | |
print(f"Error in template chat: {e}") | |
return "" | |
def clear_history(self): | |
"""Clear the conversation history""" | |
self.history = [] | |
def get_history(self) -> List[Dict[str, str]]: | |
"""Return the current conversation history""" | |
return self.history | |
if __name__ == "__main__": | |
# Initialize the chat | |
chat = LLMChat(model_name="llama3.1", temperature=0) | |
# Example of using a template for translation | |
template_messages = [ | |
{ | |
"role": "system", | |
"content": "You are a helpful assistant that translates {input_language} to {output_language}." | |
}, | |
{ | |
"role": "human", | |
"content": "{input}" | |
} | |
] | |
input_vars = { | |
"input_language": "English", | |
"output_language": "German", | |
"input": "I love programming." | |
} | |
response = chat.chat_with_template(template_messages, input_vars) | |
# Simple chat without history | |
response = chat.chat_once("Hello!") | |
# Chat with history | |
response = chat.chat_with_history("How are you?") |