TalentPerformer

Provisioning & Evaluation of Provisions Agent

An AI agent specialized in actuarial reserving and technical provisions evaluation. Focuses on reserve adequacy assessment, claims development analysis, and technical provision calculations for insurance portfolios.

LIVE

Instructions

You are Provisioning_Evaluation_of_Provisions_Agent, an AI-powered actuarial specialist operating under the Inventory Actuary Module.

## Input Handling & Tool Usage:
1. **Input Handling**
    - You have access to a **file**, using CsvTools(), containing relevant data. Accepted file types include:
        - CSV files containing claims data, reserve information, and actuarial calculations.
        - Text documents (PDF, DOCX, TXT) summarizing reserve studies, claims development, or actuarial reports.
    - Extract relevant information from the file, such as claims triangles, reserve estimates, and development patterns.
    - Pay particular attention to insurance-sector-specific data like IBNR, case reserves, and development factors.

2. **Knowledge & Research Usage**
    - Use your built-in knowledge of actuarial reserving, technical provisions, and insurance accounting standards.
    - Use ExaTools for research on current actuarial practices, regulatory requirements, and industry standards.
    - Apply this knowledge to:
        - Determine optimal reserving methodologies for different insurance portfolios.
        - Identify reserve adequacy and development patterns.
        - Guide the company to develop robust reserve estimates and technical provisions.
        - Suggest improvements and practical approaches for reserve management.

## Your Responsibilities:
1. **Technical Provisions & Reserves**
   - Calculate Best Estimate Liabilities (BEL) under Solvency II and IFRS 17
   - Assess claims reserves, premium provisions, IBNR, and IBNER
   - Apply appropriate reserving methodologies (Chain Ladder, Bornhuetter-Ferguson, Mack, GLM)
   - Implement stochastic methods for uncertainty analysis and validation
   - Ensure reserve adequacy through comprehensive analysis and back-testing

2. **Reserving Methodologies**
   - Apply Chain Ladder method for claims development triangles
   - Implement Bornhuetter-Ferguson for immature accident years
   - Use Mack method for statistical uncertainty quantification
   - Apply GLM methods for claims frequency and severity modeling
   - Implement bootstrap and Monte Carlo methods for stochastic analysis

3. **Validation & Back-Testing**
   - Compare actual vs. expected claims development over time
   - Ensure reserves are sufficient to cover future claim payments
   - Validate prior reserve estimates against actual experience
   - Assess impact of key assumptions on reserve levels
   - Perform sensitivity analysis for key reserve drivers

4. **Discounting & Present Value**
   - Apply appropriate discount curves (risk-free, liquidity-adjusted)
   - Calculate present value of future cash flows
   - Consider liquidity premiums for long-duration liabilities
   - Ensure compliance with regulatory discount rate requirements

## Tool Usage Guidelines:
- Use ExaTools for research on actuarial best practices and regulatory requirements
- Use CsvTools to process and analyze CSV data files for claims and reserve information
- Use CalculatorTools for complex actuarial calculations and validations
- Use ExaTools for research on best practices and industry standards
- Use ExaTools for research on actuarial analysis and pattern recognition
- Always reference actuarial standards and regulatory requirements

Your goal is to provide **comprehensive reserve analysis** that enables accurate technical provision calculations and ensures reserve adequacy for insurance portfolios.

Knowledge Base (.md)

Business reference guide

Drag & Drop or Click

.md, .txt, .pdf

Data Files

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

Drag & Drop or Click

Multiple files: .json, .csv, .xlsx, .xls, .pdf, .docx, .pptx, .txt

Tools 6

csv_tools

CsvTools from agno framework

calculator

CalculatorTools from agno framework

calculate_chain_ladder_reserve

Model for storing functions that can be called by an agent.

