finance_ops_env / server /tools.py
Shubham-Rasal
update world and tools
1484fbb
"""Tool definitions and registry for FinanceOpsEnv (25 tools)."""
from __future__ import annotations
from typing import Any
try:
from .world import WorldState
except ImportError:
from world import WorldState
TOOL_DEFINITIONS: list[dict[str, Any]] = [
{
"name": "acc_create_invoice",
"description": "Create an AR invoice for a customer.",
"parameters": {
"type": "object",
"properties": {
"customer_id": {"type": "string"},
"amount": {"type": "number"},
"due_date": {"type": "string", "description": "ISO date YYYY-MM-DD"},
"line_items": {"type": "array"},
},
"required": ["customer_id", "amount", "due_date"],
},
},
{
"name": "acc_record_payment",
"description": "Record a customer payment against an invoice.",
"parameters": {
"type": "object",
"properties": {
"invoice_id": {"type": "string"},
"amount": {"type": "number"},
},
"required": ["invoice_id", "amount"],
},
},
{
"name": "acc_create_bill",
"description": "Create an AP bill from a vendor.",
"parameters": {
"type": "object",
"properties": {
"vendor_id": {"type": "string"},
"amount": {"type": "number"},
"due_date": {"type": "string"},
"description": {"type": "string"},
},
"required": ["vendor_id", "amount", "due_date", "description"],
},
},
{
"name": "acc_pay_bill",
"description": "Pay an open bill from operating cash.",
"parameters": {
"type": "object",
"properties": {"bill_id": {"type": "string"}},
"required": ["bill_id"],
},
},
{
"name": "acc_get_ledger",
"description": "Fetch AR, AP, or combined ledger.",
"parameters": {
"type": "object",
"properties": {
"ledger_type": {
"type": "string",
"enum": ["ar", "ap", "all"],
"description": "Which ledger to return",
}
},
"required": ["ledger_type"],
},
},
{
"name": "acc_generate_financials",
"description": "Generate P&L, balance sheet, or cashflow summary.",
"parameters": {
"type": "object",
"properties": {
"report_type": {"type": "string", "enum": ["pnl", "balance_sheet", "cashflow"]}
},
"required": ["report_type"],
},
},
{
"name": "exp_submit",
"description": "Submit an employee expense report. The parameter name is 'category' (not 'expense_category'). Valid categories: travel, marketing, software, consulting, facilities, logistics, other.",
"parameters": {
"type": "object",
"properties": {
"employee_id": {"type": "string"},
"amount": {"type": "number"},
"category": {
"type": "string",
"enum": ["travel", "marketing", "software", "consulting", "facilities", "logistics", "other"],
},
"description": {"type": "string"},
},
"required": ["employee_id", "amount", "category", "description"],
},
},
{
"name": "exp_approve",
"description": "Approve a submitted expense.",
"parameters": {
"type": "object",
"properties": {"expense_id": {"type": "string"}},
"required": ["expense_id"],
},
},
{
"name": "exp_reject",
"description": "Reject an expense with a reason.",
"parameters": {
"type": "object",
"properties": {
"expense_id": {"type": "string"},
"reason": {"type": "string"},
},
"required": ["expense_id"],
},
},
{
"name": "exp_reimburse",
"description": "Reimburse an approved expense from operating cash.",
"parameters": {
"type": "object",
"properties": {"expense_id": {"type": "string"}},
"required": ["expense_id"],
},
},
{
"name": "exp_check_policy",
"description": "Check an expense amount against policy limits for its category. Required params: 'category' and 'amount'. Valid categories: travel, marketing, software, consulting, facilities, logistics, other.",
"parameters": {
"type": "object",
"properties": {
"category": {
"type": "string",
"enum": ["travel", "marketing", "software", "consulting", "facilities", "logistics", "other"],
},
"amount": {"type": "number"},
},
"required": ["category", "amount"],
},
},
{
"name": "pay_initiate",
"description": "Initiate a vendor payment.",
"parameters": {
"type": "object",
"properties": {
"vendor_id": {"type": "string"},
"amount": {"type": "number"},
"reference": {"type": "string"},
},
"required": ["vendor_id", "amount"],
},
},
{
"name": "pay_schedule",
"description": "Schedule a pending payment and settle from operating cash.",
"parameters": {
"type": "object",
"properties": {
"payment_id": {"type": "string"},
"schedule_date": {"type": "string"},
},
"required": ["payment_id", "schedule_date"],
},
},
{
"name": "pay_cancel",
"description": "Cancel a pending vendor payment.",
"parameters": {
"type": "object",
"properties": {"payment_id": {"type": "string"}},
"required": ["payment_id"],
},
},
{
"name": "pay_status",
"description": "Get status of a payment.",
"parameters": {
"type": "object",
"properties": {"payment_id": {"type": "string"}},
"required": ["payment_id"],
},
},
{
"name": "payroll_run",
"description": "Run aggregate payroll validation for a period (YYYY-MM).",
"parameters": {
"type": "object",
"properties": {"period": {"type": "string"}},
"required": ["period"],
},
},
{
"name": "payroll_calculate",
"description": "Calculate net pay for one employee.",
"parameters": {
"type": "object",
"properties": {"employee_id": {"type": "string"}},
"required": ["employee_id"],
},
},
{
"name": "payroll_disburse",
"description": "Disburse payroll for one employee from the payroll account.",
"parameters": {
"type": "object",
"properties": {"employee_id": {"type": "string"}},
"required": ["employee_id"],
},
},
{
"name": "bank_get_balance",
"description": "Get balance for a bank account. Valid account_id values: acc_operating, acc_payroll, acc_reserve, acc_fx.",
"parameters": {
"type": "object",
"properties": {
"account_id": {
"type": "string",
"enum": ["acc_operating", "acc_payroll", "acc_reserve", "acc_fx"],
}
},
"required": ["account_id"],
},
},
{
"name": "bank_get_transactions",
"description": "List recent transactions, optionally filtered by account. Valid account_id values: acc_operating, acc_payroll, acc_reserve, acc_fx.",
"parameters": {
"type": "object",
"properties": {
"account_id": {
"type": "string",
"enum": ["acc_operating", "acc_payroll", "acc_reserve", "acc_fx"],
},
"limit": {"type": "integer"},
},
},
},
{
"name": "bank_transfer",
"description": "Transfer cash between two accounts. Valid account IDs: acc_operating, acc_payroll, acc_reserve, acc_fx.",
"parameters": {
"type": "object",
"properties": {
"from_account_id": {
"type": "string",
"enum": ["acc_operating", "acc_payroll", "acc_reserve", "acc_fx"],
},
"to_account_id": {
"type": "string",
"enum": ["acc_operating", "acc_payroll", "acc_reserve", "acc_fx"],
},
"amount": {"type": "number"},
},
"required": ["from_account_id", "to_account_id", "amount"],
},
},
{
"name": "bank_reconcile",
"description": "Run bank reconciliation / close checklist step.",
"parameters": {"type": "object", "properties": {}},
},
{
"name": "fpna_create_budget",
"description": "Create or overwrite department budget for a period.",
"parameters": {
"type": "object",
"properties": {
"dept": {"type": "string"},
"amount": {"type": "number"},
"period": {"type": "string"},
},
"required": ["dept", "amount", "period"],
},
},
{
"name": "fpna_update_forecast",
"description": "Update a named forecast metric.",
"parameters": {
"type": "object",
"properties": {
"metric": {"type": "string"},
"value": {"type": "number"},
"period": {"type": "string"},
},
"required": ["metric", "value", "period"],
},
},
{
"name": "fpna_compare_actuals",
"description": "Compare budget vs YTD actuals by department.",
"parameters": {"type": "object", "properties": {}},
},
]
class ToolRegistry:
"""Dispatches tool calls to WorldState and logs actions."""
def __init__(self, world: WorldState):
self.world = world
def execute(self, tool_name: str, arguments: dict[str, Any]) -> dict[str, Any]:
w = self.world
try:
if tool_name == "acc_create_invoice":
r = w.acc_create_invoice(
arguments["customer_id"],
float(arguments["amount"]),
str(arguments["due_date"]),
arguments.get("line_items"),
)
elif tool_name == "acc_record_payment":
r = w.acc_record_payment(str(arguments["invoice_id"]), float(arguments["amount"]))
elif tool_name == "acc_create_bill":
r = w.acc_create_bill(
str(arguments["vendor_id"]),
float(arguments["amount"]),
str(arguments["due_date"]),
str(arguments.get("description", "")),
)
elif tool_name == "acc_pay_bill":
r = w.acc_pay_bill(str(arguments["bill_id"]))
elif tool_name == "acc_get_ledger":
r = w.acc_get_ledger(str(arguments["ledger_type"]))
elif tool_name == "acc_generate_financials":
r = w.acc_generate_financials(str(arguments["report_type"]))
elif tool_name == "exp_submit":
r = w.exp_submit(
str(arguments["employee_id"]),
float(arguments["amount"]),
str(arguments["category"]),
str(arguments.get("description", "")),
)
elif tool_name == "exp_approve":
r = w.exp_approve(str(arguments["expense_id"]))
elif tool_name == "exp_reject":
r = w.exp_reject(str(arguments["expense_id"]), str(arguments.get("reason", "")))
elif tool_name == "exp_reimburse":
r = w.exp_reimburse(str(arguments["expense_id"]))
elif tool_name == "exp_check_policy":
r = w.exp_check_policy(str(arguments["category"]), float(arguments["amount"]))
elif tool_name == "pay_initiate":
r = w.pay_initiate(
str(arguments["vendor_id"]),
float(arguments["amount"]),
str(arguments.get("reference", "")),
)
elif tool_name == "pay_schedule":
r = w.pay_schedule(str(arguments["payment_id"]), str(arguments["schedule_date"]))
elif tool_name == "pay_cancel":
r = w.pay_cancel(str(arguments["payment_id"]))
elif tool_name == "pay_status":
r = w.pay_status(str(arguments["payment_id"]))
elif tool_name == "payroll_run":
r = w.payroll_run(str(arguments["period"]))
elif tool_name == "payroll_calculate":
r = w.payroll_calculate(str(arguments["employee_id"]))
elif tool_name == "payroll_disburse":
r = w.payroll_disburse(str(arguments["employee_id"]))
elif tool_name == "bank_get_balance":
r = w.bank_get_balance(str(arguments["account_id"]))
elif tool_name == "bank_get_transactions":
r = w.bank_get_transactions(arguments.get("account_id"), int(arguments.get("limit", 50)))
elif tool_name == "bank_transfer":
r = w.bank_transfer(
str(arguments["from_account_id"]),
str(arguments["to_account_id"]),
float(arguments["amount"]),
)
elif tool_name == "bank_reconcile":
r = w.bank_reconcile()
elif tool_name == "fpna_create_budget":
r = w.fpna_create_budget(
str(arguments["dept"]), float(arguments["amount"]), str(arguments["period"])
)
elif tool_name == "fpna_update_forecast":
r = w.fpna_update_forecast(
str(arguments["metric"]),
float(arguments["value"]),
str(arguments["period"]),
)
elif tool_name == "fpna_compare_actuals":
r = w.fpna_compare_actuals()
else:
r = {"success": False, "error": f"unknown_tool:{tool_name}"}
except Exception as e:
r = {"success": False, "error": str(e)}
w.log_action(tool_name, arguments, r)
return r