mloda
Free on GitHub

Live demo · credit risk agent

Recorded AI run · live decision engine

Muster Logistik GmbH · working capital and fleet renewal

They asked for €500,000. The answer came back in two minutes.

Six documents in. One decision out, with the reasoning attached and every figure traceable to the page it came from. The AI's reading is a recording, but the decision built on it is calculated right here, by the same code the risk team runs. Change any figure and watch it move.

Amount requested 15.6% of revenue
€500,000
Nothing on this page is mocked mloda 0.11.1
Recommendation

Approve €375,000
with conditions

75% of the amount requested · grade B policy

B
Moderate risk segment
€125,000 below the amount requested
Financial health44 / 100

Policy threshold: 70 (not met)

Conditions attached
  • Quarterly financial review
  • Management meeting within 30 days
  • Updated financials every 6 months

What the answer cost (measured during the recorded run)

Two minutes of thinking.
Twenty-six milliseconds of plumbing.

Almost all of that time was the AI reading six documents, the part you actually want to pay for. Finding the data, putting the steps in the right order and moving results between them took a rounding error.

6
documents read: three spreadsheets, three statements
2m 20s
from question to signed-off decision
26ms
everything that wasn't the AI thinking
0
numbers invented along the way

What we had to write

The whole request is one line.

We name what we want. We never say where it lives, what order to fetch it in, or how to stitch it together. That is the entire point.

With mloda

scores = mloda.run_all([
    Feature("FinancialScoring", options)
])

Ask for the scored decision by name. mloda works out the rest.

Without it, the same line is a project

  • Find and open six files in two different formats
  • Parse the spreadsheets, then the statements
  • Build the prompt and call the model
  • Check what comes back is actually numbers
  • Work out the ratios, the score, the grade
  • Apply the lending policy to get a limit
  • Wire all of it together in the right order
  • Keep it running when any one piece changes

Ask something else

Change the question. The work changes with it.

mloda starts from the answer you asked for and works backwards to what it needs. Ask something smaller and the extra steps simply never run. Nobody has to go and remove them. Try it:

the whole request: the scored decision, asked for by name
Step 1
Read the documents
plain code
22ms
Step 2
Write the prompt
plain code
1.6ms
Step 3
Pull out the figures
the AI
2m 20s
Step 4
Score and decide
your risk team's code
1.9ms

For engineers: the full request for this question

The one line above is the whole API surface. Everything else is context and wiring that stays identical no matter which question you pick. Note that the plugin catalog lists all four feature groups every time, and mloda picks the subset the answer needs:

Where the AI stops

The AI reads. Your code decides.

The model's only job was to find eight numbers in the paperwork and write them down. It is not asked for an opinion, and it never touches the arithmetic that produces the score. Which is exactly why the arithmetic can run live on this page: drag anything on the left.

What the AI returned: 8 fields, nothing else

Drag a figure to test a what-if. The AI is not re-run.

It fills a fixed form. Free text is not an option it has.

What your risk team's code does with them

Recalculated live, by the real scoring code.

Same figures in, same score out. Every time, by construction.

Swap the model for a different one tomorrow and the score is still calculated the way your risk team wrote it. The reader can change. The arithmetic doesn't.

The audit trail (as recorded during the run)

Ask where any number came from.

There is an answer for all of them. The grade came from a score, the score from three ratios, the ratios from eight figures, the figures from six documents, each step recorded as it ran, not reconstructed afterwards. These rows are the original run, so they stay put when you change the figures above.

Step
What came out of it
Took
Read the documents
6 files → one block of text, 13,562 characters
22ms
Write the prompt
One prompt, 16,390 characters, built by code, so it is the same every run
1.6ms
Pull out the figures
8 financial figures, plus a written summary
2m 20.4s
Score and decide
3 ratios → health score 44 → grade B → €375,000 limit
1.9ms
Decision delivered
Approve with conditions, traceable end to end
2m 20.5s
For engineers: what the trace actually records

Every row above is captured from the run itself: the feature group that produced it, its content-hashed version, the exact columns in and out, row counts, and wall-clock duration.

Step 3 emits nine columns: FinancialExtraction~revenue through ~interest_expense, plus ~llm_summary. Step 4 consumes all nine and emits FinancialScoring~health_score, ~risk_grade and ~policy_json, among others.

The scoring on this page is a faithful browser port of health_score.py and policy_segment.py, same weights, same weakest-link cap, same grade bands. A test in the repo runs both against the same inputs so they cannot drift apart.

Run on PandasDataFrame, mloda 0.11.1, scenario demo_unsure. The AI provider is one environment variable: LLM_BACKEND, and changing it leaves every other step untouched.

Point your agent at your data.

This demo is a credit desk. The library underneath it doesn't care: it is an open-source entry point between an AI agent and whatever data it needs.