thinkless 0.3.0__tar.gz → 0.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {thinkless-0.3.0 → thinkless-0.4.1}/CHANGELOG.md +40 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/PKG-INFO +68 -52
- {thinkless-0.3.0 → thinkless-0.4.1}/README.md +59 -49
- thinkless-0.4.1/benchmarks/decisions/README.md +18 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/pyproject.toml +16 -3
- thinkless-0.4.1/src/thinkless/_version.py +1 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/__init__.py +35 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/leaderboard.py +191 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/run.py +292 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/score.py +225 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/tasks.json +535 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/tasks.py +164 -0
- thinkless-0.4.1/src/thinkless/bench/decisions/verify.py +121 -0
- thinkless-0.4.1/src/thinkless/cli/decisions.py +199 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/cli/main.py +2 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/base.py +18 -1
- thinkless-0.4.1/tests/unit/test_decision_benchmark.py +259 -0
- thinkless-0.3.0/src/thinkless/_version.py +0 -1
- {thinkless-0.3.0 → thinkless-0.4.1}/.gitignore +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/LICENSE +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/__main__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/_hub.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/_json.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/intents.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/intents_report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/metrics.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/bench/support.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/cli/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/cli/serve.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/cli/shadow.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/cli/traces.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/confidence.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/data/pricing.toml +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/data/viewer.html +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/decision.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/agent.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/data/calibration.jsonl +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/data/scenarios.jsonl +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/data/world.json +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/stack.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/demo/support/world.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/engine.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/errors.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/integrations/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/integrations/_messages.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/integrations/core.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/integrations/langgraph.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/integrations/openai_agents.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/limits.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/anthropic.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/base.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/factory.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/local.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/openai_compat.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/openrouter.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/llm/scripted.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/logs.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/pricing.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/gliner.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/hf.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/laya.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/llm.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/rules.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/systemone.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/providers/wire.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/py.typed +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/server/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/server/app.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/server/mcp.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/settings.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/shadow/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/shadow/compare.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/shadow/report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/shadow/runner.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/console.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/export.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/otel.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/sinks.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/span.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/summary.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/tracer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/src/thinkless/tracing/viewer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/conftest.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/local/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/local/test_local_models.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/network/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/network/test_openrouter_live.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_bench.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_cli_and_viewer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_confidence.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_engine.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_hf_classifier.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_integrations.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_limits.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_llm_decider.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_openrouter.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_pricing_and_llm.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_rules.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_server.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_shadow.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_support_demo.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_systemone.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_systemone_sdk_compat.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_trace_export.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.1}/tests/unit/test_tracing.py +0 -0
|
@@ -6,6 +6,46 @@ All notable changes are recorded here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.4.1 - 2026-09-25
|
|
10
|
+
|
|
11
|
+
Project and packaging updates; no change to the library's behavior.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- Package metadata: development status Beta, more keywords, and links to
|
|
16
|
+
Discussions, the decision benchmark leaderboard, release notes and funding.
|
|
17
|
+
- The README links to good first issues and Discussions and shows the docs,
|
|
18
|
+
leaderboard and OpenSSF Scorecard badges.
|
|
19
|
+
- The submission guide says submitters regenerate the leaderboard page in
|
|
20
|
+
their pull request; the release guide explains that release tags are
|
|
21
|
+
permanent.
|
|
22
|
+
|
|
23
|
+
### Security
|
|
24
|
+
|
|
25
|
+
- Every GitHub Action in the workflows is pinned to a commit.
|
|
26
|
+
- An OpenSSF Scorecard workflow checks the repository's supply chain weekly.
|
|
27
|
+
|
|
28
|
+
## 0.4.0 - 2026-09-25
|
|
29
|
+
|
|
30
|
+
The decision benchmark.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- The decision benchmark 1.0 (`thinkless bench decisions`): eight public
|
|
35
|
+
tasks across the four question kinds (banking77, clinc150 with out of
|
|
36
|
+
scope, MASSIVE in five languages, MultiWOZ 2.2 conversations, jailbreaks,
|
|
37
|
+
Civil Comments toxicity, HelpSteer2 helpfulness ratings and WNUT 2017
|
|
38
|
+
entities), with frozen rows and published hashes, calibration rows from a
|
|
39
|
+
separate split, result files that hold every prediction, `verify` that
|
|
40
|
+
recomputes every metric, a generated leaderboard and open submissions.
|
|
41
|
+
Baselines for GLiNER 2.5, Laya, Qwen3-1.7B and Qwen 3.7 Flash.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
|
|
45
|
+
- A list of chat messages now renders as `role: text` lines for providers
|
|
46
|
+
that read text, instead of one `key: value` line per field.
|
|
47
|
+
- README links to the documentation point at the documentation site.
|
|
48
|
+
|
|
9
49
|
## 0.3.0 - 2026-09-25
|
|
10
50
|
|
|
11
51
|
Shadow mode, framework adapters, limits, a decision server and MCP tools.
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thinkless
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
4
4
|
Summary: The decision plane for AI agents. Rules and small calibrated models make the routine decisions, the LLM is reserved for the steps that need thought, and every step is traced.
|
|
5
5
|
Project-URL: Homepage, https://github.com/inboxpraveen/ThinkLess
|
|
6
6
|
Project-URL: Documentation, https://inboxpraveen.github.io/ThinkLess/
|
|
7
7
|
Project-URL: Repository, https://github.com/inboxpraveen/ThinkLess
|
|
8
8
|
Project-URL: Issues, https://github.com/inboxpraveen/ThinkLess/issues
|
|
9
|
+
Project-URL: Discussions, https://github.com/inboxpraveen/ThinkLess/discussions
|
|
9
10
|
Project-URL: Changelog, https://github.com/inboxpraveen/ThinkLess/blob/main/CHANGELOG.md
|
|
11
|
+
Project-URL: Release notes, https://github.com/inboxpraveen/ThinkLess/releases
|
|
12
|
+
Project-URL: Decision benchmark, https://inboxpraveen.github.io/ThinkLess/decision-benchmark/leaderboard/
|
|
13
|
+
Project-URL: Funding, https://github.com/sponsors/inboxpraveen
|
|
10
14
|
Author: Praveen Kumar
|
|
11
15
|
License-Expression: Apache-2.0
|
|
12
16
|
License-File: LICENSE
|
|
13
|
-
Keywords: agents,classification,decision-models,gliner,jev,laya,llm,observability,
|
|
14
|
-
Classifier: Development Status ::
|
|
17
|
+
Keywords: agents,ai-agents,benchmark,calibration,classification,decision-models,gliner,guardrails,jev,langgraph,laya,llm,llm-routing,mcp,observability,openai-agents,system-one,tracing
|
|
18
|
+
Classifier: Development Status :: 4 - Beta
|
|
19
|
+
Classifier: Framework :: Pydantic :: 2
|
|
15
20
|
Classifier: Intended Audience :: Developers
|
|
21
|
+
Classifier: Intended Audience :: Information Technology
|
|
16
22
|
Classifier: Intended Audience :: Science/Research
|
|
17
23
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
18
24
|
Classifier: Operating System :: OS Independent
|
|
@@ -109,10 +115,13 @@ Description-Content-Type: text/markdown
|
|
|
109
115
|
|
|
110
116
|
<p align="center">
|
|
111
117
|
<a href="https://pypi.org/project/thinkless/"><img alt="PyPI" src="https://img.shields.io/pypi/v/thinkless.svg"></a>
|
|
118
|
+
<a href="https://pypi.org/project/thinkless/"><img alt="Python 3.10 to 3.13" src="https://img.shields.io/pypi/pyversions/thinkless.svg"></a>
|
|
112
119
|
<a href="https://github.com/inboxpraveen/ThinkLess/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/inboxpraveen/ThinkLess/actions/workflows/ci.yml/badge.svg"></a>
|
|
120
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/"><img alt="Docs" src="https://img.shields.io/badge/docs-inboxpraveen.github.io-blue.svg"></a>
|
|
121
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/decision-benchmark/leaderboard/"><img alt="Decision benchmark" src="https://img.shields.io/badge/decision%20benchmark-leaderboard-brightgreen.svg"></a>
|
|
122
|
+
<a href="https://scorecard.dev/viewer/?uri=github.com/inboxpraveen/ThinkLess"><img alt="OpenSSF Scorecard" src="https://api.scorecard.dev/projects/github.com/inboxpraveen/ThinkLess/badge"></a>
|
|
123
|
+
<a href="https://github.com/inboxpraveen/ThinkLess/discussions"><img alt="Discussions" src="https://img.shields.io/github/discussions/inboxpraveen/ThinkLess.svg"></a>
|
|
113
124
|
<a href="https://github.com/inboxpraveen/ThinkLess/blob/main/LICENSE"><img alt="License: Apache 2.0" src="https://img.shields.io/badge/license-Apache%202.0-blue.svg"></a>
|
|
114
|
-
<img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
115
|
-
<a href="https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
|
|
116
125
|
</p>
|
|
117
126
|
|
|
118
127
|
ThinkLess is an open-source decision plane for AI agents. The routine
|
|
@@ -159,7 +168,7 @@ if intent.is_("refund_duplicate_charge"): # only true when the answer is c
|
|
|
159
168
|
Same agent, same 53 labeled support tickets, two decision planes: `llm` sends
|
|
160
169
|
every decision to the LLM, `hybrid` asks rules, GLiNER and Laya first. Hosted
|
|
161
170
|
models ran through OpenRouter, and the dollar figures are what OpenRouter
|
|
162
|
-
billed ([full results](https://github.
|
|
171
|
+
billed ([full results](https://inboxpraveen.github.io/ThinkLess/benchmarks/)):
|
|
163
172
|
|
|
164
173
|
| Fallback LLM | Success, `llm` | Success, `hybrid` | Billed per 1k tickets, `llm` | Billed per 1k tickets, `hybrid` | Decision time |
|
|
165
174
|
|---|---:|---:|---:|---:|---:|
|
|
@@ -185,7 +194,7 @@ billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/
|
|
|
185
194
|
validated on a separate calibration set first. The baseline is the
|
|
186
195
|
strongest form of the LLM design: all six triage questions in one prompt.
|
|
187
196
|
- The support set is 53 synthetic tickets: evidence of the mechanism and its
|
|
188
|
-
failure modes, not a leaderboard. The [benchmarks page](https://github.
|
|
197
|
+
failure modes, not a leaderboard. The [benchmarks page](https://inboxpraveen.github.io/ThinkLess/benchmarks/)
|
|
189
198
|
lists the weak areas found and what was done about each.
|
|
190
199
|
|
|
191
200
|
## Quick start
|
|
@@ -263,11 +272,11 @@ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"
|
|
|
263
272
|
builder.add_conditional_edges(START, intent, intent.destinations)
|
|
264
273
|
```
|
|
265
274
|
|
|
266
|
-
- [LangGraph](https://github.
|
|
275
|
+
- [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
|
|
267
276
|
routers, decision nodes and gated tools.
|
|
268
|
-
- [OpenAI Agents SDK](https://github.
|
|
277
|
+
- [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
|
|
269
278
|
input guardrails, tool guardrails and routing to a specialist agent.
|
|
270
|
-
- [Any framework](https://github.
|
|
279
|
+
- [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
|
|
271
280
|
`route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
|
|
272
281
|
|
|
273
282
|
Before switching anything, measure it. Shadow mode runs ThinkLess next to your
|
|
@@ -288,10 +297,10 @@ def classify(message: str) -> str:
|
|
|
288
297
|
thinkless shadow report shadow/intent.jsonl --volume 2000000
|
|
289
298
|
```
|
|
290
299
|
|
|
291
|
-
The [migration guide](https://github.
|
|
292
|
-
walks through it, and the [FAQ](https://github.
|
|
300
|
+
The [migration guide](https://inboxpraveen.github.io/ThinkLess/guides/migration/)
|
|
301
|
+
walks through it, and the [FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
293
302
|
covers the common questions. To share one engine across services, run it as
|
|
294
|
-
a [decision server or MCP tools](https://github.
|
|
303
|
+
a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
|
|
295
304
|
|
|
296
305
|
## Try the demo agent
|
|
297
306
|
|
|
@@ -314,31 +323,31 @@ thinkless bench intents --dataset banking77
|
|
|
314
323
|
**Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
|
|
315
324
|
want to know and which answers are allowed. They follow the System One wire
|
|
316
325
|
format, so the same question works on every provider.
|
|
317
|
-
[Questions](https://github.
|
|
326
|
+
[Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
|
|
318
327
|
|
|
319
328
|
**A confidence cascade.** Providers are tried cheapest first. Each gets one
|
|
320
329
|
call with every open question it supports; answers that clear their threshold
|
|
321
330
|
close, the rest move on. Unresolved questions come back `uncertain` with the
|
|
322
331
|
best answer seen, and `decision.is_()` never matches an uncertain answer.
|
|
323
|
-
[The cascade](https://github.
|
|
332
|
+
[The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
|
|
324
333
|
|
|
325
334
|
**One meaning of confidence.** Providers disagree about what "confidence"
|
|
326
335
|
means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
|
|
327
336
|
mean different things per backend. ThinkLess derives a single normalized
|
|
328
337
|
confidence from each provider's probabilities.
|
|
329
|
-
[Confidence](https://github.
|
|
338
|
+
[Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
|
|
330
339
|
|
|
331
340
|
**Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
|
|
332
341
|
examples and recommends the lowest one that meets your accuracy target, per
|
|
333
342
|
question and per provider (`thresholds={"intent@gliner": 0.9}`).
|
|
334
|
-
[Calibration](https://github.
|
|
343
|
+
[Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
|
|
335
344
|
|
|
336
345
|
**Traces for everything.** Decisions, provider attempts, generations, tool
|
|
337
346
|
calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
|
|
338
347
|
files, export to any OpenTelemetry backend with GenAI semantic conventions, or
|
|
339
348
|
open the self-contained HTML viewer. Content capture can be switched off
|
|
340
349
|
without losing structure, timings or confidences.
|
|
341
|
-
[Tracing](https://github.
|
|
350
|
+
[Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
342
351
|
|
|
343
352
|
## Providers and backends
|
|
344
353
|
|
|
@@ -358,57 +367,64 @@ without losing structure, timings or confidences.
|
|
|
358
367
|
| `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
|
|
359
368
|
| `AnthropicLLM` | Claude, with server-side refusal fallbacks |
|
|
360
369
|
|
|
361
|
-
Writing your own provider is one class. [Providers](https://github.
|
|
362
|
-
[LLM backends](https://github.
|
|
370
|
+
Writing your own provider is one class. [Providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
371
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/)
|
|
363
372
|
|
|
364
373
|
## Documentation
|
|
365
374
|
|
|
366
|
-
- [Getting started](https://github.
|
|
367
|
-
[installation](https://github.
|
|
368
|
-
- Use it in your agent: [overview](https://github.
|
|
369
|
-
[LangGraph](https://github.
|
|
370
|
-
[OpenAI Agents SDK](https://github.
|
|
371
|
-
[any framework](https://github.
|
|
372
|
-
[migration](https://github.
|
|
373
|
-
[shadow mode](https://github.
|
|
374
|
-
[FAQ](https://github.
|
|
375
|
-
- Concepts: [the four planes](https://github.
|
|
376
|
-
[questions](https://github.
|
|
377
|
-
[confidence](https://github.
|
|
378
|
-
[the cascade](https://github.
|
|
379
|
-
[tracing](https://github.
|
|
380
|
-
- Guides: [the support agent](https://github.
|
|
381
|
-
[calibration](https://github.
|
|
382
|
-
[providers](https://github.
|
|
383
|
-
[LLM backends](https://github.
|
|
384
|
-
[production](https://github.
|
|
385
|
-
[serving](https://github.
|
|
386
|
-
[running a pilot](https://github.
|
|
387
|
-
[troubleshooting](https://github.
|
|
388
|
-
- [Benchmarks](https://github.
|
|
389
|
-
[Python API](https://github.
|
|
375
|
+
- [Getting started](https://inboxpraveen.github.io/ThinkLess/getting-started/),
|
|
376
|
+
[installation](https://inboxpraveen.github.io/ThinkLess/guides/installation/)
|
|
377
|
+
- Use it in your agent: [overview](https://inboxpraveen.github.io/ThinkLess/integrations/),
|
|
378
|
+
[LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/),
|
|
379
|
+
[OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/),
|
|
380
|
+
[any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/),
|
|
381
|
+
[migration](https://inboxpraveen.github.io/ThinkLess/guides/migration/),
|
|
382
|
+
[shadow mode](https://inboxpraveen.github.io/ThinkLess/guides/shadow-mode/),
|
|
383
|
+
[FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
384
|
+
- Concepts: [the four planes](https://inboxpraveen.github.io/ThinkLess/concepts/planes/),
|
|
385
|
+
[questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/),
|
|
386
|
+
[confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/),
|
|
387
|
+
[the cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/),
|
|
388
|
+
[tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
389
|
+
- Guides: [the support agent](https://inboxpraveen.github.io/ThinkLess/guides/support-agent/),
|
|
390
|
+
[calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/),
|
|
391
|
+
[providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
392
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/),
|
|
393
|
+
[production](https://inboxpraveen.github.io/ThinkLess/guides/production/),
|
|
394
|
+
[serving](https://inboxpraveen.github.io/ThinkLess/guides/serving/),
|
|
395
|
+
[running a pilot](https://inboxpraveen.github.io/ThinkLess/guides/pilot/),
|
|
396
|
+
[troubleshooting](https://inboxpraveen.github.io/ThinkLess/guides/troubleshooting/)
|
|
397
|
+
- [Benchmarks](https://inboxpraveen.github.io/ThinkLess/benchmarks/), [CLI reference](https://inboxpraveen.github.io/ThinkLess/reference/cli/),
|
|
398
|
+
[Python API](https://inboxpraveen.github.io/ThinkLess/reference/api/), [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/)
|
|
390
399
|
|
|
391
400
|
## Status
|
|
392
401
|
|
|
393
402
|
ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
|
|
394
403
|
traces) is meant to stay stable, and providers, adapters and benchmarks will
|
|
395
|
-
grow.
|
|
396
|
-
|
|
397
|
-
|
|
404
|
+
grow. The [decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/)
|
|
405
|
+
compares decision models on eight public tasks and is open to submissions.
|
|
406
|
+
Next up are more models on it, cross-request batching in the server, and
|
|
407
|
+
calibrated LLM confidence from log probabilities. See the [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/).
|
|
398
408
|
|
|
399
409
|
## Contributing
|
|
400
410
|
|
|
401
411
|
Issues, providers, benchmark runs on other hardware and models, and new demo
|
|
402
|
-
scenarios are all welcome. Start with [CONTRIBUTING.md](https://github.com/inboxpraveen/ThinkLess/blob/main/CONTRIBUTING.md)
|
|
403
|
-
|
|
404
|
-
|
|
412
|
+
scenarios are all welcome. Start with [CONTRIBUTING.md](https://github.com/inboxpraveen/ThinkLess/blob/main/CONTRIBUTING.md),
|
|
413
|
+
pick a [good first issue](https://github.com/inboxpraveen/ThinkLess/labels/good%20first%20issue),
|
|
414
|
+
or ask in [Discussions](https://github.com/inboxpraveen/ThinkLess/discussions).
|
|
415
|
+
The bar for changes that affect accuracy, latency or cost is evidence: a
|
|
416
|
+
before and after from `thinkless bench` or `thinkless calibrate`.
|
|
405
417
|
|
|
406
418
|
## Sponsoring
|
|
407
419
|
|
|
408
420
|
If ThinkLess saves your team time or money, consider
|
|
409
421
|
[sponsoring its development](https://github.com/sponsors/inboxpraveen).
|
|
410
|
-
|
|
411
|
-
|
|
422
|
+
|
|
423
|
+
Model vendors can sponsor runs of their models on the
|
|
424
|
+
[decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/).
|
|
425
|
+
Sponsored runs are done by the maintainers and published as verified,
|
|
426
|
+
whatever the result: sponsorship buys runs, not rankings. Sponsorship also
|
|
427
|
+
funds more providers and more demos.
|
|
412
428
|
|
|
413
429
|
## Citing
|
|
414
430
|
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
<a href="https://pypi.org/project/thinkless/"><img alt="PyPI" src="https://img.shields.io/pypi/v/thinkless.svg"></a>
|
|
7
|
+
<a href="https://pypi.org/project/thinkless/"><img alt="Python 3.10 to 3.13" src="https://img.shields.io/pypi/pyversions/thinkless.svg"></a>
|
|
7
8
|
<a href="https://github.com/inboxpraveen/ThinkLess/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/inboxpraveen/ThinkLess/actions/workflows/ci.yml/badge.svg"></a>
|
|
9
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/"><img alt="Docs" src="https://img.shields.io/badge/docs-inboxpraveen.github.io-blue.svg"></a>
|
|
10
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/decision-benchmark/leaderboard/"><img alt="Decision benchmark" src="https://img.shields.io/badge/decision%20benchmark-leaderboard-brightgreen.svg"></a>
|
|
11
|
+
<a href="https://scorecard.dev/viewer/?uri=github.com/inboxpraveen/ThinkLess"><img alt="OpenSSF Scorecard" src="https://api.scorecard.dev/projects/github.com/inboxpraveen/ThinkLess/badge"></a>
|
|
12
|
+
<a href="https://github.com/inboxpraveen/ThinkLess/discussions"><img alt="Discussions" src="https://img.shields.io/github/discussions/inboxpraveen/ThinkLess.svg"></a>
|
|
8
13
|
<a href="https://github.com/inboxpraveen/ThinkLess/blob/main/LICENSE"><img alt="License: Apache 2.0" src="https://img.shields.io/badge/license-Apache%202.0-blue.svg"></a>
|
|
9
|
-
<img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
10
|
-
<a href="https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
|
|
11
14
|
</p>
|
|
12
15
|
|
|
13
16
|
ThinkLess is an open-source decision plane for AI agents. The routine
|
|
@@ -54,7 +57,7 @@ if intent.is_("refund_duplicate_charge"): # only true when the answer is c
|
|
|
54
57
|
Same agent, same 53 labeled support tickets, two decision planes: `llm` sends
|
|
55
58
|
every decision to the LLM, `hybrid` asks rules, GLiNER and Laya first. Hosted
|
|
56
59
|
models ran through OpenRouter, and the dollar figures are what OpenRouter
|
|
57
|
-
billed ([full results](https://github.
|
|
60
|
+
billed ([full results](https://inboxpraveen.github.io/ThinkLess/benchmarks/)):
|
|
58
61
|
|
|
59
62
|
| Fallback LLM | Success, `llm` | Success, `hybrid` | Billed per 1k tickets, `llm` | Billed per 1k tickets, `hybrid` | Decision time |
|
|
60
63
|
|---|---:|---:|---:|---:|---:|
|
|
@@ -80,7 +83,7 @@ billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/
|
|
|
80
83
|
validated on a separate calibration set first. The baseline is the
|
|
81
84
|
strongest form of the LLM design: all six triage questions in one prompt.
|
|
82
85
|
- The support set is 53 synthetic tickets: evidence of the mechanism and its
|
|
83
|
-
failure modes, not a leaderboard. The [benchmarks page](https://github.
|
|
86
|
+
failure modes, not a leaderboard. The [benchmarks page](https://inboxpraveen.github.io/ThinkLess/benchmarks/)
|
|
84
87
|
lists the weak areas found and what was done about each.
|
|
85
88
|
|
|
86
89
|
## Quick start
|
|
@@ -158,11 +161,11 @@ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"
|
|
|
158
161
|
builder.add_conditional_edges(START, intent, intent.destinations)
|
|
159
162
|
```
|
|
160
163
|
|
|
161
|
-
- [LangGraph](https://github.
|
|
164
|
+
- [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
|
|
162
165
|
routers, decision nodes and gated tools.
|
|
163
|
-
- [OpenAI Agents SDK](https://github.
|
|
166
|
+
- [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
|
|
164
167
|
input guardrails, tool guardrails and routing to a specialist agent.
|
|
165
|
-
- [Any framework](https://github.
|
|
168
|
+
- [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
|
|
166
169
|
`route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
|
|
167
170
|
|
|
168
171
|
Before switching anything, measure it. Shadow mode runs ThinkLess next to your
|
|
@@ -183,10 +186,10 @@ def classify(message: str) -> str:
|
|
|
183
186
|
thinkless shadow report shadow/intent.jsonl --volume 2000000
|
|
184
187
|
```
|
|
185
188
|
|
|
186
|
-
The [migration guide](https://github.
|
|
187
|
-
walks through it, and the [FAQ](https://github.
|
|
189
|
+
The [migration guide](https://inboxpraveen.github.io/ThinkLess/guides/migration/)
|
|
190
|
+
walks through it, and the [FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
188
191
|
covers the common questions. To share one engine across services, run it as
|
|
189
|
-
a [decision server or MCP tools](https://github.
|
|
192
|
+
a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
|
|
190
193
|
|
|
191
194
|
## Try the demo agent
|
|
192
195
|
|
|
@@ -209,31 +212,31 @@ thinkless bench intents --dataset banking77
|
|
|
209
212
|
**Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
|
|
210
213
|
want to know and which answers are allowed. They follow the System One wire
|
|
211
214
|
format, so the same question works on every provider.
|
|
212
|
-
[Questions](https://github.
|
|
215
|
+
[Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
|
|
213
216
|
|
|
214
217
|
**A confidence cascade.** Providers are tried cheapest first. Each gets one
|
|
215
218
|
call with every open question it supports; answers that clear their threshold
|
|
216
219
|
close, the rest move on. Unresolved questions come back `uncertain` with the
|
|
217
220
|
best answer seen, and `decision.is_()` never matches an uncertain answer.
|
|
218
|
-
[The cascade](https://github.
|
|
221
|
+
[The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
|
|
219
222
|
|
|
220
223
|
**One meaning of confidence.** Providers disagree about what "confidence"
|
|
221
224
|
means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
|
|
222
225
|
mean different things per backend. ThinkLess derives a single normalized
|
|
223
226
|
confidence from each provider's probabilities.
|
|
224
|
-
[Confidence](https://github.
|
|
227
|
+
[Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
|
|
225
228
|
|
|
226
229
|
**Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
|
|
227
230
|
examples and recommends the lowest one that meets your accuracy target, per
|
|
228
231
|
question and per provider (`thresholds={"intent@gliner": 0.9}`).
|
|
229
|
-
[Calibration](https://github.
|
|
232
|
+
[Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
|
|
230
233
|
|
|
231
234
|
**Traces for everything.** Decisions, provider attempts, generations, tool
|
|
232
235
|
calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
|
|
233
236
|
files, export to any OpenTelemetry backend with GenAI semantic conventions, or
|
|
234
237
|
open the self-contained HTML viewer. Content capture can be switched off
|
|
235
238
|
without losing structure, timings or confidences.
|
|
236
|
-
[Tracing](https://github.
|
|
239
|
+
[Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
237
240
|
|
|
238
241
|
## Providers and backends
|
|
239
242
|
|
|
@@ -253,57 +256,64 @@ without losing structure, timings or confidences.
|
|
|
253
256
|
| `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
|
|
254
257
|
| `AnthropicLLM` | Claude, with server-side refusal fallbacks |
|
|
255
258
|
|
|
256
|
-
Writing your own provider is one class. [Providers](https://github.
|
|
257
|
-
[LLM backends](https://github.
|
|
259
|
+
Writing your own provider is one class. [Providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
260
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/)
|
|
258
261
|
|
|
259
262
|
## Documentation
|
|
260
263
|
|
|
261
|
-
- [Getting started](https://github.
|
|
262
|
-
[installation](https://github.
|
|
263
|
-
- Use it in your agent: [overview](https://github.
|
|
264
|
-
[LangGraph](https://github.
|
|
265
|
-
[OpenAI Agents SDK](https://github.
|
|
266
|
-
[any framework](https://github.
|
|
267
|
-
[migration](https://github.
|
|
268
|
-
[shadow mode](https://github.
|
|
269
|
-
[FAQ](https://github.
|
|
270
|
-
- Concepts: [the four planes](https://github.
|
|
271
|
-
[questions](https://github.
|
|
272
|
-
[confidence](https://github.
|
|
273
|
-
[the cascade](https://github.
|
|
274
|
-
[tracing](https://github.
|
|
275
|
-
- Guides: [the support agent](https://github.
|
|
276
|
-
[calibration](https://github.
|
|
277
|
-
[providers](https://github.
|
|
278
|
-
[LLM backends](https://github.
|
|
279
|
-
[production](https://github.
|
|
280
|
-
[serving](https://github.
|
|
281
|
-
[running a pilot](https://github.
|
|
282
|
-
[troubleshooting](https://github.
|
|
283
|
-
- [Benchmarks](https://github.
|
|
284
|
-
[Python API](https://github.
|
|
264
|
+
- [Getting started](https://inboxpraveen.github.io/ThinkLess/getting-started/),
|
|
265
|
+
[installation](https://inboxpraveen.github.io/ThinkLess/guides/installation/)
|
|
266
|
+
- Use it in your agent: [overview](https://inboxpraveen.github.io/ThinkLess/integrations/),
|
|
267
|
+
[LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/),
|
|
268
|
+
[OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/),
|
|
269
|
+
[any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/),
|
|
270
|
+
[migration](https://inboxpraveen.github.io/ThinkLess/guides/migration/),
|
|
271
|
+
[shadow mode](https://inboxpraveen.github.io/ThinkLess/guides/shadow-mode/),
|
|
272
|
+
[FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
273
|
+
- Concepts: [the four planes](https://inboxpraveen.github.io/ThinkLess/concepts/planes/),
|
|
274
|
+
[questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/),
|
|
275
|
+
[confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/),
|
|
276
|
+
[the cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/),
|
|
277
|
+
[tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
278
|
+
- Guides: [the support agent](https://inboxpraveen.github.io/ThinkLess/guides/support-agent/),
|
|
279
|
+
[calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/),
|
|
280
|
+
[providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
281
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/),
|
|
282
|
+
[production](https://inboxpraveen.github.io/ThinkLess/guides/production/),
|
|
283
|
+
[serving](https://inboxpraveen.github.io/ThinkLess/guides/serving/),
|
|
284
|
+
[running a pilot](https://inboxpraveen.github.io/ThinkLess/guides/pilot/),
|
|
285
|
+
[troubleshooting](https://inboxpraveen.github.io/ThinkLess/guides/troubleshooting/)
|
|
286
|
+
- [Benchmarks](https://inboxpraveen.github.io/ThinkLess/benchmarks/), [CLI reference](https://inboxpraveen.github.io/ThinkLess/reference/cli/),
|
|
287
|
+
[Python API](https://inboxpraveen.github.io/ThinkLess/reference/api/), [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/)
|
|
285
288
|
|
|
286
289
|
## Status
|
|
287
290
|
|
|
288
291
|
ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
|
|
289
292
|
traces) is meant to stay stable, and providers, adapters and benchmarks will
|
|
290
|
-
grow.
|
|
291
|
-
|
|
292
|
-
|
|
293
|
+
grow. The [decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/)
|
|
294
|
+
compares decision models on eight public tasks and is open to submissions.
|
|
295
|
+
Next up are more models on it, cross-request batching in the server, and
|
|
296
|
+
calibrated LLM confidence from log probabilities. See the [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/).
|
|
293
297
|
|
|
294
298
|
## Contributing
|
|
295
299
|
|
|
296
300
|
Issues, providers, benchmark runs on other hardware and models, and new demo
|
|
297
|
-
scenarios are all welcome. Start with [CONTRIBUTING.md](https://github.com/inboxpraveen/ThinkLess/blob/main/CONTRIBUTING.md)
|
|
298
|
-
|
|
299
|
-
|
|
301
|
+
scenarios are all welcome. Start with [CONTRIBUTING.md](https://github.com/inboxpraveen/ThinkLess/blob/main/CONTRIBUTING.md),
|
|
302
|
+
pick a [good first issue](https://github.com/inboxpraveen/ThinkLess/labels/good%20first%20issue),
|
|
303
|
+
or ask in [Discussions](https://github.com/inboxpraveen/ThinkLess/discussions).
|
|
304
|
+
The bar for changes that affect accuracy, latency or cost is evidence: a
|
|
305
|
+
before and after from `thinkless bench` or `thinkless calibrate`.
|
|
300
306
|
|
|
301
307
|
## Sponsoring
|
|
302
308
|
|
|
303
309
|
If ThinkLess saves your team time or money, consider
|
|
304
310
|
[sponsoring its development](https://github.com/sponsors/inboxpraveen).
|
|
305
|
-
|
|
306
|
-
|
|
311
|
+
|
|
312
|
+
Model vendors can sponsor runs of their models on the
|
|
313
|
+
[decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/).
|
|
314
|
+
Sponsored runs are done by the maintainers and published as verified,
|
|
315
|
+
whatever the result: sponsorship buys runs, not rankings. Sponsorship also
|
|
316
|
+
funds more providers and more demos.
|
|
307
317
|
|
|
308
318
|
## Citing
|
|
309
319
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Decision benchmark
|
|
2
|
+
|
|
3
|
+
A provider-neutral benchmark for the models that make an agent's routine
|
|
4
|
+
decisions. The method, the leaderboard and the submission guide are in the
|
|
5
|
+
documentation: https://inboxpraveen.github.io/ThinkLess/decision-benchmark/
|
|
6
|
+
|
|
7
|
+
| Path | |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `tasks/<task>/test.jsonl`, `calibration.jsonl` | the frozen rows of benchmark 1.0 |
|
|
10
|
+
| `tasks/NOTICE.md` | sources, revisions, licenses and changes for every task |
|
|
11
|
+
| `build.py` | how the rows were sampled; maintainers only, and never rerun within a version |
|
|
12
|
+
| `results/verified/` | runs done by the maintainers |
|
|
13
|
+
| `results/submitted/` | runs submitted by others, verified by CI |
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
thinkless bench decisions run --provider gliner --name "GLiNER 2.5 base"
|
|
17
|
+
thinkless bench decisions verify GLiNER-2.5-base.json
|
|
18
|
+
```
|
|
@@ -13,20 +13,29 @@ license-files = ["LICENSE"]
|
|
|
13
13
|
authors = [{ name = "Praveen Kumar" }]
|
|
14
14
|
keywords = [
|
|
15
15
|
"agents",
|
|
16
|
+
"ai-agents",
|
|
16
17
|
"llm",
|
|
18
|
+
"llm-routing",
|
|
17
19
|
"decision-models",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
+
"guardrails",
|
|
21
|
+
"langgraph",
|
|
22
|
+
"openai-agents",
|
|
23
|
+
"mcp",
|
|
24
|
+
"benchmark",
|
|
25
|
+
"calibration",
|
|
20
26
|
"classification",
|
|
21
27
|
"observability",
|
|
22
28
|
"tracing",
|
|
29
|
+
"system-one",
|
|
23
30
|
"jev",
|
|
24
31
|
"laya",
|
|
25
32
|
"gliner",
|
|
26
33
|
]
|
|
27
34
|
classifiers = [
|
|
28
|
-
"Development Status ::
|
|
35
|
+
"Development Status :: 4 - Beta",
|
|
36
|
+
"Framework :: Pydantic :: 2",
|
|
29
37
|
"Intended Audience :: Developers",
|
|
38
|
+
"Intended Audience :: Information Technology",
|
|
30
39
|
"Intended Audience :: Science/Research",
|
|
31
40
|
"License :: OSI Approved :: Apache Software License",
|
|
32
41
|
"Operating System :: OS Independent",
|
|
@@ -97,7 +106,11 @@ Homepage = "https://github.com/inboxpraveen/ThinkLess"
|
|
|
97
106
|
Documentation = "https://inboxpraveen.github.io/ThinkLess/"
|
|
98
107
|
Repository = "https://github.com/inboxpraveen/ThinkLess"
|
|
99
108
|
Issues = "https://github.com/inboxpraveen/ThinkLess/issues"
|
|
109
|
+
Discussions = "https://github.com/inboxpraveen/ThinkLess/discussions"
|
|
100
110
|
Changelog = "https://github.com/inboxpraveen/ThinkLess/blob/main/CHANGELOG.md"
|
|
111
|
+
"Release notes" = "https://github.com/inboxpraveen/ThinkLess/releases"
|
|
112
|
+
"Decision benchmark" = "https://inboxpraveen.github.io/ThinkLess/decision-benchmark/leaderboard/"
|
|
113
|
+
Funding = "https://github.com/sponsors/inboxpraveen"
|
|
101
114
|
|
|
102
115
|
[project.scripts]
|
|
103
116
|
thinkless = "thinkless.cli.main:app"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.1"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""The decision benchmark: a neutral test of decision models on public data.
|
|
2
|
+
|
|
3
|
+
Eight tasks cover the four question kinds on public datasets: support and
|
|
4
|
+
assistant intents, out-of-scope detection, five languages, a multi-turn
|
|
5
|
+
conversation, jailbreaks, toxicity, rating an assistant's reply, and entity
|
|
6
|
+
extraction. Every provider gets the same question and the same frozen rows.
|
|
7
|
+
Result files hold raw predictions, and every metric is recomputed from them
|
|
8
|
+
by :func:`verify_result`, so a result can be checked without trusting who
|
|
9
|
+
produced it.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .leaderboard import collect, leaderboard_markdown
|
|
13
|
+
from .run import BenchmarkResult, Submission, TaskResult, build_submission_provider, run_benchmark
|
|
14
|
+
from .score import TaskMetrics, score_task
|
|
15
|
+
from .tasks import TaskSpec, benchmark_version, load_rows, load_tasks, question_for
|
|
16
|
+
from .verify import Verification, verify_result
|
|
17
|
+
|
|
18
|
+
__all__ = [
|
|
19
|
+
"BenchmarkResult",
|
|
20
|
+
"Submission",
|
|
21
|
+
"TaskMetrics",
|
|
22
|
+
"TaskResult",
|
|
23
|
+
"TaskSpec",
|
|
24
|
+
"Verification",
|
|
25
|
+
"benchmark_version",
|
|
26
|
+
"build_submission_provider",
|
|
27
|
+
"collect",
|
|
28
|
+
"leaderboard_markdown",
|
|
29
|
+
"load_rows",
|
|
30
|
+
"load_tasks",
|
|
31
|
+
"question_for",
|
|
32
|
+
"run_benchmark",
|
|
33
|
+
"score_task",
|
|
34
|
+
"verify_result",
|
|
35
|
+
]
|