Files
openworker/docs
Devika Verma 1746c9ae20 Add a reasoning_effort setting translated per provider and recorded per reply (OPE-176)
OpenWorker had no way to choose how hard a model thinks per reply; the level
was whatever each endpoint defaulted to (Anthropic: high; Kimi K3 on
Together: max), and a run record could not state it.

- `Config.reasoning_effort` (low | medium | high | xhigh | max, Anthropic's
  vocabulary), config.toml / workspace / `COWORKER_REASONING_EFFORT`,
  validated; unset sends nothing so existing requests are unchanged.
- `build_engine` threads it through `model_settings` like `max_tokens`.
- providers/effort.py: the level→parameter tables and the nearest-supported
  rule (ties go up). Anthropic adaptive models get `output_config.effort`
  (per-model support from the effort doc, read 2026-09-08); budget-thinking
  models get `thinking.budget_tokens` (2,048 / 8,192 / 16,000 / 24,000 /
  32,000, max_tokens floored above); OpenAI-compatible endpoints get
  `reasoning_effort` (Kimi K3: low/high/max verified; others the OpenAI
  vocabulary). Gemini, Bedrock, Responses: not sent, recorded as such.
- Fallback: an endpoint that rejects the parameter (400 naming it) gets the
  request once more without it; the model is remembered for the run.
- Record: `AssistantTurn.effort` → `reasoning_effort` sidecar on every
  assistant message and on the ASSISTANT_MESSAGE event: {requested,
  effective, param, note}; stripped before provider calls. When a level is
  configured but the provider reports nothing, the record says so.
- docs/config.example.toml documents the key.

Tests: tests/test_reasoning_effort.py, 40 cases (levels, config layering and
rejection, build_engine plumbing, mapping tables incl. every curated model at
every level, Anthropic complete/stream/budget/fallback/unrelated error,
OpenAI-compatible unset/mapped/fallback, engine record and outbound strip).
2026-09-08 20:22:10 +05:30
..