# What's New

> Release notes and highlights. See full changelog for details.

- Skill: `tools-only/what-s-new` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add tools-only/what-s-new`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tools-only/what-s-new/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tools-only (https://skillmd.com/u/tools-only)
- Updated: 2026-09-29
- Page: https://skillmd.com/skills/tools-only/what-s-new

---

# What's New

Release notes and highlights. See full changelog for details.

- [Changelog](https://github.com/lydakis/alloy/blob/main/CHANGELOG.md)
- [Releases](https://github.com/lydakis/alloy/releases)

## 0.3.1 (2025-09-06)

- Tool payload normalization
  - Central helper for dataclasses and containers; providers use consistent JSON serialization.

- Anthropic structured outputs
  - Provider‑native guidance with precise nested key hints; minimal object prefill ("{") only.
  - Remove unsupported `response_format`; single strict finalize turn remains.

- Gemini fixes
  - Suppress non‑text warnings by reading `candidates.content.parts`.
  - Ensure `FunctionResponse.response` is a dict (wrap scalars as `{ "result": ... }`).

- Ollama
  - Native path unchanged (strict `format` enforcement).
  - OpenAI‑chat path adds strict nested‑keys finalize hints where schema cannot be enforced.

- Tests & imports
  - Add unit tests for ask context, env overrides, finalize predicate.
  - Move non‑optional imports to module scope; keep provider SDK imports lazy.

## 0.3.0 (2025-09-02)

- Finalize centralization
  - One canonical rule in `should_finalize_structured_output` handles strings (including wrapped primitives) vs. non-strings.
  - Providers defer to it; string outputs finalize only when empty.

- Shared helpers
  - `build_tools_common` for uniform tool-schema building across providers.
  - `ensure_object_schema` wraps primitives into `{ "value": ... }` consistently.

- Config extras (generic-first)
  - Use `tool_choice`, `allowed_tools`, `disable_parallel_tool_use`, `ollama_api`; provider-prefixed fallbacks supported.

- Provider parity & cleanup
  - Client getters standardized (`_get_sync_client` / `_get_async_client`).
  - Streaming: robust close/aclose for Gemini and Ollama streams; OpenAI/Anthropic already use context managers.
  - Anthropic: skip JSON prefill after tool errors so plain messages surface.
  - Ollama (headline): dual API support — native `/api/chat` and OpenAI‑compatible Chat Completions (`openai_chat`). Auto‑routes `ollama:*gpt-oss*` to `openai_chat` unless overridden via `extra["ollama_api"]`. Tools supported in both paths; native path supports strict `format={JSON Schema}` for structured outputs.
  - Ollama: remove broad exception wrapping in `complete()`; runtime errors propagate consistently.

- Docs & tests
  - Configuration extras presented as tables; production guide clarifies error surfaces and retries.
  - Tests updated for new getters; added unit tests for base helpers.

## 0.2.2 (2025-08-29)

- Shared loop & Gemini alignment
  - Centralized tool loop and provider state (`BaseLoopState`) migrated across OpenAI/Anthropic/Gemini.
  - Gemini now always uses the shared loop; finalize parity with Anthropic/OpenAI preserved.
- Streaming API: `ask.stream_async()` returns an `AsyncIterable[str]` directly (no await at call site).
- Structured outputs: providers finalize only when `auto_finalize_missing_output=True` (default on).
- OpenAI: reasoning models ignore temperature; Alloy drops it and logs a debug line.
- Fake backend: stricter schema fill (nested required properties) to mirror provider strict mode.

## 0.2.0 (2025-08-26)

- Cross‑provider streaming policy
  - Unified on text‑only streaming. Commands with tools or non‑string outputs do not stream (guarded in code and docs).
  - Examples and Getting Started updated to call this out explicitly.

- OpenAI
  - Responses API migration with shared request builder and centralized function‑calling loop via `_LoopState`.
  - Safer output assembly; always threads `previous_response_id`.
  - One follow‑up finalize (no tools) when a structured result is missing; raises `ToolLoopLimitExceeded` when the turn cap is exceeded.
  - Async parallel tool execution using `asyncio.to_thread`.

- Gemini
  - Backend refactor for non‑streaming flows: capped tool loop and strict finalize pass with the provided schema.
  - Text‑only streaming preserved; tools/structured outputs not supported in stream.

- Anthropic
  - Parity with OpenAI/Gemini for tools: robust loop with parallel tool results aggregated into a single user message.
  - Respects configured `tool_choice` (defaults to `{type:"auto"}`); supports `anthropic_disable_parallel_tool_use`.
  - Structured outputs: prefill only for non‑string primitives and object schemas; no prefill for strings; one JSON‑only finalization step after tools when needed.
  - Text‑only streaming supported; tools/structured outputs not supported in stream.

- Commands & typing
  - Enforce command prompt functions are annotated `-> str`; the decorator controls the output type.
  - Clearer parse errors and refined type stubs for default returns and async variants.

- Safety & configuration
  - Default `max_tool_turns=10` (override via `configure` or `ALLOY_MAX_TOOL_TURNS`).

- Tests & docs
  - New Anthropic integration tests: structured float/object, text‑only streaming, and parallel tool calls.
  - Docs improvements: stability page, streaming policy, configuration defaults; theme & brand refinements.

## 0.1.4 (2025-08-14)

- Typing defaults: omit `output` → `str` (async → `Awaitable[str]`); refined stubs and preserved ParamSpec; `ask.stream_async` typed.
- DBC: `ToolError` messages surface back to the model (OpenAI/Anthropic) for early corrective feedback; unit + integration tests; docs + examples.
- Docs: Typing page, Equivalence Guide, Tool Recipes, patterns examples; standardized imports and decorator style.
- Tooling: pre-commit enforcement for imports and decorator style in code + docs.

