Skip to content

v0.7.0 — honest prices, honest history

Latest

Choose a tag to compare

@parisneto parisneto released this 08 Oct 22:07
17ffe58

Anticharon v0.7.0: honest prices, honest history

One price per model, on one definition, for the live quote, the stored history and the alerts.

What changed for you

Standard-tier prices. A model's price is now the cheapest standard-tier endpoint, blended with your calibration. Flex, fast, priority, ultrafast, turbo and batch endpoints are different products and no longer set the price. Visible effect with default weights: openai/gpt-5.6-luna 0.03265 → 0.06529 and google/gemini-3.1-flash-lite 0.04081 → 0.08162. Models without tier endpoints are unchanged. Each price row names the endpoint it came from (endpoint_tag).

History from listed prices. Daily history is OpenRouter's listed endpoint prices blended with your calibration, not OpenRouter's "effective" price. The effective price moves with real cache-hit traffic even when no price changed, so it made stable models look volatile and compared badly with your live quote. A past day is the exact time-weighted average of the cheapest standard price over the UTC day; today is the live quote. A new model gets 30 days of history on its first run. If you recalibrate, every stored day is re-derived without a refetch.
On our reference VM: luna, qwen, nano and gemini-3.1-flash-lite read STABLE; deepseek and glm, whose prices really moved, read VOLATILE. nano no longer gets a false "migrate to luna" recommendation.

Run, then check, then history agree. run stores its quote as today's point, so check and history right after it show the same prices, and persisted alerts match the live response.

Alerts compare like with like. PRICE_SPIKE and PRICE_DROP compare the latest observation with the 7-day observed average. The live quote never raises one; its gap to the observation is reported as quote_vs_observed_pct.

Analytics you can trust. A model with 14 or more observed days gets a normal profile on its first run (NEWLY_TRACKED is decided by observed days, not by install date). Missing 30-day baselines are reported as unavailable, never guessed. Results carry observation_count, dates and classification_reason.

Hermes sync. Source and order are saved even when the model list is unchanged, repeated syncs are idempotent, a manual default is kept while Hermes owns the default, and exactly one default is reported.

Redirect aliases are visible. Slugs like deepseek/deepseek-v4-flash-latest (listed by OpenRouter as ~…-latest) show as NOT_TRACKED with a clear reason instead of silently disappearing. They are never priced and never given history.

Smaller items. MCP resource anticharon://effective_prices.json (read-only); :batch models are hidden from discovery (an exact model add x:batch still works); one help contract: <command> -h and help <command> everywhere, with clear errors for <command> help.

Upgrade

Back up first (optional but recommended):

cp -a ~/.anticharon ~/.anticharon.bak

CLI, recommended (manual, pinned):

uv tool install --force git+https://github.com/parisneto/anticharon.git@v0.7.0

pip install --force-reinstall git+https://github.com/parisneto/anticharon.git@v0.7.0 also works. Then run once so your stored history moves to the new basis:

anticharon run --force

Until that run, check and history show cached quotes and treat models as NEWLY_TRACKED. Your old history is not deleted: it is kept inside effective_prices.json as legacy_effective_observations and never read.

Self-update (EXPERIMENTAL). anticharon update always reinstalls from the repository's default branch (it does not compare versions and has no --force flag; the reinstall itself is forced) and may need manual intervention. It gives you v0.7.0 once v0.7.0 is on that branch. check-updates compares your installed version with the latest GitHub release:

anticharon check-updates

Then:

anticharon update --type install_only

install_only (alias 1) is the default and the supported type. It reinstalls and restarts nothing, so a running agent is not interrupted. restart_host, phoenix and reload_request (aliases 2 to 4) are deprecated, still accepted, and planned for removal in 0.8.0.

MCP (agents). Call run_update() (the default type is install_only). It executes shell commands on the host, so it should run with explicit user intent. The running MCP server keeps the old version, and check_updates keeps reporting it, until it is reloaded:

  • Hermes: ask the user to send /reload-mcp in chat.
  • Other MCP hosts: restart the host or reconnect the MCP server.

The response reports running_version (the running server's version). The default branch can hold an older version than the one you run, so call check_updates after reloading to confirm the new version. Verified on a Hermes host: run_update then /reload-mcp reconnected the server on the reinstalled version. Prompts, tools and resources keep their names; new fields are additive.

Downgrading. If you go back to 0.6.x, run anticharon run --force after you return to 0.7.0: the older version rewrites stored observations on its own basis, and 0.7.0 re-derives them from the stored listed prices on that run.

Known limits

  • History covers the last 30 days OpenRouter returns; longer history is not stored yet.
  • Service-tier detection uses the endpoint tag; an endpoint whose tag cannot be matched never sets a price.
  • A model whose endpoints are all service tiers keeps a price and reports ONLY_NON_STANDARD_TIERS.
  • deepseek/…-latest style redirects are not priced; use the dated slug.