@tool(
    name="calculate_chain_ladder_reserve",
    description="Basic Chain Ladder on a cumulative claims triangle with optional tail; returns ultimates, IBNR, and link ratios.",
    show_result=True,
)
def calculate_chain_ladder_reserve(
    cumulative_triangle: List[List[Optional[float]]],
    tail_factor: float = 1.00
) -> Dict[str, Any]:
    """
    Run a simple Chain Ladder on a cumulative triangle(origin rows x dev columns).
    None indicates missing cells(i.e., to be projected).

    Args:
        cumulative_triangle: 2D list of cumulative claims(origin x dev). Use None for missing cells.
        tail_factor: Additional tail factor applied to remaining LDF product.

    Returns:
        Dict with selected age-to-age factors, LDFs, ultimates, IBNR by origin, and totals.
    """
    n_origin = len(cumulative_triangle)
    if n_origin == 0:
        return {"error": "Empty triangle."}
    n_dev = max(len(row) for row in cumulative_triangle)

    "color: #6b7280;"># Compute age-to-age(link) ratios per column(j -> j+1), volume-weighted
    link_factors: List[float] = []
    for j in range(n_dev - 1):
        numer = 0.0
        denom = 0.0
        for i in range(n_origin):
            row = cumulative_triangle[i]
            if j + 1 < len(row) and row[j] is not None and row[j + 1] is not None:
                numer += float(row[j + 1])
                denom += float(row[j])
        link_factors.append((numer / denom) if denom > 0 else 1.0)

    "color: #6b7280;"># Build cumulative LDFs from each col to ultimate
    ldfs: List[float] = [1.0] * n_dev
    prod = tail_factor
    for j in range(n_dev - 2, -1, -1):
        prod *= link_factors[j]
        ldfs[j] = prod

    ultimate_by_origin: List[float] = []
    ibnr_by_origin: List[float] = []
    latest_cumulative: List[float] = []
    latest_col_index: List[int] = []

    for i in range(n_origin):
        row = cumulative_triangle[i]
        "color: #6b7280;"># find last observed dev col k
        k = -1
        last_val = None
        for j in range(len(row) - 1, -1, -1):
            if row[j] is not None:
                k = j
                last_val = float(row[j])
                break
        if k == -1 or last_val is None:
            ultimate_by_origin.append(0.0)
            ibnr_by_origin.append(0.0)
            latest_cumulative.append(0.0)
            latest_col_index.append(-1)
            continue

        ld = ldfs[k] if k < len(ldfs) else tail_factor
        ultimate = last_val * ld
        ibnr = max(0.0, ultimate - last_val)

        ultimate_by_origin.append(round(ultimate, 2))
        ibnr_by_origin.append(round(ibnr, 2))
        latest_cumulative.append(round(last_val, 2))
        latest_col_index.append(k)

    result = {
        "age_to_age_factors": [round(f, 6) for f in link_factors],
        "ldfs_to_ultimate": [round(x, 6) for x in ldfs],
        "tail_factor": tail_factor,
        "latest_cumulative_by_origin": latest_cumulative,
        "latest_column_index_by_origin": latest_col_index,
        "ultimate_by_origin": ultimate_by_origin,
        "ibnr_by_origin": ibnr_by_origin,
        "totals": {
            "ultimate_total": round(sum(ultimate_by_origin), 2),
            "latest_cumulative_total": round(sum(latest_cumulative), 2),
            "ibnr_total": round(sum(ibnr_by_origin), 2),
        },
    }
    return result

discount_cashflows_present_value

Model for storing functions that can be called by an agent.

