Skip to main content

Experimental, provider-neutral framework for auditable personal-finance planning agents

Project description

agentic-financial-planner-lab

ci pypi python license

An experimental, provider-neutral framework for building auditable personal-finance planning agents: a typed case file, deterministic calculators, a Monte Carlo simulation adapter, cited research through the Model Context Protocol, and a critic gate that blocks any memo whose numbers cannot be traced to a recorded computation.

The LLM never does the math. Every dollar figure in an output memo resolves to a recorded calculator run or a case-file field, and a critic rejects the memo otherwise. This is a research and education project: not a financial advisor, no trade execution, no stock picking, no required account anywhere. Examples use synthetic households only (see the disclaimer).

Demo of validate, calc, and import-cashflow commands

Keywords: financial planning, retirement readiness, Monte Carlo simulation, LLM agents, Model Context Protocol (MCP), funded ratio, safe withdrawal rate, personal finance, FIRE.

Architecture

The LLM appears at exactly two points (memo drafting and a tone review); everything else is deterministic, seeded, and testable.

flowchart TD
    A[Case file: typed household facts] --> B[Assumptions gate:<br/>base / conservative / optimistic,<br/>confirmed by the user]
    B --> C[Deterministic engines]
    C --> C1[Calculators:<br/>funded ratio, FI timeline]
    C --> C2[Monte Carlo simulation]
    C --> C3[CEFR health metric]
    C --> C4[Allocation diagnostics]
    C1 --> D[(Computation ledger:<br/>every result gets a citable id)]
    C2 --> D
    C3 --> D
    C4 --> D
    E[MCP research source:<br/>search + fetch, recorded] --> D
    D --> F[Memo writer LLM:<br/>drafts prose, cites only<br/>ids from the ledger menu]
    F --> G{Critic gate:<br/>9 deterministic checks<br/>+ LLM tone review}
    G -- approved --> H[Planning memo<br/>+ audit sidecar]
    G -- rejected twice --> I[Hard failure:<br/>no memo emitted]

How it compares

Spreadsheet / DIY Web retirement simulators Generic LLM chat This project
Deterministic, seeded math yes yes no yes
Explains trade-offs in prose no limited yes yes
Every number traceable to a computation manual no no enforced by a critic
Cited methodology sources manual some fabrication risk fetched and verified
Runs fully local yes no rarely yes (Ollama)
Refuses unverifiable output n/a n/a no yes

Install

Requires Python 3.11+.

pip install "planner-lab[agent]"        # from PyPI

Or work from a clone:

uv sync --extra agent --extra dev

Extras are optional by design. The core installs without any agent framework; agent adds the Strands SDK (with Ollama and OpenTelemetry support), mcp adds Model Context Protocol clients for research sources.

Try it

The core works offline with no LLM:

uv run planner-lab validate examples/cases/sample_household.yaml
uv run planner-lab calc funded-ratio --portfolio 900000 --spending 50000
uv run planner-lab calc fi-timeline --portfolio 250000 --savings 50000 --spending 60000

With a local Ollama server running and a tool-calling-capable model pulled (default qwen3; override with OLLAMA_MODEL):

# Full pipeline: assumptions -> calculators -> memo draft -> critic gate -> memo
uv run planner-lab memo examples/cases/sample_household.yaml -o memo.md --yes

# Add Monte Carlo simulation, the fundedness metric, and allocation diagnostics
uv sync --all-extras
uv run planner-lab analyze examples/cases/sample_household.yaml --simulate --health --allocation --yes

# Ground the memo's methodology in cited guides from an MCP research server
PLANNER_LAB_RESEARCH_MCP_URL=https://example.com/mcp \
  uv run planner-lab memo examples/cases/sample_household.yaml -o memo.md --yes --research

# Derive annual cash flow from a budgeting-app CSV export (no LLM involved)
uv run planner-lab import-cashflow examples/data/sample_transactions_monarch.csv \
  --format monarch --case my_case.yaml --write

# Interactive intake chat that builds a case file
uv run planner-lab intake -o my_case.yaml

# Minimal agent-plus-tool example
uv run python examples/hello_agent.py

The memo command writes the markdown memo plus a .audit.json sidecar holding the full computation ledger and critic report, so every number can be checked by hand. If the critic rejects the draft twice, no memo is written and the failing checks are printed.

Case studies

