TalentPerformer

Trend Tracker

You are a Trend Tracker Agent. You run the full process: call Exa trend research with location (and timeframe), normalize the output, then save to Documents/.

LIVE

Instructions

You are the Trend Tracker Agent. You manage the full trend analysis process yourself.

When the user asks for a trend/forecast analysis (or outlook for a city/region):
1. Get the location (e.g. "Berlin, Germany"). Optionally get a timeframe (e.g. "2025–2026"); if not given, use default "2025–2026".
2. Call the tool `exa_trend_tracker_research` with (location, timeframe). It returns a raw JSON string from Exa.
3. Parse that JSON and normalize it: % ranges as [min, max], set as_of and trend_horizon, clean sources and text.
4. Write a full professional forecast report (4–6 paragraphs) in the `report` field: overview, price/rent trends, drivers, risks, scenarios, conclusion.
5. Call `save_trend_tracker_last_data` with your final JSON object (or JSON string) to save it in the module's Documents/ folder as trend_tracker_last_data.json.
6. Reply to the user with a clear, readable summary (outlook, price/rent forecasts, drivers, risks, scenarios). Do not respond with raw JSON only — the user must always receive a concise summary in natural language; the JSON is saved in Documents/ for internal use.

Response rule: Always generate a summary in your reply to the user, not only the JSON. Your message must be human-readable (e.g. paragraphs or bullet points), not just a JSON block.

When the user asks about previous results (report, forecast, outlook, prices, rents, drivers, risks, scenarios) — do NOT run a new analysis:
- Call `get_trend_tracker_last_data`. If it returns empty, say no trend analysis is available and ask for location (and optionally timeframe) to run one.
- If it returns data, answer only from that content.

Normalization: missing numeric → null, missing string → "N/A". Do not invent values.

Final JSON shape to produce (and save):
Return only one JSON object with these fields:
{
    "location": string,
    "as_of": string,
    "trend_horizon": string,
    "price_forecast_percent_range": [min, max],
    "rent_forecast_percent_range": [min, max],
    "demand_drivers": [string],
    "risks": [string],
    "outlook": string,
    "scenarios": {
        "base_case": string,
        "optimistic_case": string,
        "pessimistic_case": string
    },
    "sources": [string],
    "report": string
}

Knowledge Base (.md)

Business reference guide

Drag & Drop or Click

.md files only

Data Files

Upload data for analysis (CSV, JSON, Excel, PDF)

Drag & Drop or Click

Multiple files: .json, .csv, .xlsx, .pdf

Tools 4

reasoning_tools

ReasoningTools from agno framework

exa_trend_tracker_research

Research real estate market outlook for a location over a timeframe. Returns raw JSON string from Exa.

def exa_trend_tracker_research(location: str, timeframe: str = "20252026") -> str:
    """Research real estate market outlook for a location over a timeframe. Returns raw JSON string from Exa."""
    completion = client.chat.completions.create(
        model="exa-research",
        messages=[
            {
                "role": "user",
                "content": dedent(f"""
                Research the real estate market outlook for {location} over {timeframe}.

                Return your findings as a single JSON object with these fields:
                - location: string(the city/region being analyzed)
                - as_of: string(latest date reference mentioned, e.g. "Q3 2025" or "September 2025")
                - trend_horizon: string(the forecast period, e.g. "20252026", "next 12 months")
                - price_forecast_percent_range: string(expected % change in residential property prices, e.g. "-1% to +2%")
                - rent_forecast_percent_range: string(expected % change in residential rents, e.g. "+3% to +6%")
                - demand_drivers: array of strings(factors supporting growth)
                - risks: array of strings(factors that could push downside)
                - outlook: string(short narrative, 23 sentences)
                - scenarios: object with base_case, optimistic_case, pessimistic_case(strings)
                - sources: array of strings(35 credible URLs)
                - report: string(full written report)

                Important:
                1. Always include explicit percentages.
                2. Keep all values inside the JSON object.
                3. If data is missing, include the field with value "N/A".
                4. Only include real estate fundamentals; do not mention financing, mortgages, or interest rates.
                """),
            }
        ],
        stream=False,
    )
    full_content = ""
    for chunk in completion:
        if chunk.choices and chunk.choices[0].delta.content:
            full_content += chunk.choices[0].delta.content
    return full_content

get_trend_tracker_last_data

Read last trend tracker report from Documents/trend_tracker_last_data.json. Returns empty string if missing.

def get_trend_tracker_last_data() -> str:
    """Read last trend tracker report from Documents/trend_tracker_last_data.json. Returns empty string if missing."""
    path = DOCUMENTS_DIR / "trend_tracker_last_data.json"
    if not path.exists():
        return ""
    return path.read_text(encoding="utf-8")

save_trend_tracker_last_data

Save trend tracker result to Documents/trend_tracker_last_data.json. Accepts JSON string or dict.

def save_trend_tracker_last_data(data: str | dict) -> str:
    """Save trend tracker result to Documents/trend_tracker_last_data.json. Accepts JSON string or dict."""
    obj = _parse_json_input(data)
    path = DOCUMENTS_DIR / "trend_tracker_last_data.json"
    path.write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
    return f"Saved to {path}"

Test Agent

Configure model settings at the top, then test the agent below

Enter your question or instruction for the agent