SOIT Docs
Releases

Version 1.6.0

SOIT v1.6.0 cost reconciliation and document access release highlights, database compatibility, and upgrade notes.

SOIT v1.6.0 is the cost reconciliation and document access release, released on 2026-10-02: costs can be checked against a provider's bill, calls with no price can be refused, and knowledge documents can be restricted to the people who may read them.

Highlights

  • Cost reconciliation — GET /api/v1/runs/costs/entries filters cost rows by API key, principal, run source, model, provider, tool, port, operation, currency, and pricing status, and each row says whether it is priced, estimated, free, or unpriced. GET /api/v1/runs/costs/reconciliation totals a window per currency and groups it, without counting unpriced rows as zero or adding currencies together. Observe › Costs shows the same and exports CSV to set beside a bill. See Budgets and Cost.
  • Provider ids on cost rows — model call cost rows keep the provider's upstream_id and upstream_request_id for OpenAI, Anthropic, Gemini, and LiteLLM, so a row can be found on the provider's side. The ledger contract moves to 1.1.
  • Calls with no price — a workspace setting in Settings › Security is allow (as before), refuse_when_budgeted, or refuse. A refused call is answered 403 PRICING_NOT_CONFIGURED before the provider or tool is called, and is audited; a virtual model moves on to a priced target.
  • Document-level knowledge permissions — a restricted document is readable only by the workspace's Owners and Admins, the knowledge base's creator, and holders of a knowledge_document read grant. Everyone else meets it nowhere: not in listings, not by id, and not in retrieval by any strategy. Restrictions are kept per document key, so new versions and connector syncs stay restricted. See Knowledge.
  • Stored copies follow current access — citations, knowledge_query results, source events, thread messages, tool results, and replays leave out documents the reader may not read now; step summaries and approval context that came from such a document are withheld whole. Stored records are not changed.
  • Gateway pilot kit — examples/pilot sets up a provider, models, a failover virtual model, a limited key, and a budget over the HTTP API, checks allowed and refused calls, failover, idempotency, cost reconciliation, and an evidence bundle, and tears it all down. A mock provider rehearses it without credentials. See OpenAI-Compatible Gateway.
  • Security fixes of v1.5.2 — granting resource access takes a workspace Owner or Admin, and a document's file_id must name a file of the same knowledge base.
  • soit-cli 1.6.0 is on PyPI.

Database compatibility

  • Fresh installations migrate from base to 20261002120000.
  • Three migrations are added: 20261002100000 (provider ids on run_cost_entries), 20261002110000 (unpriced_call_policy on workspaces, allow for existing workspaces), and 20261002120000 (knowledge_document_restrictions, empty until someone restricts a document).
  • The supported N-1 upgrade range is 20260927160000..20261002120000: a v1.5.x database (20261001110000) upgrades in place.
  • All three migrations have a downgrade. Downgrading to 20261001110000 drops the provider ids, every unpriced call policy, and every document restriction, so restricted documents become readable to everyone their knowledge base admits. Restoring the pre-upgrade backup is the preferred way back.

Upgrading

Back up the database and object storage, run alembic upgrade head, and restart the API, the workers, and the web console on the new images. No setting is added. Review the behaviour changes — ledger contract 1.1, stored copies following current knowledge access, the keyword fallback answering from the latest document versions only, and dashboards no longer adding currencies together — in Migration and Upgrade.

Known limitations

  • Cost reconciliation lines the ledger up beside a bill; SOIT does not import or read provider bills.
  • Text a model wrote from retrieved documents (a response's answer, assistant messages, later workflow nodes that used it) is shown as written to every reader; only its citations are filtered.
  • A run records how many documents retrieval left out, not which grant or role let it read each one.
  • A document read grant names one member or service principal; there are no groups. Connector-synced documents do not inherit the source system's permissions.
  • Steps recorded before v1.6.0 do not know which documents they came from, so their summaries are withheld more broadly when the reader may not read some document of the knowledge base, or workspace, they queried.
  • The known limitations of v1.5.0 still apply, except where the changelog lists them as fixed.

On this page