AI

Создание агента по недвижимости с помощью CrewAI и Bright Data

Узнайте, как автоматизировать работу с данными о недвижимости, анализ рынка и привлечение клиентов с помощью CrewAI и сервера MCP компании Bright Data.
11 мин. чтения
Real Estate Agent with CrewAi & Bright Data blog image

В секторе недвижимости происходят значительные изменения: интеллектуальные роботы и системы искусственного интеллекта полностью заменяют ручной труд. Предприятия, работающие в сфере недвижимости, часто имеют дело с разрозненными наборами данных, трудоемким анализом и огромными ограничениями по масштабу. Но что, если бы существовала такая система, которая могла бы рассуждать, адаптироваться и автономно предоставлять полный комплекс услуг в сфере недвижимости?

В этом руководстве вы узнаете:

  • Как современные фреймворки AI-агентов, интегрированные с инфраструктурой веб-скрепинга, решают эти проблемы.
  • Как создать современного агента по недвижимости с помощью CrewAI и MCP-сервера Bright Data.

Давайте начнем!

Что такое CrewAI?

CrewAI – это фреймворк с открытым исходным кодом для организации совместной работы агентов ИИ. С помощью CrewAI вы можете четко определить, что может делать агент, его цели и инструменты, которые ему разрешено использовать. Это позволяет выполнять сложные, многоэтапные рабочие процессы в сфере недвижимости, объединяя агентов в команды или экипажи.

CrewAI состоит из этих основных компонентов:

  1. Агент. Работник, управляемый LLM, с определенной ролью, конкретной целью и необязательной предысторией. Контекст области недвижимости является релевантным для данной модели.
  2. Задание. Единое, четко ограниченное по объему и масштабу задание для одного агента, которое имеет четко определенный результат, служащий эталоном контроля качества.
  3. Инструмент. Частные функции, которые агент может вызывать для работы с конкретным доменом, например для получения данных о недвижимости или анализа рынка, или даже для использования конечной точки MCP Bright Data для скраппинга.
  4. Экипаж. Объект недвижимости – это группа агентов, работающих совместно, каждый из которых выполняет свои задачи.
  5. Процесс. План выполнения, который может быть составлен последовательно, параллельно или иерархически, регулирует порядок задач, их назначение, делегирование и повторение.

Это зеркальное отражение команды риелторов: исследователи недвижимости занимаются сбором данных, аналитики рынка – аналитикой, менеджеры по работе с клиентами – общением, а специалисты по листингу – маркетингом.

Чтобы узнать больше о том, как CrawAI интегрируется с такими инструментами, как Bright Data, ознакомьтесь с этим руководством.

Что такое MCP?

MCP – это открытый стандарт JSON-RPC 2.0, позволяющий агентам искусственного интеллекта вызывать внешние инструменты и источники данных через единый структурированный интерфейс. Считайте, что это универсальный коннектор для данных о недвижимости.

Сервер MCP от Bright Data воплощает этот стандарт в жизнь, подключая агента непосредственно к стеку скраппинга Bright Data, что делает извлечение данных о недвижимости гораздо более простым, чем традиционные подходы:

  • Обход антиботов. Запросы проходят через Web Unlocker и пул из 150M+ вращающихся жилых IP-адресов, охватывающих 195 стран.
  • Поддержка динамических сайтов. Специально разработанный браузер для скрапинга отображает JavaScript, поэтому агенты видят полностью загруженные объявления о недвижимости
  • Структурированные результаты. Многие инструменты возвращают чистый JSON, что избавляет от необходимости использовать собственные парсеры.

На сервере опубликовано более 50 готовых инструментов, начиная от общих URL-адресов и заканчивая скреперами для работы с недвижимостью, так что ваш агент CrewAI сможет получить детали недвижимости, данные о рынке или информацию о листинге одним звонком.

Что мы строим: Агенты по недвижимости

Мы создадим агента по недвижимости CrewAI, который будет исследовать объекты недвижимости со страницы Zillow и возвращать детали в виде структурированного JSON-вывода.

