Spaces:
Sleeping
Sleeping
File size: 9,815 Bytes
4abd740 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
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() |