muterornament's picture
feat: implement PDF export module, workflow pipeline, and web-based dashboard UI
2a9745a
|
Raw
History Blame Contribute Delete
14 kB
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="850" viewBox="0 0 1200 850">
<defs>
<!-- Sleek Gradients -->
<linearGradient id="streamGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#a78bfa;stop-opacity:1" /> <!-- Violet -->
<stop offset="50%" style="stop-color:#22d3ee;stop-opacity:1" /> <!-- Cyan -->
<stop offset="100%" style="stop-color:#f43f5e;stop-opacity:1" /> <!-- Rose -->
</linearGradient>
<linearGradient id="cardGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:rgba(30, 41, 59, 0.85)" />
<stop offset="100%" style="stop-color:rgba(15, 23, 42, 0.95)" />
</linearGradient>
<linearGradient id="chatGrad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgba(124, 58, 237, 0.15)" />
<stop offset="100%" style="stop-color:rgba(34, 211, 238, 0.05)" />
</linearGradient>
<linearGradient id="agenticGrad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:rgba(28, 28, 33, 0.8)" />
<stop offset="100%" style="stop-color:rgba(9, 9, 11, 0.95)" />
</linearGradient>
<!-- Glow Filters -->
<filter id="violetGlow" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur stdDeviation="6" result="blur" />
<feComposite in="SourceGraphic" in2="blur" operator="over" />
</filter>
<filter id="cyanGlow" x="-20%" y="-20%" width="140%" height="140%">
<feGaussianBlur stdDeviation="5" result="blur" />
<feComposite in="SourceGraphic" in2="blur" operator="over" />
</filter>
<filter id="neonGlow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="4" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
</defs>
<!-- Deep space background -->
<rect width="1200" height="850" fill="#09090b" />
<!-- Subtle grid lines -->
<g stroke="rgba(255,255,255,0.02)" stroke-width="1">
<path d="M0 100 H1200 M0 200 H1200 M0 300 H1200 M0 400 H1200 M0 500 H1200 M0 600 H1200 M0 700 H1200 M0 800 H1200"/>
<path d="M100 0 V850 M200 0 V850 M300 0 V850 M400 0 V850 M500 0 V850 M600 0 V850 M700 0 V850 M800 0 V850 M900 0 V850 M1000 0 V850 M1100 0 V850"/>
</g>
<!-- Header Section -->
<g transform="translate(600, 60)">
<text x="0" y="0" fill="#ffffff" font-family="'Inter', sans-serif" font-size="34" font-weight="800" text-anchor="middle" filter="url(#violetGlow)">
Agentic Data Analysis System Workflow
</text>
<text x="0" y="32" fill="#a1a1aa" font-family="'Inter', sans-serif" font-size="14" font-weight="600" text-anchor="middle" letter-spacing="3">
DUAL-ENGINE ARCHITECTURE &amp; MULTI-AGENT ORCHESTRATION
</text>
</g>
<!-- Central Split Flow Lines -->
<!-- Main entry arrow to Split -->
<path d="M 125 400 L 195 400" stroke="#a78bfa" stroke-width="2" fill="none" stroke-dasharray="4" />
<!-- Split into Track A (Top) & Track B (Bottom) -->
<path d="M 230 360 L 230 220 L 290 220" stroke="#a78bfa" stroke-width="2" fill="none" />
<path d="M 230 440 L 230 580 L 290 580" stroke="#22d3ee" stroke-width="2" fill="none" />
<!-- 1. CSV INPUT NODE -->
<g transform="translate(70, 400)">
<circle r="40" fill="rgba(124, 58, 237, 0.15)" stroke="#a78bfa" stroke-width="2" filter="url(#violetGlow)" />
<text x="0" y="-12" fill="#ffffff" font-family="sans-serif" font-size="18" font-weight="bold" text-anchor="middle">CSV</text>
<text x="0" y="10" fill="#a78bfa" font-family="sans-serif" font-size="11" font-weight="bold" text-anchor="middle">DATASET</text>
<text x="0" y="24" fill="#a1a1aa" font-family="sans-serif" font-size="9" text-anchor="middle">UPLOAD</text>
</g>
<!-- 2. PROJECT METADATA REFINE -->
<g transform="translate(160, 400)">
<rect x="-45" y="-35" width="90" height="70" rx="8" fill="url(#cardGrad)" stroke="#e2e8f0" stroke-width="1.5" />
<text x="0" y="-10" fill="#fff" font-family="sans-serif" font-size="11" font-weight="bold" text-anchor="middle">Metadata</text>
<text x="0" y="6" fill="#22d3ee" font-family="sans-serif" font-size="10" font-weight="bold" text-anchor="middle">Title &amp; Goal</text>
<text x="0" y="20" fill="#a1a1aa" font-family="sans-serif" font-size="9" text-anchor="middle">LLM Optimized</text>
</g>
<!-- ──────────────── TRACK A: AI CHAT (TOP ENGINE) ──────────────── -->
<!-- Outer container for Track A -->
<rect x="290" y="120" width="810" height="200" rx="16" fill="url(#chatGrad)" stroke="rgba(124, 58, 237, 0.25)" stroke-width="1.5" />
<text x="310" y="148" fill="#a78bfa" font-family="sans-serif" font-size="15" font-weight="bold">TRACK A: AI DATA COPILOT CHAT (Interactive Exploration)</text>
<!-- Copilot Node -->
<g transform="translate(370, 220)">
<rect x="-60" y="-30" width="120" height="60" rx="10" fill="#0d0d0f" stroke="#a78bfa" stroke-width="2" />
<text x="0" y="-8" fill="#fff" font-family="sans-serif" font-size="13" font-weight="bold" text-anchor="middle">πŸ€– Copilot Agent</text>
<text x="0" y="12" fill="#a78bfa" font-family="sans-serif" font-size="10" text-anchor="middle">Natural Language</text>
</g>
<path d="M 430 220 L 480 220" stroke="#a78bfa" stroke-width="2" fill="none" />
<!-- Code Generator -->
<g transform="translate(560, 220)">
<rect x="-80" y="-30" width="160" height="60" rx="10" fill="#0d0d0f" stroke="#a78bfa" stroke-width="1.5" />
<text x="0" y="-8" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">πŸ“ Python Code Gen</text>
<text x="0" y="12" fill="#a1a1aa" font-family="sans-serif" font-size="10" text-anchor="middle">Formulates pandas scripts</text>
</g>
<path d="M 640 220 L 690 220" stroke="#a78bfa" stroke-width="2" fill="none" />
<!-- Sandboxed Execution -->
<g transform="translate(775, 220)">
<rect x="-85" y="-30" width="170" height="60" rx="10" fill="#0d0d0f" stroke="#22d3ee" stroke-width="2" filter="url(#cyanGlow)" />
<text x="0" y="-8" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">πŸ”’ Sandboxed Python</text>
<text x="0" y="12" fill="#22d3ee" font-family="sans-serif" font-size="10" text-anchor="middle">Isolated Subprocess Exec</text>
</g>
<path d="M 860 220 L 910 220" stroke="#22d3ee" stroke-width="2" fill="none" />
<!-- Interactive Outputs -->
<g transform="translate(990, 220)">
<rect x="-70" y="-40" width="140" height="80" rx="10" fill="url(#cardGrad)" stroke="#f43f5e" stroke-width="1.5" />
<text x="0" y="-18" fill="#fff" font-family="sans-serif" font-size="11" font-weight="bold" text-anchor="middle">Chat Results</text>
<text x="0" y="0" fill="#a1a1aa" font-family="sans-serif" font-size="10" text-anchor="middle">πŸ“ˆ On-the-fly charts</text>
<text x="0" y="16" fill="#e2e8f0" font-family="sans-serif" font-size="9" text-anchor="middle">In-place CSV edits</text>
<text x="0" y="28" fill="#10b981" font-family="sans-serif" font-size="9" text-anchor="middle">(Rename/Delete Cols)</text>
</g>
<!-- ──────────────── TRACK B: AGENTIC PIPELINE (BOTTOM ENGINE) ──────────────── -->
<!-- Outer container for Track B -->
<rect x="290" y="360" width="810" height="420" rx="16" fill="url(#agenticGrad)" stroke="rgba(34, 211, 238, 0.25)" stroke-width="1.5" />
<text x="310" y="388" fill="#22d3ee" font-family="sans-serif" font-size="15" font-weight="bold">TRACK B: AUTOMATED AGENTIC ANALYSIS (CrewAI Pipeline Orchestration)</text>
<!-- Pre-computed profile card -->
<g transform="translate(370, 440)">
<rect x="-60" y="-25" width="120" height="50" rx="6" fill="#1e293b" stroke="#94a3b8" stroke-width="1" />
<text x="0" y="-4" fill="#fff" font-family="sans-serif" font-size="11" font-weight="bold" text-anchor="middle">πŸ“Š Dataset Profile</text>
<text x="0" y="10" fill="#a1a1aa" font-family="sans-serif" font-size="9" text-anchor="middle">Embedded in task context</text>
</g>
<path d="M 430 440 L 460 440 L 460 560 L 490 560" stroke="#22d3ee" stroke-width="1.5" fill="none" />
<!-- CrewAI Logo & Orchestrator -->
<g transform="translate(370, 560)">
<polygon points="0,-35 30,-15 30,15 0,35 -30,15 -30,-15" fill="rgba(34, 211, 238, 0.12)" stroke="#22d3ee" stroke-width="2" filter="url(#cyanGlow)" />
<text x="0" y="-6" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">CrewAI</text>
<text x="0" y="8" fill="#22d3ee" font-family="sans-serif" font-size="10" font-weight="bold" text-anchor="middle">Orchestrator</text>
<text x="0" y="18" fill="#a1a1aa" font-family="sans-serif" font-size="8" text-anchor="middle">Adaptive Cooldown</text>
</g>
<!-- Connector arrows from orchestrator to the 4 pipeline agents -->
<path d="M 400 560 L 510 560" stroke="#22d3ee" stroke-width="2" fill="none" />
<path d="M 450 560 L 450 470 L 510 470" stroke="#22d3ee" stroke-width="1.5" fill="none" />
<path d="M 450 560 L 450 650 L 510 650" stroke="#22d3ee" stroke-width="1.5" fill="none" />
<path d="M 450 560 L 450 720 L 510 720" stroke="#22d3ee" stroke-width="1.5" fill="none" />
<!-- PIPELINE AGENTS -->
<!-- Agent 1: Data Cleaner -->
<g transform="translate(580, 470)">
<rect x="-70" y="-25" width="140" height="50" rx="8" fill="#0d0d0f" stroke="#10b981" stroke-width="2" />
<text x="0" y="-4" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">🧹 Data Cleaner</text>
<text x="0" y="12" fill="#10b981" font-family="sans-serif" font-size="9" text-anchor="middle">Performs robust cleaning</text>
</g>
<path d="M 650 470 L 890 470 M 890 470 L 890 530" stroke="#10b981" stroke-width="1.5" fill="none" />
<!-- Agent 2: Relation Mapper -->
<g transform="translate(580, 560)">
<rect x="-70" y="-25" width="140" height="50" rx="8" fill="#0d0d0f" stroke="#a78bfa" stroke-width="2" />
<text x="0" y="-4" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">πŸ”— Relation Mapper</text>
<text x="0" y="12" fill="#a78bfa" font-family="sans-serif" font-size="9" text-anchor="middle">Aggregates schema matrix</text>
</g>
<path d="M 650 560 L 910 560" stroke="#a78bfa" stroke-width="1.5" fill="none" />
<!-- Agent 3: Business Insights -->
<g transform="translate(580, 650)">
<rect x="-70" y="-25" width="140" height="50" rx="8" fill="#0d0d0f" stroke="#f59e0b" stroke-width="2" />
<text x="0" y="-4" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">πŸ’‘ Business Insights</text>
<text x="0" y="12" fill="#f59e0b" font-family="sans-serif" font-size="9" text-anchor="middle">BCG/McKinsey framework</text>
</g>
<path d="M 650 650 L 910 650" stroke="#f59e0b" stroke-width="1.5" fill="none" />
<!-- Agent 4: Visualizer -->
<g transform="translate(580, 720)">
<rect x="-70" y="-25" width="140" height="50" rx="8" fill="#0d0d0f" stroke="#ec4899" stroke-width="2" />
<text x="0" y="-4" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">πŸ“ˆ Visualizer Agent</text>
<text x="0" y="12" fill="#ec4899" font-family="sans-serif" font-size="9" text-anchor="middle">Matplotlib styled charts</text>
</g>
<path d="M 650 720 L 890 720 M 890 720 L 890 680" stroke="#ec4899" stroke-width="1.5" fill="none" />
<!-- Results Aggregator -->
<g transform="translate(980, 605)">
<rect x="-75" y="-75" width="150" height="150" rx="12" fill="url(#cardGrad)" stroke="#22d3ee" stroke-width="2" filter="url(#cyanGlow)" />
<text x="0" y="-46" fill="#fff" font-family="sans-serif" font-size="12" font-weight="bold" text-anchor="middle">Structured Outputs</text>
<text x="-60" y="-22" fill="#a1a1aa" font-family="sans-serif" font-size="9">πŸ“‹ Clean Audit Trail</text>
<text x="-60" y="-4" fill="#a1a1aa" font-family="sans-serif" font-size="9">🌐 Interactive Plotly</text>
<text x="-60" y="14" fill="#a1a1aa" font-family="sans-serif" font-size="9">πŸ’‘ McKinsey Cards</text>
<text x="-60" y="32" fill="#a1a1aa" font-family="sans-serif" font-size="9">⚠️ Risk &amp; Alert Box</text>
<text x="-60" y="50" fill="#a1a1aa" font-family="sans-serif" font-size="9">πŸ“‚ Cleaned CSV file</text>
</g>
<!-- Multi-Provider Gateway (Floating Badge) -->
<g transform="translate(170, 715)">
<rect x="-70" y="-35" width="140" height="70" rx="8" fill="#1e293b" stroke="#38bdf8" stroke-width="1" />
<text x="0" y="-14" fill="#38bdf8" font-family="sans-serif" font-size="10" font-weight="bold" text-anchor="middle">LLM PROVIDER GATEWAY</text>
<text x="0" y="2" fill="#fff" font-family="sans-serif" font-size="9" text-anchor="middle">Ollama, NVIDIA NIM, OpenAI,</text>
<text x="0" y="15" fill="#fff" font-family="sans-serif" font-size="9" text-anchor="middle">Gemini, Anthropic, DeepSeek</text>
</g>
<!-- ──────────────── OUTPUT EXPORTS & EXTRAS ──────────────── -->
<!-- Connectors from splits to final exports -->
<path d="M 1060 220 L 1090 220 L 1090 400 L 1115 400" stroke="#f43f5e" stroke-width="1.5" fill="none" />
<path d="M 1055 605 L 1090 605 L 1090 440 L 1115 440" stroke="#22d3ee" stroke-width="1.5" fill="none" />
<!-- 4. FINAL EXPORTS -->
<g transform="translate(1150, 420)">
<circle r="30" fill="#1e293b" stroke="#e2e8f0" stroke-width="2"/>
<text x="0" y="-6" fill="#fff" font-family="sans-serif" font-size="11" font-weight="bold" text-anchor="middle">EXPORT</text>
<text x="0" y="8" fill="#a1a1aa" font-family="sans-serif" font-size="9" text-anchor="middle">PDF/ZIP</text>
<text x="0" y="18" fill="#a1a1aa" font-family="sans-serif" font-size="9" text-anchor="middle">CSV</text>
</g>
</svg>