feat: Agente-Marketing initial commit
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
import requests
|
||||
import json
|
||||
|
||||
# Supports Ollama (local) or Anthropic API
|
||||
# Set OLLAMA_URL to use local AI, or ANTHROPIC_KEY for Claude API
|
||||
|
||||
OLLAMA_URL = "http://localhost:11434"
|
||||
OLLAMA_MODEL = "qwen2.5:14b"
|
||||
|
||||
USER_PROFILE = """
|
||||
Perfil del comprador:
|
||||
- Residente permanente en EE.UU., menos de 2 años en el país
|
||||
- Soltero
|
||||
- Trabajo independiente: electricista naval/marino ($120/hora)
|
||||
- Dinero disponible para down payment: $50,000 dólares
|
||||
- Presupuesto máximo: $200,000
|
||||
- Busca: costas de Florida (Stuart hacia el norte hasta Jacksonville)
|
||||
- Objetivo: casa para vivir, oportunidad de remate o precio bajo de mercado
|
||||
- Situación crediticia: construyendo historial en USA, no califica para préstamo convencional aún
|
||||
- Tipo de préstamo ideal: Non-QM, Bank Statement, o ITIN loan
|
||||
"""
|
||||
|
||||
ANALYSIS_PROMPT = """Eres un asesor experto en bienes raíces y finanzas para compradores en Florida.
|
||||
|
||||
{profile}
|
||||
|
||||
Analiza esta propiedad y responde en español en máximo 4 oraciones:
|
||||
1. ¿Es una buena oportunidad para este comprador?
|
||||
2. ¿Qué tipo de préstamo le conviene para esta propiedad específica?
|
||||
3. ¿Hay algo que deba investigar o que sea una señal de alerta?
|
||||
|
||||
Propiedad:
|
||||
- Dirección: {address}
|
||||
- Ciudad/Condado: {city}
|
||||
- Precio: ${price:,}
|
||||
- Tipo: {prop_type}
|
||||
- Estado: {status}
|
||||
- Habitaciones: {beds} | Baños: {baths}
|
||||
- Metros cuadrados: {sqft}
|
||||
- Fuente: {source}
|
||||
|
||||
Responde de forma directa y práctica, como si le hablaras a un amigo."""
|
||||
|
||||
|
||||
def analyze_with_ollama(prop: dict) -> str:
|
||||
prompt = ANALYSIS_PROMPT.format(
|
||||
profile=USER_PROFILE,
|
||||
address=prop.get("address", "N/A"),
|
||||
city=f"{prop.get('city', '')} {prop.get('county', '')}".strip(),
|
||||
price=prop.get("price", 0),
|
||||
prop_type=prop.get("property_type", "Residencial"),
|
||||
status=prop.get("status", "Foreclosure"),
|
||||
beds=prop.get("beds", "N/A"),
|
||||
baths=prop.get("baths", "N/A"),
|
||||
sqft=prop.get("sqft", "N/A"),
|
||||
source=prop.get("source", "N/A")
|
||||
)
|
||||
try:
|
||||
r = requests.post(
|
||||
f"{OLLAMA_URL}/api/generate",
|
||||
json={"model": OLLAMA_MODEL, "prompt": prompt, "stream": False},
|
||||
timeout=60
|
||||
)
|
||||
if r.status_code == 200:
|
||||
return r.json().get("response", "").strip()
|
||||
except Exception as e:
|
||||
return f"IA local no disponible: {e}"
|
||||
return "Análisis no disponible."
|
||||
|
||||
|
||||
def analyze_with_anthropic(prop: dict, api_key: str) -> str:
|
||||
prompt = ANALYSIS_PROMPT.format(
|
||||
profile=USER_PROFILE,
|
||||
address=prop.get("address", "N/A"),
|
||||
city=f"{prop.get('city', '')} {prop.get('county', '')}".strip(),
|
||||
price=prop.get("price", 0),
|
||||
prop_type=prop.get("property_type", "Residencial"),
|
||||
status=prop.get("status", "Foreclosure"),
|
||||
beds=prop.get("beds", "N/A"),
|
||||
baths=prop.get("baths", "N/A"),
|
||||
sqft=prop.get("sqft", "N/A"),
|
||||
source=prop.get("source", "N/A")
|
||||
)
|
||||
try:
|
||||
r = requests.post(
|
||||
"https://api.anthropic.com/v1/messages",
|
||||
headers={"x-api-key": api_key, "anthropic-version": "2023-06-01", "content-type": "application/json"},
|
||||
json={"model": "claude-haiku-4-5-20251001", "max_tokens": 300, "messages": [{"role": "user", "content": prompt}]},
|
||||
timeout=30
|
||||
)
|
||||
if r.status_code == 200:
|
||||
return r.json()["content"][0]["text"].strip()
|
||||
except Exception as e:
|
||||
return f"Error API: {e}"
|
||||
return "Análisis no disponible."
|
||||
|
||||
|
||||
def analyze_property(prop: dict, ollama_model: str = None, anthropic_key: str = None) -> str:
|
||||
global OLLAMA_MODEL
|
||||
if ollama_model:
|
||||
OLLAMA_MODEL = ollama_model
|
||||
if anthropic_key:
|
||||
return analyze_with_anthropic(prop, anthropic_key)
|
||||
return analyze_with_ollama(prop)
|
||||
Reference in New Issue
Block a user