Skip to content

Agently 4.1.3.5 Release Notes

Languages: English · 中文

Agently 4.1.3.5 is a release-line stability slice for the request foundation. It focuses on two root contracts: structured output parsing must be stable across local models, and one Agent instance must be safe to reuse while each turn keeps its request prompt isolated.

What Changed

Structured output defaults are settings-owned

Omitted .output(..., format=...) now reads prompt.default_output_format from the active settings chain. The global default remains json. Explicit format="auto" and prompt.default_output_format="auto" are still available when the caller has validated the target model and schema family.

This release keeps auto available but no longer treats it as the default strategy. Recent local qwen2.5:7b checks showed that hybrid-style responses can omit required section headers or echo scaffold comments into text fields, so the framework default stays conservative.

Required fields must contain meaningful values

Tuple ensure=True and runtime ensure_keys now require the target path to resolve to a meaningful value. Missing keys, None, blank strings, empty wildcard matches, and wildcard matches containing blank required values fail validation and consume the normal retry budget. Typed falsey values such as False and 0 remain valid.

AgentTurn owns request-scoped prompt drafts

Non-always=True Agent quick prompt chains create an isolated AgentTurn request draft. Expression-local chaining remains concise:

python
result = await agent.input("Review this ticket.").output({
    "answer": (str, "final answer", True),
}).async_start()

When setup is split across statements, conditionals, or helper functions, hold the turn explicitly:

python
turn = agent.create_turn()
turn.input("Review this ticket.")
turn.output({"answer": (str, "final answer", True)})
result = await turn.async_start()

set_turn_prompt(...) names the one-turn write surface

set_turn_prompt(...) is now the recommended name for writing a prompt slot for one turn. set_request_prompt(...) remains a compatibility alias with the same behavior and is not deprecated.

Prompt config files now accept .turn as the recommended turn-scoped section; .request remains accepted for compatibility.

yaml
.turn:
  input: Review this ticket.
  output:
    $format: json
    answer:
      $type: str
      $ensure: true

Bash sandbox action descriptions include policy limits

register_bash_sandbox_action(...) and agent.enable_shell(...) now append the model-visible command prefix allowlist, allowed working-directory roots, and timeout to the action description. This keeps shell capability boundaries visible to the model when the action is exposed.

Compatibility

  • Package version: 4.1.3.5.
  • Release manifest: compatibility/releases/4.1.3.5.json.
  • Recommended agently-devtools: >=0.1.7,<0.2.0.
  • set_request_prompt(...) and .request prompt config remain compatible.

Validation Summary

  • Editable install smoke against the course script with local qwen2.5:7b passed repeated structured-output checks without missing key sections or scaffold comments.
  • Targeted regression tests cover settings-owned output defaults, meaningful required values, AgentTurn request-scoped prompt drafts, and set_turn_prompt(...) compatibility.
  • Static typing regressions cover AgentTurn forwarding, ModelResponse stream facades, specific event tuple items, AgentExecution stream items, and Skills stream handler aliases exposed from agently and agently.types.data.
  • Agently-Skills guidance was updated and validated with the companion validation suite.

Deferred Scope

This release does not merge response and result. ModelResponse already proxies the common result readers, while response.result remains the stable cache/materialization facade for text, data, metadata, validation, and streaming.