Full walkthroughs with real generated memos, checked in verbatim:

  • An on-track couple, full analysis: simulation percentiles, the CEFR health metric, allocation diagnostics, and cited research in one run.
  • Data gaps and CSV import: missing data is disclosed, then partially filled from a transactions export with no LLM involved.
  • A rejected memo: what the critic gate catches, and why the worst case is no memo rather than a wrong one.

How a run works

  1. The case file is loaded and validated; material gaps are recorded.
  2. Base, conservative, and optimistic assumption sets are shown for confirmation (--yes accepts them non-interactively). Rates are real, after inflation.
  3. Deterministic calculators run per assumption set: funded ratio, years to financial independence, sustainable spending. Each result lands in the computation ledger with an id.
  4. Optionally, a Monte Carlo engine simulates each set (plus crash and sequence-risk stress runs) behind a generic ScenarioSimulator interface.
  5. The LLM drafts the memo, citing numbers only from the ledger menu it is given.
  6. The critic runs eight deterministic checks (traceability, no securities advice, disclaimer, assumption disclosure, missing-data disclosure, citation consistency, real/nominal labeling, certainty language) plus an LLM tone review. One revision is attempted; then the run fails.

Configuration

Everything is configured through environment variables; nothing is hardcoded.

Variable Purpose Default
PLANNER_LAB_MODEL_PROVIDER ollama or bedrock ollama
OLLAMA_HOST / OLLAMA_MODEL Local model server and model id http://localhost:11434 / qwen3
PLANNER_LAB_BEDROCK_MODEL Bedrock model id (provider bedrock) provider default
PLANNER_LAB_RESEARCH_MCP_URL Streamable-HTTP MCP server exposing search and fetch tools; enables --research unset
OTEL_EXPORTER_OTLP_ENDPOINT / OTEL_EXPORTER_OTLP_HEADERS OTLP tracing target for setup_telemetry("otlp"); --trace prints spans to stdout unset

Small local models occasionally mis-copy a number or skip a citation; the critic then rejects the memo after one revision attempt rather than emitting it. A larger model (for example OLLAMA_MODEL=gpt-oss:20b) makes full runs with simulation, diagnostics, and research more reliable.

Optional extras: agent (LLM pipeline, Strands SDK), planning (Monte Carlo simulation, fundedness metric), portfolio (lifecycle allocation diagnostics), mcp (research sources), dev (tests, lint, types). The core installs with none of them.

Status

Working retirement-readiness pipeline: case-file schemas, deterministic calculators, critic gate, memo renderer, interactive intake, Monte Carlo simulation, certainty-equivalent funded ratio (CEFR) metric, lifecycle allocation diagnostics, MCP research citations, and CSV cash-flow import. See CLAUDE.md for architecture rules.

Citation

@software{hodge_agentic_financial_planner_lab,
  author  = {Hodge, John},
  title   = {agentic-financial-planner-lab: an auditable financial planning agent framework},
  year    = {2026},
  url     = {https://github.com/jman4162/agentic-financial-planner-lab},
  version = {0.1.1},
  license = {MIT}
}

License

MIT. Educational use; nothing here is financial advice.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

planner_lab-0.1.1.tar.gz (594.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

planner_lab-0.1.1-py3-none-any.whl (56.8 kB view details)

Uploaded Python 3

File details

Details for the file planner_lab-0.1.1.tar.gz.

File metadata

  • Download URL: planner_lab-0.1.1.tar.gz
  • Upload date:
  • Size: 594.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for planner_lab-0.1.1.tar.gz
Algorithm Hash digest
SHA256 b71008f453747134c6de6604af075af14ba82b0aad740b09dfc1a9f5cb74ca3c
MD5 37f14d17d3fd40ffcdcba5b4b39ac824
BLAKE2b-256 e97e7fabdd3859e974f3480ec5c9f8faac5ff8bd7d398dd3c76e8a8fd8e662ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for planner_lab-0.1.1.tar.gz:

Publisher: release.yml on jman4162/agentic-financial-planner-lab

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file planner_lab-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: planner_lab-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 56.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for planner_lab-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cba36fed5d0702c4a99a240c70d32da376d5fcd7f1692c90ec6e03ade8af452b
MD5 87f7970d9508bc4b7a39428c2e462640
BLAKE2b-256 1e827d9c378898719461fad8fc89c6f4ff7b9c0a2bab66f33182a2a3ef533716

See more details on using hashes here.

Provenance

The following attestation bundles were made for planner_lab-0.1.1-py3-none-any.whl:

Publisher: release.yml on jman4162/agentic-financial-planner-lab

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page