thinkless 0.3.0__tar.gz → 0.4.0__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.0}/CHANGELOG.md +21 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/PKG-INFO +51 -46
- {thinkless-0.3.0 → thinkless-0.4.0}/README.md +50 -45
- thinkless-0.4.0/benchmarks/decisions/README.md +18 -0
- thinkless-0.4.0/src/thinkless/_version.py +1 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/__init__.py +35 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/leaderboard.py +191 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/run.py +292 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/score.py +225 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/tasks.json +535 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/tasks.py +164 -0
- thinkless-0.4.0/src/thinkless/bench/decisions/verify.py +121 -0
- thinkless-0.4.0/src/thinkless/cli/decisions.py +199 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/main.py +2 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/base.py +18 -1
- thinkless-0.4.0/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.0}/.gitignore +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/LICENSE +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/pyproject.toml +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/__main__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/_hub.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/_json.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/intents.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/intents_report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/metrics.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/support.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/serve.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/shadow.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/traces.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/confidence.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/data/pricing.toml +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/data/viewer.html +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/decision.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/agent.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/calibration.jsonl +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/scenarios.jsonl +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/world.json +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/stack.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/world.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/engine.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/errors.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/_messages.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/core.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/langgraph.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/openai_agents.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/limits.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/anthropic.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/base.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/factory.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/local.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/openai_compat.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/openrouter.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/scripted.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/logs.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/pricing.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/gliner.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/hf.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/laya.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/llm.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/rules.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/systemone.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/wire.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/py.typed +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/app.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/mcp.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/settings.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/compare.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/report.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/runner.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/console.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/export.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/otel.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/sinks.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/span.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/summary.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/tracer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/viewer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/conftest.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/local/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/local/test_local_models.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/network/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/network/test_openrouter_live.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/__init__.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_bench.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_cli_and_viewer.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_confidence.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_engine.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_hf_classifier.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_integrations.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_limits.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_llm_decider.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_openrouter.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_pricing_and_llm.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_questions.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_rules.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_server.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_shadow.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_support_demo.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_systemone.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_systemone_sdk_compat.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_trace_export.py +0 -0
- {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_tracing.py +0 -0
|
@@ -6,6 +6,27 @@ All notable changes are recorded here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 0.4.0 - 2026-09-25
|
|
10
|
+
|
|
11
|
+
The decision benchmark.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- The decision benchmark 1.0 (`thinkless bench decisions`): eight public
|
|
16
|
+
tasks across the four question kinds (banking77, clinc150 with out of
|
|
17
|
+
scope, MASSIVE in five languages, MultiWOZ 2.2 conversations, jailbreaks,
|
|
18
|
+
Civil Comments toxicity, HelpSteer2 helpfulness ratings and WNUT 2017
|
|
19
|
+
entities), with frozen rows and published hashes, calibration rows from a
|
|
20
|
+
separate split, result files that hold every prediction, `verify` that
|
|
21
|
+
recomputes every metric, a generated leaderboard and open submissions.
|
|
22
|
+
Baselines for GLiNER 2.5, Laya, Qwen3-1.7B and Qwen 3.7 Flash.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- A list of chat messages now renders as `role: text` lines for providers
|
|
27
|
+
that read text, instead of one `key: value` line per field.
|
|
28
|
+
- README links to the documentation point at the documentation site.
|
|
29
|
+
|
|
9
30
|
## 0.3.0 - 2026-09-25
|
|
10
31
|
|
|
11
32
|
Shadow mode, framework adapters, limits, a decision server and MCP tools.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: thinkless
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
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/
|
|
@@ -112,7 +112,7 @@ Description-Content-Type: text/markdown
|
|
|
112
112
|
<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>
|
|
113
113
|
<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
114
|
<img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
115
|
-
<a href="https://github.
|
|
115
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/benchmarks/"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
|
|
116
116
|
</p>
|
|
117
117
|
|
|
118
118
|
ThinkLess is an open-source decision plane for AI agents. The routine
|
|
@@ -159,7 +159,7 @@ if intent.is_("refund_duplicate_charge"): # only true when the answer is c
|
|
|
159
159
|
Same agent, same 53 labeled support tickets, two decision planes: `llm` sends
|
|
160
160
|
every decision to the LLM, `hybrid` asks rules, GLiNER and Laya first. Hosted
|
|
161
161
|
models ran through OpenRouter, and the dollar figures are what OpenRouter
|
|
162
|
-
billed ([full results](https://github.
|
|
162
|
+
billed ([full results](https://inboxpraveen.github.io/ThinkLess/benchmarks/)):
|
|
163
163
|
|
|
164
164
|
| Fallback LLM | Success, `llm` | Success, `hybrid` | Billed per 1k tickets, `llm` | Billed per 1k tickets, `hybrid` | Decision time |
|
|
165
165
|
|---|---:|---:|---:|---:|---:|
|
|
@@ -185,7 +185,7 @@ billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/
|
|
|
185
185
|
validated on a separate calibration set first. The baseline is the
|
|
186
186
|
strongest form of the LLM design: all six triage questions in one prompt.
|
|
187
187
|
- The support set is 53 synthetic tickets: evidence of the mechanism and its
|
|
188
|
-
failure modes, not a leaderboard. The [benchmarks page](https://github.
|
|
188
|
+
failure modes, not a leaderboard. The [benchmarks page](https://inboxpraveen.github.io/ThinkLess/benchmarks/)
|
|
189
189
|
lists the weak areas found and what was done about each.
|
|
190
190
|
|
|
191
191
|
## Quick start
|
|
@@ -263,11 +263,11 @@ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"
|
|
|
263
263
|
builder.add_conditional_edges(START, intent, intent.destinations)
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
- [LangGraph](https://github.
|
|
266
|
+
- [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
|
|
267
267
|
routers, decision nodes and gated tools.
|
|
268
|
-
- [OpenAI Agents SDK](https://github.
|
|
268
|
+
- [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
|
|
269
269
|
input guardrails, tool guardrails and routing to a specialist agent.
|
|
270
|
-
- [Any framework](https://github.
|
|
270
|
+
- [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
|
|
271
271
|
`route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
|
|
272
272
|
|
|
273
273
|
Before switching anything, measure it. Shadow mode runs ThinkLess next to your
|
|
@@ -288,10 +288,10 @@ def classify(message: str) -> str:
|
|
|
288
288
|
thinkless shadow report shadow/intent.jsonl --volume 2000000
|
|
289
289
|
```
|
|
290
290
|
|
|
291
|
-
The [migration guide](https://github.
|
|
292
|
-
walks through it, and the [FAQ](https://github.
|
|
291
|
+
The [migration guide](https://inboxpraveen.github.io/ThinkLess/guides/migration/)
|
|
292
|
+
walks through it, and the [FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
293
293
|
covers the common questions. To share one engine across services, run it as
|
|
294
|
-
a [decision server or MCP tools](https://github.
|
|
294
|
+
a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
|
|
295
295
|
|
|
296
296
|
## Try the demo agent
|
|
297
297
|
|
|
@@ -314,31 +314,31 @@ thinkless bench intents --dataset banking77
|
|
|
314
314
|
**Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
|
|
315
315
|
want to know and which answers are allowed. They follow the System One wire
|
|
316
316
|
format, so the same question works on every provider.
|
|
317
|
-
[Questions](https://github.
|
|
317
|
+
[Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
|
|
318
318
|
|
|
319
319
|
**A confidence cascade.** Providers are tried cheapest first. Each gets one
|
|
320
320
|
call with every open question it supports; answers that clear their threshold
|
|
321
321
|
close, the rest move on. Unresolved questions come back `uncertain` with the
|
|
322
322
|
best answer seen, and `decision.is_()` never matches an uncertain answer.
|
|
323
|
-
[The cascade](https://github.
|
|
323
|
+
[The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
|
|
324
324
|
|
|
325
325
|
**One meaning of confidence.** Providers disagree about what "confidence"
|
|
326
326
|
means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
|
|
327
327
|
mean different things per backend. ThinkLess derives a single normalized
|
|
328
328
|
confidence from each provider's probabilities.
|
|
329
|
-
[Confidence](https://github.
|
|
329
|
+
[Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
|
|
330
330
|
|
|
331
331
|
**Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
|
|
332
332
|
examples and recommends the lowest one that meets your accuracy target, per
|
|
333
333
|
question and per provider (`thresholds={"intent@gliner": 0.9}`).
|
|
334
|
-
[Calibration](https://github.
|
|
334
|
+
[Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
|
|
335
335
|
|
|
336
336
|
**Traces for everything.** Decisions, provider attempts, generations, tool
|
|
337
337
|
calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
|
|
338
338
|
files, export to any OpenTelemetry backend with GenAI semantic conventions, or
|
|
339
339
|
open the self-contained HTML viewer. Content capture can be switched off
|
|
340
340
|
without losing structure, timings or confidences.
|
|
341
|
-
[Tracing](https://github.
|
|
341
|
+
[Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
342
342
|
|
|
343
343
|
## Providers and backends
|
|
344
344
|
|
|
@@ -358,43 +358,44 @@ without losing structure, timings or confidences.
|
|
|
358
358
|
| `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
|
|
359
359
|
| `AnthropicLLM` | Claude, with server-side refusal fallbacks |
|
|
360
360
|
|
|
361
|
-
Writing your own provider is one class. [Providers](https://github.
|
|
362
|
-
[LLM backends](https://github.
|
|
361
|
+
Writing your own provider is one class. [Providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
362
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/)
|
|
363
363
|
|
|
364
364
|
## Documentation
|
|
365
365
|
|
|
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.
|
|
366
|
+
- [Getting started](https://inboxpraveen.github.io/ThinkLess/getting-started/),
|
|
367
|
+
[installation](https://inboxpraveen.github.io/ThinkLess/guides/installation/)
|
|
368
|
+
- Use it in your agent: [overview](https://inboxpraveen.github.io/ThinkLess/integrations/),
|
|
369
|
+
[LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/),
|
|
370
|
+
[OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/),
|
|
371
|
+
[any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/),
|
|
372
|
+
[migration](https://inboxpraveen.github.io/ThinkLess/guides/migration/),
|
|
373
|
+
[shadow mode](https://inboxpraveen.github.io/ThinkLess/guides/shadow-mode/),
|
|
374
|
+
[FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
375
|
+
- Concepts: [the four planes](https://inboxpraveen.github.io/ThinkLess/concepts/planes/),
|
|
376
|
+
[questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/),
|
|
377
|
+
[confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/),
|
|
378
|
+
[the cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/),
|
|
379
|
+
[tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
380
|
+
- Guides: [the support agent](https://inboxpraveen.github.io/ThinkLess/guides/support-agent/),
|
|
381
|
+
[calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/),
|
|
382
|
+
[providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
383
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/),
|
|
384
|
+
[production](https://inboxpraveen.github.io/ThinkLess/guides/production/),
|
|
385
|
+
[serving](https://inboxpraveen.github.io/ThinkLess/guides/serving/),
|
|
386
|
+
[running a pilot](https://inboxpraveen.github.io/ThinkLess/guides/pilot/),
|
|
387
|
+
[troubleshooting](https://inboxpraveen.github.io/ThinkLess/guides/troubleshooting/)
|
|
388
|
+
- [Benchmarks](https://inboxpraveen.github.io/ThinkLess/benchmarks/), [CLI reference](https://inboxpraveen.github.io/ThinkLess/reference/cli/),
|
|
389
|
+
[Python API](https://inboxpraveen.github.io/ThinkLess/reference/api/), [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/)
|
|
390
390
|
|
|
391
391
|
## Status
|
|
392
392
|
|
|
393
393
|
ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
|
|
394
394
|
traces) is meant to stay stable, and providers, adapters and benchmarks will
|
|
395
|
-
grow.
|
|
396
|
-
|
|
397
|
-
|
|
395
|
+
grow. The [decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/)
|
|
396
|
+
compares decision models on eight public tasks and is open to submissions.
|
|
397
|
+
Next up are more models on it, cross-request batching in the server, and
|
|
398
|
+
calibrated LLM confidence from log probabilities. See the [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/).
|
|
398
399
|
|
|
399
400
|
## Contributing
|
|
400
401
|
|
|
@@ -407,8 +408,12 @@ and after from `thinkless bench` or `thinkless calibrate`.
|
|
|
407
408
|
|
|
408
409
|
If ThinkLess saves your team time or money, consider
|
|
409
410
|
[sponsoring its development](https://github.com/sponsors/inboxpraveen).
|
|
410
|
-
|
|
411
|
-
|
|
411
|
+
|
|
412
|
+
Model vendors can sponsor runs of their models on the
|
|
413
|
+
[decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/).
|
|
414
|
+
Sponsored runs are done by the maintainers and published as verified,
|
|
415
|
+
whatever the result: sponsorship buys runs, not rankings. Sponsorship also
|
|
416
|
+
funds more providers and more demos.
|
|
412
417
|
|
|
413
418
|
## Citing
|
|
414
419
|
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<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>
|
|
8
8
|
<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
9
|
<img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
|
|
10
|
-
<a href="https://github.
|
|
10
|
+
<a href="https://inboxpraveen.github.io/ThinkLess/benchmarks/"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
|
|
11
11
|
</p>
|
|
12
12
|
|
|
13
13
|
ThinkLess is an open-source decision plane for AI agents. The routine
|
|
@@ -54,7 +54,7 @@ if intent.is_("refund_duplicate_charge"): # only true when the answer is c
|
|
|
54
54
|
Same agent, same 53 labeled support tickets, two decision planes: `llm` sends
|
|
55
55
|
every decision to the LLM, `hybrid` asks rules, GLiNER and Laya first. Hosted
|
|
56
56
|
models ran through OpenRouter, and the dollar figures are what OpenRouter
|
|
57
|
-
billed ([full results](https://github.
|
|
57
|
+
billed ([full results](https://inboxpraveen.github.io/ThinkLess/benchmarks/)):
|
|
58
58
|
|
|
59
59
|
| Fallback LLM | Success, `llm` | Success, `hybrid` | Billed per 1k tickets, `llm` | Billed per 1k tickets, `hybrid` | Decision time |
|
|
60
60
|
|---|---:|---:|---:|---:|---:|
|
|
@@ -80,7 +80,7 @@ billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/
|
|
|
80
80
|
validated on a separate calibration set first. The baseline is the
|
|
81
81
|
strongest form of the LLM design: all six triage questions in one prompt.
|
|
82
82
|
- The support set is 53 synthetic tickets: evidence of the mechanism and its
|
|
83
|
-
failure modes, not a leaderboard. The [benchmarks page](https://github.
|
|
83
|
+
failure modes, not a leaderboard. The [benchmarks page](https://inboxpraveen.github.io/ThinkLess/benchmarks/)
|
|
84
84
|
lists the weak areas found and what was done about each.
|
|
85
85
|
|
|
86
86
|
## Quick start
|
|
@@ -158,11 +158,11 @@ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"
|
|
|
158
158
|
builder.add_conditional_edges(START, intent, intent.destinations)
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
- [LangGraph](https://github.
|
|
161
|
+
- [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
|
|
162
162
|
routers, decision nodes and gated tools.
|
|
163
|
-
- [OpenAI Agents SDK](https://github.
|
|
163
|
+
- [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
|
|
164
164
|
input guardrails, tool guardrails and routing to a specialist agent.
|
|
165
|
-
- [Any framework](https://github.
|
|
165
|
+
- [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
|
|
166
166
|
`route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
|
|
167
167
|
|
|
168
168
|
Before switching anything, measure it. Shadow mode runs ThinkLess next to your
|
|
@@ -183,10 +183,10 @@ def classify(message: str) -> str:
|
|
|
183
183
|
thinkless shadow report shadow/intent.jsonl --volume 2000000
|
|
184
184
|
```
|
|
185
185
|
|
|
186
|
-
The [migration guide](https://github.
|
|
187
|
-
walks through it, and the [FAQ](https://github.
|
|
186
|
+
The [migration guide](https://inboxpraveen.github.io/ThinkLess/guides/migration/)
|
|
187
|
+
walks through it, and the [FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
188
188
|
covers the common questions. To share one engine across services, run it as
|
|
189
|
-
a [decision server or MCP tools](https://github.
|
|
189
|
+
a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
|
|
190
190
|
|
|
191
191
|
## Try the demo agent
|
|
192
192
|
|
|
@@ -209,31 +209,31 @@ thinkless bench intents --dataset banking77
|
|
|
209
209
|
**Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
|
|
210
210
|
want to know and which answers are allowed. They follow the System One wire
|
|
211
211
|
format, so the same question works on every provider.
|
|
212
|
-
[Questions](https://github.
|
|
212
|
+
[Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
|
|
213
213
|
|
|
214
214
|
**A confidence cascade.** Providers are tried cheapest first. Each gets one
|
|
215
215
|
call with every open question it supports; answers that clear their threshold
|
|
216
216
|
close, the rest move on. Unresolved questions come back `uncertain` with the
|
|
217
217
|
best answer seen, and `decision.is_()` never matches an uncertain answer.
|
|
218
|
-
[The cascade](https://github.
|
|
218
|
+
[The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
|
|
219
219
|
|
|
220
220
|
**One meaning of confidence.** Providers disagree about what "confidence"
|
|
221
221
|
means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
|
|
222
222
|
mean different things per backend. ThinkLess derives a single normalized
|
|
223
223
|
confidence from each provider's probabilities.
|
|
224
|
-
[Confidence](https://github.
|
|
224
|
+
[Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
|
|
225
225
|
|
|
226
226
|
**Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
|
|
227
227
|
examples and recommends the lowest one that meets your accuracy target, per
|
|
228
228
|
question and per provider (`thresholds={"intent@gliner": 0.9}`).
|
|
229
|
-
[Calibration](https://github.
|
|
229
|
+
[Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
|
|
230
230
|
|
|
231
231
|
**Traces for everything.** Decisions, provider attempts, generations, tool
|
|
232
232
|
calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
|
|
233
233
|
files, export to any OpenTelemetry backend with GenAI semantic conventions, or
|
|
234
234
|
open the self-contained HTML viewer. Content capture can be switched off
|
|
235
235
|
without losing structure, timings or confidences.
|
|
236
|
-
[Tracing](https://github.
|
|
236
|
+
[Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
237
237
|
|
|
238
238
|
## Providers and backends
|
|
239
239
|
|
|
@@ -253,43 +253,44 @@ without losing structure, timings or confidences.
|
|
|
253
253
|
| `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
|
|
254
254
|
| `AnthropicLLM` | Claude, with server-side refusal fallbacks |
|
|
255
255
|
|
|
256
|
-
Writing your own provider is one class. [Providers](https://github.
|
|
257
|
-
[LLM backends](https://github.
|
|
256
|
+
Writing your own provider is one class. [Providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
257
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/)
|
|
258
258
|
|
|
259
259
|
## Documentation
|
|
260
260
|
|
|
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.
|
|
261
|
+
- [Getting started](https://inboxpraveen.github.io/ThinkLess/getting-started/),
|
|
262
|
+
[installation](https://inboxpraveen.github.io/ThinkLess/guides/installation/)
|
|
263
|
+
- Use it in your agent: [overview](https://inboxpraveen.github.io/ThinkLess/integrations/),
|
|
264
|
+
[LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/),
|
|
265
|
+
[OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/),
|
|
266
|
+
[any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/),
|
|
267
|
+
[migration](https://inboxpraveen.github.io/ThinkLess/guides/migration/),
|
|
268
|
+
[shadow mode](https://inboxpraveen.github.io/ThinkLess/guides/shadow-mode/),
|
|
269
|
+
[FAQ](https://inboxpraveen.github.io/ThinkLess/faq/)
|
|
270
|
+
- Concepts: [the four planes](https://inboxpraveen.github.io/ThinkLess/concepts/planes/),
|
|
271
|
+
[questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/),
|
|
272
|
+
[confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/),
|
|
273
|
+
[the cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/),
|
|
274
|
+
[tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
|
|
275
|
+
- Guides: [the support agent](https://inboxpraveen.github.io/ThinkLess/guides/support-agent/),
|
|
276
|
+
[calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/),
|
|
277
|
+
[providers](https://inboxpraveen.github.io/ThinkLess/guides/providers/),
|
|
278
|
+
[LLM backends](https://inboxpraveen.github.io/ThinkLess/guides/llm-backends/),
|
|
279
|
+
[production](https://inboxpraveen.github.io/ThinkLess/guides/production/),
|
|
280
|
+
[serving](https://inboxpraveen.github.io/ThinkLess/guides/serving/),
|
|
281
|
+
[running a pilot](https://inboxpraveen.github.io/ThinkLess/guides/pilot/),
|
|
282
|
+
[troubleshooting](https://inboxpraveen.github.io/ThinkLess/guides/troubleshooting/)
|
|
283
|
+
- [Benchmarks](https://inboxpraveen.github.io/ThinkLess/benchmarks/), [CLI reference](https://inboxpraveen.github.io/ThinkLess/reference/cli/),
|
|
284
|
+
[Python API](https://inboxpraveen.github.io/ThinkLess/reference/api/), [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/)
|
|
285
285
|
|
|
286
286
|
## Status
|
|
287
287
|
|
|
288
288
|
ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
|
|
289
289
|
traces) is meant to stay stable, and providers, adapters and benchmarks will
|
|
290
|
-
grow.
|
|
291
|
-
|
|
292
|
-
|
|
290
|
+
grow. The [decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/)
|
|
291
|
+
compares decision models on eight public tasks and is open to submissions.
|
|
292
|
+
Next up are more models on it, cross-request batching in the server, and
|
|
293
|
+
calibrated LLM confidence from log probabilities. See the [roadmap](https://inboxpraveen.github.io/ThinkLess/roadmap/).
|
|
293
294
|
|
|
294
295
|
## Contributing
|
|
295
296
|
|
|
@@ -302,8 +303,12 @@ and after from `thinkless bench` or `thinkless calibrate`.
|
|
|
302
303
|
|
|
303
304
|
If ThinkLess saves your team time or money, consider
|
|
304
305
|
[sponsoring its development](https://github.com/sponsors/inboxpraveen).
|
|
305
|
-
|
|
306
|
-
|
|
306
|
+
|
|
307
|
+
Model vendors can sponsor runs of their models on the
|
|
308
|
+
[decision benchmark](https://inboxpraveen.github.io/ThinkLess/decision-benchmark/).
|
|
309
|
+
Sponsored runs are done by the maintainers and published as verified,
|
|
310
|
+
whatever the result: sponsorship buys runs, not rankings. Sponsorship also
|
|
311
|
+
funds more providers and more demos.
|
|
307
312
|
|
|
308
313
|
## Citing
|
|
309
314
|
|
|
@@ -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
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.0"
|
|
@@ -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
|
+
]
|