Вы можете использовать его для других свойств, изменив ссылку и некоторые части кода.

Пререквизиты:

Прежде чем погрузиться в код, убедитесь, что у вас есть следующие настройки:

  • Python 3.11 – рекомендуется для обеспечения стабильности.
  • Node.js + npm – требуется для запуска сервера Bright Data Web MCP; загрузить с официального сайта.
  • Виртуальное окружение Python – позволяет изолировать зависимости; см. документациюvenv.
  • Учетная запись Bright Dataзарегистрируйтесь и создайте токен API (доступны бесплатные пробные кредиты).
  • Ключ API Nebius – создайте ключ в Nebius AI Studio (нажмите + Получить ключ API). Вы можете использовать его бесплатно. Биллинговый профиль не требуется.

Шаг 1. Настройка среды:

Выполните следующие команды в терминале, чтобы настроить окружение проекта и установить зависимости:

mkdir real-estate-ai-system && cd real-estate-ai-system
python -m venv venv
# macOS/Linux: source venv/bin/activate
# Windows: venv\\Scripts\\activate
pip install "crewai-tools[mcp]" crewai mcp python-dotenv pandas

Создайте новый файл real_estate_agents.py и добавьте в него следующие импорты:

from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
from mcp import StdioServerParameters
from crewai.llm import LLM
import os
import json
import pandas as pd
from datetime import datetime
from dotenv import load_dotenv

load_dotenv()

Шаг 2. Конфигурация сервера Brightdata MCP

Создайте файл .env в корне проекта с вашими учетными данными:

BRIGHT_DATA_API_TOKEN="your_api_token_here"
WEB_UNLOCKER_ZONE="your_web_unlocker_zone"
BROWSER_ZONE="your_browser_zone"
NEBIUS_API_KEY="your_nebius_api_key"

Вам потребуется:

  • API-токен: Сгенерируйте новый токен API на панели управления Bright Data.
  • Зона Web Unlocker: Создайте новую зону Web Unlocker для сайтов о недвижимости
  • Зона Browser API: Создайте новую зону Browser API для сайтов, перегруженных JavaScript
  • Ключ API Nebius: Уже создан в разделе Предварительные условия

Добавьте эту конфигурацию в файл real_estate_agents.py:

llm = LLM(
    model="nebius/Qwen/Qwen3-235B-A22B",
    api_key=os.getenv("NEBIUS_API_KEY")
)

server_params = StdioServerParameters(
    command="npx",
    args=["@brightdata/mcp"],
    env={
        "API_TOKEN": os.getenv("BRIGHT_DATA_API_TOKEN"),
        "WEB_UNLOCKER_ZONE": os.getenv("WEB_UNLOCKER_ZONE"),
        "BROWSER_ZONE": os.getenv("BROWSER_ZONE"),
    },
)

Это запускает *npx @brightdata/mcp* в качестве подпроцесса и открывает 50+ инструментов через стандарт MCP для извлечения данных о недвижимости.

Шаг 3. Определение агента и задачи

Здесь мы определяем личность агента и конкретную работу, которую он должен выполнять. При внедрении CrewAI приоритет отдавайте разработке задач, посвящая ей около 80 % усилий, и только 20 % – определению агентов. Обновите файл real_estate_agents.py, чтобы добавить определения агентов и задач:

