Spaces:
Sleeping
Sleeping
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() |