thinkless 0.2.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.2.0 → thinkless-0.4.0}/CHANGELOG.md +56 -0
  2. {thinkless-0.2.0 → thinkless-0.4.0}/PKG-INFO +112 -32
  3. {thinkless-0.2.0 → thinkless-0.4.0}/README.md +91 -30
  4. thinkless-0.4.0/benchmarks/decisions/README.md +18 -0
  5. {thinkless-0.2.0 → thinkless-0.4.0}/pyproject.toml +13 -2
  6. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/__init__.py +3 -0
  7. thinkless-0.4.0/src/thinkless/_version.py +1 -0
  8. thinkless-0.4.0/src/thinkless/bench/decisions/__init__.py +35 -0
  9. thinkless-0.4.0/src/thinkless/bench/decisions/leaderboard.py +191 -0
  10. thinkless-0.4.0/src/thinkless/bench/decisions/run.py +292 -0
  11. thinkless-0.4.0/src/thinkless/bench/decisions/score.py +225 -0
  12. thinkless-0.4.0/src/thinkless/bench/decisions/tasks.json +535 -0
  13. thinkless-0.4.0/src/thinkless/bench/decisions/tasks.py +164 -0
  14. thinkless-0.4.0/src/thinkless/bench/decisions/verify.py +121 -0
  15. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/metrics.py +16 -0
  16. thinkless-0.4.0/src/thinkless/cli/decisions.py +199 -0
  17. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/cli/main.py +14 -0
  18. thinkless-0.4.0/src/thinkless/cli/serve.py +117 -0
  19. thinkless-0.4.0/src/thinkless/cli/shadow.py +175 -0
  20. thinkless-0.4.0/src/thinkless/cli/traces.py +89 -0
  21. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/engine.py +115 -9
  22. thinkless-0.4.0/src/thinkless/integrations/__init__.py +14 -0
  23. thinkless-0.4.0/src/thinkless/integrations/_messages.py +73 -0
  24. thinkless-0.4.0/src/thinkless/integrations/core.py +205 -0
  25. thinkless-0.4.0/src/thinkless/integrations/langgraph.py +162 -0
  26. thinkless-0.4.0/src/thinkless/integrations/openai_agents.py +185 -0
  27. thinkless-0.4.0/src/thinkless/limits.py +88 -0
  28. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/base.py +18 -1
  29. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/wire.py +92 -2
  30. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/questions.py +30 -1
  31. thinkless-0.4.0/src/thinkless/server/__init__.py +6 -0
  32. thinkless-0.4.0/src/thinkless/server/app.py +194 -0
  33. thinkless-0.4.0/src/thinkless/server/mcp.py +107 -0
  34. thinkless-0.4.0/src/thinkless/shadow/__init__.py +40 -0
  35. thinkless-0.4.0/src/thinkless/shadow/compare.py +77 -0
  36. thinkless-0.4.0/src/thinkless/shadow/report.py +441 -0
  37. thinkless-0.4.0/src/thinkless/shadow/runner.py +515 -0
  38. thinkless-0.4.0/src/thinkless/tracing/export.py +263 -0
  39. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/summary.py +1 -1
  40. thinkless-0.4.0/tests/unit/test_decision_benchmark.py +259 -0
  41. thinkless-0.4.0/tests/unit/test_integrations.py +278 -0
  42. thinkless-0.4.0/tests/unit/test_limits.py +117 -0
  43. thinkless-0.4.0/tests/unit/test_server.py +168 -0
  44. thinkless-0.4.0/tests/unit/test_shadow.py +333 -0
  45. thinkless-0.4.0/tests/unit/test_trace_export.py +84 -0
  46. thinkless-0.2.0/src/thinkless/_version.py +0 -1
  47. {thinkless-0.2.0 → thinkless-0.4.0}/.gitignore +0 -0
  48. {thinkless-0.2.0 → thinkless-0.4.0}/LICENSE +0 -0
  49. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/__main__.py +0 -0
  50. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/_hub.py +0 -0
  51. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/_json.py +0 -0
  52. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/__init__.py +0 -0
  53. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/intents.py +0 -0
  54. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/intents_report.py +0 -0
  55. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/report.py +0 -0
  56. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/support.py +0 -0
  57. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/cli/__init__.py +0 -0
  58. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/confidence.py +0 -0
  59. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/data/pricing.toml +0 -0
  60. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/data/viewer.html +0 -0
  61. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/decision.py +0 -0
  62. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/__init__.py +0 -0
  63. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/__init__.py +0 -0
  64. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/agent.py +0 -0
  65. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/calibration.jsonl +0 -0
  66. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/scenarios.jsonl +0 -0
  67. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/world.json +0 -0
  68. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/questions.py +0 -0
  69. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/stack.py +0 -0
  70. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/world.py +0 -0
  71. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/errors.py +0 -0
  72. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/__init__.py +0 -0
  73. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/anthropic.py +0 -0
  74. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/base.py +0 -0
  75. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/factory.py +0 -0
  76. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/local.py +0 -0
  77. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/openai_compat.py +0 -0
  78. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/openrouter.py +0 -0
  79. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/scripted.py +0 -0
  80. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/logs.py +0 -0
  81. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/pricing.py +0 -0
  82. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/__init__.py +0 -0
  83. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/gliner.py +0 -0
  84. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/hf.py +0 -0
  85. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/laya.py +0 -0
  86. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/llm.py +0 -0
  87. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/rules.py +0 -0
  88. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/systemone.py +0 -0
  89. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/py.typed +0 -0
  90. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/settings.py +0 -0
  91. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/__init__.py +0 -0
  92. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/console.py +0 -0
  93. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/otel.py +0 -0
  94. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/sinks.py +0 -0
  95. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/span.py +0 -0
  96. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/tracer.py +0 -0
  97. {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/viewer.py +0 -0
  98. {thinkless-0.2.0 → thinkless-0.4.0}/tests/__init__.py +0 -0
  99. {thinkless-0.2.0 → thinkless-0.4.0}/tests/conftest.py +0 -0
  100. {thinkless-0.2.0 → thinkless-0.4.0}/tests/local/__init__.py +0 -0
  101. {thinkless-0.2.0 → thinkless-0.4.0}/tests/local/test_local_models.py +0 -0
  102. {thinkless-0.2.0 → thinkless-0.4.0}/tests/network/__init__.py +0 -0
  103. {thinkless-0.2.0 → thinkless-0.4.0}/tests/network/test_openrouter_live.py +0 -0
  104. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/__init__.py +0 -0
  105. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_bench.py +0 -0
  106. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_cli_and_viewer.py +0 -0
  107. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_confidence.py +0 -0
  108. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_engine.py +0 -0
  109. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_hf_classifier.py +0 -0
  110. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_llm_decider.py +0 -0
  111. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_openrouter.py +0 -0
  112. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_pricing_and_llm.py +0 -0
  113. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_questions.py +0 -0
  114. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_rules.py +0 -0
  115. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_support_demo.py +0 -0
  116. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_systemone.py +0 -0
  117. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_systemone_sdk_compat.py +0 -0
  118. {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_tracing.py +0 -0
@@ -6,6 +6,62 @@ 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
+
30
+ ## 0.3.0 - 2026-09-25
31
+
32
+ Shadow mode, framework adapters, limits, a decision server and MCP tools.
33
+
34
+ ### Added
35
+
36
+ - Shadow mode (`thinkless.shadow`): run a candidate engine next to existing
37
+ decision code without changing what it returns, log both answers, and
38
+ report agreement with a 95% interval, the share settled without an LLM,
39
+ cost and latency on both sides, thresholds fitted on production traffic,
40
+ and a verdict per question (`thinkless shadow report`). Disagreements
41
+ export as labeling rows (`thinkless shadow export`). The same class audits
42
+ a live engine against an LLM.
43
+ - Framework adapters (`thinkless.integrations`): a LangGraph router, decision
44
+ node and async decision node; OpenAI Agents SDK input guardrails, tool input
45
+ guardrails and `route_agent`; and framework-neutral `Router`, `route` and
46
+ `gate`, tested with LangChain tools and Pydantic AI. Extras `langgraph` and
47
+ `openai-agents`.
48
+ - Engine deadlines (`deadline_ms` on the engine and per call), spend limits
49
+ (`SpendLimit`, lifetime or rolling window) and per-run caps
50
+ (`engine.run(..., max_cost_usd=...)`). Skipped providers are recorded with
51
+ reason `deadline` or `spend_limit`.
52
+ - A decision server (`thinkless serve`, `thinkless.server.app.create_app`)
53
+ with `/v1/decide` and a System One compatible `/v1/systemone`, so another
54
+ engine's `SystemOne` provider, or TypeSafe's SDK, can use it. Extra
55
+ `server`.
56
+ - MCP tools (`thinkless mcp`, `thinkless.server.mcp.create_mcp_server`): one
57
+ `decide_<question>` tool per registered question. Extra `mcp`.
58
+ - `thinkless trace export` turns traced decisions into labeling rows, and
59
+ `thinkless trace drift` compares two periods and exits with 1 when a
60
+ question drifted.
61
+ - `question_from_spec` rebuilds a question from its spec.
62
+ - Docs: an integrations section, a migration guide, shadow mode, serving,
63
+ a pilot playbook and a FAQ, published to GitHub Pages by a new workflow.
64
+
9
65
  ## 0.2.0 - 2026-09-25
10
66
 
11
67
  First release on PyPI.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: thinkless
3
- Version: 0.2.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
- Project-URL: Documentation, https://github.com/inboxpraveen/ThinkLess/tree/main/docs
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
9
  Project-URL: Changelog, https://github.com/inboxpraveen/ThinkLess/blob/main/CHANGELOG.md
@@ -34,8 +34,12 @@ Provides-Extra: all
34
34
  Requires-Dist: accelerate>=1.0; extra == 'all'
35
35
  Requires-Dist: anthropic>=1.0; extra == 'all'
36
36
  Requires-Dist: datasets>=3.0; extra == 'all'
37
+ Requires-Dist: fastapi>=0.115; extra == 'all'
37
38
  Requires-Dist: gliner2[local]<3,>=2.0; extra == 'all'
39
+ Requires-Dist: langgraph>=1.0; extra == 'all'
38
40
  Requires-Dist: laya<0.4,>=0.3.20; extra == 'all'
41
+ Requires-Dist: mcp>=1.10; extra == 'all'
42
+ Requires-Dist: openai-agents>=0.22; extra == 'all'
39
43
  Requires-Dist: openai>=2.0; extra == 'all'
40
44
  Requires-Dist: opentelemetry-api>=1.25; extra == 'all'
41
45
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25; extra == 'all'
@@ -44,14 +48,20 @@ Requires-Dist: protobuf>=4.25; extra == 'all'
44
48
  Requires-Dist: sentencepiece>=0.2; extra == 'all'
45
49
  Requires-Dist: torch>=2.1; extra == 'all'
46
50
  Requires-Dist: transformers<5,>=4.48; extra == 'all'
51
+ Requires-Dist: uvicorn>=0.30; extra == 'all'
47
52
  Provides-Extra: anthropic
48
53
  Requires-Dist: anthropic>=1.0; extra == 'anthropic'
49
54
  Provides-Extra: bench
50
55
  Requires-Dist: datasets>=3.0; extra == 'bench'
51
56
  Provides-Extra: dev
57
+ Requires-Dist: fastapi>=0.115; extra == 'dev'
58
+ Requires-Dist: langgraph>=1.0; extra == 'dev'
59
+ Requires-Dist: mcp>=1.10; extra == 'dev'
52
60
  Requires-Dist: mkdocs-material>=9.5; extra == 'dev'
53
61
  Requires-Dist: mkdocstrings[python]>=0.26; extra == 'dev'
54
62
  Requires-Dist: mypy>=1.10; extra == 'dev'
63
+ Requires-Dist: openai-agents>=0.22; extra == 'dev'
64
+ Requires-Dist: pydantic-ai-slim>=1.0; extra == 'dev'
55
65
  Requires-Dist: pytest-cov>=5; extra == 'dev'
56
66
  Requires-Dist: pytest>=8; extra == 'dev'
57
67
  Requires-Dist: ruff>=0.6; extra == 'dev'
@@ -61,6 +71,8 @@ Requires-Dist: gliner2[local]<3,>=2.0; extra == 'gliner'
61
71
  Requires-Dist: protobuf>=4.25; extra == 'gliner'
62
72
  Requires-Dist: sentencepiece>=0.2; extra == 'gliner'
63
73
  Requires-Dist: transformers<5,>=4.48; extra == 'gliner'
74
+ Provides-Extra: langgraph
75
+ Requires-Dist: langgraph>=1.0; extra == 'langgraph'
64
76
  Provides-Extra: laya
65
77
  Requires-Dist: laya<0.4,>=0.3.20; extra == 'laya'
66
78
  Requires-Dist: transformers<5,>=4.48; extra == 'laya'
@@ -76,12 +88,19 @@ Provides-Extra: local-llm
76
88
  Requires-Dist: accelerate>=1.0; extra == 'local-llm'
77
89
  Requires-Dist: torch>=2.1; extra == 'local-llm'
78
90
  Requires-Dist: transformers<5,>=4.48; extra == 'local-llm'
91
+ Provides-Extra: mcp
92
+ Requires-Dist: mcp>=1.10; extra == 'mcp'
79
93
  Provides-Extra: openai
80
94
  Requires-Dist: openai>=2.0; extra == 'openai'
95
+ Provides-Extra: openai-agents
96
+ Requires-Dist: openai-agents>=0.22; extra == 'openai-agents'
81
97
  Provides-Extra: otel
82
98
  Requires-Dist: opentelemetry-api>=1.25; extra == 'otel'
83
99
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.25; extra == 'otel'
84
100
  Requires-Dist: opentelemetry-sdk>=1.25; extra == 'otel'
101
+ Provides-Extra: server
102
+ Requires-Dist: fastapi>=0.115; extra == 'server'
103
+ Requires-Dist: uvicorn>=0.30; extra == 'server'
85
104
  Description-Content-Type: text/markdown
86
105
 
87
106
  <h1 align="center">ThinkLess</h1>
@@ -93,7 +112,7 @@ Description-Content-Type: text/markdown
93
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>
94
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>
95
114
  <img alt="Python 3.10+" src="https://img.shields.io/badge/python-3.10%2B-blue.svg">
96
- <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>
97
116
  </p>
98
117
 
99
118
  ThinkLess is an open-source decision plane for AI agents. The routine
@@ -140,7 +159,7 @@ if intent.is_("refund_duplicate_charge"): # only true when the answer is c
140
159
  Same agent, same 53 labeled support tickets, two decision planes: `llm` sends
141
160
  every decision to the LLM, `hybrid` asks rules, GLiNER and Laya first. Hosted
142
161
  models ran through OpenRouter, and the dollar figures are what OpenRouter
143
- billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md)):
162
+ billed ([full results](https://inboxpraveen.github.io/ThinkLess/benchmarks/)):
144
163
 
145
164
  | Fallback LLM | Success, `llm` | Success, `hybrid` | Billed per 1k tickets, `llm` | Billed per 1k tickets, `hybrid` | Decision time |
146
165
  |---|---:|---:|---:|---:|---:|
@@ -166,7 +185,7 @@ billed ([full results](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/
166
185
  validated on a separate calibration set first. The baseline is the
167
186
  strongest form of the LLM design: all six triage questions in one prompt.
168
187
  - The support set is 53 synthetic tickets: evidence of the mechanism and its
169
- 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/)
170
189
  lists the weak areas found and what was done about each.
171
190
 
172
191
  ## Quick start
@@ -229,6 +248,51 @@ No GPU? `pip install thinkless` and run
229
248
  [`examples/01_rules_only.py`](https://github.com/inboxpraveen/ThinkLess/blob/main/examples/01_rules_only.py): the API, the cascade
230
249
  and the traces with no model downloads.
231
250
 
251
+ ## Use it in your agent
252
+
253
+ ThinkLess sits inside the framework you already use, at the points where the
254
+ agent decides something: which path to take, whether an input is safe,
255
+ whether a tool call is inside policy. Uncertain decisions go to the code you
256
+ run today, so nothing gets worse while the routine ones get cheaper.
257
+
258
+ ```python
259
+ from thinkless.integrations.langgraph import router
260
+
261
+ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"},
262
+ default="agent") # your existing LLM node
263
+ builder.add_conditional_edges(START, intent, intent.destinations)
264
+ ```
265
+
266
+ - [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
267
+ routers, decision nodes and gated tools.
268
+ - [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
269
+ input guardrails, tool guardrails and routing to a specialist agent.
270
+ - [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
271
+ `route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
272
+
273
+ Before switching anything, measure it. Shadow mode runs ThinkLess next to your
274
+ current code on live traffic and reports, per decision, the agreement with a
275
+ confidence interval and what it would save:
276
+
277
+ ```python
278
+ from thinkless.shadow import Shadow
279
+
280
+ shadow = Shadow(engine, log="shadow/intent.jsonl", sample=0.2)
281
+
282
+ @shadow.watch(INTENT, cost_usd=0.0004) # today's cost per call
283
+ def classify(message: str) -> str:
284
+ ... # unchanged, and still what users get
285
+ ```
286
+
287
+ ```bash
288
+ thinkless shadow report shadow/intent.jsonl --volume 2000000
289
+ ```
290
+
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
+ covers the common questions. To share one engine across services, run it as
294
+ a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
295
+
232
296
  ## Try the demo agent
233
297
 
234
298
  A complete customer support agent ships with the package: a mock store with
@@ -250,31 +314,31 @@ thinkless bench intents --dataset banking77
250
314
  **Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
251
315
  want to know and which answers are allowed. They follow the System One wire
252
316
  format, so the same question works on every provider.
253
- [Questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md)
317
+ [Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
254
318
 
255
319
  **A confidence cascade.** Providers are tried cheapest first. Each gets one
256
320
  call with every open question it supports; answers that clear their threshold
257
321
  close, the rest move on. Unresolved questions come back `uncertain` with the
258
322
  best answer seen, and `decision.is_()` never matches an uncertain answer.
259
- [The cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md)
323
+ [The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
260
324
 
261
325
  **One meaning of confidence.** Providers disagree about what "confidence"
262
326
  means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
263
327
  mean different things per backend. ThinkLess derives a single normalized
264
328
  confidence from each provider's probabilities.
265
- [Confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md)
329
+ [Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
266
330
 
267
331
  **Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
268
332
  examples and recommends the lowest one that meets your accuracy target, per
269
333
  question and per provider (`thresholds={"intent@gliner": 0.9}`).
270
- [Calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md)
334
+ [Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
271
335
 
272
336
  **Traces for everything.** Decisions, provider attempts, generations, tool
273
337
  calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
274
338
  files, export to any OpenTelemetry backend with GenAI semantic conventions, or
275
339
  open the self-contained HTML viewer. Content capture can be switched off
276
340
  without losing structure, timings or confidences.
277
- [Tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
341
+ [Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
278
342
 
279
343
  ## Providers and backends
280
344
 
@@ -294,32 +358,44 @@ without losing structure, timings or confidences.
294
358
  | `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
295
359
  | `AnthropicLLM` | Claude, with server-side refusal fallbacks |
296
360
 
297
- Writing your own provider is one class. [Providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
298
- [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/)
299
363
 
300
364
  ## Documentation
301
365
 
302
- - [Getting started](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/getting-started.md)
303
- - Concepts: [the four planes](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/planes.md),
304
- [questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md),
305
- [confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md),
306
- [the cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md),
307
- [tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
308
- - Guides: [the support agent](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/support-agent.md),
309
- [calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md),
310
- [providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
311
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md),
312
- [production](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/production.md),
313
- [troubleshooting](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/troubleshooting.md)
314
- - [Benchmarks](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md), [CLI reference](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/cli.md),
315
- [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/)
316
390
 
317
391
  ## Status
318
392
 
319
- ThinkLess is at 0.1: the core API (questions, the engine, decisions and
320
- traces) is meant to stay stable, and providers and benchmarks will grow.
321
- Next up are shadow mode, calibration from traces, calibrated LLM confidence
322
- from log probabilities, and live Jev runs. See the [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md).
393
+ ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
394
+ traces) is meant to stay stable, and providers, adapters and benchmarks will
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/).
323
399
 
324
400
  ## Contributing
325
401
 
@@ -332,8 +408,12 @@ and after from `thinkless bench` or `thinkless calibrate`.
332
408
 
333
409
  If ThinkLess saves your team time or money, consider
334
410
  [sponsoring its development](https://github.com/sponsors/inboxpraveen).
335
- Sponsorship funds frontier-model benchmark runs, more providers and more
336
- 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.
337
417
 
338
418
  ## Citing
339
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
@@ -143,6 +143,51 @@ No GPU? `pip install thinkless` and run
143
143
  [`examples/01_rules_only.py`](https://github.com/inboxpraveen/ThinkLess/blob/main/examples/01_rules_only.py): the API, the cascade
144
144
  and the traces with no model downloads.
145
145
 
146
+ ## Use it in your agent
147
+
148
+ ThinkLess sits inside the framework you already use, at the points where the
149
+ agent decides something: which path to take, whether an input is safe,
150
+ whether a tool call is inside policy. Uncertain decisions go to the code you
151
+ run today, so nothing gets worse while the routine ones get cheaper.
152
+
153
+ ```python
154
+ from thinkless.integrations.langgraph import router
155
+
156
+ intent = router(engine, INTENT, {"order_status": "tracking", "refund": "refunds"},
157
+ default="agent") # your existing LLM node
158
+ builder.add_conditional_edges(START, intent, intent.destinations)
159
+ ```
160
+
161
+ - [LangGraph](https://inboxpraveen.github.io/ThinkLess/integrations/langgraph/):
162
+ routers, decision nodes and gated tools.
163
+ - [OpenAI Agents SDK](https://inboxpraveen.github.io/ThinkLess/integrations/openai-agents/):
164
+ input guardrails, tool guardrails and routing to a specialist agent.
165
+ - [Any framework](https://inboxpraveen.github.io/ThinkLess/integrations/any-framework/):
166
+ `route` and `gate` for Pydantic AI, a hand-written loop, or anything else.
167
+
168
+ Before switching anything, measure it. Shadow mode runs ThinkLess next to your
169
+ current code on live traffic and reports, per decision, the agreement with a
170
+ confidence interval and what it would save:
171
+
172
+ ```python
173
+ from thinkless.shadow import Shadow
174
+
175
+ shadow = Shadow(engine, log="shadow/intent.jsonl", sample=0.2)
176
+
177
+ @shadow.watch(INTENT, cost_usd=0.0004) # today's cost per call
178
+ def classify(message: str) -> str:
179
+ ... # unchanged, and still what users get
180
+ ```
181
+
182
+ ```bash
183
+ thinkless shadow report shadow/intent.jsonl --volume 2000000
184
+ ```
185
+
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
+ covers the common questions. To share one engine across services, run it as
189
+ a [decision server or MCP tools](https://inboxpraveen.github.io/ThinkLess/guides/serving/).
190
+
146
191
  ## Try the demo agent
147
192
 
148
193
  A complete customer support agent ships with the package: a mock store with
@@ -164,31 +209,31 @@ thinkless bench intents --dataset banking77
164
209
  **Typed questions.** `Choice`, `Score`, `YesNo` and `Extract` declare what you
165
210
  want to know and which answers are allowed. They follow the System One wire
166
211
  format, so the same question works on every provider.
167
- [Questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md)
212
+ [Questions](https://inboxpraveen.github.io/ThinkLess/concepts/questions/)
168
213
 
169
214
  **A confidence cascade.** Providers are tried cheapest first. Each gets one
170
215
  call with every open question it supports; answers that clear their threshold
171
216
  close, the rest move on. Unresolved questions come back `uncertain` with the
172
217
  best answer seen, and `decision.is_()` never matches an uncertain answer.
173
- [The cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md)
218
+ [The cascade](https://inboxpraveen.github.io/ThinkLess/concepts/cascade/)
174
219
 
175
220
  **One meaning of confidence.** Providers disagree about what "confidence"
176
221
  means (Laya and TypeSafe compute it differently), so a threshold of 0.8 would
177
222
  mean different things per backend. ThinkLess derives a single normalized
178
223
  confidence from each provider's probabilities.
179
- [Confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md)
224
+ [Confidence](https://inboxpraveen.github.io/ThinkLess/concepts/confidence/)
180
225
 
181
226
  **Thresholds from data.** `thinkless calibrate` sweeps thresholds on labeled
182
227
  examples and recommends the lowest one that meets your accuracy target, per
183
228
  question and per provider (`thresholds={"intent@gliner": 0.9}`).
184
- [Calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md)
229
+ [Calibration](https://inboxpraveen.github.io/ThinkLess/guides/calibration/)
185
230
 
186
231
  **Traces for everything.** Decisions, provider attempts, generations, tool
187
232
  calls and rule checks are spans with W3C-compatible ids. Write JSONL audit
188
233
  files, export to any OpenTelemetry backend with GenAI semantic conventions, or
189
234
  open the self-contained HTML viewer. Content capture can be switched off
190
235
  without losing structure, timings or confidences.
191
- [Tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
236
+ [Tracing](https://inboxpraveen.github.io/ThinkLess/concepts/tracing/)
192
237
 
193
238
  ## Providers and backends
194
239
 
@@ -208,32 +253,44 @@ without losing structure, timings or confidences.
208
253
  | `OpenAICompatibleLLM` | OpenAI, Ollama, vLLM, LM Studio, llama.cpp, Groq |
209
254
  | `AnthropicLLM` | Claude, with server-side refusal fallbacks |
210
255
 
211
- Writing your own provider is one class. [Providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
212
- [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/)
213
258
 
214
259
  ## Documentation
215
260
 
216
- - [Getting started](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/getting-started.md)
217
- - Concepts: [the four planes](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/planes.md),
218
- [questions](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/questions.md),
219
- [confidence](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/confidence.md),
220
- [the cascade](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/cascade.md),
221
- [tracing](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/concepts/tracing.md)
222
- - Guides: [the support agent](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/support-agent.md),
223
- [calibration](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/calibration.md),
224
- [providers](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/providers.md),
225
- [LLM backends](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/llm-backends.md),
226
- [production](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/production.md),
227
- [troubleshooting](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/guides/troubleshooting.md)
228
- - [Benchmarks](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/benchmarks.md), [CLI reference](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/reference/cli.md),
229
- [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/)
230
285
 
231
286
  ## Status
232
287
 
233
- ThinkLess is at 0.1: the core API (questions, the engine, decisions and
234
- traces) is meant to stay stable, and providers and benchmarks will grow.
235
- Next up are shadow mode, calibration from traces, calibrated LLM confidence
236
- from log probabilities, and live Jev runs. See the [roadmap](https://github.com/inboxpraveen/ThinkLess/blob/main/docs/roadmap.md).
288
+ ThinkLess is pre-1.0: the core API (questions, the engine, decisions and
289
+ traces) is meant to stay stable, and providers, adapters and benchmarks will
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/).
237
294
 
238
295
  ## Contributing
239
296
 
@@ -246,8 +303,12 @@ and after from `thinkless bench` or `thinkless calibrate`.
246
303
 
247
304
  If ThinkLess saves your team time or money, consider
248
305
  [sponsoring its development](https://github.com/sponsors/inboxpraveen).
249
- Sponsorship funds frontier-model benchmark runs, more providers and more
250
- 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.
251
312
 
252
313
  ## Citing
253
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
+ ```
@@ -70,7 +70,13 @@ otel = [
70
70
  ]
71
71
  # Public dataset benchmarks.
72
72
  bench = ["datasets>=3.0"]
73
- all = ["thinkless[local,openai,anthropic,otel,bench]"]
73
+ # Agent framework adapters (thinkless.integrations).
74
+ langgraph = ["langgraph>=1.0"]
75
+ openai-agents = ["openai-agents>=0.22"]
76
+ # The decision server (thinkless serve) and MCP tools (thinkless mcp).
77
+ server = ["fastapi>=0.115", "uvicorn>=0.30"]
78
+ mcp = ["mcp>=1.10"]
79
+ all = ["thinkless[local,openai,anthropic,otel,bench,langgraph,openai-agents,server,mcp]"]
74
80
  dev = [
75
81
  "pytest>=8",
76
82
  "pytest-cov>=5",
@@ -79,11 +85,16 @@ dev = [
79
85
  "typesafe-sdk>=0.7",
80
86
  "mkdocs-material>=9.5",
81
87
  "mkdocstrings[python]>=0.26",
88
+ "langgraph>=1.0",
89
+ "openai-agents>=0.22",
90
+ "pydantic-ai-slim>=1.0",
91
+ "fastapi>=0.115",
92
+ "mcp>=1.10",
82
93
  ]
83
94
 
84
95
  [project.urls]
85
96
  Homepage = "https://github.com/inboxpraveen/ThinkLess"
86
- Documentation = "https://github.com/inboxpraveen/ThinkLess/tree/main/docs"
97
+ Documentation = "https://inboxpraveen.github.io/ThinkLess/"
87
98
  Repository = "https://github.com/inboxpraveen/ThinkLess"
88
99
  Issues = "https://github.com/inboxpraveen/ThinkLess/issues"
89
100
  Changelog = "https://github.com/inboxpraveen/ThinkLess/blob/main/CHANGELOG.md"
@@ -28,6 +28,7 @@ from ._version import __version__
28
28
  from .decision import Answer, Attempt, Decision, Plane, Status, Usage
29
29
  from .engine import Engine, Run
30
30
  from .errors import ConfigurationError, ThinkLessError
31
+ from .limits import SpendLimit, SpendLimitError
31
32
  from .logs import configure_logging
32
33
  from .questions import Choice, Extract, Kind, Question, Score, YesNo
33
34
  from .settings import load_env
@@ -49,6 +50,8 @@ __all__ = [
49
50
  "Question",
50
51
  "Run",
51
52
  "Score",
53
+ "SpendLimit",
54
+ "SpendLimitError",
52
55
  "Status",
53
56
  "ThinkLessError",
54
57
  "TraceSummary",
@@ -0,0 +1 @@
1
+ __version__ = "0.4.0"