GenAI_Loan_Advisor / crew /tasks /underwriting_tasks.py
DevKX's picture
Added guardrail for task formatting
720964a
from crewai import Task
"""
This task instructs the agent to act as the final decision maker.
KEY MECHANISM:
1. CONTEXT CONSUMPTION: It takes the inputs from the Data Agent (Facts) and Policy Agent (Rules).
2. LOGIC GATING: It applies a strict "If X then Y" logic chain.
3. ZERO-TRUST: It enforces a "Silent Policy = Reject" rule. If the policy manual doesn't explicitly allow it, the agent must reject it.
"""
def create_underwriting_task(agent, context_tasks):
return Task(
description=(
"**INTERNAL RISK REVIEW**\n\n"
"**INPUTS**: Review findings from Data Investigator and Policy Researcher.\n\n"
"**STRICT EXECUTION RULES**:\n"
"1. **Evidence Only**: Every decision must point to a specific data point or policy line provided in the context.\n"
"2. **Silent Policy = Reject**: If the policy does not explicitly say 'Approve' for a scenario, the default answer is REJECT.\n"
"3. **Missing Data**: If you do not see a credit score, do not estimate one. Fail the application as 'Incomplete Data'.\n\n"
"**LOGICAL REASONING STEPS**:\n"
"1. **Residency & Eligibility Check**: \n"
" - Check `nationality` and `is_pr` (Permanent Resident status).\n"
" - **DEFINITION**: A 'Foreigner' is anyone whose nationality is NOT 'Singaporean'.\n"
" - **THE STRICT RULE**: \n"
" - If Customer is Singaporean -> **PASS** (Eligible).\n"
" - If Customer is Non-Singaporean AND is PR (Permanent Resident) -> **PASS** (Eligible).\n"
" - **If Customer is Non-Singaporean AND is NOT Permanent Resident -> REJECT IMMEDIATELY**.\n"
" - (Reasoning: We do not lend to non-residents. Foreigners must hold PR status).\n\n"
"2. **Risk Mapping**: \n"
" - Locate `credit_score` and `account_status` in the input.\n"
" - Map EXACTLY to the Risk Matrix provided.\n"
" - DETERMINE: Is the Overall Risk 'Low', 'Medium', or 'High'?\n\n"
"3. **Final Verdict**: \n"
" - If its High Risk OR Non-Singaporean+PR, please REJECT.\n"
" - Low/Medium Risk is APPROVE.\n\n"
"**REQUIRED OUTPUT**:\n"
"Return a Markdown Memo. You MUST NOT add 'Notes', 'Suggestions', or 'Flexible terms'.\n"
"End with this strict JSON block:\n"
"```json\n"
"{\n"
' "decision": "APPROVED" | "REJECTED",\n'
' "risk_level": "Low" | "Medium" | "High",\n'
' "interest_rate": "The numerical rate (e.g. 4.85%) or N/A",\n'
' "reason_code": "The specific rule from policy that triggered this decision"\n'
"}\n"
"```"
),
expected_output="A Decision Memo derived 100% from provided text with no outside hallucination.",
agent=agent,
context=context_tasks
)