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.
Files changed (118) hide show
  1. {thinkless-0.3.0 → thinkless-0.4.0}/CHANGELOG.md +21 -0
  2. {thinkless-0.3.0 → thinkless-0.4.0}/PKG-INFO +51 -46
  3. {thinkless-0.3.0 → thinkless-0.4.0}/README.md +50 -45
  4. thinkless-0.4.0/benchmarks/decisions/README.md +18 -0
  5. thinkless-0.4.0/src/thinkless/_version.py +1 -0
  6. thinkless-0.4.0/src/thinkless/bench/decisions/__init__.py +35 -0
  7. thinkless-0.4.0/src/thinkless/bench/decisions/leaderboard.py +191 -0
  8. thinkless-0.4.0/src/thinkless/bench/decisions/run.py +292 -0
  9. thinkless-0.4.0/src/thinkless/bench/decisions/score.py +225 -0
  10. thinkless-0.4.0/src/thinkless/bench/decisions/tasks.json +535 -0
  11. thinkless-0.4.0/src/thinkless/bench/decisions/tasks.py +164 -0
  12. thinkless-0.4.0/src/thinkless/bench/decisions/verify.py +121 -0
  13. thinkless-0.4.0/src/thinkless/cli/decisions.py +199 -0
  14. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/main.py +2 -0
  15. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/base.py +18 -1
  16. thinkless-0.4.0/tests/unit/test_decision_benchmark.py +259 -0
  17. thinkless-0.3.0/src/thinkless/_version.py +0 -1
  18. {thinkless-0.3.0 → thinkless-0.4.0}/.gitignore +0 -0
  19. {thinkless-0.3.0 → thinkless-0.4.0}/LICENSE +0 -0
  20. {thinkless-0.3.0 → thinkless-0.4.0}/pyproject.toml +0 -0
  21. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/__init__.py +0 -0
  22. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/__main__.py +0 -0
  23. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/_hub.py +0 -0
  24. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/_json.py +0 -0
  25. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/__init__.py +0 -0
  26. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/intents.py +0 -0
  27. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/intents_report.py +0 -0
  28. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/metrics.py +0 -0
  29. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/report.py +0 -0
  30. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/bench/support.py +0 -0
  31. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/__init__.py +0 -0
  32. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/serve.py +0 -0
  33. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/shadow.py +0 -0
  34. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/cli/traces.py +0 -0
  35. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/confidence.py +0 -0
  36. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/data/pricing.toml +0 -0
  37. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/data/viewer.html +0 -0
  38. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/decision.py +0 -0
  39. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/__init__.py +0 -0
  40. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/__init__.py +0 -0
  41. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/agent.py +0 -0
  42. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/calibration.jsonl +0 -0
  43. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/scenarios.jsonl +0 -0
  44. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/world.json +0 -0
  45. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/questions.py +0 -0
  46. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/stack.py +0 -0
  47. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/demo/support/world.py +0 -0
  48. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/engine.py +0 -0
  49. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/errors.py +0 -0
  50. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/__init__.py +0 -0
  51. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/_messages.py +0 -0
  52. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/core.py +0 -0
  53. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/langgraph.py +0 -0
  54. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/integrations/openai_agents.py +0 -0
  55. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/limits.py +0 -0
  56. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/__init__.py +0 -0
  57. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/anthropic.py +0 -0
  58. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/base.py +0 -0
  59. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/factory.py +0 -0
  60. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/local.py +0 -0
  61. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/openai_compat.py +0 -0
  62. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/openrouter.py +0 -0
  63. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/llm/scripted.py +0 -0
  64. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/logs.py +0 -0
  65. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/pricing.py +0 -0
  66. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/__init__.py +0 -0
  67. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/gliner.py +0 -0
  68. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/hf.py +0 -0
  69. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/laya.py +0 -0
  70. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/llm.py +0 -0
  71. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/rules.py +0 -0
  72. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/systemone.py +0 -0
  73. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/providers/wire.py +0 -0
  74. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/py.typed +0 -0
  75. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/questions.py +0 -0
  76. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/__init__.py +0 -0
  77. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/app.py +0 -0
  78. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/server/mcp.py +0 -0
  79. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/settings.py +0 -0
  80. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/__init__.py +0 -0
  81. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/compare.py +0 -0
  82. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/report.py +0 -0
  83. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/shadow/runner.py +0 -0
  84. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/__init__.py +0 -0
  85. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/console.py +0 -0
  86. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/export.py +0 -0
  87. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/otel.py +0 -0
  88. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/sinks.py +0 -0
  89. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/span.py +0 -0
  90. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/summary.py +0 -0
  91. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/tracer.py +0 -0
  92. {thinkless-0.3.0 → thinkless-0.4.0}/src/thinkless/tracing/viewer.py +0 -0
  93. {thinkless-0.3.0 → thinkless-0.4.0}/tests/__init__.py +0 -0
  94. {thinkless-0.3.0 → thinkless-0.4.0}/tests/conftest.py +0 -0
  95. {thinkless-0.3.0 → thinkless-0.4.0}/tests/local/__init__.py +0 -0
  96. {thinkless-0.3.0 → thinkless-0.4.0}/tests/local/test_local_models.py +0 -0
  97. {thinkless-0.3.0 → thinkless-0.4.0}/tests/network/__init__.py +0 -0
  98. {thinkless-0.3.0 → thinkless-0.4.0}/tests/network/test_openrouter_live.py +0 -0
  99. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/__init__.py +0 -0
  100. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_bench.py +0 -0
  101. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_cli_and_viewer.py +0 -0
  102. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_confidence.py +0 -0
  103. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_engine.py +0 -0
  104. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_hf_classifier.py +0 -0
  105. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_integrations.py +0 -0
  106. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_limits.py +0 -0
  107. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_llm_decider.py +0 -0
  108. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_openrouter.py +0 -0
  109. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_pricing_and_llm.py +0 -0
  110. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_questions.py +0 -0
  111. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_rules.py +0 -0
  112. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_server.py +0 -0
  113. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_shadow.py +0 -0
  114. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_support_demo.py +0 -0
  115. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_systemone.py +0 -0
  116. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_systemone_sdk_compat.py +0 -0
  117. {thinkless-0.3.0 → thinkless-0.4.0}/tests/unit/test_trace_export.py +0 -0
  118. {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.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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md)):
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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/langgraph.md):
266
+ - [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
267
267
  routers, decision nodes and gated tools.
268
- - [OpenAI Agents SDK](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/openai-agents.md):
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.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/any-framework.md):
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/migration.md)
292
- walks through it, and the [FAQ](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/faq.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/serving.md).
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
362
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/getting-started.md),
367
- [installation](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/installation.md)
368
- - Use it in your agent: [overview](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/index.md),
369
- [LangGraph](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/langgraph.md),
370
- [OpenAI Agents SDK](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/openai-agents.md),
371
- [any framework](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/any-framework.md),
372
- [migration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/migration.md),
373
- [shadow mode](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/shadow-mode.md),
374
- [FAQ](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/faq.md)
375
- - Concepts: [the four planes](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/planes.md),
376
- [questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md),
377
- [confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md),
378
- [the cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md),
379
- [tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
380
- - Guides: [the support agent](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/support-agent.md),
381
- [calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md),
382
- [providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
383
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md),
384
- [production](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/production.md),
385
- [serving](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/serving.md),
386
- [running a pilot](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/pilot.md),
387
- [troubleshooting](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/troubleshooting.md)
388
- - [Benchmarks](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md), [CLI reference](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/cli.md),
389
- [Python API](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/api.md), [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md)
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. Next up are a neutral benchmark for decision models, cross-request
396
- batching in the server, calibrated LLM confidence from log probabilities, and
397
- live Jev runs. See the [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md).
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
- Sponsorship funds frontier-model benchmark runs, more providers and more
411
- demos.
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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md"><img alt="Benchmarks" src="https://img.shields.io/badge/benchmarks-reproducible-brightgreen.svg"></a>
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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md)):
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.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/langgraph.md):
161
+ - [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
162
162
  routers, decision nodes and gated tools.
163
- - [OpenAI Agents SDK](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/openai-agents.md):
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.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/any-framework.md):
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/migration.md)
187
- walks through it, and the [FAQ](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/faq.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/serving.md).
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
257
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md)
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.com/inboxpraveen/ThinkLess/blob/main/docs/getting-started.md),
262
- [installation](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/installation.md)
263
- - Use it in your agent: [overview](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/index.md),
264
- [LangGraph](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/langgraph.md),
265
- [OpenAI Agents SDK](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/openai-agents.md),
266
- [any framework](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/integrations/any-framework.md),
267
- [migration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/migration.md),
268
- [shadow mode](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/shadow-mode.md),
269
- [FAQ](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/faq.md)
270
- - Concepts: [the four planes](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/planes.md),
271
- [questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md),
272
- [confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md),
273
- [the cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md),
274
- [tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
275
- - Guides: [the support agent](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/support-agent.md),
276
- [calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md),
277
- [providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
278
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md),
279
- [production](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/production.md),
280
- [serving](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/serving.md),
281
- [running a pilot](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/pilot.md),
282
- [troubleshooting](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/troubleshooting.md)
283
- - [Benchmarks](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md), [CLI reference](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/cli.md),
284
- [Python API](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/api.md), [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md)
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. Next up are a neutral benchmark for decision models, cross-request
291
- batching in the server, calibrated LLM confidence from log probabilities, and
292
- live Jev runs. See the [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md).
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
- Sponsorship funds frontier-model benchmark runs, more providers and more
306
- demos.
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
+ ]