{"id":"a9372aae-ea30-49a6-957a-b0fd9cf1e3aa","entityType":"agent","slug":"crewai-arun-srinivasan-builds-crewai-customer-support","name":"CrewAI-Customer-Support","canonicalUrl":"https://www.xpersona.co/agent/crewai-arun-srinivasan-builds-crewai-customer-support","canonicalPath":"/agent/crewai-arun-srinivasan-builds-crewai-customer-support","generatedAt":"2026-10-09T21:48:34.112Z","source":"GITHUB_REPOS","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":null},"description":"Sequential specialized-agent customer support workflow built with CrewAI. 🤖 AI Customer Support Lab CrewAI Multi-Agent Buildathon · Guardrails · Evaluation · Controlled Agent Experiments A production-style customer-support application built to learn not only **how to use AI agents**, but also **when agent-based orchestration actually adds value**. **Build → Experiment → Learn → Harden → Deploy** --- 🚀 Live Application $1 **Deployment:** Docker · Hostinger VPS · Traefik · Let's Encrypt HT","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.","installCommand":null,"sourceUrl":"https://github.com/arun-srinivasan-builds/CrewAI-Customer-Support","homepage":null,"primaryLinks":[{"label":"View Source","url":"https://github.com/arun-srinivasan-builds/CrewAI-Customer-Support","kind":"source"}],"safetyScore":66,"overallRank":37.4,"popularityScore":0,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Sequential specialized-agent customer support workflow built with CrewAI. 🤖 AI Customer Support Lab CrewAI Multi-Agent Buildathon · Guardrails · Evaluation · C"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"crewai","status":"self-declared"},{"label":"multi-agent","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":3,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"crewai","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"multi-agent","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:crewai|supported|profile capability:multi-agent|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":"No source adoption metrics were available."},"stars":0,"forks":0,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-10-09T01:11:43.930Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T01:11:43.935Z","lastCrawledAt":"2026-10-09T01:11:43.930Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-16T01:11:43.930Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":null,"setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"GITHUB_REPOS","generatedAt":"2026-10-09T21:48:34.111Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-arun-srinivasan-builds-crewai-customer-support/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"high","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":null},"readme":"# 🤖 AI Customer Support Lab\n\n### CrewAI Multi-Agent Buildathon · Guardrails · Evaluation · Controlled Agent Experiments\n\nA production-style customer-support application built to learn not only **how to use AI agents**, but also **when agent-based orchestration actually adds value**.\n\n> **Build → Experiment → Learn → Harden → Deploy**\n\n---\n\n## 🚀 Live Application\n\n### [Open the Live VPS Application](https://crewai-support.srv1965124.hstgr.cloud)\n\n**Deployment:** Docker · Hostinger VPS · Traefik · Let's Encrypt HTTPS\n\n**GitHub Repository:**  \nhttps://github.com/arun-srinivasan-builds/CrewAI-Customer-Support\n\n---\n\n# 📌 Project Overview\n\nThis project started as a **CrewAI Buildathon** to implement a sequential three-agent customer-support workflow.\n\nRather than stopping after the agents worked, the application was extended into a controlled learning lab to understand:\n\n- How multi-agent orchestration behaves in a fixed workflow\n- When explicit Python orchestration may be simpler\n- Where runtime agent decisions become useful\n- How guardrails should surround an AI workflow\n- How generated answers and tool decisions should be evaluated\n- How session memory supports follow-up conversations\n- How unnecessary model and search calls can be reduced\n- How to move an AI application from local development to a live HTTPS deployment\n\n> **Core Engineering Principle:** Use agents deliberately, not by default. Keep deterministic work deterministic and introduce runtime reasoning where it creates meaningful value.\n\n---\n\n# 🧭 Project Journey\n\n| Stage | Implementation |\n|---|---|\n| **Build** | Three-agent CrewAI customer-support workflow |\n| **Experiment** | Python vs CrewAI and fixed routing vs runtime capability selection |\n| **Learn** | Understand where agents provide meaningful value |\n| **Harden** | Guardrails, temporal validation, evals, memory, caching and trace validation |\n| **Deploy** | Docker → Hostinger VPS → Traefik → Let's Encrypt HTTPS |\n\n---\n\n# 🤖 Buildathon Core — Three-Agent Workflow\n\nThe Buildathon implementation uses **three specialized CrewAI agents** running through a sequential process.\n\n```text\nCUSTOMER QUERY\n      │\n      ▼\n┌─────────────────────────┐\n│ Input Guardrails        │\n│ Security Validation     │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 1. Assistant Agent      │\n│ Initial Answer          │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 2. Web Search Agent     │\n│ Retrieve + Ground       │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 3. Entry Agent          │\n│ Consolidate Record      │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Output Guardrail        │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Evaluation & Validation │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Persistent Record       │\n│ answers.txt             │\n└─────────────────────────┘\n```\n\n---\n\n## Agent Responsibilities\n\n### 1. Assistant Agent\n\nThe Assistant Agent:\n\n- Understands the customer request\n- Produces an initial response\n- Uses model knowledge\n- Does not claim that web verification has occurred\n\n### 2. Web Search Agent\n\nThe Web Search Agent:\n\n- Retrieves current information\n- Uses web evidence\n- Grounds the response\n- Produces a current-information answer where required\n\n### 3. Entry Agent\n\nThe Entry Agent:\n\n- Consolidates the customer query\n- Uses the grounded answer\n- Creates a structured support record\n- Prepares the record for validation and persistence\n\n---\n\n# 🧩 Core Capabilities\n\n| Capability | Implementation |\n|---|---|\n| Multi-Agent Framework | CrewAI |\n| Agents | 3 Specialized Agents |\n| Orchestration | Sequential |\n| LLM | OpenAI |\n| Current Information | Web Search |\n| Grounded Response | Search evidence supplied to research stage |\n| Input Protection | Deterministic + AI-assisted validation |\n| Output Protection | Post-generation Output Guardrail |\n| Current-Date Correctness | Temporal Validation |\n| Persistence | `answers.txt` |\n| Session Context | Session-scoped memory |\n| UI | Streamlit |\n| Secrets | Environment Variables |\n| Containerization | Docker |\n| Reverse Proxy | Traefik |\n| TLS | Let's Encrypt |\n| Hosting | Hostinger VPS |\n\n---\n\n# 🛡️ Guardrails\n\nGuardrails were implemented around the AI workflow instead of relying only on model prompts.\n\n---\n\n## Input Guardrails\n\nEvery request passes through a security gate before downstream execution.\n\n```text\nCustomer Request\n       │\n       ▼\nDeterministic Validation\n       │\n       ▼\nAI Safety Check\n       │\n   ┌───┴───┐\n   │       │\n PASS    BLOCK\n   │       │\n   ▼       ▼\nWorkflow  Stop Safely\n```\n\nThis allows unsafe or invalid requests to be stopped before:\n\n- Agents execute\n- Search is invoked\n- Tools are invoked\n- Evaluation runs\n- Data is persisted\n\n---\n\n## Output Guardrails\n\nGenerated content is also validated before being released.\n\n```text\nGenerated Response\n       │\n       ▼\nOutput Guardrail\n       │\n   ┌───┴───┐\n   │       │\n PASS    BLOCK\n   │       │\n   ▼       ▼\nDisplay   Safe Message\nPersist   No Persistence\n```\n\nThe same post-generation guardrail principle is applied to both architectures used in **Experiment 1**.\n\nThis keeps the Python vs CrewAI comparison consistent.\n\n---\n\n# 📅 Temporal Validation\n\nCurrent-information questions need more than semantic relevance.\n\nAdditional deterministic validation is applied to freshness-sensitive requests containing terms such as:\n\n- `latest`\n- `current`\n- `newest`\n- `today`\n- `next`\n- `upcoming`\n- `nearest`\n\nThis helps prevent an outdated or past date from silently being presented as the latest or upcoming answer.\n\n---\n\n# 🧠 Session Memory\n\nThe Buildathon page supports **session-scoped conversational memory**.\n\nExample:\n\n```text\nUser: What is the latest stable version of Python?\n\nUser: When was it released?\n```\n\nThe second question can use the context established by the first question.\n\n## Memory Design\n\n- Stored using Streamlit session state\n- Limited to recent completed turns\n- No separate memory-model/API call\n- Can be cleared from the UI\n- Scoped to the current application session\n- Not implemented as a global shared memory store\n\nThis provides useful conversational continuity while controlling token growth.\n\n---\n\n# 🧪 Experiment 1 — Fixed Sequential Workflow\n\n## Objective\n\nExperiment 1 asks:\n\n> **If the execution path is already known, do we really need an agent framework?**\n\nTwo implementations provide equivalent business capability.\n\n---\n\n## 🟢 Non-Agentic · Python Orchestration\n\n```text\nCustomer Query\n      │\n      ▼\nExplicit Python Orchestration\n      │\n      ▼\nInitial OpenAI Answer\n      │\n      ▼\nShared Web Evidence\n      │\n      ▼\nGrounded Synthesis\n      │\n      ▼\nOutput Guardrail\n      │\n      ▼\nValidation\n      │\n      ▼\nPersistence\n```\n\nThe developer explicitly controls the sequence.\n\n---\n\n## 🔵 Agentic · CrewAI\n\n```text\nCustomer Query\n      │\n      ▼\nCrewAI Sequential Process\n      │\n      ▼\nAssistant Agent\n      │\n      ▼\nWeb Search Agent\n      │\n      ▼\nEntry Agent\n      │\n      ▼\nOutput Guardrail\n      │\n      ▼\nValidation\n      │\n      ▼\nPersistence\n```\n\nCrewAI provides role-based orchestration abstraction.\n\n---\n\n## Fair Comparison Design\n\nBoth architectures receive the **same workflow evidence** during a comparison run.\n\nThis avoids comparing two implementations using different search results.\n\nA separate evidence set is retrieved for evaluation so that:\n\n```text\nGeneration Evidence\n        ≠\nIndependent Evaluation Evidence\n```\n\nThis provides a stronger basis for comparison.\n\n---\n\n## Experiment 1 Evaluation\n\nBoth implementations are evaluated using common dimensions:\n\n- **Relevance**\n- **Completeness**\n- **Consistency**\n- **Groundedness**\n\nThe application also records:\n\n- Execution time\n- Search usage\n- Known API-call information\n- Persistence status\n- Validation results\n\n---\n\n## Experiment 1 Learning\n\nA fixed sequential workflow does not automatically require an agent framework.\n\nExplicit Python may be attractive when:\n\n- The execution path is predetermined\n- Branching is minimal\n- Tool choice is already known\n- Deterministic control is preferred\n\nCrewAI still provides useful:\n\n- Role separation\n- Agent abstraction\n- Task abstraction\n- Orchestration structure\n\nHowever, that abstraction also introduces framework and runtime overhead.\n\n> **Learning:** Do not introduce agents simply because multiple processing stages exist.\n\n---\n\n# 🧭 Experiment 2 — Dynamic Decision Workflow\n\nExperiment 2 changes the problem.\n\nInstead of comparing two implementations following a fixed sequence, the request may require different capabilities depending on customer intent.\n\n---\n\n## Explicit Python Routing\n\n```text\nCustomer Request\n       │\n       ▼\nDeveloper-Written Rules\n       │\n       ▼\nIntent Matching\n       │\n       ▼\nInvoke Matching Capabilities\n       │\n       ▼\nDeterministic Response\n```\n\nDecision ownership remains in developer-written code.\n\n---\n\n## Runtime Agent Selection\n\n```text\nCustomer Request\n       │\n       ▼\nRuntime Interpretation\n       │\n       ▼\nSelect Relevant Capabilities\n       │\n       ▼\nExecute Selected Tools\n       │\n       ▼\nCustomer Response\n```\n\nThe agent chooses among a **bounded set of available capabilities**.\n\n---\n\n# 🔧 Bounded Capabilities\n\nExperiment 2 exposes controlled simulated enterprise capabilities.\n\nThe tools intentionally avoid real external side effects.\n\nThe goal is to study:\n\n- Runtime interpretation\n- Capability selection\n- Tool orchestration\n- Decision ownership\n- Execution traces\n\nIt is **not** intended to perform real billing or account operations.\n\n---\n\n# ✅ Decision Validation\n\nExperiment 2 uses deterministic validation based on actual execution traces.\n\nChecks include:\n\n- Python routing trace completeness\n- Allowed capability enforcement\n- Tool-trace integrity\n- Action-claim validation\n- Usable runtime response\n- Selection agreement between approaches\n\nDecision validation uses actual runtime information and requires:\n\n```text\n0 additional OpenAI calls\n0 additional search calls\n```\n\n---\n\n# 💡 Experiment 2 Learning\n\nAgents become more useful when:\n\n- Requests vary\n- The required execution path is not known beforehand\n- Multiple bounded tools are available\n- Different capability combinations may be required\n- Developer-written routing logic starts growing\n\nThis does **not** mean ordinary Python cannot solve the problem.\n\nThe important difference is:\n\n> **Where is the decision made?**\n\n### Python\n\n```text\nDeveloper-written rules decide\n```\n\n### Agent\n\n```text\nRuntime reasoning selects among bounded capabilities\n```\n\n---\n\n# 📊 Evaluation Strategy\n\nEvaluation was treated as a separate engineering concern rather than assuming that a plausible-looking answer is correct.\n\n---\n\n## Fixed Workflow Evaluation\n\nUseful dimensions include:\n\n- Relevance\n- Completeness\n- Consistency\n- Groundedness\n- Temporal correctness\n\n---\n\n## Dynamic Workflow Evaluation\n\nAnswer quality alone is insufficient.\n\nThe system also needs to understand:\n\n- Which capabilities were selected?\n- Which capabilities actually executed?\n- Were those capabilities allowed?\n- Do claimed actions match the execution trace?\n- Was a usable customer-facing response produced?\n\nThis is why the dynamic experiment presents:\n\n## Decision Validation\n\nrather than treating every evaluation problem as a generic LLM score.\n\n---\n\n# ⚡ API & Search Efficiency\n\nOne goal of the project was to avoid unnecessary API usage.\n\nImplemented optimizations include:\n\n- Shared workflow evidence in Experiment 1\n- Independent but reusable evaluation evidence\n- Session-level search caching\n- Exact-result reuse\n- Conservative near-duplicate evidence reuse\n- Date-scoped cache behavior\n- Session memory without an additional memory API\n- Deterministic validation where an LLM is unnecessary\n- Zero external API calls from Experiment 2 simulated tools\n- Zero additional OpenAI/search calls for deterministic Decision Validation\n- Learning Summary generated from local/session data\n\n> **Use model calls where reasoning is useful. Keep deterministic work deterministic.**\n\n---\n\n# 🔭 Observability\n\nThe application exposes runtime information to make workflow behavior easier to understand and debug.\n\nVisible information includes:\n\n- Animated processing stages\n- Current workflow stage\n- Architecture comparison\n- Execution time\n- Known direct OpenAI call counts\n- Workflow search-call counts\n- Evaluation search-call counts\n- Input Guardrail status\n- Output Guardrail status\n- Temporal Validation\n- Tool traces\n- Decision Validation\n- Evaluation metrics\n- Persistence status\n\nCrewAI-controlled internal model calls are distinguished from application-controlled direct calls rather than presenting an invented exact count.\n\n---\n\n# 🛠️ Technology Stack\n\n| Layer | Technology |\n|---|---|\n| Programming Language | Python 3.11 |\n| Agent Framework | CrewAI |\n| LLM | OpenAI |\n| Search | Serper-backed Web Search |\n| UI | Streamlit |\n| Data Handling | Pandas |\n| Configuration | python-dotenv |\n| Persistence | Text File |\n| Containerization | Docker |\n| Container Orchestration | Docker Compose |\n| Reverse Proxy | Traefik |\n| TLS | Let's Encrypt |\n| Hosting | Hostinger VPS |\n| Source Control | GitHub |\n\n---\n\n# 📁 Repository Structure\n\n```text\nCrewAI-Customer-Support/\n│\n├── app.py\n├── requirements.txt\n├── Dockerfile\n├── compose.yaml\n├── .dockerignore\n├── .gitignore\n├── .env.example\n│\n└── assets/\n    ├── experiment1_architecture.png\n    └── experiment2_architecture.png\n```\n\nRuntime files such as `.env` and generated answer records should remain outside source control.\n\n---\n\n# 🔐 Environment Variables\n\nCreate a local `.env` file using `.env.example`.\n\nExample:\n\n```env\nOPENAI_API_KEY=your_openai_api_key\nSERPER_API_KEY=your_serper_api_key\n```\n\n> **Security:** Never commit the real `.env`, API keys, GitHub PATs or other credentials.\n\nOnly placeholder variable names should be stored in `.env.example`.\n\n---\n\n# 💻 Running Locally\n\n## Step 1 — Clone Repository\n\n```bash\ngit clone https://github.com/arun-srinivasan-builds/CrewAI-Customer-Support.git\n\ncd CrewAI-Customer-Support\n```\n\n---\n\n## Step 2 — Create Virtual Environment\n\n### Windows PowerShell\n\n```powershell\npython -m venv venv\n\n.\\venv\\Scripts\\Activate.ps1\n```\n\n### Linux / macOS\n\n```bash\npython3 -m venv venv\n\nsource venv/bin/activate\n```\n\n---\n\n## Step 3 — Install Dependencies\n\n```bash\npip install -r requirements.txt\n```\n\n---\n\n## Step 4 — Configure Environment\n\nCreate:\n\n```text\n.env\n```\n\nand provide the required API keys.\n\n---\n\n## Step 5 — Start Streamlit\n\n```bash\nstreamlit run app.py\n```\n\nOpen:\n\n```text\nhttp://localhost:8501\n```\n\n---\n\n# 🐳 Docker Deployment\n\n## Build Image\n\n```bash\ndocker build -t crewai-customer-support:1.0 .\n```\n\n---\n\n## Run Container\n\nIf host port `8501` is already occupied:\n\n```bash\ndocker run \\\n  --env-file .env \\\n  -p 8502:8501 \\\n  --name crewai-customer-support \\\n  crewai-customer-support:1.0\n```\n\nOpen:\n\n```text\nhttp://localhost:8502\n```\n\nThe application includes a Docker health check so container health can be verified independently of browser access.\n\n---\n\n# 🚀 VPS Deployment\n\nThe application is deployed using the following architecture:\n\n```text\nGitHub\n   │\n   ▼\nHostinger VPS\n   │\n   ▼\nDocker Compose\n   │\n   ▼\nCrewAI + Streamlit Container\n   │\n   ▼\nTraefik Reverse Proxy\n   │\n   ▼\nLet's Encrypt TLS\n   │\n   ▼\nPublic HTTPS Application\n```\n\n---\n\n# 🌐 Live Deployment\n\n## Application\n\n### https://crewai-support.srv1965124.hstgr.cloud\n\nThe deployed application was functionally tested after deployment.\n\n---\n\n# 📦 VPS Deployment Steps\n\nClone the repository:\n\n```bash\ncd /docker/apps\n\ngit clone https://github.com/arun-srinivasan-builds/CrewAI-Customer-Support.git\n\ncd CrewAI-Customer-Support\n```\n\nCreate the production `.env` directly on the VPS.\n\nThe real `.env` is intentionally excluded from Git.\n\nBuild:\n\n```bash\ndocker compose build\n```\n\nStart:\n\n```bash\ndocker compose up -d\n```\n\n---\n\n# 🩺 Container Health Verification\n\n```bash\ndocker ps --filter name=crewai-customer-support\n```\n\nCheck health:\n\n```bash\ndocker inspect \\\n  --format='{{.State.Health.Status}}' \\\n  crewai-customer-support\n```\n\nExpected:\n\n```text\nhealthy\n```\n\n---\n\n# 🔒 HTTPS Verification\n\n```bash\ncurl -I https://crewai-support.srv1965124.hstgr.cloud\n```\n\nValidated response:\n\n```text\nHTTP/2 200\n```\n\n---\n\n# 🌐 Traefik + Let's Encrypt\n\nTraefik routes:\n\n```text\ncrewai-support.srv1965124.hstgr.cloud\n```\n\nto Streamlit on the application's internal container port:\n\n```text\n8501\n```\n\nDeployment validation confirmed:\n\n- IPv4 DNS resolution\n- IPv6 DNS resolution\n- Docker network connectivity\n- Traefik router configuration\n- ACME certificate resolver\n- Valid Let's Encrypt certificate\n- Healthy application container\n- HTTPS connectivity\n- `HTTP/2 200`\n\n---\n\n# 🧪 Testing & Validation\n\n| Test | Result |\n|---|---|\n| Streamlit Local Startup | ✅ PASS |\n| Three-Agent Buildathon Flow | ✅ PASS |\n| Web-Grounded Response | ✅ PASS |\n| Entry Record Creation | ✅ PASS |\n| Input Guardrail | ✅ PASS |\n| Output Guardrail | ✅ PASS |\n| Temporal Validation | ✅ PASS |\n| Session Memory Follow-Up | ✅ PASS |\n| Experiment 1 — Python Path | ✅ PASS |\n| Experiment 1 — CrewAI Path | ✅ PASS |\n| Experiment 1 Common Evaluation | ✅ PASS |\n| Experiment 2 — Python Routing | ✅ PASS |\n| Experiment 2 — Runtime Tool Selection | ✅ PASS |\n| Decision / Action Validation | ✅ PASS |\n| Docker Image Build | ✅ PASS |\n| Docker Health Check | ✅ PASS |\n| VPS Container Deployment | ✅ PASS |\n| Traefik Routing | ✅ PASS |\n| Let's Encrypt HTTPS | ✅ PASS |\n| Public HTTP/2 Response | ✅ PASS |\n| Live Browser Functional Test | ✅ PASS |\n\n---\n\n# 🧯 Issues Encountered & Resolutions\n\n## Issue 1 — Docker Port Conflict\n\n### Problem\n\nPort `8501` was already used by another Streamlit container.\n\n```text\nBind for 0.0.0.0:8501 failed: port is already allocated\n```\n\n### Resolution\n\nThe CrewAI application was mapped to host port:\n\n```text\n8502\n```\n\nwhile Streamlit continued using container port:\n\n```text\n8501\n```\n\n### Learning\n\nContainer ports and host ports are independent.\n\nMultiple Streamlit applications can run simultaneously as long as host-port mappings do not conflict.\n\n---\n\n# 🧯 Issue 2 — GitHub Push Returned HTTP 403\n\n### Problem\n\nGit Credential Manager was authenticating using a different GitHub identity.\n\nThe push returned:\n\n```text\nPermission denied\nHTTP 403\n```\n\n### Resolution\n\nRepository authentication was corrected using a **fine-grained GitHub Personal Access Token**.\n\nThe token was restricted to the repository with:\n\n```text\nContents → Read and Write\n```\n\n### Learning\n\nGit commit identity:\n\n```text\nuser.name\nuser.email\n```\n\nand GitHub authentication are separate concerns.\n\n---\n\n# 🧯 Issue 3 — VPS Git Commit Used Root Identity\n\n### Problem\n\nA deployment commit created on the VPS initially inherited the Linux root identity.\n\n### Resolution\n\nGit identity was configured correctly:\n\n```bash\ngit config --global user.name \"arun-srinivasan-builds\"\n\ngit config --global user.email \"<configured email>\"\n```\n\nThe commit author was then corrected before push.\n\n### Learning\n\nConfigure Git author information on deployment machines before creating commits.\n\n---\n\n# 🧯 Issue 4 — Remote Branch Ahead of Laptop\n\n### Problem\n\nA laptop push was rejected because deployment commits already existed on:\n\n```text\norigin/main\n```\n\n### Resolution\n\nThe local commit was rebased:\n\n```bash\ngit pull --rebase origin main\n```\n\nand then pushed normally.\n\n### Learning\n\nUse a consistent development/deployment flow:\n\n```text\nLaptop Development\n       │\n       ▼\nGitHub\n       │\n       ▼\nVPS git pull\n       │\n       ▼\nDocker Rebuild\n```\n\nAvoid modifying application source directly on the VPS unless necessary.\n\n---\n\n# 🧯 Issue 5 — HTTPS Initially Returned Self-Signed Certificate\n\n### Problem\n\nImmediately after configuring the new hostname, HTTPS temporarily returned a certificate verification error.\n\n### Investigation\n\nThe following were independently checked:\n\n- Traefik labels\n- Docker networks\n- IPv4 DNS\n- IPv6 DNS\n- ACME resolver configuration\n- Application health\n\n### Resolution\n\nTraefik successfully completed Let's Encrypt certificate issuance.\n\nFinal certificate verification confirmed a valid Let's Encrypt certificate.\n\nThe endpoint returned:\n\n```text\nHTTP/2 200\n```\n\n### Learning\n\nDNS, application health, routing and TLS should be diagnosed as separate infrastructure layers.\n\n---\n\n# 🧯 Issue 6 — Experiment 1 `entry_record_display` Error\n\n### Problem\n\nAfter VPS deployment, the Non-Agentic Experiment 1 path raised:\n\n```text\nNameError: name 'entry_record_display' is not defined\n```\n\n### Root Cause\n\nThe Python path referenced Output Guardrail display variables that had been implemented in the Agentic path but were not initialized consistently in the Non-Agentic path.\n\n### Resolution\n\nThe Non-Agentic implementation was aligned with the same post-generation Output Guardrail behavior.\n\n```text\nGenerate\n   │\n   ▼\nGround\n   │\n   ▼\nOutput Guardrail\n   │\n ┌─┴────────────┐\n │              │\nPASS          BLOCK\n │              │\n ▼              ▼\nDisplay       Safe Message\nPersist       No Persistence\n```\n\nThe corrected application was:\n\n1. Tested locally\n2. Committed to GitHub\n3. Pulled onto the VPS\n4. Docker image rebuilt\n5. Container restarted\n6. Health checked\n7. Public HTTPS endpoint validated\n8. Functionally tested again\n\n### Learning\n\nGuardrails must be integrated consistently across every execution path.\n\n---\n\n# 🔒 Security Practices\n\nThe project follows practical secret and application-security controls.\n\n- `.env` excluded from Git\n- `.env.example` contains placeholders only\n- API keys supplied through environment variables\n- GitHub PAT excluded from the repository\n- Fine-grained repository access used for Git authentication\n- Deterministic input validation\n- AI-assisted safety validation\n- Post-generation Output Guardrail\n- Blocked output is not persisted\n- Dynamic-agent capabilities are bounded\n- Action claims are validated against actual tool traces\n- Production application is exposed through Traefik rather than a direct public container port\n\n---\n\n# 💡 Key Learning Outcomes\n\n## 1. Agents Are Not Automatically Better\n\nA predictable fixed workflow can often be implemented more simply using explicit Python orchestration.\n\n---\n\n## 2. Runtime Uncertainty Changes the Equation\n\nAgent-based orchestration becomes more interesting when the required capability combination varies depending on the request.\n\n---\n\n## 3. Grounding Is Different from Generation\n\nA fluent LLM response is not automatically grounded.\n\nEvidence retrieval, synthesis constraints and evaluation need to be designed explicitly.\n\n---\n\n## 4. Guardrails Belong Outside the Prompt\n\nPrompt instructions are useful, but security should not depend entirely on asking the model to behave correctly.\n\nApplication-level controls provide additional protection.\n\n---\n\n## 5. Evaluation Must Match the Problem\n\nA factual fixed workflow benefits from:\n\n```text\nRelevance\nCompleteness\nConsistency\nGroundedness\n```\n\nA dynamic tool-selection workflow also requires:\n\n```text\nDecision Validation\nTool Trace Validation\nAction Validation\n```\n\n---\n\n## 6. Memory Has a Cost\n\nSession memory improves follow-up conversations but increases prompt context.\n\nBounded memory provides a practical balance.\n\n---\n\n## 7. API Efficiency Matters\n\nAgents, search, evaluation and memory can multiply API usage quickly.\n\nUseful optimizations include:\n\n```text\nCaching\nShared Evidence\nExact Result Reuse\nDeterministic Validation\nBounded Memory\n```\n\n---\n\n## 8. Deployment Is Part of the Product\n\nA successful local application is only one stage.\n\nProduction-style delivery also involves:\n\n- Docker\n- Health checks\n- Secret management\n- Git workflow\n- VPS deployment\n- DNS\n- Reverse proxy\n- TLS\n- Live functional validation\n\n---\n\n# 🎯 Final Takeaway\n\nThe most important lesson from this Buildathon was not simply how to create multiple agents.\n\nIt was understanding **where agents provide meaningful value and where ordinary deterministic code remains sufficient**.\n\n```text\nIs the execution path predictable?\n              │\n       ┌──────┴──────┐\n       │             │\n      YES            NO\n       │             │\n       ▼             ▼\nExplicit         Runtime\nOrchestration    Reasoning\nmay be           may add\nsufficient       more value\n```\n\nThe goal is **not to maximize the number of agents**.\n\nThe goal is to choose the appropriate orchestration approach for the problem.\n\n> **Use agents deliberately. Keep deterministic work deterministic. Introduce runtime agent reasoning where it provides meaningful value.**\n\n---\n\n# 🚀 Live Demo\n\n## AI Customer Support Lab\n\n### https://crewai-support.srv1965124.hstgr.cloud\n\n**Dockerized · VPS Hosted · Traefik Routed · HTTPS Secured**\n\n---\n\n# 📂 GitHub Repository\n\n### https://github.com/arun-srinivasan-builds/CrewAI-Customer-Support\n\n---\n\n# 👤 Author\n\n## Arun Srinivasan\n\nHands-on Generative AI learning through:\n\n**Building · Experimentation · Validation · Deployment**\n","readmeExcerpt":"🤖 AI Customer Support Lab CrewAI Multi-Agent Buildathon · Guardrails · Evaluation · Controlled Agent Experiments A production-style customer-support application built to learn not only **how to use AI agents**, but also **when agent-based orchestration actually adds value**. **Build → Experiment → Learn → Harden → Deploy** --- 🚀 Live Application $1 **Deployment:** Docker · Hostinger VPS · Traefik · Let's Encrypt HT","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"CUSTOMER QUERY\n      │\n      ▼\n┌─────────────────────────┐\n│ Input Guardrails        │\n│ Security Validation     │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 1. Assistant Agent      │\n│ Initial Answer          │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 2. Web Search Agent     │\n│ Retrieve + Ground       │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ 3. Entry Agent          │\n│ Consolidate Record      │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Output Guardrail        │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Evaluation & Validation │\n└────────────┬────────────┘\n             │\n             ▼\n┌─────────────────────────┐\n│ Persistent Record       │\n│ answers.txt             │\n└─────────────────────────┘"},{"language":"text","snippet":"Customer Request\n       │\n       ▼\nDeterministic Validation\n       │\n       ▼\nAI Safety Check\n       │\n   ┌───┴───┐\n   │       │\n PASS    BLOCK\n   │       │\n   ▼       ▼\nWorkflow  Stop Safely"},{"language":"text","snippet":"Generated Response\n       │\n       ▼\nOutput Guardrail\n       │\n   ┌───┴───┐\n   │       │\n PASS    BLOCK\n   │       │\n   ▼       ▼\nDisplay   Safe Message\nPersist   No Persistence"},{"language":"text","snippet":"User: What is the latest stable version of Python?\n\nUser: When was it released?"},{"language":"text","snippet":"Customer Query\n      │\n      ▼\nExplicit Python Orchestration\n      │\n      ▼\nInitial OpenAI Answer\n      │\n      ▼\nShared Web Evidence\n      │\n      ▼\nGrounded Synthesis\n      │\n      ▼\nOutput Guardrail\n      │\n      ▼\nValidation\n      │\n      ▼\nPersistence"},{"language":"text","snippet":"Customer Query\n      │\n      ▼\nCrewAI Sequential Process\n      │\n      ▼\nAssistant Agent\n      │\n      ▼\nWeb Search Agent\n      │\n      ▼\nEntry Agent\n      │\n      ▼\nOutput Guardrail\n      │\n      ▼\nValidation\n      │\n      ▼\nPersistence"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["python"],"docsSourceLabel":"GITHUB REPOS","editorialOverview":"Sequential specialized-agent customer support workflow built with CrewAI. 🤖 AI Customer Support Lab CrewAI Multi-Agent Buildathon · Guardrails · Evaluation · Controlled Agent Experiments A production-style customer-support application built to learn not only **how to use AI agents**, but also **when agent-based orchestration actually adds value**. **Build → Experiment → Learn → Harden → Deploy** --- 🚀 Live Application $1 **Deployment:** Docker · Hostinger VPS · Traefik · Let's Encrypt HT","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":375,"uniquenessScore":66,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T01:11:43.935Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T21:48:34.112Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/github_repos","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}