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.
- {thinkless-0.2.0 → thinkless-0.4.0}/CHANGELOG.md +56 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/PKG-INFO +112 -32
- {thinkless-0.2.0 → thinkless-0.4.0}/README.md +91 -30
- thinkless-0.4.0/benchmarks/decisions/README.md +18 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/pyproject.toml +13 -2
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/__init__.py +3 -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.2.0 → thinkless-0.4.0}/src/thinkless/bench/metrics.py +16 -0
- thinkless-0.4.0/src/thinkless/cli/decisions.py +199 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/cli/main.py +14 -0
- thinkless-0.4.0/src/thinkless/cli/serve.py +117 -0
- thinkless-0.4.0/src/thinkless/cli/shadow.py +175 -0
- thinkless-0.4.0/src/thinkless/cli/traces.py +89 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/engine.py +115 -9
- thinkless-0.4.0/src/thinkless/integrations/__init__.py +14 -0
- thinkless-0.4.0/src/thinkless/integrations/_messages.py +73 -0
- thinkless-0.4.0/src/thinkless/integrations/core.py +205 -0
- thinkless-0.4.0/src/thinkless/integrations/langgraph.py +162 -0
- thinkless-0.4.0/src/thinkless/integrations/openai_agents.py +185 -0
- thinkless-0.4.0/src/thinkless/limits.py +88 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/base.py +18 -1
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/wire.py +92 -2
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/questions.py +30 -1
- thinkless-0.4.0/src/thinkless/server/__init__.py +6 -0
- thinkless-0.4.0/src/thinkless/server/app.py +194 -0
- thinkless-0.4.0/src/thinkless/server/mcp.py +107 -0
- thinkless-0.4.0/src/thinkless/shadow/__init__.py +40 -0
- thinkless-0.4.0/src/thinkless/shadow/compare.py +77 -0
- thinkless-0.4.0/src/thinkless/shadow/report.py +441 -0
- thinkless-0.4.0/src/thinkless/shadow/runner.py +515 -0
- thinkless-0.4.0/src/thinkless/tracing/export.py +263 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/summary.py +1 -1
- thinkless-0.4.0/tests/unit/test_decision_benchmark.py +259 -0
- thinkless-0.4.0/tests/unit/test_integrations.py +278 -0
- thinkless-0.4.0/tests/unit/test_limits.py +117 -0
- thinkless-0.4.0/tests/unit/test_server.py +168 -0
- thinkless-0.4.0/tests/unit/test_shadow.py +333 -0
- thinkless-0.4.0/tests/unit/test_trace_export.py +84 -0
- thinkless-0.2.0/src/thinkless/_version.py +0 -1
- {thinkless-0.2.0 → thinkless-0.4.0}/.gitignore +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/LICENSE +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/__main__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/_hub.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/_json.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/intents.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/intents_report.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/report.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/bench/support.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/cli/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/confidence.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/data/pricing.toml +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/data/viewer.html +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/decision.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/agent.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/calibration.jsonl +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/scenarios.jsonl +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/data/world.json +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/questions.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/stack.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/demo/support/world.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/errors.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/anthropic.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/base.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/factory.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/local.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/openai_compat.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/openrouter.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/llm/scripted.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/logs.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/pricing.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/gliner.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/hf.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/laya.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/llm.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/rules.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/providers/systemone.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/py.typed +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/settings.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/console.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/otel.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/sinks.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/span.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/tracer.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/src/thinkless/tracing/viewer.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/conftest.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/local/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/local/test_local_models.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/network/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/network/test_openrouter_live.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/__init__.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_bench.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_cli_and_viewer.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_confidence.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_engine.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_hf_classifier.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_llm_decider.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_openrouter.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_pricing_and_llm.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_questions.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_rules.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_support_demo.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_systemone.py +0 -0
- {thinkless-0.2.0 → thinkless-0.4.0}/tests/unit/test_systemone_sdk_compat.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
298
|
-
[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/)
|
|
299
363
|
|
|
300
364
|
## Documentation
|
|
301
365
|
|
|
302
|
-
- [Getting started](https://github.
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
[
|
|
306
|
-
[
|
|
307
|
-
[
|
|
308
|
-
|
|
309
|
-
[
|
|
310
|
-
[
|
|
311
|
-
|
|
312
|
-
[
|
|
313
|
-
[
|
|
314
|
-
|
|
315
|
-
[
|
|
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
|
|
320
|
-
traces) is meant to stay stable, and providers and benchmarks will
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
336
|
-
|
|
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.
|
|
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
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
212
|
-
[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/)
|
|
213
258
|
|
|
214
259
|
## Documentation
|
|
215
260
|
|
|
216
|
-
- [Getting started](https://github.
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
[
|
|
220
|
-
[
|
|
221
|
-
[
|
|
222
|
-
|
|
223
|
-
[
|
|
224
|
-
[
|
|
225
|
-
|
|
226
|
-
[
|
|
227
|
-
[
|
|
228
|
-
|
|
229
|
-
[
|
|
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
|
|
234
|
-
traces) is meant to stay stable, and providers and benchmarks will
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
250
|
-
|
|
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
|
-
|
|
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.
|
|
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"
|