Skip to content

v0.4.4

Latest

Choose a tag to compare

@byapparov byapparov released this 30 Sep 14:49
4b4661e

Highlights

Gemini: recover when a step ends without a finish reason (#121, #122)

Vertex Gemini sometimes ends a model step with no finish reason: thought chunks only, sometimes with an error embedded in a 200 stream. The CLI used to resend the conversation ending on the model's own turn, which Vertex rejects with 400 Requests ending with a model turn are not supported, and the session failed.

  • A step that ends unknown with no visible output (no text, no delivered tool call) is now a retryable error, subject to the normal retry limit.
  • Before retrying, the failed attempt's parts are removed and its usage is rolled back. Repeated identical tool executions still trigger the doom-loop guard across retries.
  • An unknown finish that produced text is treated as finished (stop), so the answer isn't regenerated.
  • For Gemini targets, including Gemini behind a gateway, OpenRouter or another proxy, a trailing assistant turn without a tool call is never sent. The MAX_STEPS instruction is sent as a user turn, and a hard step cap stops the loop.
  • Terminal provider errors no longer carry raw response headers or bodies.

Verified against real Vertex with fault injection: every injected and natural fault recovered.

Headless (run --format json)

  • New retry event {attempt, code, next} with a stable code (no_finish_reason, rate_limited, overloaded, server_error, network, unknown). It never contains raw provider text. Additive; schemaVersion stays "1".
  • Headless runs now fail (exit 1) when the provider ends with an error or content-filter finish, or when unknown-finish retries are exhausted (#108, #113).
  • step_finish gains an optional termination object with safe provider finish diagnostics. Request IDs are reported only as present or redacted (#109, #114).
  • Tool-call truth: the loop no longer stops on stop while delivered local tool calls are outstanding, and a failed subagent now fails its parent task (#89, #116).
  • Optional model stream idle timeout (#80, #117): off by default. Set AICTRL_MODEL_STREAM_IDLE_TIMEOUT_MS (e.g. 300000) to fail a stalled stream with reason: "timeout", code: "MODEL_STREAM_IDLE_TIMEOUT". The timer pauses while tools run.

See EVENTS.md for the full event contract.

Providers

  • Vertex (#118): a scoped auth client that's reused and loaded lazily; validated projects and locations, including the regional us/eu endpoints; google-vertex-anthropic gets the same handling. An invalid Vertex configuration now affects only the Vertex providers, not every provider.
  • Gemini schemas are normalised for non-native transports (#111, #119).

Other

  • The manual AI review workflow is hardened; the automatic review trigger is removed (#120).
  • UTM tracking added to website links (#107).

Full changelog: v0.4.3...v0.4.4