Spaces:
Running
Running
| # ========================================================= | |
| # VendIQ β Intelligent Market Assistant (LangGraph + Gradio) | |
| # Founder: Rohit Kumar | Data Scientist | |
| # ========================================================= | |
| import os | |
| import random | |
| import sqlite3 | |
| from datetime import datetime | |
| import matplotlib.pyplot as plt | |
| from PIL import Image, ImageDraw, ImageFont | |
| import torch | |
| from transformers import pipeline | |
| from diffusers import StableDiffusionPipeline | |
| # ---- LangGraph Imports ---- | |
| from langgraph.graph import StateGraph, END | |
| from typing import TypedDict, Optional | |
| # ---- LangChain community imports ---- | |
| from langchain_community.document_loaders import PyPDFLoader | |
| from langchain_community.embeddings import HuggingFaceEmbeddings | |
| from langchain_community.vectorstores import FAISS | |
| # ---- UI ---- | |
| import gradio as gr | |
| # ========================================================= | |
| # 1. CONFIGURATION | |
| # ========================================================= | |
| TEXT_MODEL = "google/flan-t5-large" | |
| IMAGE_MODEL = "runwayml/stable-diffusion-v1-5" | |
| EMBED_MODEL = "sentence-transformers/all-MiniLM-L6-v2" | |
| PDF_PATH = "Business Strategy Document β Mukesh Ambani Style.pdf" | |
| DB_PATH = "vendiq.db" | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| text_gen = pipeline("text2text-generation", model=TEXT_MODEL) | |
| try: | |
| image_gen = StableDiffusionPipeline.from_pretrained( | |
| IMAGE_MODEL, | |
| torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32, | |
| safety_checker=None | |
| ).to(device) | |
| except Exception: | |
| image_gen = None | |
| # ========================================================= | |
| # 2. DATABASE | |
| # ========================================================= | |
| def init_db(): | |
| conn = sqlite3.connect(DB_PATH) | |
| c = conn.cursor() | |
| c.execute('''CREATE TABLE IF NOT EXISTS deals ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| company TEXT, | |
| product TEXT, | |
| strategy TEXT, | |
| profit REAL, | |
| marketing TEXT, | |
| created_at TEXT | |
| )''') | |
| conn.commit() | |
| conn.close() | |
| init_db() | |
| # ========================================================= | |
| # 3. CONTEXT MEMORY | |
| # ========================================================= | |
| def load_strategy(): | |
| emb = HuggingFaceEmbeddings(model_name=EMBED_MODEL) | |
| if os.path.exists(PDF_PATH): | |
| loader = PyPDFLoader(PDF_PATH) | |
| pages = loader.load() | |
| vectordb = FAISS.from_documents(pages, emb) | |
| return vectordb | |
| return FAISS.from_texts( | |
| ["Reliance-style strategy emphasizing scale, technology, and market dominance"], | |
| emb | |
| ) | |
| vectordb = load_strategy() | |
| def get_context(query): | |
| try: | |
| results = vectordb.similarity_search(query, k=2) | |
| return "\n".join([r.page_content for r in results]) | |
| except Exception: | |
| return "Reliance-inspired strategy: scale, vertical integration, and customer-first innovation." | |
| # ========================================================= | |
| # 4. LANGGRAPH STATE | |
| # ========================================================= | |
| class VendIQState(TypedDict): | |
| scenario: str | |
| product: str | |
| context: Optional[str] | |
| strategy: Optional[str] | |
| marketing: Optional[str] | |
| profit: Optional[float] | |
| chart_path: Optional[str] | |
| ad_path: Optional[str] | |
| # ========================================================= | |
| # 5. NODES | |
| # ========================================================= | |
| def context_node(state: VendIQState): | |
| context = get_context(state["scenario"]) | |
| state["context"] = context if context else f"General B2B environment for {state['scenario']}" | |
| return state | |
| def strategy_node(state: VendIQState): | |
| tone = random.choice([ | |
| "aggressive expansion mindset", | |
| "strategic partnership and alliance-driven growth", | |
| "innovation-led differentiation and disruption", | |
| "cost leadership with scalability focus", | |
| "customer loyalty and retention-based positioning" | |
| ]) | |
| focus = random.choice([ | |
| "digital transformation and process automation", | |
| "supply chain optimization and vendor integration", | |
| "B2B channel growth and ecosystem partnerships", | |
| "new market entry and regional dominance", | |
| "AI-driven customer analytics and personalization" | |
| ]) | |
| risk_profile = random.choice([ | |
| "high-reward disruptive expansion", | |
| "balanced strategic scaling", | |
| "low-risk sustainable long-term growth" | |
| ]) | |
| prompt = f""" | |
| You are **VendIQ**, an AI Strategy Architect modeled on Mukesh Ambaniβs philosophy: | |
| *scale fast, integrate vertically, and own the market ecosystem.* | |
| --- | |
| ### π§© Context | |
| {state["context"]} | |
| ### π Scenario | |
| {state["scenario"]} | |
| ### π·οΈ Product | |
| {state["product"]} | |
| --- | |
| ### π― Objective | |
| Formulate a **5-Step Negotiation & Market-Entry Strategy** for **{state["product"]}**, crafted in Ambani-style β focused on ecosystem control, long-term scale, and competitive dominance. | |
| πΉ **Approach Tone:** {tone} | |
| πΉ **Strategic Focus:** {focus} | |
| πΉ **Risk Appetite:** {risk_profile} | |
| --- | |
| ### π Each Step Should Include: | |
| 1οΈβ£ **Objective** β Clear, measurable business goal. | |
| 2οΈβ£ **Action Plan** β Concrete strategic move or partnership. | |
| 3οΈβ£ **Rationale** β Market or competitive logic behind it. | |
| 4οΈβ£ **Expected Outcome** β Measurable or strategic impact. | |
| 5οΈβ£ **Ambani-Style Twist** β How vertical integration or scale amplifies the result. | |
| --- | |
| Format clearly using numbered steps (1β5). | |
| End with a single-line **Positioning Summary** showing how {state["product"]} establishes category dominance. | |
| Maintain a professional, analytical tone β like a market intelligence brief. | |
| """ | |
| state["strategy"] = text_gen(prompt.strip(), max_length=700, temperature=0.85)[0]["generated_text"] | |
| return state | |
| # ========================================================= | |
| # π§© MARKETING NODE β DISTINCT 7-DAY PLAN (Ambani-Style) | |
| # ========================================================= | |
| def marketing_node(state): | |
| """ | |
| Generates a 7-Day Ambani-style Marketing Plan based on the scenario and product. | |
| Ensures clear day-wise objectives, actions, and KPIs. | |
| """ | |
| prompt = f""" | |
| You are **VendIQ**, an AI-powered B2B Marketing Strategist inspired by Relianceβs agility, scale, and dominance mindset. | |
| Your goal is to convert a strategic vision into a precise 7-day marketing execution plan. | |
| ### Scenario | |
| {state["scenario"]} | |
| ### Product | |
| {state["product"]} | |
| ### Strategic Philosophy (for inspiration) | |
| {state["context"]} | |
| --- | |
| ### TASK | |
| Ignore negotiation or high-level strategy repetition. | |
| Focus on practical execution β digital + field + B2B partnerships. | |
| Be concise, measurable, and bold. Use Reliance-style scale thinking. | |
| Generate a **7-Day Marketing Plan** using this format: | |
| #### ποΈ Day 1: Market Pulse | |
| - **Objective:** Identify initial customer response | |
| - **Action Steps:** (2β3 crisp bullet points) | |
| - **KPIs:** (measurable goals) | |
| #### π Day 2: Visibility & Awareness | |
| ... | |
| Continue till **Day 7**, ending with a summary that highlights momentum, scaling, and brand loyalty. | |
| Ensure: | |
| - Each day has a unique purpose. | |
| - Avoid repeating negotiation/strategy language. | |
| - Include Ambani-style confidence in tone. | |
| - Output should read like a business execution manual. | |
| --- | |
| ### OUTPUT | |
| Now write the full 7-day marketing plan below: | |
| """ | |
| from transformers import pipeline | |
| text_gen = pipeline("text-generation", model="google/flan-t5-large") | |
| marketing_plan = text_gen(prompt.strip(), max_length=900, temperature=1.05)[0]["generated_text"] | |
| # Save to state | |
| state["marketing"] = marketing_plan | |
| return state | |
| def profit_node(state: VendIQState): | |
| """ | |
| Generates a realistic 7-day profit forecast visualization for the product. | |
| Includes business-like chart design and performance trend logic. | |
| """ | |
| base_profit = random.randint(500, 2500) | |
| growth_trend = random.choice(["upward", "steady", "volatile", "decline-risk"]) | |
| if growth_trend == "upward": | |
| profits = [base_profit + i * random.randint(40, 120) for i in range(7)] | |
| elif growth_trend == "steady": | |
| profits = [base_profit + random.randint(-50, 50) for _ in range(7)] | |
| elif growth_trend == "volatile": | |
| profits = [base_profit + random.randint(-200, 250) for _ in range(7)] | |
| else: | |
| profits = [base_profit - i * random.randint(20, 70) for i in range(7)] | |
| days = list(range(1, 8)) | |
| plt.figure(figsize=(6, 3.5)) | |
| plt.plot(days, profits, marker="o", linewidth=2) | |
| plt.title(f"π 7-Day Profit Projection β {state['product']}", fontsize=11, fontweight="bold") | |
| plt.xlabel("Day", fontsize=9) | |
| plt.ylabel("Profit ($)", fontsize=9) | |
| plt.grid(True, linestyle="--", alpha=0.6) | |
| plt.tight_layout() | |
| chart_path = f"{state['product']}_profit.png" | |
| plt.savefig(chart_path, dpi=150) | |
| plt.close() | |
| state["profit"] = profits[-1] | |
| state["chart_path"] = chart_path | |
| return state | |
| def ad_node(state: VendIQState): | |
| """ | |
| Generates a B2B advertisement image for the product. | |
| Uses Stable Diffusion if available; otherwise, falls back to a styled banner. | |
| """ | |
| theme = random.choice([ | |
| "AI innovation and automation", | |
| "enterprise intelligence and scale", | |
| "sustainability and green business", | |
| "luxury fintech excellence", | |
| "smart logistics transformation", | |
| "healthcare precision technology" | |
| ]) | |
| color_scheme = random.choice([ | |
| "blue and silver", | |
| "black and gold", | |
| "emerald green and white", | |
| "navy and cyan", | |
| "crimson red and charcoal gray", | |
| "deep teal and white" | |
| ]) | |
| visual_tone = random.choice([ | |
| "futuristic realism", | |
| "executive corporate branding", | |
| "3D minimalism with strong contrast", | |
| "AI-powered digital theme", | |
| "luxury business aesthetics" | |
| ]) | |
| if image_gen: | |
| prompt = ( | |
| f"Design a premium B2B advertisement for a product named {state['product']}. " | |
| f"Theme: {theme}. " | |
| f"Color scheme: {color_scheme}. " | |
| f"Visual tone: {visual_tone}. " | |
| f"Include elements of market leadership, innovation, and trust. " | |
| f"Style: professional, cinematic, and Ambani-style corporate dominance. " | |
| f"No text or logos. 16:9 aspect ratio." | |
| ) | |
| img = image_gen(prompt).images[0] | |
| else: | |
| # Fallback banner generation | |
| color_map = { | |
| "blue and silver": (40, 60, 140), | |
| "black and gold": (30, 25, 25), | |
| "emerald green and white": (0, 100, 60), | |
| "navy and cyan": (15, 40, 80), | |
| "crimson red and charcoal gray": (90, 20, 30), | |
| "deep teal and white": (0, 80, 85) | |
| } | |
| bg_color = color_map.get(color_scheme, (0, 80, 160)) | |
| img = Image.new("RGB", (960, 540), color=bg_color) | |
| draw = ImageDraw.Draw(img) | |
| font = ImageFont.load_default() | |
| # Add subtle design | |
| draw.rectangle([0, 400, 960, 540], fill=(255, 255, 255, 40)) | |
| draw.text((30, 430), f"{state['product']}", font=font, fill="white") | |
| draw.text((30, 460), "Powered by VendIQ β B2B Market Intelligence", font=font, fill="white") | |
| ad_path = f"{state['product']}_ad.png" | |
| img.save(ad_path) | |
| state["ad_path"] = ad_path | |
| return state | |
| from reportlab.lib.pagesizes import A4 | |
| from reportlab.pdfgen import canvas | |
| from reportlab.lib.units import inch | |
| from reportlab.lib.utils import simpleSplit | |
| def save_to_pdf(product, strategy_text, marketing_text): | |
| filename = f"{product.replace(' ', '_')}_VendIQ_Report.pdf" | |
| c = canvas.Canvas(filename, pagesize=A4) | |
| width, height = A4 | |
| # ---- Title ---- | |
| c.setFont("Helvetica-Bold", 18) | |
| c.drawCentredString(width / 2, height - 1*inch, "VendIQ β Strategic Market Report") | |
| c.setFont("Helvetica", 12) | |
| c.drawCentredString(width / 2, height - 1.3*inch, f"Product: {product}") | |
| c.drawCentredString(width / 2, height - 1.6*inch, datetime.now().strftime("Generated on %Y-%m-%d %H:%M")) | |
| c.line(1*inch, height - 1.7*inch, width - 1*inch, height - 1.7*inch) | |
| # ---- Section 1: Negotiation & Market Entry ---- | |
| text_obj = c.beginText(1*inch, height - 2.2*inch) | |
| text_obj.setFont("Helvetica-Bold", 14) | |
| text_obj.textLine("Section 1 β Negotiation & Market Entry Strategy") | |
| text_obj.setFont("Helvetica", 11) | |
| text_obj.textLine("") | |
| for line in simpleSplit(strategy_text, "Helvetica", 11, width - 2*inch): | |
| text_obj.textLine(line) | |
| c.drawText(text_obj) | |
| # ---- Section 2: 7-Day Marketing Plan ---- | |
| c.showPage() | |
| text_obj = c.beginText(1*inch, height - 1*inch) | |
| text_obj.setFont("Helvetica-Bold", 14) | |
| text_obj.textLine("Section 2 β 7-Day B2B Marketing Plan") | |
| text_obj.setFont("Helvetica", 11) | |
| text_obj.textLine("") | |
| for line in simpleSplit(marketing_text, "Helvetica", 11, width - 2*inch): | |
| text_obj.textLine(line) | |
| c.drawText(text_obj) | |
| c.save() | |
| return filename | |
| def save_node(state: VendIQState): | |
| conn = sqlite3.connect(DB_PATH) | |
| c = conn.cursor() | |
| c.execute( | |
| "INSERT INTO deals (company, product, strategy, profit, marketing, created_at) VALUES (?, ?, ?, ?, ?, ?)", | |
| ("GlobalTech", state["product"], state["strategy"], state["profit"], state["marketing"], | |
| datetime.now().strftime("%Y-%m-%d %H:%M")) | |
| ) | |
| conn.commit() | |
| conn.close() | |
| pdf_path = save_to_pdf(state["product"], state["strategy"], state["marketing"]) | |
| state["pdf_path"] = pdf_path | |
| return state | |
| # ========================================================= | |
| # 6. LANGGRAPH PIPELINE | |
| # ========================================================= | |
| graph = StateGraph(VendIQState) | |
| graph.add_node("context", context_node) | |
| graph.add_node("strategy", strategy_node) | |
| graph.add_node("marketing", marketing_node) | |
| graph.add_node("profit", profit_node) | |
| graph.add_node("ad", ad_node) | |
| graph.add_node("save", save_node) | |
| graph.set_entry_point("context") | |
| graph.add_edge("context", "strategy") | |
| graph.add_edge("strategy", "marketing") | |
| graph.add_edge("marketing", "profit") | |
| graph.add_edge("profit", "ad") | |
| graph.add_edge("ad", "save") | |
| graph.add_edge("save", END) | |
| vendiq_graph = graph.compile() | |
| # ========================================================= | |
| # 7. GRADIO UI | |
| # ========================================================= | |
| def vendiq_app(scenario, product): | |
| if not scenario or not product: | |
| return "β Please enter both fields.", None, None, None, None, None | |
| result = vendiq_graph.invoke({"scenario": scenario, "product": product}) | |
| return ( | |
| result["strategy"], | |
| result["profit"], | |
| result["chart_path"], | |
| result["marketing"], | |
| result["ad_path"], | |
| result.get("pdf_path") # β include PDF download link | |
| ) | |
| with gr.Blocks(title="VendIQ β Intelligent Market Assistant") as app: | |
| gr.Markdown("<h1 style='text-align:center;'>VendIQ β Intelligent Market Assistant</h1>") | |
| gr.Markdown("<p style='text-align:center;'>B2B Strategy, Marketing, and Profit Insights with Ambani-style intelligence.</p>") | |
| with gr.Tab("π Generate Strategy"): | |
| scenario = gr.Textbox(label="Business Scenario", placeholder="E.g., entering new logistics market") | |
| product = gr.Textbox(label="Product", placeholder="E.g., AI Supply Chain Platform") | |
| btn = gr.Button("Generate Strategy") | |
| strategy_out = gr.Textbox(label="Negotiation Strategy", lines=6) | |
| profit_out = gr.Number(label="Projected Profit ($)") | |
| chart_out = gr.Image(label="Profit Chart") | |
| marketing_out = gr.Textbox(label="7-Day Marketing Plan", lines=6) | |
| ad_out = gr.Image(label="Ad Image") | |
| pdf_out = gr.File(label="π Download Full Report (PDF)") # β Added output | |
| btn.click( | |
| fn=vendiq_app, | |
| inputs=[scenario, product], | |
| outputs=[strategy_out, profit_out, chart_out, marketing_out, ad_out, pdf_out] | |
| ) | |
| app.launch() | |