few additions

This commit is contained in:
Madhu 2025-02-13 04:29:26 +05:30
parent a6bd9f66f1
commit b42b879761
4 changed files with 41 additions and 12 deletions

View file

@ -26,12 +26,12 @@ class FirecrawlResponse(BaseModel):
status: str status: str
expiresAt: str expiresAt: str
class PriceFindingAgent: class PropertyFindingAgent:
"""Agent responsible for finding properties and providing recommendations""" """Agent responsible for finding properties and providing recommendations"""
def __init__(self, firecrawl_api_key: str): def __init__(self, firecrawl_api_key: str, openai_api_key: str):
self.agent = Agent( self.agent = Agent(
model=OpenAIChat(id="o3-mini"), model=OpenAIChat(id="o3-mini", api_key=openai_api_key),
markdown=True, markdown=True,
description="I am a real estate expert who helps find and analyze properties based on user preferences." description="I am a real estate expert who helps find and analyze properties based on user preferences."
) )
@ -52,7 +52,6 @@ class PriceFindingAgent:
f"https://www.99acres.com/property-in-{formatted_location}-ffid/*", f"https://www.99acres.com/property-in-{formatted_location}-ffid/*",
f"https://housing.com/in/buy/{formatted_location}/{formatted_location}", f"https://housing.com/in/buy/{formatted_location}/{formatted_location}",
f"https://www.squareyards.com/sale/property-for-sale-in-{formatted_location}/*", f"https://www.squareyards.com/sale/property-for-sale-in-{formatted_location}/*",
f"https://www.nobroker.in/*",
f"https://www.nobroker.in/property/sale/{city}/{formatted_location}", f"https://www.nobroker.in/property/sale/{city}/{formatted_location}",
f"https://www.magicbricks.com/*" f"https://www.magicbricks.com/*"
] ]
@ -62,7 +61,7 @@ class PriceFindingAgent:
raw_response = self.firecrawl.extract( raw_response = self.firecrawl.extract(
urls=urls, urls=urls,
params={ params={
'prompt': f"""Extract {property_category} {property_type_prompt} from {city} that cost less than {max_price} crores. 'prompt': f"""Extract at least 2-3 different {property_category} {property_type_prompt} from {city} that cost less than {max_price} crores.
Requirements: Requirements:
- Property Category: {property_category} properties only - Property Category: {property_category} properties only
@ -70,11 +69,11 @@ class PriceFindingAgent:
- Location: {city} - Location: {city}
- Maximum Price: {max_price} crores - Maximum Price: {max_price} crores
- Include complete property details with exact location - Include complete property details with exact location
- IMPORTANT: Return at least 2 different property listings
""", """,
'schema': PropertyData.model_json_schema() 'schema': PropertyData.model_json_schema()
} } )
) print(raw_response)
# Process the properties data # Process the properties data
properties = [] properties = []
if isinstance(raw_response, dict): if isinstance(raw_response, dict):
@ -83,7 +82,7 @@ class PriceFindingAgent:
elif isinstance(raw_response, list): elif isinstance(raw_response, list):
responses = [FirecrawlResponse(**item) for item in raw_response] responses = [FirecrawlResponse(**item) for item in raw_response]
properties = [resp.data for resp in responses] properties = [resp.data for resp in responses]
print(properties)
# Now use the agent to analyze and provide recommendations # Now use the agent to analyze and provide recommendations
properties_context = "\n".join([ properties_context = "\n".join([
f"Property: {p['Building_name']}\nPrice: {p['Price']}\nLocation: {p['location_address']}\nType: {p['Property_type']}\nDescription: {p['Description']}" f"Property: {p['Building_name']}\nPrice: {p['Price']}\nLocation: {p['location_address']}\nType: {p['Property_type']}\nDescription: {p['Description']}"
@ -114,9 +113,9 @@ class PriceFindingAgent:
class MarketAnalysisAgent: class MarketAnalysisAgent:
"""Agent responsible for analyzing market trends and conditions""" """Agent responsible for analyzing market trends and conditions"""
def __init__(self, firecrawl_api_key: str): def __init__(self, firecrawl_api_key: str, openai_api_key: str):
self.agent = Agent( self.agent = Agent(
model=OpenAIChat(id="o3-mini"), model=OpenAIChat(id="o3-mini", api_key=openai_api_key),
markdown=True, markdown=True,
description="I am a real estate market analyst who provides insights on market trends and conditions." description="I am a real estate market analyst who provides insights on market trends and conditions."
) )
@ -186,10 +185,11 @@ class MarketAnalysisAgent:
def main(): def main():
"""Main function to demonstrate the agents""" """Main function to demonstrate the agents"""
firecrawl_api_key = "YOUR_FIRECRAWL_API_KEY" firecrawl_api_key = "YOUR_FIRECRAWL_API_KEY"
openai_api_key = "OPENAI_API_KEY"
try: try:
# Initialize agents # Initialize agents
property_agent = PriceFindingAgent(firecrawl_api_key) property_agent = PropertyFindingAgent(firecrawl_api_key, openai_api_key)
market_agent = MarketAnalysisAgent(firecrawl_api_key) market_agent = MarketAnalysisAgent(firecrawl_api_key)
# Get property recommendations # Get property recommendations

View file

@ -0,0 +1,3 @@
agno
firecrawl
pydantic

View file

@ -0,0 +1,26 @@
from ai_real_estate_agent import PropertyFindingAgent
def test_property_agent():
# Initialize the agent with your Firecrawl and OpenAI API keys
agent = PropertyFindingAgent(
firecrawl_api_key="", # Replace with your Firecrawl key
openai_api_key=""
)
try:
# Test property search
results = agent.find_properties(
city="Visakhapatnam",
max_price=4.0,
property_category="Residential",
property_type="Individual House"
)
print("\n=== Property Search Results ===")
print(results.content)
except Exception as e:
print(f"Error during testing: {str(e)}")
if __name__ == "__main__":
test_property_agent()