miniswen 1.3.0 → 1.3.1
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.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/lib/miniswen/agent.rb +8 -9
- data/lib/miniswen/cli.rb +4 -0
- data/lib/miniswen/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e4c9e3b53432be806eb3a0822777bafd74b6656e5c3577e2b7a41f70f24f6a97
|
|
4
|
+
data.tar.gz: a533f95356c1b8ba40606a25cc79f6e6da885fe42251daf436dcad62df6a273e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bf213b85fd14ef0ec93b94409361f490b82769f70b6d6fbef8917688a9510c29366f7825c0ecdf951824a42ed19a33a23530679c23108f852996486ffd5d92db
|
|
7
|
+
data.tar.gz: a9328e4313ce9abbe5843368428f4e85752cc9690c00e6bfe8c68321e8c820ce1000996472c76aded6eef0fa988815c9a2a7348bc12bc953ea356f980184bd71
|
data/README.md
CHANGED
|
@@ -88,6 +88,7 @@ agent:
|
|
|
88
88
|
timeout: 30m
|
|
89
89
|
step_limit: 100
|
|
90
90
|
cost_limit: 5.0
|
|
91
|
+
# max_output_tokens: 32768 # [optional] output cap per model call, for hosts that reserve the model's full max output out of the context window (default: the provider's)
|
|
91
92
|
environment:
|
|
92
93
|
network: # the sandbox network while the agent works: just enough to reach the model
|
|
93
94
|
mode: allowlist
|
|
@@ -218,7 +219,7 @@ ar-archive-book-access miniswen-installed gpt-5.6-luna 1 completed 0.0
|
|
|
218
219
|
6 trials: 6 scored, 0 invalid, 6 solved (100%) · $0.0801 · pass@2 3/3 tasks (100%)
|
|
219
220
|
```
|
|
220
221
|
|
|
221
|
-
`lemans run` runs all the tasks for the model defined in `bench.yml` and prints the report at the end. You can override the model(s) to use (`--model`), the number of attempts (`--attempts`), or select specific tasks by name (`--task=ac-throttle-search`, may be repeated).
|
|
222
|
+
`lemans run` runs all the tasks for the model defined in `bench.yml` and prints the report at the end. You can override the model(s) to use (`--model`), the agent's output cap per model call (`--max-output-tokens`), the number of attempts (`--attempts`), or select specific tasks by name (`--task=ac-throttle-search`, may be repeated).
|
|
222
223
|
|
|
223
224
|
Each trial writes a flat `runs/<model>/<task>__<id>/` directory:
|
|
224
225
|
|
|
@@ -253,7 +254,7 @@ gpt-5.6-luna ar-archive-book-access 2/2 2m 23s $0.0132 12.5 156905
|
|
|
253
254
|
| --- | --- |
|
|
254
255
|
| `lemans init` | Scaffold a new bench directory: an annotated `bench.yml` and two example tasks |
|
|
255
256
|
| `lemans tasks` | List the tasks in a bench (`--tag` to filter) |
|
|
256
|
-
| `lemans run` | Run tasks and grade them (`--task`, `--tag`, `--agent`, `--model`, `-k`, `-c`, `--resume`) |
|
|
257
|
+
| `lemans run` | Run tasks and grade them (`--task`, `--tag`, `--agent`, `--model`, `--max-output-tokens`, `-k`, `-c`, `--resume`) |
|
|
257
258
|
| `lemans report` | Summarize `runs/` as a table or CSV (`--task`, `--tag`, `--metadata key:value` to filter, `-A [task-agent-model]` to aggregate, `-S <column>` to sort); repeated attempts add pass@k per model × task, fractional grading a `credit` column |
|
|
258
259
|
| `lemans clobber` | Delete run results (`--task`, `--ttl 10m\|2h\|1d`, `--invalid`, `-f` to skip the confirmation) |
|
|
259
260
|
|
data/lib/miniswen/agent.rb
CHANGED
|
@@ -14,7 +14,7 @@ module Miniswen
|
|
|
14
14
|
|
|
15
15
|
# Both finish_reason dialects accepted raw: OpenAI-shaped providers say
|
|
16
16
|
# "length"/"tool_calls", Anthropic says "max_tokens"/"tool_use".
|
|
17
|
-
TRUNCATION_FINISH_REASONS = %w[length max_tokens].freeze
|
|
17
|
+
TRUNCATION_FINISH_REASONS = %w[length max_tokens model_context_window_exceeded].freeze
|
|
18
18
|
CLAIMED_TOOL_FINISH_REASONS = %w[tool_calls tool_use].freeze
|
|
19
19
|
# A safety stop, which arrives looking exactly like a model that forgot
|
|
20
20
|
# to call the tool: no content, no tool call, and — since the provider
|
|
@@ -27,11 +27,6 @@ module Miniswen
|
|
|
27
27
|
# The breakpoint marker Anthropic reads, shaped the way OpenRouter forwards it.
|
|
28
28
|
CACHE_CONTROL = { type: "ephemeral" }.freeze
|
|
29
29
|
|
|
30
|
-
# Left unset, the provider reserves the model's advertised maximum output
|
|
31
|
-
# ahead of the prompt (qwen3.8-27b: 128K of a 256K window), halving the
|
|
32
|
-
# history an agent turn of a few hundred tokens can build on.
|
|
33
|
-
MAX_OUTPUT_TOKENS = 32_768
|
|
34
|
-
|
|
35
30
|
EXEC_ENV = {
|
|
36
31
|
"PAGER" => "cat",
|
|
37
32
|
"MANPAGER" => "cat",
|
|
@@ -234,14 +229,15 @@ module Miniswen
|
|
|
234
229
|
|
|
235
230
|
attr_reader :messages, :environment
|
|
236
231
|
|
|
237
|
-
private attr_reader :max_steps, :max_time, :max_cost, :exec_timeout,
|
|
232
|
+
private attr_reader :max_steps, :max_time, :max_cost, :exec_timeout, :max_output_tokens,
|
|
238
233
|
:clock, :reporter
|
|
239
234
|
|
|
240
235
|
# `model` is a litellm-style name ("openrouter/z-ai/glm-5.2"), optionally
|
|
241
236
|
# suffixed with a reasoning effort ("openrouter/openai/gpt-5.6-luna#xhigh").
|
|
242
237
|
# Limits of 0 or nil are disabled.
|
|
243
238
|
def initialize(model:, environment:, max_steps: 0, max_time: 0, max_cost: nil,
|
|
244
|
-
exec_timeout: 30,
|
|
239
|
+
exec_timeout: 30, max_output_tokens: 0,
|
|
240
|
+
clock: -> { Process.clock_gettime(Process::CLOCK_MONOTONIC) },
|
|
245
241
|
reporter: nil)
|
|
246
242
|
name, @effort = model.split("#", 2)
|
|
247
243
|
@provider, @id = name.split("/", 2)
|
|
@@ -259,6 +255,7 @@ module Miniswen
|
|
|
259
255
|
@max_time = max_time.to_f
|
|
260
256
|
@max_cost = max_cost
|
|
261
257
|
@exec_timeout = exec_timeout
|
|
258
|
+
@max_output_tokens = max_output_tokens.to_i
|
|
262
259
|
|
|
263
260
|
@clock = clock
|
|
264
261
|
@reporter = reporter
|
|
@@ -551,7 +548,9 @@ module Miniswen
|
|
|
551
548
|
# OpenAI itself retired `max_tokens` for its reasoning models; the
|
|
552
549
|
# OpenAI-compatible providers and Anthropic still read it.
|
|
553
550
|
def output_cap_params(model_info)
|
|
554
|
-
|
|
551
|
+
return {} if max_output_tokens.zero?
|
|
552
|
+
|
|
553
|
+
cap = [ info&.max_tokens, max_output_tokens ].compact.min
|
|
555
554
|
provider_class = RubyLLM::Provider.providers[model_info.provider.to_sym]
|
|
556
555
|
if [ RubyLLM::Providers::OpenAI, RubyLLM::Providers::Azure ].include?(provider_class)
|
|
557
556
|
{ max_completion_tokens: cap }
|
data/lib/miniswen/cli.rb
CHANGED
|
@@ -123,6 +123,10 @@ module Miniswen
|
|
|
123
123
|
options[:exec_timeout] = v
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
+
opts.on("--max-output-tokens=TOKENS", Integer, "Output cap per model call (default: the provider's)") do |v|
|
|
127
|
+
options[:max_output_tokens] = v
|
|
128
|
+
end
|
|
129
|
+
|
|
126
130
|
opts.on("-q", "--quiet", "Disable progress output") do
|
|
127
131
|
@quiet = true
|
|
128
132
|
end
|
data/lib/miniswen/version.rb
CHANGED