def build_scraper_agent(mcp_tools):
    return Agent(
        role="Senior Real Estate Data Extractor",
        goal=(
            "Return a JSON object with snake_case keys containing: address, price, "
            "bedrooms, bathrooms, square_feet, lot_size, year_built, property_type, "
            "listing_agent, days_on_market, mls_number, description, image_urls, "
            "and neighborhood for the target property listing page. Ensure strict schema validation."
        ),
        backstory=(
            "Veteran real estate data engineer with years of experience extracting "
            "property information from Zillow, Realtor.com, and Redfin. Skilled in "
            "Bright Data MCP, proxy rotation, CAPTCHA avoidance, and strict "
            "JSON-schema validation for real estate data."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=3,
        verbose=True,
    )

def build_scraping_task(agent):
    return Task(
        description=(
            "Extract property data from <https://www.zillow.com/homedetails/123-Main-St-City-State-12345/123456_zpid/> "
            "and return it as structured JSON."
        ),
        expected_output="""{
            "address": "123 Main Street, City, State 12345",
            "price": "$450,000",
            "bedrooms": 3,
            "bathrooms": 2,
            "square_feet": 1850,
            "lot_size": "0.25 acres",
            "year_built": 1995,
            "property_type": "Single Family Home",
            "listing_agent": "John Doe, ABC Realty",
            "days_on_market": 45,
            "mls_number": "MLS123456",
            "description": "Beautiful home with updated kitchen...",
            "image_urls": ["<https://example.com/image1.jpg>", "<https://example.com/image2.jpg>"],
            "neighborhood": "Downtown Historic District"
        }""",
        agent=agent,
    )

Вот что делает каждый параметр:

  • role – краткое название должности, CrewAI вводит параметр @role в каждое системное приглашение.
  • goal – цель северной звезды; CrewAI сравнивает ее после каждого шага цикла, чтобы решить, стоит ли останавливаться.
  • предыстория – знание домена, которое помогает направлять тон агента и уменьшает галлюцинации.
  • tools – Вставляет список объектов BaseTool (например, MCP search_engine, scrape_as_markdown).
  • llm – определение модели, которую CrewAI будет использовать для каждой процедуры “думать → планировать → действовать → отвечать”.
  • max_iter – жесткое ограничение на количество внутренних циклов, которые может делать агент – в версии 0.30+ по умолчанию используется 20.
  • verbose – Потоковая передача каждой подсказки, каждой мысли, каждого вызова инструмента в stdout (для отладки).
  • описание – На каждом ходу вводится инструкция, ориентированная на действие.
  • expected_output – Формальный контракт на правильный ответ (строгий JSON, без следующей запятой).
  • agent – Привязывает эту задачу к конкретному экземпляру агента для Crew.kickoff().

Шаг 4. Сбор экипажа и выполнение

Эта часть собирает агента и задание в экипаж и запускает рабочий процесс. Добавьте сценарий сборки и выполнения Crew в файл real_estate_agents.py:

def scrape_property_data():
    """Assembles and runs the scraping crew."""
    with MCPServerAdapter(server_params) as mcp_tools:
        scraper_agent = build_scraper_agent(mcp_tools)
        scraping_task = build_scraping_task(scraper_agent)

        crew = Crew(
            agents=[scraper_agent],
            tasks=[scraping_task],
            process=Process.sequential,
            verbose=True
        )
        return crew.kickoff()

if __name__ == "__main__":
    try:
        result = scrape_property_data()
        print("\\n[SUCCESS] Scraping completed!")
        print("Extracted property data:")
        print(result)
    except Exception as e:
        print(f"\\n[ERROR] Scraping failed: {str(e)}")

Шаг 5. Запуск скребка

Запустите команду, чтобы выполнить сценарий в терминале:

python real_estate_agents.py

Вы увидите в консоли ход мыслей агента, как каждый из них планирует и выполняет свои задачи.

Мыслительный процесс агента

Конечным результатом будет чистый объект JSON:

{
  "address": "123 Main Street, City, State 12345",
  "price": "$450,000",
  "bedrooms": 3,
  "bathrooms": 2,
  "square_feet": 1850,
  "lot_size": "0.25 acres",
  "year_built": 1995,
  "property_type": "Single Family Home",
  "listing_agent": "John Doe, ABC Realty",
  "days_on_market": 45,
  "mls_number": "MLS123456",
  "description": "Beautiful home with updated kitchen...",
  "image_urls": ["<https://example.com/image1.jpg>", "<https://example.com/image2.jpg>"],
  "neighborhood": "Downtown Historic District"       
 }

Усовершенствованный шаблон реализации

Хотя наш базовый пример демонстрирует основные идеи, реальные приложения требуют более глубокого осмысления:

Анализ рынка и генерация свинца

Для сбора информации о рынке требуются агенты, способные анализировать тенденции, выявлять возможности и генерировать квалифицированные запросы. Эти агенты сотрудничают друг с другом, чтобы предоставить исчерпывающую информацию о рынке и определить перспективы.

Добавьте эти агенты анализа рынка в файл real_estate_agents.py:

def build_market_analysis_agent(mcp_tools):
    return Agent(
        role="Real Estate Market Analyst",
        goal=(
            "Analyze market trends, price movements, and investment opportunities. "
            "Provide actionable insights for buyers, sellers, and investors based "
            "on comprehensive market data and comparable property analysis."
        ),
        backstory=(
            "Senior market analyst with expertise in real estate economics, "
            "property valuation, and investment analysis. Specializes in identifying "
            "market trends, pricing anomalies, and investment opportunities using "
            "statistical analysis and machine learning techniques."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=4,
        verbose=True,
    )

def build_lead_generation_agent(mcp_tools):
    return Agent(
        role="Real Estate Lead Generation Specialist",
        goal=(
            "Identify potential buyers and sellers based on market activity, "
            "property searches, and behavioral patterns. Generate qualified "
            "leads with contact information and engagement strategies."
        ),
        backstory=(
            "Lead generation expert with deep knowledge of real estate marketing, "
            "customer behavior analysis, and digital prospecting. Experienced in "
            "identifying high-value prospects and developing targeted outreach "
            "campaigns for real estate professionals."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=3,
        verbose=True,
    )

def analyze_market_and_generate_leads(area_zip_code, price_range):
    """Perform market analysis and generate leads for a specific area."""
    with MCPServerAdapter(server_params) as mcp_tools:
        market_analyst = build_market_analysis_agent(mcp_tools)
        lead_generator = build_lead_generation_agent(mcp_tools)
        
        market_task = Task(
            description=(
                f"Analyze the real estate market for ZIP code {area_zip_code} "
                f"within price range {price_range}. Research recent sales, "
                "current listings, price trends, and market conditions. "
                "Identify opportunities and provide investment recommendations."
            ),
            expected_output="""{
                "market_overview": {
                    "avg_price": "$000,000",
                    "median_price": "$000,000",
                    "price_trend": "increasing/decreasing/stable",
                    "days_on_market_avg": 00,
                    "inventory_levels": "high/medium/low"
                },
                "recent_sales": [],
                "active_listings": 000,
                "price_per_sqft_trend": "$000",
                "investment_opportunities": [],
                "market_forecast": "market_prediction",
                "recommendations": []
            }""",
            agent=market_analyst,
        )
        
        lead_task = Task(
            description=(
                f"Generate qualified leads for {area_zip_code} area. "
                "Identify potential sellers with properties likely to be listed, "
                "buyers actively searching in the area, and investors looking "
                "for opportunities. Include contact strategies and timing recommendations."
            ),
            expected_output="""{
                "potential_sellers": [],
                "active_buyers": [],
                "investor_prospects": [],
                "lead_scoring": {
                    "high_priority": [],
                    "medium_priority": [],
                    "low_priority": []
                },
                "contact_strategies": [],
                "follow_up_timeline": []
            }""",
            agent=lead_generator,
        )
        
        crew = Crew(
            agents=[market_analyst, lead_generator],
            tasks=[market_task, lead_task],
            process=Process.sequential,
            verbose=True
        )
        
        return crew.kickoff()

Взаимодействие и общение с клиентами

Для эффективного управления клиентами требуются специализированные агенты, которые могут поддерживать связь, назначать встречи и поддерживать отношения на протяжении всего процесса работы с недвижимостью. Эти агенты обеспечивают постоянное и профессиональное обслуживание клиентов.

Добавьте эти агенты управления клиентами в файл real_estate_agents.py:


def build_client_communication_agent(mcp_tools):
    return Agent(
        role="Real Estate Client Relations Manager",
        goal=(
            "Manage client communications, schedule appointments, send follow-ups, "
            "and maintain client relationships throughout the buying/selling process. "
            "Provide personalized service and timely responses to client inquiries."
        ),
        backstory=(
            "Experienced client relations specialist with expertise in real estate "
            "customer service, appointment scheduling, and relationship management. "
            "Skilled in understanding client needs, managing expectations, and "
            "maintaining long-term relationships for referrals and repeat business."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=3,
        verbose=True,
    )

def build_appointment_scheduler_agent(mcp_tools):
    return Agent(
        role="Real Estate Appointment Coordinator",
        goal=(
            "Schedule property viewings, client meetings, and follow-up appointments. "
            "Coordinate between buyers, sellers, and agents to optimize scheduling "
            "and maximize showing efficiency."
        ),
        backstory=(
            "Professional appointment coordinator with deep understanding of real "
            "estate workflows, client preferences, and scheduling optimization. "
            "Expert in managing complex calendars and coordinating multiple stakeholders."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=2,
        verbose=True,
    )

def handle_client_communication(client_inquiry, client_profile):
    """Process client inquiries and manage communications."""
    with MCPServerAdapter(server_params) as mcp_tools:
        communication_agent = build_client_communication_agent(mcp_tools)
        scheduler_agent = build_appointment_scheduler_agent(mcp_tools)
        
        communication_task = Task(
            description=(
                f"Process client inquiry: '{client_inquiry}' from client with "
                f"profile: {client_profile}. Provide personalized response, "
                "address their specific needs, and recommend next steps."
            ),
            expected_output="""{
                "response_message": "personalized_client_response",
                "client_needs_assessment": {
                    "budget_range": "$000,000 - $000,000",
                    "preferred_locations": [],
                    "property_requirements": [],
                    "timeline": "timeframe"
                },
                "recommended_properties": [],
                "next_steps": [],
                "follow_up_schedule": "timing_recommendations"
            }""",
            agent=communication_agent,
        )
        
        scheduling_task = Task(
            description=(
                "Based on the client communication, schedule appropriate "
                "follow-up appointments, property viewings, or consultation "
                "meetings. Optimize scheduling for client convenience and "
                "agent efficiency."
            ),
            expected_output="""{
                "scheduled_appointments": [],
                "property_viewing_schedule": [],
                "follow_up_reminders": [],
                "calendar_integration": "scheduling_details"
            }""",
            agent=scheduler_agent,
        )
        
        crew = Crew(
            agents=[communication_agent, scheduler_agent],
            tasks=[communication_task, scheduling_task],
            process=Process.sequential,
            verbose=True
        )
        
        return crew.kickoff()

Автоматизация листинга недвижимости и маркетинга

Для автоматизации маркетинга требуются специализированные агенты, которые могут создавать привлекательные объявления, оптимизировать их для поисковых систем и распространять на различных платформах.

Добавьте этот маркетинговый агент в файл real_estate_agents.py:


def build_listing_manager_agent(mcp_tools):
    return Agent(
        role="Property Listing Marketing Manager",
        goal=(
            "Create compelling property listings, optimize for search engines, "
            "and distribute across multiple platforms. Generate marketing materials "
            "and track listing performance to maximize exposure and inquiries."
        ),
        backstory=(
            "Digital marketing specialist with expertise in real estate marketing, "
            "SEO optimization, and multi-platform listing management. Experienced "
            "in creating high-converting property descriptions and managing "
            "marketing campaigns across MLS, Zillow, Realtor.com, and social media."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=4,
        verbose=True,
    )

Функции поиска и обнаружения

Интеллектуальные системы поиска и рекомендации недвижимости позволяют клиентам находить объекты, которые точно соответствуют их конкретным потребностям и предпочтениям. Эти агенты предоставляют персонализированные услуги по поиску и рекомендации недвижимости.

Добавьте эти агенты поиска и обнаружения в файл real_estate_agents.py:

def build_search_agent(mcp_tools):
    return Agent(
        role="Intelligent Property Search Specialist",
        goal=(
            "Provide intelligent property search and recommendation services. "
            "Understand client preferences, search multiple databases, and "
            "deliver personalized property recommendations with detailed analysis."
        ),
        backstory=(
            "Search technology expert with deep understanding of real estate "
            "databases, property matching algorithms, and client preference analysis. "
            "Specializes in advanced search techniques and personalized recommendation "
            "systems for optimal property discovery."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=4,
        verbose=True,
    )

def build_recommendation_agent(mcp_tools):
    return Agent(
        role="Property Recommendation Engine",
        goal=(
            "Analyze client behavior, preferences, and market data to generate "
            "personalized property recommendations. Learn from client feedback "
            "and continuously improve recommendation accuracy."
        ),
        backstory=(
            "Machine learning specialist with expertise in recommendation systems, "
            "behavioral analysis, and predictive modeling for real estate. "
            "Experienced in developing personalized recommendation engines that "
            "learn from user interactions and market trends."
        ),
        tools=mcp_tools,
        llm=llm,
        max_iter=3,
        verbose=True,
    )

def intelligent_property_search(search_criteria, client_preferences):
    """Perform intelligent property search with personalized recommendations."""
    with MCPServerAdapter(server_params) as mcp_tools:
        search_agent = build_search_agent(mcp_tools)
        recommendation_agent = build_recommendation_agent(mcp_tools)
        
        search_task = Task(
            description=(
                f"Search for properties matching criteria: {search_criteria}. "
                f"Client preferences: {client_preferences}. Use advanced search "
                "techniques across multiple platforms and databases. Prioritize "
                "results based on client preferences and market conditions."
            ),
            expected_output="""{
                "search_results": [],
                "total_matches": 0,
                "search_filters_applied": [],
                "alternative_suggestions": [],
                "market_insights": {
                    "avg_price_in_area": "$000,000",
                    "market_trends": "trend_analysis",
                    "inventory_levels": "availability_status"
                }
            }""",
            agent=search_agent,
        )
        
        recommendation_task = Task(
            description=(
                "Analyze search results and client preferences to generate "
                "personalized recommendations. Rank properties by relevance, "
                "identify hidden gems, and suggest alternative options that "
                "might meet client needs."
            ),
            expected_output="""{
                "top_recommendations": [],
                "personalization_score": "0-100",
                "recommendation_reasoning": [],
                "alternative_options": [],
                "learning_insights": {
                    "preference_patterns": [],
                    "behavior_analysis": "client_behavior_summary"
                }
            }""",
            agent=recommendation_agent,
        )
        
        crew = Crew(
            agents=[search_agent, recommendation_agent],
            tasks=[search_task, recommendation_task],
            process=Process.sequential,
            verbose=True
        )
        
        return crew.kickoff()

Развертывание и настройка производства

Наконец, давайте создадим комплексную систему оркестровки, которая будет координировать работу всех наших специализированных агентов. Этот основной класс системы будет служить центральным узлом для всех операций с недвижимостью.

Добавьте эту главную системную оркестровку в файл real_estate_agents.py:


class RealEstateAgentSystem:
    def full_property_analysis(self, property_url, client_profile=None):
        with MCPServerAdapter(server_params) as mcp_tools:
            research_agent = build_property_research_agent(mcp_tools)
            market_analyst = build_market_analysis_agent(mcp_tools)
            listing_manager = build_listing_manager_agent(mcp_tools)
            
            research_task = build_property_research_task(research_agent, property_url)
            
            market_task = Task(
                description="Analyze market conditions for the researched property",
                expected_output="Market analysis with trends and recommendations",
                agent=market_analyst,
            )
            
            marketing_task = Task(
                description="Create marketing strategy based on property and market analysis",
                expected_output="Complete marketing campaign plan",
                agent=listing_manager,
            )
            
            crew = Crew(
                agents=[research_agent, market_analyst, listing_manager],
                tasks=[research_task, market_task, marketing_task],
                process=Process.sequential,
                verbose=True
            )
            
            return crew.kickoff()
    
    def client_service_workflow(self, client_inquiry, client_profile):
        communication_result = handle_client_communication(client_inquiry, client_profile)
        
        if "search" in client_inquiry.lower():
            search_criteria = self.extract_search_criteria(client_inquiry)
            search_result = intelligent_property_search(search_criteria, client_profile)
            return {
                "communication": communication_result,
                "search_results": search_result
            }
        
        return communication_result
    
    def extract_search_criteria(self, inquiry):
        criteria = {
            "price_range": "extracted_from_inquiry",
            "location": "extracted_from_inquiry", 
            "property_type": "extracted_from_inquiry",
            "bedrooms": "extracted_from_inquiry",
            "bathrooms": "extracted_from_inquiry"
        }
        return criteria

def main():
    system = RealEstateAgentSystem()
    
    property_url = "<https://www.zillow.com/homedetails/661-Cranbrook-Rd-London-ON-N6K-1W8/2071250954_zpid/>"
    
    try:
        print("=== Starting Comprehensive Property Analysis ===")
        analysis_result = system.full_property_analysis(property_url)
        print("\\n=== Analysis Complete ===")
        print("Extracted property data:")
        print(json.dumps(analysis_result, indent=2) if isinstance(analysis_result, dict) else str(analysis_result))
        
        client_inquiry = "I'm looking for a 3-bedroom house under $500,000 in downtown area"
        client_profile = {
            "name": "John Smith",
            "budget": "$450,000",
            "preferred_locations": ["downtown", "midtown"],
            "timeline": "3 months"
        }
        
        print("\\n=== Processing Client Inquiry ===")
        service_result = system.client_service_workflow(client_inquiry, client_profile)
        print("\\n=== Client Service Complete ===")
        print("Client service results:")
        print(json.dumps(service_result, indent=2) if isinstance(service_result, dict) else str(service_result))
        
        print("\\n=== Analyzing Market and Generating Leads ===")
        market_leads = analyze_market_and_generate_leads("90210", "$500,000-$1,000,000")
        print("\\n=== Market Analysis Complete ===")
        print("Market analysis and leads:")
        print(json.dumps(market_leads, indent=2) if isinstance(market_leads, dict) else str(market_leads))
        
    except Exception as e:
        print(f"\\n[ERROR] System execution failed: {str(e)}")

if __name__ == "__main__":
    main()

Оптимизация затрат

MCP от Bright Data основан на использовании, поэтому счет выставляется за каждый дополнительный запрос. Вот несколько советов, которые помогут вам держать расходы под контролем:

  • Запрашивайте только те поля недвижимости, которые вам нужны, вместо того чтобы просматривать целые сайты объявлений или наборы данных.
  • Включите кэш CrewAI на уровне инструментов, чтобы пропускать вызовы, когда данные о свойствах не изменились, экономя время и кредиты.
  • По умолчанию используйте зону Web Unlocker и переключайтесь на зону Browser API только в тех случаях, когда JavaScript-рендеринг необходим для сложных сайтов недвижимости.
  • Установите для каждого агента разумную максимальную границу итераций, чтобы он не мог бесконечно циклиться на проблемных объявлениях.

Следуйте этим рекомендациям, и ваши агенты CrewAI останутся экономичными и надежными, готовыми к выполнению производственных задач в сфере недвижимости.

Заключение

Из этого руководства вы узнали, как создавать агентов недвижимости CrawAI с помощью MCP-сервера Bright Data.

Мы начали с понимания того, что представляют собой эти технологии и как они используются. Затем мы перешли к созданию агента по недвижимости. Настроили MCP-сервер Bright Data, сконфигурировали LLM, создали агентов, определили задачи и собрали task Crew.

Вы можете легко адаптировать этих агентов к другим объектам недвижимости. Например, чтобы скрапить с Realtor.com, а не с Zillow, достаточно изменить роль, цель и предысторию агента, а также описание задачи и то, что вы ожидаете получить на выходе.