|
|
import math
|
|
|
from typing import Optional
|
|
|
from langchain.agents import initialize_agent,Tool, AgentType
|
|
|
from langchain.memory import ConversationBufferMemory
|
|
|
from langchain_deepseek import ChatDeepSeek
|
|
|
from dotenv import load_dotenv
|
|
|
import os
|
|
|
from datetime import datetime
|
|
|
|
|
|
load_dotenv()
|
|
|
|
|
|
|
|
|
llm = ChatDeepSeek(api_key=os.getenv("DEEPSEEK_API_KEY"), model="deepseek-chat")
|
|
|
|
|
|
def get_weather(location: str) -> str:
|
|
|
|
|
|
return f"Weather forecast for {location}: Sunny with a high of 25°C and low of 15°C. 10% chance of precipitation."
|
|
|
|
|
|
def calculator(operation_input: str) -> str:
|
|
|
"""Perform basic arithmetic operations from a text description."""
|
|
|
try:
|
|
|
|
|
|
parts = operation_input.split()
|
|
|
|
|
|
|
|
|
if "add" in operation_input.lower() or "+" in operation_input:
|
|
|
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if len(numbers) >= 2:
|
|
|
return f"{numbers[0]} + {numbers[1]} = {numbers[0] + numbers[1]}"
|
|
|
else:
|
|
|
return "Error: Could not identify two numbers for addition"
|
|
|
|
|
|
elif "subtract" in operation_input.lower() or "-" in operation_input:
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if len(numbers) >= 2:
|
|
|
return f"{numbers[0]} - {numbers[1]} = {numbers[0] - numbers[1]}"
|
|
|
else:
|
|
|
return "Error: Could not identify two numbers for subtraction"
|
|
|
|
|
|
elif "multiply" in operation_input.lower() or "*" in operation_input:
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if len(numbers) >= 2:
|
|
|
return f"{numbers[0]} * {numbers[1]} = {numbers[0] * numbers[1]}"
|
|
|
else:
|
|
|
return "Error: Could not identify two numbers for multiplication"
|
|
|
|
|
|
elif "divide" in operation_input.lower() or "/" in operation_input:
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if len(numbers) >= 2:
|
|
|
if numbers[1] == 0:
|
|
|
return "Error: Division by zero"
|
|
|
return f"{numbers[0]} / {numbers[1]} = {numbers[0] / numbers[1]}"
|
|
|
else:
|
|
|
return "Error: Could not identify two numbers for division"
|
|
|
|
|
|
elif "power" in operation_input.lower() or "^" in operation_input:
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if len(numbers) >= 2:
|
|
|
return f"{numbers[0]}^{numbers[1]} = {numbers[0] ** numbers[1]}"
|
|
|
else:
|
|
|
return "Error: Could not identify two numbers for power operation"
|
|
|
|
|
|
elif "sqrt" in operation_input.lower():
|
|
|
numbers = [float(s) for s in parts if s.replace('.', '', 1).isdigit()]
|
|
|
if numbers:
|
|
|
if numbers[0] < 0:
|
|
|
return "Error: Cannot take square root of negative number"
|
|
|
return f"sqrt({numbers[0]}) = {math.sqrt(numbers[0])}"
|
|
|
else:
|
|
|
return "Error: Could not identify a number for square root"
|
|
|
else:
|
|
|
return f"Unknown operation. Please specify one of: add, subtract, multiply, divide, power, sqrt"
|
|
|
except Exception as e:
|
|
|
return f"Error performing calculation: {str(e)}"
|
|
|
|
|
|
tools = [
|
|
|
Tool(
|
|
|
name="Weather",
|
|
|
func=get_weather,
|
|
|
description="Get the current weather for a specified location."
|
|
|
),
|
|
|
Tool(
|
|
|
name="Calculator",
|
|
|
func=calculator,
|
|
|
description="Perform mathematical calculations. Available operations: add, subtract, multiply, divide, power, sqrt. For example: operation='add', a=2, b=3 will return '2 + 3 = 5'."
|
|
|
),
|
|
|
]
|
|
|
|
|
|
memory = ConversationBufferMemory(
|
|
|
memory_key="chat_history",
|
|
|
return_messages=True
|
|
|
)
|
|
|
|
|
|
agent_executor = initialize_agent(
|
|
|
tools=tools,
|
|
|
llm=llm,
|
|
|
memory=memory,
|
|
|
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
|
|
|
verbose=True,
|
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
while True:
|
|
|
query = input("\nEnter your question (or 'exit' to quit): ")
|
|
|
if query.lower() == 'exit':
|
|
|
break
|
|
|
result = agent_executor.invoke(query)
|
|
|
print(f"Result: {result['output']}")
|
|
|
|