Repository navigation
Conversation
A standard run's cost estimate came from 13 OpenAI models written in run.py, matched by name prefix. The list is now the user's: fetched on request from a public list, with the user's own rows over it, and a model is priced by exactly its name. A run never fetches a price.
1 of 9 tasks
This comment has been minimized.
This comment has been minimized.
# Conflicts: # app/nullius/standard/run.py
This comment has been minimized.
This comment has been minimized.
…list never prices a run
This comment has been minimized.
This comment has been minimized.
Collaborator
Author
|
/judge |
This comment has been minimized.
This comment has been minimized.
…n, turning while it updates
aitianshi
added a commit
that referenced
this pull request
Nov 10, 2026
This comment has been minimized.
This comment has been minimized.
A job's config.json credited the public list (its address and day) with every recorded price, including a row of the user's own and a run's --price. Each row now carries its source (list, own, run), and the list is named only when a row is its. A refused update repeated its address or file in the message.
🟡 PR judge · 8 of 8 yes · #39 ↔ #38
Acceptance criteria, 7 of 7 met
Checks the script runs itself, 4 of 4 pass
some of the diff was cut before the judge read it |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #38
What
A standard run's cost estimate came from a 13-model, OpenAI-only table written in
run.py, matched by name prefix. Prices are now the user's data (app/nullius/prices.py): oneprices.jsonin the configuration directory holding a public list fetched on request (LiteLLM'smodel_prices_and_context_window.json, keyed by the providers' own model names, kept with its address and day) and the user's own rows, which win over it. Nullius ships no price and a run never fetches one. A call is priced by the provider's own figure when its reply carries one, else by exactly its model name, else not at all.nullius prices(list, update, set, remove) and a Model prices section in Settings manage the list;--price MODEL=INPUT,OUTPUT[,CACHED]prices one run. A docker unit's relay is handed only its run's models' rows, a run on a host takes this machine's list with it (NULLIUS_PRICES), an empty one too, so a host's own list never prices a run started elsewhere, and a job'sconfig.jsonrecords the prices of the models it calls, each with its source (list,own, orrunfor--price), and names the list and its day only when a price is the list's.Touches
backend · routes · templates and static · docs and site · the standard
Before and after
Settings gains a Model prices section under Evaluation, with a dollar icon: a Price list card (how many models, the day fetched, Update with the refresh icon, turning while it updates) and Your prices (rows with Remove, and a form to add one). Before, there was no such section and no way to see or change a price.
Verified
app/tests/test_prices.py(16 tests): a new profile has no prices; the list is converted per million tokens with its source and day; a bad list or a failed fetch changes nothing; only https or a file is a source; the fetch sends nothing of the user; own rows win and survive an update; rows and--priceare checked;NULLIUS_PRICESnames another file; the CLI.test_standard_relay.py: a model whose name only starts like a priced one has no cost.test_standard_run.py: a run given a price estimates its calls and records only its own models' rows inconfig.json, each with its source, the list named only for a row that is its; a run with none has no cost and nopricesblock.test_execution.py: the list is sent to a host and exported asNULLIUS_PRICES; with no list here an empty one is sent, so the host's own is never read.app/ui_tests/test_settings_page.py: the three routes, their errors and their guards (token, origin, loopback); nothing lands in the settings file.python3 app/tests/parallel.py(1621 tests, after main was merged in) and route suite (356 tests), OK. The wheel built andapp/packaging/verify.pypassed, withpricesamong the installed commands.docs-driftscript: 0 findings.nullius priceson a new profile, a realupdate(3,946 models),list,set,remove, each refusal (a price below zero, not a number, an output limit of 0, an unknown model, an http address, a missing file, a file that is not a list),NULLIUS_PRICES.nullius standard runpriced each call from the list at 0.00024 USD, as computed by hand; with--price gpt-4o-mini=1,10,0.5at 0.0028; a model whose name only starts like a priced one had no cost; an own price for that name priced it; a malformed--pricewas refused before anything ran.--backend docker, from the list and with--price: the container's relay priced the calls the same.Risk
Undone by a revert;
prices.jsonis then ignored.