@tool(
    name="discount_cashflows_present_value",
    description="Discount annual cashflows with a simple zero-coupon curve: PV = sum(amount/(1+r_year)^year).",
    show_result=True,
)
def discount_cashflows_present_value(
    cashflows_by_year: Dict[int, float],
    zero_rates_by_year: Dict[int, float]
) -> Dict[str, Any]:
    """
    Present value cashflows using annual zero-coupon rates.

    Args:
        cashflows_by_year: {year_offset: cash_amount}, e.g., {1: -100.0, 2: -80.0, 3: 50.0}
        zero_rates_by_year: {year_offset: annual_rate}, e.g., {1: 0.02, 2: 0.025, 3: 0.03}

    Returns:
        Dict with PV by year and total PV.
    """
    pv_by_year: Dict[int, float] = {}
    total_pv = 0.0
    for t, amt in cashflows_by_year.items():
        r = zero_rates_by_year.get(t, 0.0)
        pv = amt / ((1.0 + r) ** t)
        pv_by_year[t] = round(pv, 2)
        total_pv += pv
    return {
        "present_value_by_year": pv_by_year,
        "present_value_total": round(total_pv, 2),
    }

backtest_reserve_adequacy

Model for storing functions that can be called by an agent.

@tool(
    name="backtest_reserve_adequacy",
    description="Simple actual-vs-expected back-test for prior IBNR.",
    show_result=True,
)
def backtest_reserve_adequacy(
    prior_ibnr_estimate: float,
    actual_paid_on_prior_year: float
) -> Dict[str, Any]:
    """
    Compare last year's IBNR estimate against actual cash emergence.

    Args:
        prior_ibnr_estimate: Last valuation's IBNR for the cohort.
        actual_paid_on_prior_year: Cash paid over the subsequent year for that cohort.

    Returns:
        Dict with adequacy, redundancy/deficiency, and percentages.
    """
    diff = prior_ibnr_estimate - actual_paid_on_prior_year
    status = "adequate" if abs(diff) <= 0.01 * max(1.0, prior_ibnr_estimate) else("redundant" if diff > 0 else "deficient")
    pct = (diff / prior_ibnr_estimate) if prior_ibnr_estimate != 0 else 0.0
    return {
        "prior_ibnr_estimate": round(prior_ibnr_estimate, 2),
        "actual_paid_on_prior_year": round(actual_paid_on_prior_year, 2),
        "difference": round(diff, 2),
        "adequacy_status": status,
        "difference_pct_of_prior": round(pct, 4)
    }

exa

ExaTools is a toolkit for interfacing with the Exa web search engine, providing functionalities to perform categorized searches and retrieve structured results. Args: enable_search (bool): Enable search functionality. Default is True. enable_get_contents (bool): Enable get contents functionality. Default is True. enable_find_similar (bool): Enable find similar functionality. Default is True. enable_answer (bool): Enable answer generation. Default is True. enable_research (bool): Enable research tool functionality. Default is False. all (bool): Enable all tools. Overrides individual flags when True. Default is False. text (bool): Retrieve text content from results. Default is True. text_length_limit (int): Max length of text content per result. Default is 1000. api_key (Optional[str]): Exa API key. Retrieved from `EXA_API_KEY` env variable if not provided. num_results (Optional[int]): Default number of search results. Overrides individual searches if set. start_crawl_date (Optional[str]): Include results crawled on/after this date (`YYYY-MM-DD`). end_crawl_date (Optional[str]): Include results crawled on/before this date (`YYYY-MM-DD`). start_published_date (Optional[str]): Include results published on/after this date (`YYYY-MM-DD`). end_published_date (Optional[str]): Include results published on/before this date (`YYYY-MM-DD`). type (Optional[str]): Specify content type (e.g., article, blog, video). category (Optional[str]): Filter results by category. Options are "company", "research paper", "news", "pdf", "github", "tweet", "personal site", "linkedin profile", "financial report". include_domains (Optional[List[str]]): Restrict results to these domains. exclude_domains (Optional[List[str]]): Exclude results from these domains. show_results (bool): Log search results for debugging. Default is False. model (Optional[str]): The search model to use. Options are 'exa' or 'exa-pro'. timeout (int): Maximum time in seconds to wait for API responses. Default is 30 seconds.

Test Agent

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

Enter your question or instruction for the agent