Spaces:
Sleeping
Sleeping
| from dotenv import load_dotenv | |
| import matplotlib.pyplot as plt | |
| import pandas as pd | |
| from smolagents import LiteLLMModel, ToolCallingAgent, tool | |
| import os | |
| # litellm._turn_on_debug() # Disabled for faster responses | |
| API_KEY = os.environ.get("MISTRAL_API_KEY") | |
| TOKEN = os.getenv("token") | |
| model = LiteLLMModel(model_id="mistral/mistral-large-2512",api_key=API_KEY) #mistral/mistral-large-2512 | |
| instructions = """You are a helpful assistant that can analyze datasets and create visualizations based on user questions.""" | |
| saves = "./conversation_log.txt" | |
| def load_saves(): # Load the conversation history from the file | |
| try: | |
| with open(saves, "r") as f: | |
| chat_history_content = f.read() | |
| print("Previous Conversation:\n", chat_history_content) | |
| return chat_history_content | |
| except FileNotFoundError: | |
| print("No previous conversation found.") | |
| def save_conversation(user_input, response,dataset_path=None): # Save the conversation history to the file | |
| with open(saves, "a") as f: | |
| f.write(f"User: {user_input} with dataset path: {dataset_path}\n") | |
| f.write(f"Agent: {response}\n\n") | |
| print("Conversation saved.") | |
| def clear_conversation_history(): # Clear the conversation history | |
| with open(saves, "w") as f: | |
| f.write("") | |
| print("Conversation history cleared.") | |
| #TOOLS SECTION | |
| def csv_reader(file_path:str)->str: | |
| """ | |
| Read a CSV file and return a summary and sample rows (not the entire file). | |
| Args: | |
| file_path: The path to the CSV file you want to read. | |
| """ | |
| try: | |
| df = pd.read_csv(file_path) | |
| summary = f"Dataset Shape: {df.shape[0]} rows, {df.shape[1]} columns\n" | |
| summary += f"Columns: {', '.join(df.columns)}\n" | |
| summary += f"Data Types:\n{df.dtypes.to_string()}\n\n" | |
| summary += "First 10 rows:\n" | |
| summary += df.head(10).to_string() #see first 10 rows of the dataset | |
| return summary | |
| except Exception as e: | |
| return f"Error reading CSV: {e}" | |
| def bar_chart(file_path: str, x: str, y: str) -> str: | |
| """ | |
| Generates and displays a beautiful bar chart from a CSV or Excel file. | |
| Args: | |
| file_path: The path to the data file (CSV or Excel). | |
| x: The name of the column to use for the X-axis (categories). | |
| y: The name of the column to use for the Y-axis (numeric values). | |
| """ | |
| df = pd.read_csv(file_path) | |
| plt.figure(figsize=(10, 6)) | |
| plt.bar(df[x], df[y]) | |
| plt.xlabel(x) | |
| plt.xticks(rotation=45, ha='right') | |
| plt.ylabel(y) | |
| plt.title(f'{y} by {x}') | |
| plt.tight_layout() | |
| plt.savefig("bar_chart.png") | |
| plt.close() | |
| return "bar_chart.png" | |
| def delete_chart()-> str: | |
| """ | |
| Don't show old charts - delete the previous one before generating a new one. | |
| Deletes the generated bar chart image file if it exists. | |
| """ | |
| if os.path.exists("bar_chart.png"): | |
| os.remove("bar_chart.png") | |
| return "Bar chart deleted." | |
| else: | |
| return "No bar chart to delete." | |
| agent = ToolCallingAgent(model=model, tools=[csv_reader, bar_chart],instructions=instructions) | |
| def ask_agent(question, dataset_path): | |
| # Only load last few lines of history to speed up response | |
| history = "" | |
| try: | |
| with open(saves, "r") as f: | |
| lines = f.readlines() | |
| # Only use last 20 lines (last ~5 exchanges) | |
| history = "".join(lines[-20:]) if lines else "" | |
| except FileNotFoundError: | |
| history = "" | |
| full_prompt = f"Latest Question: {question}\nDataset Path: {dataset_path}" | |
| if history: | |
| full_prompt = f"Recent context:\n{history}\n\n{full_prompt}" | |
| response = agent.run(full_prompt) | |
| save_conversation(question, response, dataset_path) | |
| return response, "bar_chart.png" if os.path.exists("bar_chart.png") else None | |