This release is a pre-release and may not be stable for production use.
s1flow
Evaluate decision models on your own data, then ship the one you trust.
Decision models such as Jev, Clef, d1 and OpenAI's Decisions API (also called System One models) answer a typed question, like yes/no or pick one, with a probability instead of free text. s1flow measures on your own labeled cases how much work each model can take over at the accuracy you need, then runs that setup in your app.
Is this ticket a bug? Which team owns it? Should the agent act or ask?
Accuracy hides what you can automate
These four models are within 9 points of each other on accuracy, yet the share of cases each can handle while staying 95% accurate ranges from 0% to 97%, and the leader flips between tasks. Claude Haiku 4.5, an LLM asked once per case, gives every answer the same confidence, so no threshold gets it to 95%. The numbers are a snapshot of four of the 13 to 21 models in the reports, not a ranking of providers. Your own cases may tell a different story, which is exactly why you measure them.
Quick start
1. Install the CLI. You need Python 3.13 or later.
uv tool install "s1flow[eval]"
2. Add the s1flow Skill to your coding agent.
| Agent | How |
|---|---|
| Claude Code | /plugin marketplace add gotalab/s1flow, then /plugin install s1flow@s1flow |
| Codex | codex plugin marketplace add gotalab/s1flow, then install s1flow from the Plugins directory |
| Cursor and other agents | s1flow skill install copies the Skill into .agents/skills/ and .claude/skills/ |
Plugins update through your agent's plugin manager. s1flow skill install copies the files into your
repository instead, so they change only when you run it again.
3. Tell your agent what to decide, in your own words.
Use s1flow to decide whether a new GitHub issue is a bug. Call the task is-bug, collect 200 labeled issues, compare the models and show me the result.
The agent runs s1flow init, which creates an s1flow/ folder and touches nothing else in your repository.
The default line-up needs one key, OPENROUTER_API_KEY, and fetching issues needs the gh CLI, signed in.
A CI check on pull requests is one flag away (s1flow init --ci) when you want it.
4. Run your pick in your app. Your choice is saved as a policy: one JSON file holding the model, the
question and the confidence threshold. Your app needs only the base package (pip install s1flow), which depends
on just httpx and pydantic, plus a connections.toml that lists the models it is allowed to call, including the
one the policy uses (format).
from s1flow import Client, policies
client = Client(connections="connections.toml")
policy = policies.load(path="s1flow/policies/is-bug/v1.json", client=client)
decision = policy.decide({"text": "Crash on startup"})
decision.value, decision.probability # True, 0.93
No labels yet? You can ship a policy today and evaluate it later.
What you get
- A comparison you can act on. Pull cases from GitHub issues, app logs or labels you already have, and run every model and prompt against them. For each one you see how much it can handle at your target accuracy, with confidence intervals, cost and latency.
- What runs is what you measured. A policy pins the model, prompt and threshold you evaluated. Change any of them, or the cases, and the old results no longer apply to it.
- A CI check on every policy change. A GitHub Action tests the new policy against the current one on the test cases and posts the result on the pull request.
- All the major decision models, plus LLMs for comparison. Jev (TypeSafe), Clef (Cloudflare), d1 (Liquid) and pplx-decider (Perplexity) through the System One API or OpenRouter, OpenAI's Decisions API, LLMs through LiteLLM, or a provider you write yourself.
- Production feedback becomes new cases. Record the correct answer for a decision ID, and it goes into the next comparison.
Docs
| Page | What it covers |
|---|---|
| Run decisions in your app | your first policy, the SDK, calling a model directly |
| Evaluate and compare | cases, compare, charts, thresholds |
| Policies, evidence and promotion | versions, evidence, promote, schemas |
| Feedback and improvement | recording correct answers, measuring in production, prompt optimization |
| Connections and discovery | which models your app may call, and how config files are found |
| CLI, agents and CI | exit codes, the Agent Skill, GitHub Actions |
| Develop s1flow | running this repository's checks |
Metadata
Release files for s1flow 0.1.0a1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| s1flow-0.1.0a1.tar.gz | 224.7 kB | With provenance | Details for s1flow-0.1.0a1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| s1flow-0.1.0a1-py3-none-any.whl | Python 3 | none | any | Details for s1flow-0.1.0a1-py3-none-any.whl |
Total release size: 501.1 kB
Release files / s1flow-0.1.0a1.tar.gz
| Download URL | s1flow-0.1.0a1.tar.gz |
|---|---|
| Size | 224.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0ecb376acc60c9aaa6882b66b75dba1eb1d0fb3ef4971296645024eb6b428ef1
|
|
BLAKE2b-256 checksum How to use checksums |
7f7d64e59bfc13347d6c86757554f59ff19351f3b040cbb1ae3b6a5e3fd4f77e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logRelease files / s1flow-0.1.0a1-py3-none-any.whl
| Download URL | s1flow-0.1.0a1-py3-none-any.whl |
|---|---|
| Size | 276.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4d651ef79997bd31bb63ba9e50933ae509052cf5d207e140de34415fd7e95e1e
|
|
BLAKE2b-256 checksum How to use checksums |
d7217e3e6c76f8180389471ab80272b2394e4861f00f3ba269db57aa6ba8aa31
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logSecurity for s1flow 0.1.0a1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for s1flow-0.1.0a1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.