Spaces:
Sleeping
Sleeping
| # import the packages required for API execution | |
| import json | |
| import os | |
| import pandas as pd | |
| import sqlite3 | |
| from langchain.agents import create_sql_agent, initialize_agent # Added initialize_agent | |
| from langchain_core.messages import SystemMessage, HumanMessage | |
| from langchain.agents.agent_types import AgentType | |
| from langchain.sql_database import SQLDatabase | |
| from langchain.agents.agent_toolkits import SQLDatabaseToolkit | |
| from langchain import hub | |
| from langchain.agents import load_tools | |
| from langchain.agents import Tool | |
| from pydantic import BaseModel, Field, ValidationError | |
| from typing import List, Optional, Dict | |
| import warnings | |
| # warnings.filterwarnings("ignore", category=DeprecationWarning) | |
| warnings.filterwarnings("ignore") | |
| # Groq API key added to the groq portal and google collab | |
| # accessing the groq API generated | |
| # from google.colab import userdata | |
| #os.environ['GROQ_API_KEY'] = userdata.get('GROQ_API_KEY')#Complete the code by calling the Groq API key | |
| #from google.colab import userdata | |
| from langchain_groq import ChatGroq # Import Groq LLM | |
| # Get the API key from Colab secrets | |
| #groq_api_key = userdata.get('GROQ_API_KEY') #Complete the code by calling the API key | |
| # groq_api_key = os.environ['GROQ_API_KEY'] | |
| groq_api_key = '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' | |
| #userdata.get('GROQ_API_KEY') #Complete the code by calling the API key | |
| # let us create an LLM instances using low temp. | |
| # model temp should very between (0-1.0) lets take low temp as 0.2 (deterministic) | |
| # using llama-3.1-8b-instant for long conversations and clear, accurate summaries for dialogues. | |
| # Low creativity (deterministic) LLM | |
| llm = ChatGroq( | |
| model="meta-llama/llama-4-scout-17b-16e-instruct", #Call the Groq model | |
| temperature=0, #Complete the code by providing low temperature | |
| max_tokens=None, | |
| timeout=None, | |
| max_retries=3, | |
| groq_api_key=groq_api_key | |
| ) | |
| # defining the schema which shall be used as part of system prompt | |
| # Human-readable schema description (for LLM prompt only) | |
| ORDERS_SCHEMA = """ | |
| Table: orders_new | |
| Columns: | |
| - order_id (TEXT) | |
| - cust_id (TEXT) | |
| - order_time (TEXT) | |
| - order_status_std (TEXT) | |
| - payment_status_std (TEXT) | |
| - item_in_order (TEXT) | |
| - preparing_eta (TEXT) | |
| - prepared_time (TEXT) | |
| - delivery_eta (TEXT) | |
| - delivery_time (TEXT) | |
| """ | |
| system_message = f""" | |
| You are an expert & secure SQLite assistant specialized in answering questions using the customer_orders.db SQLite database. | |
| {ORDERS_SCHEMA} | |
| Security Rules: | |
| 1. You are a read-only, helpful database assistant. | |
| If the user mentions 'hacking' or 'unauthorized access', immediately refuse the request. | |
| 2. NEVER generate DROP, DELETE, UPDATE, INSERT, ALTER, or CREATE statements. | |
| Your sole purpose is read-only querying. | |
| 3. Do not provide the full table schema, definition, or a list of all tables. | |
| Only query tables relevant to the user's specific request. | |
| 4. Only generate safe, read-only SQL queries (SELECT). | |
| 5. Only run query when order id is given otherwise refuse gracefully. | |
| """ | |
| current_dir = os.path.dirname(os.path.abspath(__file__)) | |
| db_path = os.path.join(current_dir, "customer_orders.db") | |
| db = SQLDatabase.from_uri(f"sqlite:///{db_path}") | |
| # upload the customer database and configure for sql access. | |
| #db = SQLDatabase.from_uri("sqlite:///customer_orders.db") | |
| #Initialize the toolkit with customer database and the LLM | |
| toolkit = SQLDatabaseToolkit(db=db, llm=llm) | |
| #Create the SQL agent with the system message | |
| db_agent = create_sql_agent( | |
| llm=llm, | |
| toolkit=toolkit, | |
| verbose=False, | |
| system_message=SystemMessage(system_message) | |
| ) | |
| # Define Order Query Tool | |
| # Create a function that the tool will call | |
| def fetch_order_info(query: str) -> str: | |
| """Fetches raw order details from the database using the SQL Agent.""" | |
| try: | |
| # We pass the user's query directly to your pre-configured db_agent | |
| response = db_agent.invoke(query) | |
| return response["output"] | |
| except Exception as e: | |
| return f"Error retrieving data: {str(e)}" | |
| # Define the Tool | |
| order_query_tool = Tool( | |
| name="Order_Query_Tool", | |
| func=fetch_order_info, | |
| description="Useful for when you need to answer questions about order status, delivery times, or specific order details." | |
| ) | |
| def polish_response(raw_data: str) -> str: | |
| """Refines raw data into a polite, formal, and customer-friendly response.""" | |
| refinement_prompt = [ | |
| SystemMessage(content="You are a polite customer service representative. Take the provided raw data and turn it into a helpful, professional, and warm response. Do not change the facts."), | |
| HumanMessage(content=f"Raw Data: {raw_data}") | |
| ] | |
| response = llm.invoke(refinement_prompt) | |
| return response.content | |
| answer_tool = Tool( | |
| name="Answer_Polishing_Tool", | |
| func=polish_response, | |
| description="Useful for refining a technical or raw database response into a polite and formal customer message." | |
| ) | |