{"id":45715903,"url":"https://github.com/calderbuild/MeetSpot","last_synced_at":"2026-03-10T11:02:10.590Z","repository":{"id":295363194,"uuid":"989905714","full_name":"calderbuild/MeetSpot","owner":"calderbuild","description":"End the \"Where should we meet?\" debate by instantly finding a spot that’s fair, convenient, and loved by everyone. An intelligent meeting point recommendation system.","archived":false,"fork":false,"pushed_at":"2026-03-04T10:54:55.000Z","size":76472,"stargazers_count":520,"open_issues_count":8,"forks_count":51,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-03-04T14:11:35.121Z","etag":null,"topics":["collaborate","fortheloveofcode","geolocation","meeting","meetspot","meetup"],"latest_commit_sha":null,"homepage":"https://meetspot-irq2.onrender.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/calderbuild.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-05-25T04:49:26.000Z","updated_at":"2026-03-04T10:54:59.000Z","dependencies_parsed_at":"2025-07-03T03:19:41.737Z","dependency_job_id":"74629f62-ab2b-44b0-9c2b-afa4ffc86f46","html_url":"https://github.com/calderbuild/MeetSpot","commit_stats":null,"previous_names":["jasonrobertdestiny/meetspot","calderbuild/meetspot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/calderbuild/MeetSpot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calderbuild%2FMeetSpot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calderbuild%2FMeetSpot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calderbuild%2FMeetSpot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calderbuild%2FMeetSpot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/calderbuild","download_url":"https://codeload.github.com/calderbuild/MeetSpot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/calderbuild%2FMeetSpot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30331626,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: 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":["collaborate","fortheloveofcode","geolocation","meeting","meetspot","meetup"],"created_at":"2026-02-25T04:00:34.794Z","updated_at":"2026-03-10T11:02:10.574Z","avatar_url":"https://github.com/calderbuild.png","language":"Python","funding_links":[],"categories":["📊 四、效率与办公相关"],"sub_categories":["🏡 4.2 生活服务"],"readme":"\u003cdiv align=\"center\"\u003e\r\n\r\n# MeetSpot\r\n\r\n\u003cimg src=\"docs/logo.jpg\" alt=\"MeetSpot Logo\" width=\"200\"/\u003e\r\n\r\n### AI Agent for Multi-Person Meeting Point Recommendations\r\n\r\n*Not just a search tool. An autonomous agent that decides the fairest meeting point for everyone.*\r\n\r\n[![Live Demo](https://img.shields.io/badge/Live-Demo-brightgreen?style=for-the-badge)](https://meetspot-irq2.onrender.com)\r\n[![Video Demo](https://img.shields.io/badge/Bilibili-Demo-00A1D6?style=for-the-badge\u0026logo=bilibili)](https://www.bilibili.com/video/BV1aUK7zNEvo/)\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n[![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)\r\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.115+-009688.svg)](https://fastapi.tiangolo.com/)\r\n[![Build Status](https://github.com/calderbuild/MeetSpot/actions/workflows/ci.yml/badge.svg)](https://github.com/calderbuild/MeetSpot/actions)\r\n\r\n[English](README.md) | [简体中文](README_ZH.md)\r\n\r\n\u003c/div\u003e\r\n\r\n---\r\n\r\n## Why MeetSpot?\r\n\r\nMost location tools return results near *you*. MeetSpot calculates the **geographic center** of all participants and returns AI-ranked venues that minimize everyone's travel time.\r\n\r\n| Traditional Tools | MeetSpot |\r\n|-------------------|----------|\r\n| Search near your location | Calculate fair center for all |\r\n| Keyword-based ranking | AI-powered multi-factor scoring |\r\n| Static results | Adaptive dual-mode routing |\r\n| No reasoning | Explainable AI with chain-of-thought |\r\n\r\n\u003cdiv align=\"center\"\u003e\r\n\u003cimg src=\"docs/show1.jpg\" alt=\"MeetSpot Interface\" width=\"85%\"/\u003e\r\n\u003c/div\u003e\r\n\r\n---\r\n\r\n## Agent Architecture\r\n\r\nMeetSpot is an **AI Agent** - it makes autonomous decisions based on request complexity, not just executes searches.\r\n\r\n```\r\n                              User Request\r\n                                   │\r\n                    ┌──────────────┴──────────────┐\r\n                    │      Complexity Router      │\r\n                    │    (Autonomous Decision)    │\r\n                    └──────────────┬──────────────┘\r\n                                   │\r\n              ┌────────────────────┼────────────────────┐\r\n              │                    │                    │\r\n              ▼                    │                    ▼\r\n    ┌─────────────────┐            │          ┌─────────────────┐\r\n    │    Rule Mode    │            │          │   Agent Mode    │\r\n    │   (2-4 sec)     │            │          │   (8-15 sec)    │\r\n    │  Deterministic  │            │          │  LLM-Enhanced   │\r\n    └────────┬────────┘            │          └────────┬────────┘\r\n             │                     │                   │\r\n             └─────────────────────┼───────────────────┘\r\n                                   │\r\n                    ┌──────────────┴──────────────┐\r\n                    │    5-Step Processing        │\r\n                    │        Pipeline             │\r\n                    └──────────────┬──────────────┘\r\n                                   │\r\n        ┌──────────┬──────────┬────┴────┬──────────┬──────────┐\r\n        │          │          │         │          │          │\r\n        ▼          ▼          ▼         ▼          ▼          ▼\r\n    Geocode    Center     POI      Ranking     HTML      Result\r\n              Calc      Search               Gen\r\n```\r\n\r\n### Intelligent Mode Selection\r\n\r\nThe Agent autonomously decides which processing mode to use:\r\n\r\n| Factor | Score | Example |\r\n|--------|-------|---------|\r\n| Location count | +10/location | 4 locations = 40 pts |\r\n| Complex keywords | +15 | \"quiet business cafe with private rooms\" |\r\n| Special requirements | +10 | \"parking, wheelchair accessible, WiFi\" |\r\n\r\n- **Score \u003c 40**: Rule Mode (fast, deterministic, pattern-matched)\r\n- **Score \u003e= 40**: Agent Mode (LLM reasoning, semantic understanding)\r\n\r\n### Agent Mode Scoring\r\n\r\n```\r\nFinal Score = Rule Score × 0.4 + LLM Score × 0.6\r\n```\r\n\r\nThe LLM analyzes semantic fit between venues and requirements, then blends with rule-based scoring. Results include **Explainable AI** visualization showing the agent's reasoning process.\r\n\r\n### 5-Step Pipeline\r\n\r\n| Step | Function | Details |\r\n|------|----------|---------|\r\n| **Geocode** | Address → Coordinates | 90+ smart mappings (universities, landmarks) |\r\n| **Center Calc** | Fair point calculation | Spherical geometry for accuracy |\r\n| **POI Search** | Venue discovery | Concurrent async search, auto-fallback |\r\n| **Ranking** | Multi-factor scoring | Base(30) + Popularity(20) + Distance(25) + Scenario(15) + Requirements(10) |\r\n| **HTML Gen** | Interactive map | Amap JS API integration |\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n```bash\r\n# Clone and install\r\ngit clone https://github.com/calderbuild/MeetSpot.git \u0026\u0026 cd MeetSpot\r\npip install -r requirements.txt\r\n\r\n# Configure (get key from https://lbs.amap.com/)\r\ncp config/config.toml.example config/config.toml\r\n# Edit config.toml and add your AMAP_API_KEY\r\n\r\n# Run\r\npython web_server.py\r\n```\r\n\r\nOpen http://127.0.0.1:8000\r\n\r\n---\r\n\r\n## API Reference\r\n\r\n### Main Endpoint\r\n\r\n`POST /api/find_meetspot`\r\n\r\n```json\r\n{\r\n  \"locations\": [\"Peking University\", \"Tsinghua University\", \"Renmin University\"],\r\n  \"keywords\": \"cafe restaurant\",\r\n  \"user_requirements\": \"parking, quiet environment\"\r\n}\r\n```\r\n\r\n**Response:**\r\n```json\r\n{\r\n  \"success\": true,\r\n  \"html_url\": \"/workspace/js_src/recommendation_xxx.html\",\r\n  \"center\": {\"lat\": 39.99, \"lng\": 116.32},\r\n  \"venues_count\": 8\r\n}\r\n```\r\n\r\n### Other Endpoints\r\n\r\n| Endpoint | Method | Description |\r\n|----------|--------|-------------|\r\n| `/api/find_meetspot_agent` | POST | Force Agent Mode (LLM reasoning) |\r\n| `/api/ai_chat` | POST | AI customer service chat |\r\n| `/health` | GET | System health check |\r\n| `/docs` | GET | Interactive API documentation |\r\n\r\n---\r\n\r\n## Screenshots\r\n\r\n\u003ctable\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/agent-thinking.jpg\" alt=\"Agent Reasoning\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eAgent Chain-of-Thought\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/result-map.jpg\" alt=\"Interactive Map\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eInteractive Map View\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/多维度智能评分show4.jpg\" alt=\"AI Scoring\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eMulti-Factor AI Scoring\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/show5推荐地点.jpg\" alt=\"Venue Cards\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eVenue Recommendation Cards\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n\u003cdetails\u003e\r\n\u003csummary\u003e\u003cb\u003eMore Screenshots\u003c/b\u003e\u003c/summary\u003e\r\n\r\n\u003ctable\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/homepage.jpg\" alt=\"Homepage\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eHomepage\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/finder-input.jpg\" alt=\"Input Interface\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eMeeting Point Finder\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/result-summary.jpg\" alt=\"Results\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eResults Summary\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"docs/AI客服.jpg\" alt=\"AI Chat\"/\u003e\u003cp align=\"center\"\u003e\u003cb\u003eAI Customer Service\u003c/b\u003e\u003c/p\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n\u003c/details\u003e\r\n\r\n---\r\n\r\n## Tech Stack\r\n\r\n| Layer | Technologies |\r\n|-------|--------------|\r\n| **Backend** | FastAPI, Pydantic, aiohttp, SQLAlchemy 2.0, asyncio |\r\n| **Frontend** | HTML5, CSS3, Vanilla JavaScript, Boxicons |\r\n| **Maps** | Amap (Gaode) - Geocoding, POI Search, JS API |\r\n| **AI** | DeepSeek / GPT-4o-mini for semantic analysis |\r\n| **Deploy** | Render, Railway, Docker, Vercel |\r\n\r\n---\r\n\r\n## Project Structure\r\n\r\n```\r\nMeetSpot/\r\n├── api/\r\n│   └── index.py                 # FastAPI application entry\r\n├── app/\r\n│   ├── tool/\r\n│   │   └── meetspot_recommender.py  # Core recommendation engine\r\n│   ├── config.py                # Configuration management\r\n│   └── design_tokens.py         # WCAG-compliant color system\r\n├── templates/                   # Jinja2 templates\r\n├── public/                      # Static assets\r\n└── workspace/js_src/            # Generated result pages\r\n```\r\n\r\n---\r\n\r\n## Development\r\n\r\n```bash\r\n# Development server with hot reload\r\nuvicorn api.index:app --reload\r\n\r\n# Run tests\r\npytest tests/ -v\r\n\r\n# Code quality\r\nblack . \u0026\u0026 ruff check . \u0026\u0026 mypy app/\r\n```\r\n\r\n---\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please:\r\n\r\n1. Fork the repository\r\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\r\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\r\n4. Push to the branch (`git push origin feature/amazing-feature`)\r\n5. Open a Pull Request\r\n\r\n---\r\n\r\n## Contact\r\n\r\n\u003ctable\u003e\r\n\u003ctr\u003e\r\n\u003ctd\u003e\r\n\r\n**Email:** Johnrobertdestiny@gmail.com\r\n\r\n**GitHub:** [Issues](https://github.com/calderbuild/MeetSpot/issues)\r\n\r\n**Blog:** [jasonrobert.me](https://jasonrobert.me/)\r\n\r\n\u003c/td\u003e\r\n\u003ctd align=\"center\"\u003e\r\n\r\n\u003cimg src=\"public/docs/vx_chat.png\" alt=\"WeChat\" width=\"150\"/\u003e\r\n\r\n**Personal WeChat**\r\n\r\n\u003c/td\u003e\r\n\u003ctd align=\"center\"\u003e\r\n\r\n\u003cimg src=\"public/docs/vx_group.png\" alt=\"WeChat Group\" width=\"150\"/\u003e\r\n\r\n**WeChat Group**\r\n\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/table\u003e\r\n\r\n---\r\n\r\n## License\r\n\r\nMIT License - see [LICENSE](LICENSE) for details.\r\n\r\n---\r\n\r\n\u003cdiv align=\"center\"\u003e\r\n\r\n**If MeetSpot helps you, please give it a star!**\r\n\r\n[![Star History Chart](https://api.star-history.com/svg?repos=calderbuild/MeetSpot\u0026type=Date)](https://star-history.com/#calderbuild/MeetSpot\u0026Date)\r\n\r\n\u003c/div\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalderbuild%2FMeetSpot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcalderbuild%2FMeetSpot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcalderbuild%2FMeetSpot/lists"}