SivaMallikarjun's picture
Create app.py
4abd740 verified
import gradio as gr
import duckdb
import pandas as pd
from datetime import datetime
import random
# --- MCP Registry ---
class MCP:
def __init__(self):
self.agents = {}
self.services = {} # To map service types to agent names
def register_agent(self, name, agent, services=None):
self.agents[name] = agent
if services:
for service in services:
if service not in self.services:
self.services[service] = []
self.services[service].append(name)
def get_agent(self, name):
return self.agents.get(name)
def find_agents_by_service(self, service_type):
return self.services.get(service_type, [])
mcp_registry = MCP()
# --- Data Management Agent ---
class DataManagementAgent:
def __init__(self, db_path="market_ai_duckdb.db"):
self.conn = duckdb.connect(db_path)
self._create_tables()
def _create_tables(self):
try:
self.conn.execute("""
CREATE TABLE IF NOT EXISTS demand_forecasts (
item_name VARCHAR,
location VARCHAR,
forecast_date VARCHAR,
predicted_demand INTEGER
);
""")
except Exception as e:
print(f"Error creating demand_forecasts table: {e}")
try:
self.conn.execute("""
CREATE TABLE IF NOT EXISTS consumer_requests (
id INTEGER,
consumer_name VARCHAR,
item_name VARCHAR,
requested_qty INTEGER,
unit VARCHAR,
required_date VARCHAR
);
""")
except Exception as e:
print(f"Error creating consumer_requests table: {e}")
try:
self.conn.execute("""
CREATE TABLE IF NOT EXISTS farmer_stock (
id INTEGER,
farmer_name VARCHAR,
item_name VARCHAR,
available_qty INTEGER,
unit VARCHAR,
quality_grade VARCHAR,
available_date VARCHAR
);
""")
except Exception as e:
print(f"Error creating farmer_stock table: {e}")
self.conn.commit()
def insert(self, table_name, data):
cursor = self.conn.cursor()
placeholders = ', '.join(['?'] * len(data))
query = f"INSERT INTO {table_name} VALUES ({placeholders})"
try:
cursor.execute(query, data)
self.conn.commit()
except Exception as e:
print(f"Error inserting into {table_name}: {e}")
def fetch(self, query):
try:
df = self.conn.execute(query).df()
return df
except Exception as e:
print(f"Error fetching data: {e}")
return pd.DataFrame()
data_agent = DataManagementAgent()
mcp_registry.register_agent("data_agent", data_agent, services=["data_storage"])
# --- Demand Forecasting Agent (Simplified) ---
class DemandForecastingAgent:
def __init__(self, data_agent):
self.data_agent = data_agent
def predict_demand(self, item_name, location, forecast_date):
predicted_demand = random.randint(10, 100)
self.data_agent.insert("demand_forecasts", (item_name, location, forecast_date, predicted_demand))
return f"Predicted demand for {item_name} in {location} on {forecast_date}: {predicted_demand}"
demand_forecaster = DemandForecastingAgent(data_agent)
mcp_registry.register_agent("demand_forecaster", demand_forecaster, services=["demand_forecasting"])
# --- Vendor Agent (Illustrative) ---
class VendorAgent:
def __init__(self, mcp_registry):
self.mcp_registry = mcp_registry
def get_demand_forecast(self, item_name, location, forecast_date):
forecasting_agents = self.mcp_registry.find_agents_by_service("demand_forecasting")
if forecasting_agents:
forecaster_name = forecasting_agents[0]
forecaster = self.mcp_registry.get_agent(forecaster_name)
return forecaster.predict_demand(item_name, location, forecast_date)
else:
return "No demand forecasting agent available."
vendor_agent = VendorAgent(mcp_registry)
mcp_registry.register_agent("vendor_agent", vendor_agent)
# --- Consumer Agent ---
class ConsumerAgent:
def __init__(self, data_agent):
self.data_agent = data_agent
def submit_request(self, consumer_name, item_name, requested_qty, unit, required_date):
data = (int(datetime.now().timestamp()), consumer_name, item_name, requested_qty, unit, required_date)
self.data_agent.insert("consumer_requests", data)
return "Consumer request submitted successfully."
consumer_agent = ConsumerAgent(data_agent)
mcp_registry.register_agent("consumer_agent", consumer_agent, services=["consumer_request_submission"])
# --- Farmer Agent ---
class FarmerAgent:
def __init__(self, data_agent):
self.data_agent = data_agent
def submit_stock(self, farmer_name, item_name, available_qty, unit, quality_grade, available_date):
data = (int(datetime.now().timestamp()), farmer_name, item_name, available_qty, unit, quality_grade, available_date)
self.data_agent.insert("farmer_stock", data)
return "Farmer stock submitted successfully."
farmer_agent = FarmerAgent(data_agent)
mcp_registry.register_agent("farmer_agent", farmer_agent, services=["farmer_stock_submission"])
# --- Matching Agent ---
class MatchingAgent:
def __init__(self, data_agent):
self.data_agent = data_agent
def view_matches(self):
query = """
SELECT c.consumer_name, c.item_name, c.requested_qty, c.unit AS consumer_unit, c.required_date,
f.farmer_name, f.available_qty, f.unit AS farmer_unit, f.quality_grade, f.available_date
FROM consumer_requests c
LEFT JOIN farmer_stock f ON c.item_name = f.item_name AND c.unit = f.unit
WHERE c.required_date <= f.available_date
"""
df = self.data_agent.fetch(query)
return df
matching_agent = MatchingAgent(data_agent)
mcp_registry.register_agent("matching_agent", matching_agent, services=["market_matching"])
# --- Pre-Booking Agent ---
class PreBookingAgent:
def pre_book_item(self, consumer_name, item_name):
return f"{consumer_name} pre-booked {item_name}. Please proceed to checkout during market day."
prebooking_agent = PreBookingAgent()
mcp_registry.register_agent("prebooking_agent", prebooking_agent, services=["pre_booking"])
# --- GRADIO UI ---
def submit_consumer_ui(consumer_name, item_name, requested_qty, unit, required_date):
agent = mcp_registry.get_agent("consumer_agent")
return agent.submit_request(consumer_name, item_name, requested_qty, unit, required_date)
def submit_farmer_ui(farmer_name, item_name, available_qty, unit, quality_grade, available_date):
agent = mcp_registry.get_agent("farmer_agent")
return agent.submit_stock(farmer_name, item_name, available_qty, unit, quality_grade, available_date)
def view_market_matches_ui():
agent = mcp_registry.get_agent("matching_agent")
return agent.view_matches()
def pre_book_item_ui(consumer_name, item_name):
agent = mcp_registry.get_agent("prebooking_agent")
return agent.pre_book_item(consumer_name, item_name)
def get_demand_forecast_ui(item_name, location, forecast_date):
vendor = mcp_registry.get_agent("vendor_agent")
return vendor.get_demand_forecast(item_name, location, forecast_date)
with gr.Blocks() as app:
gr.Markdown("## Agentic AI Market App with MCP")
with gr.Tab("Consumer Request"):
uid = gr.Textbox(label="Consumer Name")
item = gr.Textbox(label="Item Name")
qty = gr.Number(label="Quantity Required")
unit = gr.Textbox(label="Unit (e.g., kg, liters)")
req_date = gr.Textbox(label="Required Date (YYYY-MM-DD)")
consumer_btn = gr.Button("Submit Request")
consumer_output = gr.Textbox()
consumer_btn.click(submit_consumer_ui, inputs=[uid, item, qty, unit, req_date], outputs=consumer_output)
with gr.Tab("Farmer Stock"):
fid = gr.Textbox(label="Farmer Name")
item_stock = gr.Textbox(label="Item Name")
qty_stock = gr.Number(label="Available Quantity")
unit_stock = gr.Textbox(label="Unit (e.g., kg, liters)")
quality = gr.Textbox(label="Quality Grade")
avail_date = gr.Textbox(label="Available Date (YYYY-MM-DD)")
farmer_btn = gr.Button("Submit Stock")
farmer_output = gr.Textbox()
farmer_btn.click(submit_farmer_ui, inputs=[fid, item_stock, qty_stock, unit_stock, quality, avail_date], outputs=farmer_output)
with gr.Tab("Market Matches"):
match_btn = gr.Button("View Matches")
match_output = gr.Dataframe()
match_btn.click(view_market_matches_ui, outputs=match_output)
with gr.Tab("Pre-Booking"):
consumer_name_prebook = gr.Textbox(label="Consumer Name")
item_name_prebook = gr.Textbox(label="Item Name")
prebook_btn = gr.Button("Pre-Book Item")
prebook_output = gr.Textbox()
prebook_btn.click(pre_book_item_ui, inputs=[consumer_name_prebook, item_name_prebook], outputs=prebook_output)
with gr.Tab("Vendor Services"):
item_forecast = gr.Textbox(label="Item Name")
location_forecast = gr.Textbox(label="Location")
date_forecast = gr.Textbox(label="Forecast Date (YYYY-MM-DD)")
forecast_btn = gr.Button("Get Demand Forecast")
forecast_output = gr.Textbox()
forecast_btn.click(get_demand_forecast_ui, inputs=[item_forecast, location_forecast, date_forecast], outputs=forecast_output)
app.launch()