All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.2.25 - 2026-04-02
Added
- BAML backend supports multimodal messages (images, audio, video, and files) via the
:messages_multimodalargs format
0.2.24 - 2026-03-27
Fixed
- BAML
output_schemanow works with upstreambaml_elixir~> 1.0.0-pre.27, including schemas that useZoi.literal/1 - BAML backend no longer passes an empty
tblist when no generated TypeBuilder entries are needed
Changed
- Replaced the optional
baml_elixir_nextdependency override with upstreambaml_elixir - BAML TypeBuilder no longer emits top-level
TypeBuilder.Unionentries; callers should define root union return types in.bamland useoutput_schema/TypeBuilder for the nested shapes, literals, and generated classes
0.2.23 - 2026-02-21
Fixed
- BAML streaming
sanitize_partial_strings/1no longer crashes withProtocol.UndefinedErrorwhen the output schema parses into a struct (e.g.,PuckCoder.Actions.Shell). Structs match theis_mapguard but don't implementEnumerable, soMap.new/2would raise. Added a struct-specific clause that passes through unchanged.
0.2.22 - 2026-02-21
Added
- Added
on_stream_done/3hook callback, invoked once after stream completion with the assembledPuck.Responseand final assistant-appended context
Fixed
- BAML streaming now populates usage (token counts) in the final chunk, making
on_stream_doneandPuck.Responseusage symmetric with non-streaming calls - BAML streaming no longer emits partial chunks containing broken escape sequences or duplicate content
0.2.21 - 2026-02-21
Fixed
- BAML backend streaming no longer aborts immediately when stream callbacks are delivered asynchronously from the BAML client
0.2.20 - 2026-02-20
Fixed
- BAML backend now enriches collector usage with provider response usage/body/header fields, including cache metrics such as
cache_read_input_tokenswhen available - Fixed
map_get/2dropping legitimate falsy values like0from usage maps
0.2.19 - 2026-02-20
Fixed
- BAML backend now preserves provider-specific usage fields (e.g.,
cache_creation_input_tokens,cache_read_input_tokens) returned by the LLM provider alongside the defaultinput_tokensandoutput_tokens
0.2.18 - 2026-02-17
Added
[:puck, :backend, :baml, :error]telemetry event emitted when the BAML backend returns an error, with the raw LLM response included in metadata for debugging
0.2.17 - 2026-02-14
Fixed
- BAML
dynamic_classesTypeBuilder no longer renders// nilcomments on dynamic fields in prompts
0.2.16 - 2026-02-14
Fixed
- BAML backend now strips
__baml_class__and__baml_enum__metadata from NIF results before Zoi parsing, fixing struct parsing failures whenoutput_schemais used - BAML
dynamic_classesTypeBuilder now emits a dedicated enum for type discriminators with descriptions, fixing union variants being collapsed to{ type: string }in rendered prompts
0.2.15 - 2026-02-14
Added
- BAML TypeBuilder generates meaningful variant names from tagged unions (e.g.,
PluginActionGetSkillinstead ofPluginActionVariant0) - BAML TypeBuilder accepts a
descriptionsoption to attach human-readable descriptions to union variants
Fixed
- BAML TypeBuilder now correctly recognizes literal discriminator fields in JSON schema
0.2.14 - 2026-02-14
Added
- BAML backend now auto-builds
TypeBuilderfromoutput_schema, giving BAML's Rust runtime full knowledge of dynamic types for Schema-Aligned Parsing andctx.output_formatprompt formatting - BAML backend accepts
dynamic_classesoption to register@@dynamicclass fields in TypeBuilder, enabling callers to declare runtime-only fields for BAML parsing
Fixed
- BAML backend now registers root union types in
TypeBuilder, fixing top-level union schemas (e.g., plugin actions) where fields beyondtypewere silently dropped - Replaced deprecated
strict: truewithunrecognized_keys: :errorfor Zoi 0.17 compatibility - Lua sandbox callbacks now receive maps when Lua passes table arguments (previously returned opaque internal references)
Changed
- Bumped
zoidependency from~> 0.7to~> 0.17 - Bumped
baml_elixirdependency to~> 1.0.0-pre.24.next.2(baml_elixir_next) for TypeBuilder nullable union support
0.2.13 - 2026-02-08
Fixed
- Claude Agent SDK backend no longer returns nil content when the result message lacks
structured_outputandresultfields
Changed
- Bumped
claude_agent_sdkdependency from~> 0.8to~> 0.11
0.2.12 - 2026-02-07
Added
Puck.LiveView— stream LLM responses into Phoenix LiveView with PubSub, cancellation, and timeoutstart_stream/2function variant for multi-turn loops and structured output orchestrationPuck.LiveView.Handlerbehaviour for pluggable persistence in the stream process- LiveView telemetry events for stream lifecycle monitoring
Fixed
Puck.Testno longer causes flaky failures in async tests (NimbleOwnership process is now unlinked from the starting test process)
0.2.11 - 2026-02-06
Fixed
- Claude Agent SDK backend now forwards the
:toolsconfig option, enabling tool-free chatbots viatools: []
0.2.10 - 2026-02-05
Fixed
- Claude Agent SDK backend now resumes sessions on multi-turn calls
- Stream event partial chunks are now emitted during streaming (handles both CLIStream and ClientStream SDK paths)
Changed
- Updated ex_doc from 0.39 to 0.40
0.2.9 - 2026-01-18
Added
Puck.Test- Deterministic agent testing with queued mock responses
0.2.8 - 2026-01-17
Added
Puck.Backends.ClaudeAgentSDK- Use Claude Code CLI with your existing Pro/Max subscription- Native JSON schema structured outputs via SDK
- Automatic wrapping for union schemas (anyOf/oneOf/allOf) to work around Anthropic API limitation
- Sandbox mode support for safe execution
0.2.7 - 2026-01-10
Fixed
- Lua eval results are now converted to JSON-encodable format (tables become maps, arrays become lists)
0.2.6 - 2026-01-10
Fixed
- Lua callbacks now accept maps with atom keys (idiomatic Elixir) by automatically converting them to string keys at the sandbox boundary
0.2.5 - 2026-01-10
Fixed
Puck.Eval.Collectornow captures telemetry events from child processes (Task.async, spawned GenServers, etc.)
0.2.4 - 2026-01-09
Added
Puck.Eval- Test and measure LLM agent performancePuck.Eval.Trajectory- Records execution history (steps, tokens, duration)Puck.Eval.Step- Details of a single LLM call (input, output, tokens, timing)Puck.Eval.Collector- Captures trajectories from bothcallandstreamoperations via telemetryPuck.Eval.Grader- Define custom scoring rules for agent outputsPuck.Eval.Graders- Built-in graders (contains, max_steps, max_tokens, output_produced, and more)Puck.Eval.Result- Combines grader results into a single pass/fail outcome
0.2.3 - 2026-01-09
Added
[:puck, :stream, :exception]telemetry event for stream initialization failures
Changed
- Telemetry events are now emitted automatically when the
:telemetrydependency is installed (no configuration required)
Removed
Puck.Telemetry.Hooksmodule (telemetry is now automatic, no hooks configuration needed)
0.2.2 - 2026-01-08
Added
- Built-in BAML conversation summarizer (
PuckSummarize) - no custom BAML files needed - Summarize compaction now works automatically with BAML backend
Puck.Bamlmodule for built-in BAML functions- Client registry documentation in README
Changed
- Renamed
:instructionsoption to:promptinPuck.Compaction.Summarizefor consistency - Updated
baml_elixirdependency to 1.0.0-pre.24 - Added
--warnings-as-errorsto docs in precommit and CI
Fixed
- Fixed token usage tracking for BAML backend
Removed
baml_elixir_nextoverride documentation (no longer needed with baml_elixir 1.0.0-pre.24)
0.2.1 - 2026-01-08
Added
- Documentation for
baml_elixir_nextas an optional override for enhanced BAML features (client registry support) - Acknowledgments section in README recognizing key dependencies
Fixed
- Compile warnings when optional dependencies (
lua,req) are not installed - ExDoc module groups now reflect the reorganized sandbox module structure
- CHANGELOG version links for v0.2.0
0.2.0 - 2026-01-07
Added
Puck.Compaction- Behaviour for context compaction strategiesPuck.Compaction.Summarize- LLM-based summarization strategyPuck.Compaction.SlidingWindow- Sliding window strategy (keeps last N messages)Puck.Context.compact/2- Manual context compactionPuck.Context.total_tokens/1- Token count tracking- Auto-compaction via
Puck.Client.new/2:auto_compactionoption - Compaction lifecycle hooks:
on_compaction_start/3,on_compaction_end/2 - Compaction telemetry events:
[:puck, :compaction, :start],[:puck, :compaction, :stop],[:puck, :compaction, :error] Puck.Sandbox.Eval- In-process code evaluation with Lua supportPuck.Sandbox.Eval.Lua- Lua sandbox with timeout, memory limits, and callbacksPuck.Sandbox.Eval.Lua.schema/1- Schema helper for LLM-generated Lua code execution
Changed
- Reorganized sandbox modules:
Puck.Sandbox.Runtimefor containers,Puck.Sandbox.Evalfor interpreters
Removed
- Native tool calling support (use structured outputs with discriminated unions instead)
0.1.0 - 2025-01-04
The first release!