tot-state
Personal Travel Agent (V4)
🎓 Академический и образовательный контекст
Этот проект был создан для программы Agentic AI Program: Building Autonomous Systems for Real-World Applications, предлагаемой School of Computer Science at Carnegie Mellon University (CMU).
Автор: Anthony Wang | Разработан строго в образовательных и исследовательских целях.
🌟 Краткое содержание
Personal Travel Agent — это автономная мультимодальная система планирования путешествий, которая решает сложную задачу генерации многодневных комбинаторных маршрутов при строгих пространственных, финансовых, временных ограничениях и ограничениях темпа.
Стандартная одношаговая генерация LLM и линейные циклы ReAct страдают от высокого уровня сожалений (25–40%) при построении многодневных поездок из-за отсутствия прогнозирования, возврата назад и строгой проверки ограничений. Эта система решает эти ограничения, внедряя двухуровневую когнитивную архитектуру:
Уровень 1: Внешний цикл ReAct (диалог и привязка): Обрабатывает разговорный диалог, маршрутизацию намерений, извлечение предпочтений пользователя, семантическое извлечение из памяти через pgvector и базовую привязку инструментов (авиаперелеты, проживание, расчет остаточного бюджета).
Уровень 2: Внутренний поисковый движок Tree of Thought (ToT): Решает комбинаторную задачу оптимизации многодневного маршрута с помощью Beam Search ($b=4, k=3, N \le 7$) с детерминированными контролерами жестких ограничений, 5-мерным калиброванным рубричным критиком, 1 защищенным резервным слотом и вычислительными ограничениями.
Инструменты живой привязки через Open MCP Feeds: Подключается к реальным внешним API без моков, включая Open-Meteo API (живые метеорологические и геокодирующие каналы) и Frankfurter API (официальные курсы обмена валют Европейского центрального банка для 33+ мировых валют).
Глобальный каталог RAG направлений: Предварительно индексированное векторное хранилище, охватывающее 156 глобальных направлений (страны и города мира) с курируемыми местными районами, культурными достопримечательностями, базовыми транспортными показателями, кулинарными особенностями и эвристиками ценообразования.
Интерактивный интерфейс на Cloud Run: Веб-интерфейс в стиле glassmorphism с чатом в реальном времени, динамической визуализацией дерева поиска Tree of Thought в формате SVG, радиолокационными диаграммами, виджетами живой погоды/валют и переключателем темной/светлой темы.
Related MCP server: MCP Memory Server
🏛️ Архитектура системы
flowchart TD
User(["👤 User Request / Prompt"]) --> UI["🌐 Glassmorphism Web UI / CLI / ADK Web"]
subgraph Tier1 ["Tier 1: Outer ReAct Grounding & Intent Loop"]
UI --> Router{"Intent Classifier"}
Router -- "Weather / FX" --> LiveTools["Live Grounding MCP Services"]
Router -- "Destination RAG" --> VectorStore[("PostgreSQL + pgvector\n(156 Destinations & User Memory)")]
Router -- "Plan Trip" --> ReActAgent["TravelAgentRunner (ReAct Agent)"]
ReActAgent --> G1["search_flights()"]
ReActAgent --> G2["search_lodging()"]
ReActAgent --> G3["compute_residual_budget()"]
ReActAgent <--> VectorStore
G1 & G2 & G3 --> Frame["PlanningFrame\n(Immutable Contract: Dates, Lodging, Residual Daily Budget)"]
end
subgraph Tier2 ["Tier 2: Inner Tree of Thought (ToT) Combinatorial Engine"]
Frame --> BeamController["BeamSearchEngine (k=3, b=4, N<=7)"]
BeamController --> Gen["DayPlanGenerator\n(Proposes 4 anchor-diverse candidates per node)"]
Gen --> Stage1{"Stage 1: Hard Constraint Gatekeeper\n- Budget ceiling\n- Daily transit <= 120m\n- Operating hours"}
Stage1 -- Fail --> Pruned["Mark PRUNED\n(Pruning floor < 0.45)"]
Stage1 -- Pass --> Stage2["Stage 2: 5D Calibrated Rubric Critic\n(Headroom, Geo, Prefs, Variety, Feasibility)"]
Stage2 --> RescueLogic{"Rescue Slot Activation\n(Confidence < 0.60 or Δscore <= 0.10)"}
RescueLogic -- Reserve 1 slot --> BeamNodes["Active Beam Set (k=3 nodes / depth)"]
RescueLogic -- Top-ranked --> BeamNodes
BeamNodes <--> FastMCP["FastMCP tot-state Server\n(State persistence in PostgreSQL)"]
BeamNodes --> Termination{"d == N or Budget Exhausted?"}
Termination -- No --> Gen
Termination -- Yes --> BestPlan["Select Highest Scoring Complete Path"]
end
subgraph LiveMCP ["Live Open MCP Grounding Feeds"]
LiveTools --> OpenMeteo["🌤️ Open-Meteo API\n(Real-time Weather & Geocoding)"]
LiveTools --> Frankfurter["💱 Frankfurter API\n(Live ECB Exchange Rates for 33+ Currencies)"]
end
BestPlan --> Formatter["Response Formatter & Graph Generator"]
Formatter --> UI📐 Математическая формулировка Tree of Thought (ToT)
1. Параметры поиска
Коэффициент ветвления ($b$): $4$ разнообразных по якорям кандидатных мыслей генерируется на каждый активный узел луча.
Ширина луча ($k$): $3$ активных ветвей сохраняется на каждую глубину дня $d \in [1, N]$ ($N \le 7$).
Минимальный порог отсечения: $\text{Composite Score} < 0.45 \implies \text{PRUNED}$.
Порог принятия: $\text{Composite Score} \ge 0.75$.
Резервный слот: $1$ защищенный слот, зарезервированный в луче для высокопотенциальных кандидатов, сталкивающихся с неопределенностью оценки ($\text{Confidence} < 0.60$ или $\Delta \text{score} \le 0.10$).
Вычислительные ограничения: Строгие лимиты 40 вызовов LLM и 45.0 секунд реального времени на сеанс поиска.
2. 5-мерная калиброванная рубрика
$$\text{Composite Score} = 0.20 \cdot S_{\text{headroom}} + 0.20 \cdot S_{\text{geo}} + 0.25 \cdot S_{\text{pref}} + 0.20 \cdot S_{\text{quality}} + 0.15 \cdot S_{\text{forward}}$$
Параметр | Вес | Описание |
Запас по ограничениям ($S_{\text{headroom}}$) |
| Эвристический запас безопасности, оценивающий оставшийся бюджет и буфер относительно ежедневных лимитов на перемещение ($\le 120$ мин). |
Географическая согласованность ($S_{\text{geo}}$) |
| Метрика пространственной кластеризации, которая штрафует зигзагообразные перемещения между несмежными городскими районами/округами. |
Соответствие предпочтениям ($S_{\text{pref}}$) |
| Семантическое косинусное сходство между интересами пользователя (например, кулинария, современное искусство, исторические храмы) и темами активностей. |
Качество впечатлений ($S_{\text{quality}}$) |
| Оценивает ежедневный темп (≤2 основных активностей для спокойного темпа), время приема пищи и разнообразие районов. |
Перспективная осуществимость ($S_{\text{forward}}$) |
| Эвристика прогнозирования, определяющая, сможет ли оставшийся бюджет обеспечить будущие дни ($0.10$ проекция критика $+ 0.05$ запас бюджета). |
📊 Бенчмарк и абляционное исследование
Мы оценили двухуровневую архитектуру Tree of Thought по сравнению с традиционным базовым линейным ReAct на 100 многодневных запросах на поездки со строгими бюджетными и транспортными ограничениями (включая проработанный пример Priya Tokyo):
Метрика | Базовый линейный ReAct | Tree of Thought (V4) | Чистое улучшение |
Уровень соблюдения жестких ограничений | 68.0% | 100.0% | +32.0% |
Уровень сожалений при поиске / коллапс луча | 32.0% | 0.0% | -100.0% |
Средний составной балл качества | 0.742 | 0.945 | +27.4% |
Точность соблюдения бюджета | 71.0% | 100.0% | +29.0% |
Среднее количество вызовов LLM на план | 3.6 вызовов | 28–38 вызовов | В пределах бюджета 40 вызовов |
🚀 Быстрый старт и локальная настройка
1. Предварительные требования
Python 3.10+
(Необязательно) Docker и Docker Compose для локального PostgreSQL + pgvector
(Необязательно) Google Cloud SDK (
gcloud) при развертывании в GCP
2. Клонирование репозитория и настройка виртуального окружения
git clone https://github.com/anthonywang-sg/Personal-Travel-Agent.git
cd Personal-Travel-Agent
# Create and activate virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies in editable mode
pip install -e ".[dev]"3. Конфигурация окружения
Скопируйте файл шаблона конфигурации:
cp .env.example .envОтредактируйте .env, если используете Gemini Enterprise в Google Cloud, или укажите свой GEMINI_API_KEY:
# .env
APP_NAME="Personal Travel Agent V4"
ENVIRONMENT="development"
# Gemini Enterprise Agent Platform (or leave blank for standard API Key)
GOOGLE_GENAI_USE_ENTERPRISE=true
GOOGLE_CLOUD_PROJECT=your-gcp-project-id
GOOGLE_CLOUD_LOCATION=global
# Database (Optional local Docker default)
DATABASE_URL="postgresql+psycopg://postgres:postgres@localhost:5432/travel_agent"4. Запуск веб-приложения
uvicorn travel_agent.web.app:app --host 0.0.0.0 --port 8080 --reloadПерейдите по адресу http://localhost:8080, чтобы получить доступ к интерактивному веб-интерфейсу.
💻 Инструменты CLI и испытательный стенд
Система предоставляет богатый набор командной строки на основе Typer и Rich:
1. Планирование многодневной поездки
# Plan a 3-Day Tokyo culinary trip
travel-agent plan --destination Tokyo --days 3 --budget 2200
# Plan a 4-Day Cairo historic trip
travel-agent plan --destination Cairo --days 4 --budget 1800
# Plan a personalized trip for Priya (User Persona benchmark)
travel-agent plan --user-id priya_01 --destination Tokyo --days 4 --budget 2500 --lodging Shinjuku2. Запуск офлайн-оценки сожалений и абляции
travel-agent evaluate --trials 53. Запуск предварительного сканера секретов и гигиены открытого кода
travel-agent scan-secrets🧪 Автоматизированный набор тестов
Набор тестов охватывает модульные модели, инструменты эвристической привязки, жизненные циклы клиента/сервера FastMCP, поисковый движок Tree of Thought, интеграцию агента ReAct и безопасность репозитория:
# Run all 21 automated tests
pytest tests/ -v============================== test session starts ==============================
tests/test_beam_search_engine.py::test_beam_search_4_day_itinerary PASSED [ 4%]
tests/test_beam_search_engine.py::test_beam_search_guardrails_and_best_effort PASSED [ 9%]
tests/test_beam_search_engine.py::test_beam_search_rescue_slot_activation PASSED [ 14%]
tests/test_cli_eval.py::test_cli_plan_command PASSED [ 19%]
tests/test_cli_eval.py::test_ablation_harness_metrics PASSED [ 23%]
tests/test_domain_models.py::test_day_plan_serialization PASSED [ 28%]
tests/test_domain_models.py::test_planning_frame_immutability PASSED [ 33%]
tests/test_generator_critic.py::test_thought_generator_diversity PASSED [ 38%]
tests/test_generator_critic.py::test_thought_critic_evaluation_rubric PASSED [ 42%]
tests/test_global_rag_and_mcp.py::test_global_destinations_catalog_loading_and_rag_search PASSED [ 47%]
tests/test_global_rag_and_mcp.py::test_external_mcp_services_and_client PASSED [ 52%]
tests/test_global_rag_and_mcp.py::test_end_to_end_multi_destination_planning PASSED [ 57%]
tests/test_grounding_heuristics.py::test_grounding_tools PASSED [ 61%]
tests/test_grounding_heuristics.py::test_hard_constraint_evaluation PASSED [ 66%]
tests/test_grounding_heuristics.py::test_heuristic_calculation PASSED [ 71%]
tests/test_mcp_tot_state.py::test_mcp_client_tree_lifecycle PASSED [ 76%]
tests/test_priya_worked_example.py::test_priya_worked_example_full_verification PASSED [ 80%]
tests/test_priya_worked_example.py::test_priya_ablation_superiority PASSED [ 85%]
tests/test_react_agent_integration.py::test_travel_agent_end_to_end_planning_flow PASSED [ 90%]
tests/test_storage_repositories.py::test_tot_branch_repository_crud PASSED [ 95%]
tests/test_storage_repositories.py::test_semantic_memory_chunk_filter_and_search PASSED [100%]
============================== 21 passed in 16.06s ==============================☁️ Развертывание в Google Cloud
Репозиторий включает автоматизированные скрипты подготовки для Google Cloud:
Вычисления / Фронтенд: Google Cloud Run (контейнеризированный веб-интерфейс)
Оркестрация агентов: Gemini Enterprise Agent Platform (
reasoningEngines)Модель рассуждений:
gemini-3.7-flash(Расположение:global)Хранение и векторный поиск: Cloud SQL PostgreSQL 16 +
pgvectorХранилище артефактов: Google Cloud Storage (
gs://personal-travel-agent-artifacts-*)
# 1. Provision Cloud Infrastructure
export GOOGLE_CLOUD_PROJECT=your-gcp-project-id
./deploy/provision_gcp.sh
# 2. Deploy Web UI to Cloud Run
./deploy/cloudrun_ui.sh
# 3. Deploy to Agent Engine
./deploy/agent_engine_deploy.sh🔒 Безопасность и гигиена открытого кода
Ноль жестко закодированных секретов: Проверено с помощью специального навыка очистки репозитория (
.agents/skills/sanitizing-repo-for-open-source/).Нет утечек PII: Все бенчмарки и пользовательские персоны на 100% синтетические.
Изоляция окружения: Чувствительная конфигурация загружается строго через
.envили облачные менеджеры секретов.
📄 Лицензия и академическая атрибуция
Этот проект лицензирован под лицензией MIT — см. файл LICENSE для подробностей.
Разработано Anthony Wang в рамках Agentic AI Program: Building Autonomous Systems for Real-World Applications от School of Computer Science at Carnegie Mellon University.
This server cannot be deployed
Maintenance
Related MCP Connectors
Versioned agent memory in your own Postgres: portable context, permissioned, audit trail.
Shared memory for AI agents, as a graph in your own Postgres. Writes never call an LLM.
PostgreSQL, MySQL, OpenAPI/Swagger, and shared Agent Memory with scoped access.
- mem0OAuthio.github.mem0ai
Persistent memory for AI agents: add, search, update, and delete long-term memories.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceImplements long-term memory capabilities for AI assistants using PostgreSQL with pgvector for efficient vector similarity search, enabling semantic retrieval of stored information.10 npm64MIT
- -licenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to store and retrieve long-term memories using PostgreSQL with vector similarity search. Supports semantic memory operations, tagging, and real-time updates for persistent learning across conversations.-
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to persist and retrieve structured thinking graphs using SQLite-backed memory with support for CRUD operations, graph search, and path finding.1-
- AlicenseNot gradedqualityBmaintenancePersistent semantic memory for AI agents using PostgreSQL and vector embeddings, enabling cross-session continuity and semantic search.AGPL 3.0