{"id":42040503,"url":"https://github.com/rithinch/holly-and-morty","last_synced_at":"2026-01-31T10:00:47.110Z","repository":{"id":334481345,"uuid":"1141355333","full_name":"rithinch/holly-and-morty","owner":"rithinch","description":"✨ Conversational AI for Wealth Advisors","archived":false,"fork":false,"pushed_at":"2026-01-25T07:31:21.000Z","size":1124,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-26T18:48:01.598Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rithinch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-24T17:57:42.000Z","updated_at":"2026-01-25T08:35:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rithinch/holly-and-morty","commit_stats":null,"previous_names":["rithinch/holly-and-morty","rithinch/saturn-ef-hack"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rithinch/holly-and-morty","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rithinch%2Fholly-and-morty","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rithinch%2Fholly-and-morty/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rithinch%2Fholly-and-morty/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rithinch%2Fholly-and-morty/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rithinch","download_url":"https://codeload.github.com/rithinch/holly-and-morty/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rithinch%2Fholly-and-morty/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28805316,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T05:43:52.625Z","status":"ssl_error","status_checked_at":"2026-01-27T05:43:48.957Z","response_time":168,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-26T05:33:55.031Z","updated_at":"2026-01-27T06:00:37.621Z","avatar_url":"https://github.com/rithinch.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://images.lumacdn.com/cdn-cgi/image/format=auto,fit=cover,dpr=1,background=white,quality=75,width=400,height=400/event-covers/56/30d26c7d-d2a5-4249-b60d-25c6ade98529.png\" alt=\"Saturn \u0026 EF Hackathon\" width=\"400\" /\u003e\n\u003c/div\u003e\n\n# 🎙️ Holly and Morty\n\n\u003e ✨ Conversational Agents for Wealth Advisors\n\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.109.0-009688.svg?style=flat\u0026logo=FastAPI\u0026logoColor=white)](https://fastapi.tiangolo.com)\n[![Python](https://img.shields.io/badge/Python-3.11+-3776AB.svg?style=flat\u0026logo=python\u0026logoColor=white)](https://www.python.org)\n[![Azure Cosmos DB](https://img.shields.io/badge/Azure-Cosmos%20DB-0078D4.svg?style=flat\u0026logo=microsoftazure\u0026logoColor=white)](https://azure.microsoft.com/en-us/services/cosmos-db/)\n[![Anthropic Claude](https://img.shields.io/badge/Anthropic-Claude-191919.svg?style=flat)](https://www.anthropic.com)\n[![Docker](https://img.shields.io/badge/Docker-Ready-2496ED.svg?style=flat\u0026logo=docker\u0026logoColor=white)](https://www.docker.com)\n\nHolly and Morty is a platform that processes voice conversations from ElevenLabs conversational AI agents, extracts structured financial profiles using Claude AI, and provides a comprehensive REST API for managing conversations and client data.\n\n## � Built for Saturn \u0026 EF | Build the Next Decade Hackathon\n\n**Track 2: Build AI Systems that Solve Underserved Problems**\n\n\u003e *Build systems that solve painful, underserved, and specific problems, delivering clear, immediate value to a real user. AI must meaningfully improve the outcome, not just be bolted on.*\n\n### The Problem\n\nComprehensive financial advice—the kind that actually changes lives—is only available to the wealthy. The financial advisory industry manages over **$40 trillion in assets** and generates **$100 billion+ in annual revenue**, yet the vast majority of people who need financial guidance will never get it.\n\n**Why?** Because the economics are broken.\n\nA single financial adviser can only serve ~100-150 clients. Advisers spend **70% of their time on administration and compliance**—not actually helping people. The assembly line of financial advice is held together with duct tape, manual processes, and spreadsheets.\n\n### The Solution: Holly \u0026 Morty\n\nHolly \u0026 Morty targets **Stage 1 \u0026 2** in the financial advice assembly pipeline:\n\n#### 🎙️ **Holly** - The Listener\nVoice-based conversational AI agent that:\n- **Conducts data gathering conversations** with clients\n- **Extracts Letters of Authority (LOA)** information\n- **Performs compliant fact-finding** interviews\n- **Understands client goals, risk tolerance, and circumstances**\n\n#### 🤖 **Morty** - The Supporter\nAI-powered extraction and support system that:\n- **Provides targeted support** (FCA regulation compliant, not advice)\n- **Extracts structured data** from conversations automatically\n- **Eliminates manual data entry** and repetitive administrative work\n- **Generates prospect leads** for advisor dashboards\n\n### The Impact\n\n**What currently takes 4-8 hours per client** (data gathering and fact-finding) is reduced to minutes through intelligent voice agents and automated extraction.\n\nThis isn't AI bolted on—it's AI **meaningfully improving outcomes** by:\n- **Cutting repetitive work** for advisors and paraplanners by 70%\n- **Making financial advice accessible** to people who can't afford traditional services\n- **Freeing advisors** to focus on actual advice, not paperwork\n- **Scaling expertise** from 100 clients per advisor to potentially thousands\n\n### The Vision: Financial Advice for a Billion People\n\nBy making the assembly line of financial advice **10x more efficient**, we can democratize access to financial guidance. Holly \u0026 Morty is the first step toward a future where comprehensive financial advice isn't a luxury—it's a right.\n\n## �🌟 Features\n\n- **🎯 ElevenLabs Voice Agent Integration** - Real-time webhook processing for post-call transcriptions\n- **🤖 AI-Powered Profile Extraction** - Automated extraction of financial profiles using Anthropic Claude\n- **💾 Multi-Container Cosmos DB** - Scalable NoSQL storage for conversations, profiles, and insights\n- **📊 Comprehensive REST API** - Full CRUD operations with advanced search and filtering\n- **📈 Serverless Architecture** - Cost-effective Azure Cosmos DB serverless deployment\n- **🎨 Interactive API Docs** - Beautiful Scalar documentation interface\n- **🐳 Docker Ready** - Containerized deployment with environment-based configuration\n- **🔍 Advanced Querying** - Search by status, date ranges, employment, risk profile, net worth, and more\n## 🌐 Live Demo\n\n**🚀 Access the deployed application:** [https://holly-morty-financial-navigation-907277113728.us-west1.run.app](https://holly-morty-financial-navigation-907277113728.us-west1.run.app)\n\n### 📸 Application Screenshots\n\n#### Profile Details \u0026 Extraction\nDetailed client profile view showing AI-extracted financial information from voice conversations with Holly.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/onboarding.png\" alt=\"Profile Details\" width=\"800\" /\u003e\n\u003c/div\u003e\n\n#### Profile Details \u0026 Extraction\nDetailed client profile view showing AI-extracted financial information from voice conversations with Holly.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/voice-agent.png\" alt=\"Profile Details\" width=\"800\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/profile-details.png\" alt=\"Profile Details\" width=\"800\" /\u003e\n\u003c/div\u003e\n\n#### User Dashboard\nThe user dashboard provides a comprehensive view of financial profile status, conversations, and personalized insights.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/client-dashboard.png\" alt=\"Client Dashboard\" width=\"800\" /\u003e\n\u003c/div\u003e\n\n#### Advisor Dashboard - Pipeline View\nAdvisors can view and manage all client profiles with advanced filtering by status, risk profile, employment, net worth, and more.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/advisor-dashboard-pipeline.png\" alt=\"Advisor Dashboard - Pipeline\" width=\"800\" /\u003e\n\u003c/div\u003e\n\n\n#### Advanced Filtering \u0026 Search\nSearch capabilities to filter clients by name, status, risk attitude, employment status, income range, and net worth.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"./screenshots/advanced-filtering.png\" alt=\"Advanced Filtering\" width=\"800\" /\u003e\n\u003c/div\u003e\n## 🏗️ Architecture\n\n```\n┌─────────────────┐\n│  ElevenLabs     │\n│  Voice Agent    │\n└────────┬────────┘\n         │ Webhook\n         ▼\n┌─────────────────────────────────────────┐\n│         Holly \u0026 Morty API               │\n│  ┌─────────────────────────────────┐   │\n│  │  FastAPI + Scalar Docs          │   │\n│  └─────────────┬───────────────────┘   │\n│                │                         │\n│  ┌─────────────▼───────────────────┐   │\n│  │  Profile Extraction Service     │   │\n│  │  (Anthropic Claude Sonnet)      │   │\n│  └─────────────┬───────────────────┘   │\n│                │                         │\n│  ┌─────────────▼───────────────────┐   │\n│  │   Azure Cosmos DB (NoSQL)       │   │\n│  │  ┌──────────────────────────┐   │   │\n│  │  │ Conversations Container  │   │   │\n│  │  └──────────────────────────┘   │   │\n│  │  ┌──────────────────────────┐   │   │\n│  │  │  Profiles Container      │   │   │\n│  │  └──────────────────────────┘   │   │\n│  │  ┌──────────────────────────┐   │   │\n│  │  │  Insights Container      │   │   │\n│  │  └──────────────────────────┘   │   │\n│  └─────────────────────────────────┘   │\n└─────────────────────────────────────────┘\n```\n\n## 🛠️ Tech Stack\n\n| Category | Technology |\n|----------|-----------|\n| **API Framework** | FastAPI 0.109.0 |\n| **Python Runtime** | Python 3.11+ |\n| **Database** | Azure Cosmos DB (NoSQL, Serverless) |\n| **AI/LLM** | Anthropic Claude 3.5 Sonnet |\n| **Voice AI** | ElevenLabs Conversational AI |\n| **API Documentation** | Scalar FastAPI |\n| **Validation** | Pydantic v2 |\n| **Containerization** | Docker |\n| **HTTP Client** | HTTPX 0.27.2 |\n| **ASGI Server** | Uvicorn 0.27.0 |\n\n## 📡 API Endpoints\n\n### Core Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `GET` | `/` | Root endpoint with API information |\n| `GET` | `/health` | Health check endpoint |\n| `GET` | `/docs` | Interactive API documentation (Scalar) |\n\n### Webhook Endpoints\n\n| Method | Endpoint | Description |\n|--------|----------|-------------|\n| `POST` | `/webhooks/holly-conversation` | ElevenLabs post-call transcription webhook |\n\n### Conversations API\n\n| Method | Endpoint | Description | Query Parameters |\n|--------|----------|-------------|------------------|\n| `GET` | `/conversations/` | Get all conversations | `limit`, `offset`, `user_id` |\n| `GET` | `/conversations/{conversation_id}` | Get conversation by ID | - |\n| `GET` | `/conversations/user/{user_id}` | Get all conversations for user | `limit`, `offset` |\n| `GET` | `/conversations/search/by-status` | Search by conversation status | `status`, `limit`, `offset` |\n| `GET` | `/conversations/search/by-agent` | Search by agent ID | `agent_id`, `limit`, `offset` |\n| `GET` | `/conversations/search/by-date-range` | Search by date range | `start_timestamp`, `end_timestamp`, `limit`, `offset` |\n\n### Profiles API\n\n| Method | Endpoint | Description | Query Parameters |\n|--------|----------|-------------|------------------|\n| `POST` | `/profiles/` | Create new profile | Body: `user_id`, `first_name`, `last_name` |\n| `GET` | `/profiles/` | Get all profiles | `limit`, `offset`, `status` |\n| `GET` | `/profiles/{user_id}` | Get profile by user ID | - |\n| `PUT` | `/profiles/{user_id}` | Update profile | Body: Partial profile data |\n| `GET` | `/profiles/search/by-name` | Search by name | `name`, `limit`, `offset` |\n| `GET` | `/profiles/search/by-status` | Search by profile status | `status`, `limit`, `offset` |\n| `GET` | `/profiles/search/by-employment` | Search by employment status | `employment_status`, `limit`, `offset` |\n| `GET` | `/profiles/search/by-net-worth-range` | Search by net worth | `min_net_worth`, `max_net_worth`, `limit`, `offset` |\n| `GET` | `/profiles/search/by-risk-attitude` | Search by risk attitude | `risk_attitude`, `limit`, `offset` |\n| `GET` | `/profiles/search/by-income-range` | Search by income | `min_income`, `max_income`, `limit`, `offset` |\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- Python 3.11 or higher\n- Docker (optional, for containerized deployment)\n- Azure Cosmos DB account\n- Anthropic API key\n- ElevenLabs account with Conversational AI\n\n### Local Development\n\n1. **Clone the repository**\n   ```bash\n   git clone https://github.com/rithinch/holly-and-morty.git\n   cd holly-and-morty/api\n   ```\n\n2. **Create virtual environment**\n   ```bash\n   python -m venv venv\n   source venv/bin/activate  # On Windows: venv\\Scripts\\activate\n   ```\n\n3. **Install dependencies**\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n4. **Configure environment variables**\n   ```bash\n   cp .env.example .env\n   ```\n   \n   Edit `.env` with your credentials:\n   ```env\n   # API Configuration\n   API_TITLE=Holly and Morty API\n   API_VERSION=1.0.0\n   \n   # ElevenLabs\n   ELEVENLABS_WEBHOOK_SECRET=your_webhook_secret\n   \n   # Azure Cosmos DB\n   COSMOS_CONNECTION_STRING=your_cosmos_connection_string\n   COSMOS_DATABASE_NAME=holly-morty-db\n   \n   # Anthropic AI\n   ANTHROPIC_API_KEY=your_anthropic_api_key\n   ```\n\n5. **Run the application**\n   ```bash\n   uvicorn main:app --reload\n   ```\n\n6. **Access the API**\n   - API: http://localhost:8000\n   - Documentation: http://localhost:8000/docs\n   - Health Check: http://localhost:8000/health\n\n### Docker Deployment\n\n1. **Build the Docker image**\n   ```bash\n   cd api\n   docker build -t holly-and-morty-api .\n   ```\n\n2. **Run with environment file**\n   ```bash\n   docker run -p 8000:8000 --env-file .env holly-and-morty-api\n   ```\n\n3. **Run with inline environment variables**\n   ```bash\n   docker run -p 8000:8000 \\\n     -e ELEVENLABS_WEBHOOK_SECRET=your_secret \\\n     -e COSMOS_CONNECTION_STRING=your_cosmos_string \\\n     -e ANTHROPIC_API_KEY=your_anthropic_key \\\n     holly-and-morty-api\n   ```\n\n## 🔄 CI/CD Pipeline\n\n### GitHub Actions Workflow\n\nThe project includes automated CI/CD pipelines for continuous integration and deployment.\n\n#### Continuous Integration (CI)\n\n```yaml\nname: CI\n\non: [push, pull_request]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Set up Python\n        uses: actions/setup-python@v4\n        with:\n          python-version: '3.11'\n      - name: Install dependencies\n        run: |\n          cd api\n          pip install -r requirements.txt\n      - name: Run tests\n        run: |\n          cd api\n          pytest\n```\n\n#### Continuous Deployment (CD)\n\n```yaml\nname: Deploy to Azure\n\non:\n  push:\n    branches: [main]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Build Docker image\n        run: |\n          cd api\n          docker build -t holly-and-morty-api .\n      - name: Push to Azure Container Registry\n        run: |\n          # Add your ACR push commands here\n      - name: Deploy to Azure Container Apps\n        run: |\n          # Add your Azure deployment commands here\n```\n\n### Environment Setup for CI/CD\n\nAdd the following secrets to your GitHub repository:\n\n- `ELEVENLABS_WEBHOOK_SECRET`\n- `COSMOS_CONNECTION_STRING`\n- `ANTHROPIC_API_KEY`\n- `AZURE_CREDENTIALS` (for Azure deployment)\n\n## 📊 Data Models\n\n### Financial Profile\n\nThe system extracts comprehensive financial profiles from conversations:\n\n```python\n{\n  \"user_id\": \"string\",\n  \"status\": \"incomplete | in_progress | complete\",\n  \"personal_info\": {\n    \"first_name\": \"string\",\n    \"last_name\": \"string\",\n    \"date_of_birth\": \"YYYY-MM-DD\",\n    \"nationality\": \"string\",\n    \"marital_status\": \"single | married | divorced | widowed\",\n    \"number_of_dependents\": 0\n  },\n  \"employment\": {\n    \"employment_status\": \"employed | self_employed | unemployed | retired\",\n    \"employer_name\": \"string\",\n    \"job_title\": \"string\",\n    \"years_in_current_role\": 0,\n    \"total_annual_income\": 0.0\n  },\n  \"financial_position\": {\n    \"total_assets\": 0.0,\n    \"total_liabilities\": 0.0,\n    \"net_worth\": 0.0\n  },\n  \"risk_profile\": {\n    \"risk_attitude\": \"very_low | low | medium | high | very_high\",\n    \"time_horizon\": \"short_term | medium_term | long_term\"\n  },\n  \"completeness_percentage\": 0.0\n}\n```\n\n### Conversation\n\n```python\n{\n  \"conversation_id\": \"string\",\n  \"user_id\": \"string\",\n  \"agent_id\": \"string\",\n  \"status\": \"string\",\n  \"transcript\": [...],\n  \"metadata\": {...},\n  \"created_at\": \"ISO-8601\",\n  \"updated_at\": \"ISO-8601\"\n}\n```\n\n## 🔐 Security\n\n- **Webhook Verification**: HMAC-SHA256 signature validation\n- **Environment Variables**: Sensitive data stored in environment variables\n- **Azure Cosmos DB**: Encrypted at rest and in transit\n- **API Keys**: Secure management of Anthropic and ElevenLabs credentials\n- **Input Validation**: Pydantic models for request/response validation\n\n## 🧪 Testing\n\n### Test Webhook Locally\n\nUse ngrok to expose your local server:\n\n```bash\n# Terminal 1: Start the API\nuvicorn main:app --reload\n\n# Terminal 2: Start ngrok\nngrok http 8000\n```\n\nConfigure the ngrok URL in your ElevenLabs dashboard.\n\n### Example Health Check\n\n```bash\ncurl http://localhost:8000/health\n```\n\nResponse:\n```json\n{\n  \"status\": \"healthy\",\n  \"service\": \"holly-and-morty-api\"\n}\n```\n\n## 📁 Project Structure\n\n```\nholly-and-morty/\n├── api/\n│   ├── main.py                    # FastAPI application entry point\n│   ├── core/\n│   │   ├── config.py             # Configuration and settings\n│   │   └── cosmos.py             # Cosmos DB client (multi-container)\n│   ├── models/\n│   │   ├── elevenlabs.py         # ElevenLabs webhook models\n│   │   └── profile.py            # Financial profile models\n│   ├── routers/\n│   │   ├── webhooks.py           # Webhook endpoints\n│   │   ├── conversations.py      # Conversations CRUD API\n│   │   └── profiles.py           # Profiles CRUD API\n│   ├── services/\n│   │   └── profile_extraction.py # Claude AI profile extraction\n│   ├── requirements.txt          # Python dependencies\n│   ├── Dockerfile               # Docker configuration\n│   ├── .env.example             # Environment template\n│   ├── .gitignore              # Git ignore rules\n│   └── README.md               # API documentation\n└── README.md                   # This file\n```\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- **FastAPI** - Modern, fast web framework for building APIs\n- **Anthropic Claude** - Advanced AI for intelligent profile extraction\n- **ElevenLabs** - Conversational AI voice agents\n- **Azure Cosmos DB** - Globally distributed, multi-model database\n- **Scalar** - Beautiful API documentation\n\n## 📞 Support\n\nFor issues, questions, or contributions, please open an issue on GitHub.\n\n---\n\n**Built with ❤️ using FastAPI, Azure Cosmos DB, and Claude AI**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frithinch%2Fholly-and-morty","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frithinch%2Fholly-and-morty","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frithinch%2Fholly-and-morty/lists"}